프리온보딩 BE 챌린지 8월 사전 과제 - 게시글 프로젝트 요구사항 분석
게시글 프로젝트 요구사항 분석
프리온보팅 BE 챌린지 8월 사전 과제
원티드의 프리온보딩 BE 챌린지를 신청하니, 다음과 같이 사전 과제가 주어졌다.
안녕하세요. 8월 멘토링 진행하는 @@@ 멘토입니다.
많은 분들께서 사전 프로젝트 진행하고 계신걸로 확인되는데요.
프로젝트 진행을 하시면서 공유주시는 방법에 대해서 간단하게 작성드립니다.
기본 및 심화 구현에 대해서 의무적으로 구현하시기보다 가이드라인이라고 생각하시면 좋습니다. 본인만의 포트폴리오 프로젝트를 만든시는게 가장 중요한 프로젝트입니다.
코드리뷰는 정보공개를 동의하신 분들께 진행되며 제출하시고 특정 구현에 대해 코드리뷰를 원하실 경우 안내드린 이메일로 문의해주시면 수업때 준비해보겠습니다.
PR 을 올리실 필요는 없습니다. 제출해주신 분들 위주로 git관련해서는 간단히 봐드릴 예정입니다.
추가적으로 궁금하신 사항은 메일로 문의 부탁드립니다!
감사합니다 ~
요구사항 분석
전달받은 깃허브 템플릿이다 한번 확인해보자.
주요 기능
요구사항을 읽어보고 나름대로 정리해보았다.
- 회원 기능 (JWT)
- 회원가입
- 로그인
- 게시글 기능
- 게시글 작성
- 게시글 수정
- 게시글 삭제
- 게시글 조회 (상세 조회, 목록 조회)
- title 기준 검색
- createdAt 기준 정렬 - 게시글 좋아요 - 조회수 증가
- 댓글 기능
- 댓글 작성
- 댓글 수정
- 댓글 삭제
- 알림기능
- 댓글 및 좋아요 알림
- 게시글 수정 제한 경고 알림
- 테스트
- 단위 테스트
- 통합 테스트
- 그외
- Soft Delete
- 이미지 업로드 외부스토리지 연동
- Swagger API 문서화
개발 계획
개발 계획은 다음과 같다.
1. 회원 기능
유저 도메인을 설계할 때 늘 고민되는 부분은 스프링 시큐리티의 UserDetails
를 어떻게 처리할 것인가이다.
User 엔티티에 UserDetails
를 구현할 것인지, 아니면 시큐리티를 통과하는 객체인 CustomUserDetails
를 따로 만들 것인지
전자의 장점은 유저 객체를 직접 사용하기 때문에, 개발의 편의성이 높아진다는 것이며, 단점은 UserDetails
를 구현하기 위해서 유저 객체에 시큐리티 관련된 코드가 들어가게 되어, 도메인 모델이 지저분해진다는 것이다.
따라서, 후자의 방법을 사용하지만, UserDetialsService에서 userdetails.User.builder
를 통해 굳이 UserDetails를 구현하지않고, 반환하기로 했다
2. 게시글 및 댓글 기능
최근, DDD (도메인 주도 개발)에 관심이 많아, DDD 방식을 어느정도 적용해보려고 한다.
그동안 찾아본 정보에서는 유저 - 게시글 간의 매핑은 @ManyToOne 대신, Id값만 저장하는 방식으로 구현하라고 되어있었다.
하지만, 이 방식대로 개발을 진행하게 되면 유저와 게시글간의 결합도를 낮출 수 있지만, 게시글 - 댓글까지 별도의 도메인으로 개발하고 키 값만 저장하게 된다면 개인적으로 응집도 마저 떨어지게 된다고 생각한다
따라서 적당히 @OnetoMany를 사용하여, 게시글 - 댓글 간의 관계를 설정하고, 나머지 부분은 Id값만 저장하는 방식으로 구현하기로 했다.
3. 알림 기능
알림 기능은 잘못 설계하게 되면 높은 결합도를 가지게 되기 때문에, 주의해야 한다.
따라서, 스프링 이벤트를 활용하여, 알림 기능을 구현하기로 했다.
Aggregate Root인 게시글과 댓글을 수정할 때, 이벤트를 발생시키고, 이를 통해 알림을 생성하는 방식으로 구현해볼까 한다.
4. 이미지 업로드
StorageService라는 인터페이스를 만들어서, S3와 ImgBB, 테스트용 MockStorage를 구현하기로 했다.
이후, 스프링 실행환경에 맞추어 StorageService를 주입받아 사용할 예정이다.
5. 테스트
테스트는 단위 테스트와 통합 테스트를 모두 진행할 예정이다.
Junit5를 활용하여 단위 테스트를 진행하고, WebTestClient를 활용하여 통합 테스트를 진행할 예정이다.
유틸 클래스같은 경우에는 단위테스트를 진행하며, 그외 서비스의 경우 스프링 통합 테스트를 통해 E2E 테스트를 진행할 예정이다.