이 프로젝트는 다양한 관심사를 가진 사용자들이 모여 취미를 공유하고 서로의 경험을 나눌 수 있는 커뮤니티 플랫폼입니다. 활동량에 따라 뱃지🏅와 순위🏆가 부여되며, 챌린지 참여를 통해 새로운 도전과 성취를 경험할 수 있습니다. 등급별로 차별화된 접근 권한을 제공하여 깊이 있는 소통과 유대감을 형성할 수 있도록 설계되었습니다.
- 많은 사람들이 서로의 관심사를 공유하고 소통할 수 있는 공간 제공
- 커뮤니티를 통해 취미에 관해 소통하며 서로의 도움을 주고 받음
- 커뮤니티 활동을 통해 활동 점수를 얻고 순위에 따라 뱃지를 획득함으로써 성취감 획득
- 챌린지 게시판을 통해 다양한 취미를 시도하고 참여를 통해 수식어를 획득하여 참여를 유도
- 사용방법
- 카카오 로그인을 해주세요
- 관심사에 따라 게시판에 들어가주세요
- 게시글을 작성하시거나 게시글에 댓글을 작성하실 수 있습니다
- 또한 챌린지 게시판에서 그에 해당하는 챌린지에 참여하실 수 있습니다
- 활동량 시스템을 통해 뱃지를 부여하여 활동을 유도
- 챌린지 게시판을 통해 다양한 취미를 시도하고, 참여를 통해 수식어를 획득하여 참여를 유도
- 특정 등급 이상부터 지역 게시판에 접근하여 지역별 취미를 공유하고 소통
- Web Framework:
Spring Boot
- DB:
AWS RDS
(MySQL) - Backend:
Spring Boot
+REST API
- Server:
AWS EC2
- FrontEnd: CSS + JavaScript + HTML
- Auth:
OAuth2
,Spring Security
- IDE: IntelliJ
- 실행 URL: http://52.78.95.78:8080/
GitHub
레포: https://github.com/ESTsoft-Back-end-6th-2nd-project-team3/ESTsoft-2nd-Project
- 팀장: 황승현
- 팀원: 언형민, 이슬기, 전지현
- 개발 기간: 2024년 10월 28일 - 2024년 11월 13일
- 최종 수정 및 문서화: 2024년 11월 12일 - 2024년 11월 13일
📂 ESTsoft-2st-Project
┣ 📂 .gradle┣ 📂 .idea
┣ 📂 build
┣ 📂 gradle
┣ 📂 src
┃ ┣ 📂 main
┃ ┃ ┣ 📂 java
┃ ┃ ┃ ┣ 📂 com.estsoft.estsoft2ndproject
┃ ┃ ┃ ┃ ┣ 📂 config
┃ ┃ ┃ ┃ ┃ ┣ 📜 JasyptConfigAES
┃ ┃ ┃ ┃ ┃ ┣ 📜 WebMvcConfig
┃ ┃ ┃ ┃ ┃ ┗ 📜 WebSecurityConfig
┃ ┃ ┃ ┃ ┣ 📂 controller
┃ ┃ ┃ ┃ ┃ ┣ 📂 api
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 AdminController
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 CommentApiController
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 ImageController
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 MenuDataController
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 MyPageController
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 ObjectiveController
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 PostApiController
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜 UserController
┃ ┃ ┃ ┃ ┃ ┣ 📂 main
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 CustomErrorController
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 PageController
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜 PostController
┃ ┃ ┃ ┃ ┣ 📂 customException
┃ ┃ ┃ ┃ ┃ ┗ 📜 AdditionalInformationRequireException
┃ ┃ ┃ ┃ ┣ 📂 domain
┃ ┃ ┃ ┃ ┃ ┣ 📂 dto
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂 activityScore
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 ScoreRequestDTO
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂 admin
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 PostListResponse
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 UserLevelRequest
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜 UserListResponse
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂 comment
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 CommentListResponseDTO
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 CommentRequestDTO
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜 CommentResponseDTO
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂 mypage
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 ObjectiveRequestDTO
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 PostResponseDTO
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 UserInfoRequestDTO
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜 UserInfoResponseDTO
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂 post
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 CommentResponseDTO
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 LikeRequestDTO
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 PostRequestDTO
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜 PostResponseDTO
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📂 user
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 CustomUserDetails
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜 RegisterRequestDTO
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜 UserRequestDTO
┃ ┃ ┃ ┃ ┃ ┣ 📜 ActivityScore
┃ ┃ ┃ ┃ ┃ ┣ 📜 Category
┃ ┃ ┃ ┃ ┃ ┣ 📜 Comment
┃ ┃ ┃ ┃ ┃ ┣ 📜 Level
┃ ┃ ┃ ┃ ┃ ┣ 📜 Likes
┃ ┃ ┃ ┃ ┃ ┣ 📜 Objective
┃ ┃ ┃ ┃ ┃ ┣ 📜 Post
┃ ┃ ┃ ┃ ┃ ┣ 📜 PostType
┃ ┃ ┃ ┃ ┃ ┣ 📜 Region
┃ ┃ ┃ ┃ ┃ ┣ 📜 SubMenu
┃ ┃ ┃ ┃ ┃ ┗ 📜 User
┃ ┃ ┃ ┃ ┣ 📂 exception
┃ ┃ ┃ ┃ ┃ ┣ 📜 CustomAccessDeniedHandler
┃ ┃ ┃ ┃ ┃ ┣ 📜 GlobalExceptionHandler
┃ ┃ ┃ ┃ ┃ ┣ 📜 PostNotFoundException
┃ ┃ ┃ ┃ ┃ ┗ 📜 UserNotFoundException
┃ ┃ ┃ ┃ ┣ 📂 repository
┃ ┃ ┃ ┃ ┃ ┣ 📜 ActivityScoreRepository
┃ ┃ ┃ ┃ ┃ ┣ 📜 CategoryRepository
┃ ┃ ┃ ┃ ┃ ┣ 📜 CommentRepository
┃ ┃ ┃ ┃ ┃ ┣ 📜 LikesRepository
┃ ┃ ┃ ┃ ┃ ┣ 📜 ObjectiveRepository
┃ ┃ ┃ ┃ ┃ ┣ 📜 PostRepository
┃ ┃ ┃ ┃ ┃ ┣ 📜 RegionRepository
┃ ┃ ┃ ┃ ┃ ┗ 📜 UserRepository
┃ ┃ ┃ ┃ ┣ 📂 service
┃ ┃ ┃ ┃ ┃ ┣ 📜 AdminService
┃ ┃ ┃ ┃ ┃ ┣ 📜 CommentService
┃ ┃ ┃ ┃ ┃ ┣ 📜 MenuDataService
┃ ┃ ┃ ┃ ┃ ┣ 📜 MyPageService
┃ ┃ ┃ ┃ ┃ ┣ 📜 ObjectiveService
┃ ┃ ┃ ┃ ┃ ┣ 📜 PostService
┃ ┃ ┃ ┃ ┃ ┗ 📜 UserService
┃ ┃ ┃ ┃ ┗ 📜 EsTsoft2ndProjectApplication
┃ ┃ ┣ 📂 resources
┃ ┃ ┃ ┣ 📂 sql
┃ ┃ ┃ ┃ ┗ 📜 Untitled.sql
┃ ┃ ┃ ┣ 📂 static
┃ ┃ ┃ ┃ ┣ 📂 css
┃ ┃ ┃ ┃ ┃ ┣ 📜 base.css
┃ ┃ ┃ ┃ ┃ ┗ 📜 reset.css
┃ ┃ ┃ ┃ ┣ 📂 images
┃ ┃ ┃ ┃ ┃ ┗ 📜 logo.png
┃ ┃ ┃ ┃ ┣ 📂 img
┃ ┃ ┃ ┃ ┃ ┗ 📜 kakao-icon.svg
┃ ┃ ┃ ┃ ┣ 📂 js
┃ ┃ ┃ ┃ ┗ ┗ 📜 bulletin-board-list.js
┃ ┃ ┃ ┗ 📂 templates
┃ ┃ ┃ ┃ ┣ 📂 fragment
┃ ┃ ┃ ┃ ┃ ┣ 📜 admin-board-list.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 board-list.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 bulletin-board-list.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 category.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 category-best.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 category-name.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 edit-objective.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 edit-profile.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 main-page-best.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 main-page-signin.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 my-objective.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 mypage-profile.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 participated-challenge.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 register.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 search-all.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 view-comment.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 view-post.html
┃ ┃ ┃ ┃ ┃ ┗ 📜 write-post.html
┃ ┃ ┃ ┃ ┣ 📂 post
┃ ┃ ┃ ┃ ┃ ┣ 📜 create-post.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 view-post.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 view-post-all.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 view-post-by-category.html
┃ ┃ ┃ ┃ ┃ ┗ 📜 view-search-results.html
┃ ┃ ┃ ┃ ┣ 📂 testHtml
┃ ┃ ┃ ┃ ┃ ┣ 📜 comment-test.html
┃ ┃ ┃ ┃ ┃ ┣ 📜 index.html
┃ ┃ ┃ ┃ ┃ ┗ 📜 objectives_stats.html
┃ ┃ ┃ ┗ 📜 application.yml
┣ 📂 test
┣ 📜 .gitignore
┣ 📜 build.gradle
┣ 📜 gradlew
┣ 📜 README.md
┗ 📜 settings.gradle
- LIKES
like_type
: 게시글, 댓글 구분target_id
: 게시글, 댓글 id
- POST
post_type
: 카테고리, 지역, 챌린지, 공지사항 구분category_id
: 카테고리, 지역 id
- 일반 로그인 및 회원가입: OAuth2 외 일반 로그인ㆍ회원가입 기능 구현
- 등급 부여 시스템: 활동 점수에 따른 등급 부여 구체화
- 이미지 삽입 기능: 게시글 본문에 사진 삽입 기능 지원
- 닉네임 변경 동시성 해결: 다중 사용자 환경에서 닉네임 변경 시 발생할 수 있는 동시성 문제 해결
- 연속 클릭 방지: 데이터 전송 시 연속 클릭 방지로 중복 전송 방지
-
Spring Security 로그인 과정 중 Exception 처리 문제
- 발생 문제: 로그인 중 발생한 Exception이
ControllerAdvice
에서 처리되지 않음 - 해결 방법: Spring Security에서 발생하는 Exception은
security filter chain
에서 처리해야 하며,.oauth2Login(oauth2 -> oauth2.failureHandler())
를 통해 Exception을 처리하도록 수정
- 발생 문제: 로그인 중 발생한 Exception이
-
Spring Security 리다이렉션 이후 CORS 에러
- 발생 문제: 리다이렉션 이후 카카오 로그인 진행 시 CORS 에러 발생
- 해결 방법: 가입 페이지에서 서버로
form
데이터를 전송 후 응답을 받고 카카오 로그인 URL로 로그인 요청을 전송하여 해결
-
JavaScript에서 onclick 함수와 Thymeleaf 변수 사용 시 SyntaxError
- 발생 문제:
onclick
함수 내에 Thymeleaf 변수를 사용 시SyntaxError
발생 - 해결 방법:
onclick
을th:onclick
으로 변경하고,th:onclick="함수명(this.getAttribute('변수명'))"
형식으로 함수를 호출하여 변수 할당을 적용
- 발생 문제:
-
좋아요와 좋아요 취소 로직 통합 문제
- 발생 문제: 게시글 상세 페이지에서 좋아요 버튼을 눌러도 화면에 변경사항이 반영되지 않음
- 원인 분석:
toggleLike
메소드 하나로 좋아요와 좋아요 취소를 모두 처리하려다 보니, JavaScript의 렌더링 문제가 발생하여 좋아요 상태가 제대로 렌더링되지 않음 - 해결 방법: 좋아요와 좋아요 취소 기능을 각각의 메소드 (like와 unlike)로 분리하여 각 상태에 따른 동작을 명확히 처리하도록 수정
-
좋아요 수 표시 문제
- 발생 문제: 좋아요 버튼을 누르면 글자 상태는 변경되지만, 좋아요 수가 화면에 업데이트되지 않음
- 원인 분석: HTML의 span 태그에 타임리프(
th:text
)로 좋아요 수를 표시했으나, 초기값이 없을 경우 요소가 렌더링되지 않아 동적 업데이트가 불가능함 - 해결 방법: 초기값이 없더라도
span
태그를 유지하여 좋아요 수가 0일 때도 빈 요소가 남아 동적으로 업데이트될 수 있도록 수정
-
좋아요 연속 클릭 시 에러 발생 문제
- 발생 문제: 연속해서 좋아요 버튼을 클릭할 경우, 좋아요 취소가 계속 누적되면서 서버에서 오류 발생
- 원인 분석: 연속 클릭으로 인해 post의
like_count
값이 음수로 감소하고, 삭제할 like 데이터가 없어서 서버에서 500 오류 발생 - 서버 측 조치: 컨트롤러에서 like 데이터가 존재하는지 확인한 후, 있을 때만 like 데이터 추가와 post count 증가를 처리 클라이언트 측 조치: JavaScript에서 좋아요 버튼을 클릭할 때 버튼을 일시적으로 비활성화하고, 서버 응답이 완료된 후 버튼을 다시 활성화하는 로직을 추가하여 중복 클릭을 방지
-
Thymeleaf 조각 템플릿 렌더링 문제
- 발생 문제: Thymeleaf로 템플릿을 분리해 조각화할 때
th:replace
사용 시 특정 컴포넌트가 예상대로 렌더링되지 않는 문제가 발생 - 해결 방법: 조각 템플릿에 필요한 변수를 명확하게 전달하고
th:replace
사용 방식을 재검토하여 각 조각이 올바르게 렌더링되도록 수정
- 발생 문제: Thymeleaf로 템플릿을 분리해 조각화할 때
-
정적 리소스의 동적 인식 문제
- 발생 문제: static 디렉토리 내에 이미지를 저장했지만 실시간으로 서버에서 인식하지 못하는 현상 발생
- 해결 방법: WebMvc의 addResourceHandlers를 통해 정적 리소스를 동적으로 인식하도록 설정
- GitHub 블로그 스타일 참조
- GitHub Engineering Blog을 참고하여 UI/UX 디자인과 레이아웃에 반영
- Spring MVC - 타임리프(Thymeleaf) 템플릿 조각과 레이아웃
th:fragment
,th:replace
등을 사용하여 템플릿 구조를 구성하고 레이아웃을 관리
참고 사이트 |
---|