-
Notifications
You must be signed in to change notification settings - Fork 0
♻️ 코드 리팩토링 : 기술 정보 도메인 2차 리팩토링 및 Swagger 개선 #214
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- custom-delete-* 및 custom-insert-* 스크립트: 블로그, 댓글, 좋아요, 스크랩 등 특정 데이터 조작 처리 - default-delete-all 및 default-insert-* 스크립트: 전체 데이터 초기화 및 세팅용
- custom-delete-* 및 custom-insert-* 스크립트: 블로그, 댓글, 좋아요, 스크랩 등 특정 데이터 조작 처리 - default-delete-all 및 default-insert-* 스크립트: 전체 데이터 초기화 및 세팅용
- ArticleFixture, BlogFixture, CommentFixture, LikeFixture, ScrapFixture, UserFixture: 각 엔티티별 테스트 데이터 생성 지원 - CustomUserDetailsFixture: 사용자 인증 관련 테스트 시나리오 지원
- Article 도메인 엔티티 생성 - MongoDB용 어노테이션(@document, @CompoundIndex) 적용 - 기본 필드(id, blogId, type, title, content, thumbnailImageUri, likesCount, viewCount, createdAt, updatedAt, displayed) 정의 - 유효성 검사 로직(checkTitle) 추가 - 정적 팩토리 메소드(create) 및 업데이트(update), 숨김 처리(hide) 메소드 구현
- 다양한 ArticleType 상수 정의 - 입력 문자열을 대문자로 변환 후 enum 값으로 매핑하는 from 메소드 구현 - 잘못된 타입 입력 시 RestApiException 발생하는 validate 메소드 추가 Ref : #213
- 사용자와의 일대일 매핑을 통한 Blog 엔티티 구현 - 기본 블로그 소개 메시지(DEFAULT_BLOG_INTRO) 적용 - 정적 팩토리 메소드(create) 및 소개글 업데이트 메소드 구현 - 유효성 검사 로직 추가하여 필수 필드 검증 Ref : #213
- 사용자와의 다대일 관계를 통한 Comment 엔티티 구현 - 필수 필드(articleId, content)와 감사 필드(createdAt, updatedAt) 정의 - 정적 팩토리 메소드(create) 및 컨텐츠 업데이트(updateContent) 메소드 추가 - 필수 컨텐츠 유효성 검사 로직 및 댓글 숨김 처리(hide) 구현 Ref : #213
- 사용자와의 다대일 관계를 통한 Scrap 엔티티 생성 - articleId와 user 필드의 유니크 제약 조건 추가 - 생성일(createdAt) 자동 설정 및 정적 팩토리 메소드(create) 구현 Ref : #213
- 사용자와의 다대일 관계를 통한 Like 엔티티 생성 - articleId와 user 필드의 유니크 제약 조건 적용으로 중복 좋아요 방지 - 생성일(createdAt) 자동 설정 및 정적 팩토리 메소드(create) 구현 Ref : #213
- 정렬 기준(NEWEST, OLDEST, VIEW_COUNT, LIKE_COUNT) 정의 - 입력 문자열을 대문자로 변환하여 enum 매핑 - 유효하지 않은 타입 입력 시 명확한 예외 메시지 제공하는 검증 메소드 구현 Ref : #213
- 존재하지 않는 아티클 타입 입력 시 올바른 예외(RestApiException) 발생 여부를 검증하는 테스트 케이스 추가 Ref : #213
- Blog 생성자, 정적 팩토리 메소드(create), 소개글 업데이트(updateIntro)에 대한 테스트 케이스 구현 - 유효하지 않은 소개글 입력 시 올바른 예외 발생(RestApiException) 검증 Ref : #213
- Like 생성자와 정적 팩토리 메소드(create)의 올바른 동작을 검증하는 테스트 케이스 구현 Ref : #213
- Like 생성자와 정적 팩토리 메소드(create)의 올바른 동작을 검증하는 테스트 케이스 구현 Ref : #213
- Scrap 생성자 및 정적 팩토리 메소드(create)의 올바른 동작 검증 테스트 구현 Ref : #213
- ArticleRepository 인터페이스 추가: 기본 CRUD, 페이지네이션, 이전/다음 아티클 조회 등 쿼리 메소드 정의 - ArticleCustomRepository 인터페이스 추가: 연간 아티클 통계, 조회수 및 좋아요 수 업데이트 관련 커스텀 메소드 정의 - ArticleCustomRepositoryImpl 구현: MongoTemplate을 활용한 집계 파이프라인 구성 및 조회수, 좋아요 수 업데이트 로직 구현 Ref : #213
- CommentRepository 인터페이스 정의: 댓글 저장, 조회(아이디, 사용자 아이디, 사용자 닉네임 기반) 및 삭제 관련 메소드 구현 - 특정 articleId에 대한 댓글 비공개 처리 업데이트(@Modifying, @query) 메소드 추가 - JpaRepository를 확장하는 CommentJpaRepository 인터페이스 추가하여 기본 CRUD 및 커스텀 메소드 통합 지원 Ref : #213
- ScrapRepository 인터페이스 정의: 스크랩 저장, 사용자 아이디 및 닉네임 기반 조회, 스크랩 존재 여부 확인, 삭제 관련 메소드 구현 - JpaRepository를 확장하는 ScrapJpaRepository 인터페이스 추가하여 기본 CRUD 기능과 커스텀 메소드 통합 지원 Ref : #213
- LikeRepository 인터페이스 정의: 좋아요 저장, 사용자 아이디 기반 조회, 사용자 닉네임과 articleId 기반 존재 여부 확인 및 삭제 메소드 구현 - JpaRepository를 확장하는 LikeJpaRepository 인터페이스 추가하여 기본 CRUD와 커스텀 메소드 통합 지원 Ref : #213
- 알고리즘 관련 엔드포인트(/algorithm/**)가 첫 번째 버전에는 포함되어 있으나, 두 번째 버전에서는 제거됨 - 기타 허용 URL 목록 및 CORS, JWT 필터 구성 등은 동일하게 유지됨 Ref : #213
- Blog 조회 관련 API 메소드 구현: - ID, 사용자 닉네임으로 블로그 응답 생성 - 블로그 ID 조회 및 ID 집합을 기반으로 한 블로그 맵 반환 - 존재하지 않는 블로그에 대한 예외 처리 로직 포함 - 위 기능을 검증하는 통합 테스트 케이스 추가 및 SQL 스크립트를 통한 테스트 데이터 관리 Ref : #213
- Blog 생성 기능 구현: - 사용자 ID로 Blog 생성 - @async, @retryable 어노테이션을 활용하여 비동기 및 재시도 로직 적용 - 사용자 정보 미존재 시 최대 3회 재시도 후 리커버리 메소드 호출 - 블로그 소개글 수정 기능 구현: - CustomUserDetails 및 BlogIntroEditRequest를 기반으로 블로그 소개글 업데이트 - 사용자 인증 및 블로그 존재 여부에 따른 예외 처리 로직 포함 - 통합 테스트 케이스 추가: - 정상적인 블로그 생성 및 수정 검증 - 사용자 정보 미존재, 블로그 미존재 시 예외 발생 및 재시도 로직 검증 Ref : #213
- 아티클 조회, 미리보기, 인접 아티클, 연간 통계 조회 등 다양한 API 메소드 구현 - 사용자 정보 유무에 따라 비동기 작업 및 이벤트(ViewedEvent) 발행 로직 적용 - Caffeine 캐시를 이용한 미리보기 응답 최적화 (최대 5페이지 캐싱) - 존재하지 않는 아티클 조회 및 필터 조건에 따른 예외 처리 로직 포함 - 각 기능에 대한 통합 테스트 케이스 추가로 정상 동작 및 예외 상황 검증 Ref : #213
- ArticleCommandService 인터페이스 구현 - create: 사용자 인증 후 블로그 ID 조회, 아티클 생성 및 저장 후 생성된 아티클 ID 반환 - update: 사용자 인증 및 소유 검증 후 아티클 정보 수정 - delete: 아티클 숨김 처리 후 ArticleHiddenEvent 이벤트 발행 - updateViewCount와 updateLikesCount: 아티클의 조회수와 좋아요 수 업데이트 로직 구현 - 사용자 정보 누락 및 존재하지 않는 아티클에 대한 예외 처리 로직 추가 - 통합 테스트 케이스를 통해 정상 동작 및 예외 상황 검증 실시 Ref : #213
- ArticlePreview 인터페이스 정의 및 Getter 메소드 테스트를 위한 DummyArticlePreview 구현 - 연도별, 월별, 주별 아티클 통계를 위한 YearlyArticleStatistics, MonthlyArticleStatistics, WeeklyArticleStatistics 레코드 추가 Ref : #213
- CommentQueryService 인터페이스 및 구현체 추가: 특정 아티클 ID에 대한 댓글 목록 조회 기능 구현 - 페이징 및 정렬 처리(PageableGenerator, SortType 사용) 적용 - 댓글이 존재하지 않을 경우 예외(RestApiException) 발생 처리 - SQL 스크립트를 활용한 테스트 데이터 기반 통합 테스트 케이스 추가하여 정상 동작 및 예외 상황 검증 실시 Ref : #213
- 사용자 인증 검사 후 댓글 생성, 수정, 삭제 기능 구현 - 댓글 생성 시, 사용자 존재 및 아티클 존재 여부 확인 후 Comment 생성 및 저장 - 댓글 수정 및 삭제 시, 해당 사용자의 본인 댓글 여부를 검증하여 수정/비공개 처리 - 아티클 ID 기준으로 댓글 전체 비공개 처리 기능 추가 Ref : #213
- 사용자 닉네임과 아티클 ID를 이용해 좋아요 존재 여부를 조회하는 메소드 구현 - LikeRepository를 활용한 조회 로직 적용 - 다양한 시나리오를 검증하는 통합 테스트 케이스 추가 Ref : #213
- 사용자 닉네임과 아티클 ID를 이용해 스크랩 존재 여부를 조회하는 메소드 구현 - ScrapRepository를 활용한 조회 로직 적용 - 다양한 시나리오를 검증하는 통합 테스트 케이스 추가 Ref : #213
- 사용자 인증 검사 후 스크랩 생성 및 삭제 기능 구현 - 스크랩 생성 시, 사용자 존재 및 아티클 존재 여부 확인 후 Scrap 생성 및 저장 - 중복 스크랩 시 ALREADY_SCRAP_ARTICLE 예외 처리 - 스크랩 삭제 시, 사용자 본인 검증 후 삭제 기능 추가 - 관련 통합 테스트 케이스를 통해 정상 동작 및 예외 상황 검증 실시 Ref : #213
- ViewCacheRepository 인터페이스 정의: merge, 전체 조회, 캐시 클리어 기능 구현 - ViewCacheService 인터페이스 및 구현체 추가: - 비동기 merge 메소드로 아티클 조회수 누적 - 스케줄링된 flush 메소드로 캐시 배치 업데이트 후 아티클 조회수 업데이트 호출 Ref : #213
- LikeCacheRepository 인터페이스 정의: merge, 전체 조회, 클리어 기능 구현
- LikeCacheService 인터페이스 정의: merge, subtract, flush 메소드 추가
- LikeCacheServiceImpl 구현:
- 비동기 merge와 subtract 메소드로 캐시에 좋아요 값 누적 및 차감
- 스케줄링 flush 메소드로 캐시 배치를 ArticleCommandService의 updateLikesCount 메소드에 전달 후 캐시 클리어
Ref : #213
- LikeInMemoryRepositoryImpl: ConcurrentHashMap 기반으로 좋아요 캐시 저장소 구현 (merge, 전체 조회, 클리어 기능) - ViewInMemoryRepositoryImpl: ObjectId를 key로 사용하는 뷰 캐시 저장소 구현 (merge, 전체 조회, 클리어 기능) Ref : #213
- ViewedEvent 수신 시, 비동기 방식으로 ViewCacheService의 merge 메소드 호출하여 조회수 캐시 업데이트 처리 Ref : #213
- LikedEvent 및 LikeCancelledEvent 수신 시 비동기 방식으로 각각 LikeCacheService의 merge와 subtract 메소드 호출 - 트랜잭션 커밋 이후 이벤트 처리하도록 TransactionalEventListener 적용 Ref : #213
- ArticleHiddenEvent 수신 시 비동기 방식으로 댓글 전체 비공개 처리 기능 호출 - 이벤트 내 아티클 ID를 hex 문자열로 변환 후 CommentCommandService.deleteByArticleId 메소드 실행 Ref : #213
- 아티클 상세 조회, 미리보기, 인접 아티클, 연간 통계 조회 API 추가 - 아티클 등록, 수정, 삭제 기능을 위한 엔드포인트 구현 - 요청(Payload) 및 응답(Response) DTO(ArticleRegistrationRequest, ArticleEditRequest, ArticleResponse) 정의 - HATEOAS PagedModel을 활용하여 페이징 응답 구성 - Swagger 및 예외 코드 관련 Annotation 추가하여 API 문서화 및 일관된 응답 처리 적용 Ref : #213
- 로그인 사용자의 좋아요 등록 및 취소 요청 처리 엔드포인트 구현 - Swagger 문서화 및 예외 코드 Annotation 적용 - 사용자 인증 기반으로 아티클 좋아요 등록 및 취소 기능 제공 Ref : #213
- 댓글 조회, 등록, 변경, 삭제 엔드포인트 구현 - 댓글 등록/변경/삭제 요청 Payload (CommentRegistrationRequest, CommentEditRequest) 및 응답 DTO (CommentResponse) 정의 - HATEOAS 기반 페이징 응답(PagedModel) 적용 - Swagger 문서화 및 예외 코드 Annotation 적용하여 API 명세 일관성 강화 Ref : #213
- 로그인 사용자 기반으로 아티클 스크랩 등록 및 취소 요청 처리 엔드포인트 추가 - Swagger 문서화 및 예외 코드 Annotation 적용하여 API 명세 일관성 강화 - 사용자 인증, 아티클 존재 여부, 중복 스크랩 예외 처리 적용 Ref : #213
- 블로그 ID, 닉네임 기반 블로그 조회 엔드포인트 추가 (블로그 기본 정보 조회 및 기존 정보 조회) - 블로그 소개글 변경 엔드포인트 구현 (회원 인증 기반) - 요청/응답 DTO(BlogIntroEditRequest, BlogResponse) 정의 및 Swagger 문서화 적용 - 예외 코드 Annotation을 통한 일관된 오류 처리 적용 Ref : #213
- UserCreatedEvent 수신 시 BlogCommandService.create 호출하여 블로그 자동 생성 처리 - 트랜잭션 커밋 후 비동기 방식으로 이벤트 리스너 실행 Ref : #213
- UserCreatedEvent 수신 시 BlogCommandService.create 호출하여 블로그 자동 생성 처리 - 트랜잭션 커밋 후 비동기 방식으로 이벤트 리스너 실행 Ref : #213
- CacheType enum을 통해 캐시 이름, 만료 시간, 최대 크기 설정 정의 - CaffeineCacheConfig를 통해 Caffeine 기반 캐시 매니저 구성 및 스프링 캐시 활성화 - AsyncConfig를 통해 비동기 작업용 ThreadPoolTaskExecutor 및 CustomAsyncExceptionHandler 구성 - Spring Retry 및 Caffeine 의존성 추가하여 재시도 및 캐싱 기능 활성화 Ref : #213
- PageableGenerator: 정렬 타입(SortType)에 따라 PageRequest 객체 생성 - PagedModelGenerator: Page 객체를 HATEOAS 기반의 PagedModel로 변환 - UpperCaseGenerator: 문자열을 대문자로 변환하는 유틸리티 메서드 추가 - 공통 유틸 클래스는 생성자 private 선언으로 인스턴스화 방지 Ref : #213
- Tech Info 관련 블로그, 아티클, 댓글, 좋아요, 스크랩 에러 코드 메시지 추가 및 HTTP 상태 코드 설정 - @EnableRetry 어노테이션 적용으로 재시도 기능 활성화 - RedisCacheManager 빈 구성 추가 (TTL 10분, 문자열 및 JSON 직렬화 설정) - Primary CacheManager로 등록하여 기본 캐시 매니저로 활용하도록 설정 Ref : #213
- LikeCacheServiceImpl의 merge, subtract 메서드에 @retryable와 @recover 추가하여 재시도 로직 구현 - CommentCommandServiceImpl의 deleteByArticleId 메서드에 JPA 관련 예외(DataAccessException)를 대상으로 재시도 및 복구 처리 추가 - 재시도 실패 시 fallback 로직으로 단순 로깅을 통해 문제 상황을 모니터링하도록 구성 - @async, @retryable, @recover를 통한 비동기 작업의 안정성 강화 Ref : #213
- Event Payload, Projection 인터페이스, Test Fixture 등 관련 클래스에 JavaDocs 주석 추가 Ref : #213
- 기존 테스트는 비동기 처리된 댓글 삭제 작업이 완료되기 전에 결과를 조회하여 실패할 가능성이 있었음. - Awaitility를 사용해 비동기 작업 완료 시점까지 최대 5초간 대기하도록 수정하여 테스트의 신뢰성을 향상시킴. Ref : #213
- 전반적인 코드 클린업 및 가독성 향상 Ref : #213
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
요약
이번 PR에서는 기술 정보(Tech Info) 도메인의 2차 리팩토링과 Swagger 문서 개선 작업을 진행하였습니다.
주요 목적은 코드의 가독성, 유지보수성 및 확장성을 향상시키고, API 명세를 보다 일관되고 명확하게 제공하는 것입니다.
주요 변경 사항
1. 코드 리팩토링
도메인 및 서비스 계층 정리
Article,Blog,Comment,Like,Scrap엔티티와 관련 서비스(Command/Query) 클래스의 중복 코드 제거리포지토리 및 이벤트 핸들러 개선
ViewEventHandler,LikeEventHandler,CommentEventHandler,BlogEventHandler)의 비동기 처리와 트랜잭션 이벤트 리스너 로직 점검 및 개선유틸리티 및 설정 정리
PageableGenerator,PagedModelGenerator,UpperCaseGenerator등 유틸리티 클래스 코드 간결화 및 주석 보강2. Swagger 문서 개선
API 명세 통일성 강화
Article,Blog,Comment,Like,Scrap)의 API 엔드포인트에 적용된 Swagger Annotation(@Operation,@Parameter,@Schema등) 재검토 및 설명 보강ExceptionCodeAnnotations,ResponseCodeAnnotation)을 통한 일관된 오류 메시지 제공요청/응답 DTO 문서화 보완
ArticleRegistrationRequest,ArticleEditRequest,BlogIntroEditRequest,CommentRegistrationRequest,CommentEditRequest,BlogResponse,ArticleResponse,CommentResponse등 모든 DTO에 대해 상세한 Swagger 명세와 예제 추가3. 테스트 및 검증
참고 사항