Skip to content

Conversation

@rowing0328
Copy link
Collaborator

요약

이번 PR에서는 기술 정보(Tech Info) 도메인의 2차 리팩토링과 Swagger 문서 개선 작업을 진행하였습니다.
주요 목적은 코드의 가독성, 유지보수성 및 확장성을 향상시키고, API 명세를 보다 일관되고 명확하게 제공하는 것입니다.

주요 변경 사항

1. 코드 리팩토링

  • 도메인 및 서비스 계층 정리

    • Article, Blog, Comment, Like, Scrap 엔티티와 관련 서비스(Command/Query) 클래스의 중복 코드 제거
    • Command와 Query 서비스의 책임을 명확히 구분하여 인터페이스와 구현체 개선
  • 리포지토리 및 이벤트 핸들러 개선

    • MongoDB 및 JPA 리포지토리 인터페이스 정리 및 커스텀 쿼리 최적화
    • 이벤트 핸들러(ViewEventHandler, LikeEventHandler, CommentEventHandler, BlogEventHandler)의 비동기 처리와 트랜잭션 이벤트 리스너 로직 점검 및 개선
  • 유틸리티 및 설정 정리

    • PageableGenerator, PagedModelGenerator, UpperCaseGenerator 등 유틸리티 클래스 코드 간결화 및 주석 보강
    • Async/Retry 설정과 캐시 구성(Caffeine, Redis) 관련 설정 코드 리팩토링

2. Swagger 문서 개선

  • API 명세 통일성 강화

    • 각 컨트롤러(Article, Blog, Comment, Like, Scrap)의 API 엔드포인트에 적용된 Swagger Annotation(@Operation, @Parameter, @Schema 등) 재검토 및 설명 보강
    • 예외 코드 Annotation(ExceptionCodeAnnotations, ResponseCodeAnnotation)을 통한 일관된 오류 메시지 제공
  • 요청/응답 DTO 문서화 보완

    • ArticleRegistrationRequest, ArticleEditRequest, BlogIntroEditRequest,
      CommentRegistrationRequest, CommentEditRequest, BlogResponse,
      ArticleResponse, CommentResponse 등 모든 DTO에 대해 상세한 Swagger 명세와 예제 추가

3. 테스트 및 검증

  • 모든 단위 테스트 및 통합 테스트가 성공적으로 통과됨을 확인
  • Swagger UI 상에서 API 요청/응답 예제가 명확하게 표시되는 것을 검증

참고 사항

  • 변경된 코드와 API 명세는 프론트엔드 및 관련 팀과 협업하여 검토되었으며, 지속적인 피드백을 반영할 예정입니다.
  • 이번 리팩토링으로 기술 정보 도메인의 구조가 개선되어, 향후 새로운 기능 추가 및 유지보수 작업이 용이해졌습니다.

- 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
- BlogRepository 인터페이스 정의: 블로그 저장, 조회(아이디, 사용자 아이디, 닉네임 기반) 및 삭제 관련 메소드 구현
- 사용자 닉네임으로 블로그 아이디 조회하는 커스텀 쿼리(@query) 추가
- JpaRepository를 확장하는 BlogJpaRepository 인터페이스 추가하여 기본 CRUD 기능과 커스텀 메소드 통합 지원

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
@rowing0328 rowing0328 added the 🛠️ Refactor 코드 리팩토링 label Apr 3, 2025
@rowing0328 rowing0328 self-assigned this Apr 3, 2025
@rowing0328 rowing0328 merged commit c971f1a into main Apr 3, 2025
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🛠️ Refactor 코드 리팩토링

Projects

Status: 완료

Development

Successfully merging this pull request may close these issues.

2 participants