Skip to content

Refactor: 게시글, 알림 리팩토링#59

Merged
gratisreise merged 7 commits intomainfrom
dev
Mar 8, 2026
Merged

Refactor: 게시글, 알림 리팩토링#59
gratisreise merged 7 commits intomainfrom
dev

Conversation

@gratisreise
Copy link
Owner

@gratisreise gratisreise commented Mar 8, 2026

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 게시물 검색 기능 추가 (키워드, 태그, 카테고리별 필터 지원)
    • 알림 설정 관리 기능 (알림 유형별 ON/OFF 토글)
    • 개발 환경용 Docker Compose 설정 추가
  • 개선사항

    • 게시물 수정 시 선택적 이미지 처리 개선
    • 토큰 관리 및 새로고침 로직 강화
    • 다양한 API 엔드포인트의 응답 구조 최적화
  • 기타

    • 내부 코드 구조 정리 및 최적화

- Tag 도메인을 Article 도메인 하위로 통합
- deprecated 엔드포인트 제거 (/all, /all/search, /me/search)
- 생성/수정/삭제 API 응답을 204 No Content로 변경
- 생성 API 이미지 필수, 수정 API 이미지 선택으로 변경
- CMissingDataException을 BusinessException + ErrorCode 패턴으로 변경
- MemberController 응답 형식 toNoContent()로 통일
- NotificationSetting 도메인 member 패키지로 이동
- 알림 설정 조회/토글 API 추가
- notificationsetting 도메인을 member 패키지로 통합
- ErrorCode enum 구조 개선 및 중복 제거
- QuerydslConfig, Docker Compose 개발 환경 설정 추가
- AnalyzeStatus, WritingStyle enum 추가
- OAuth 및 각 도메인 서비스 코드 정리
- GET /api/articles: 목록조회 전용 (Pageable만)
- GET /api/articles/search: 검색 전용 (keyword, tag, categoryId)
- GET /api/articles/me: 내 게시글 목록조회 전용
- GET /api/articles/me/search: 내 게시글 검색 전용

조건문 분기 처리 제거로 단일 책임 원칙 준수
CategoryResponse에 @builder와 from() 정적 팩토리 메서드를 적용하여
객체 생성 방식을 개선하고 전체 코드 포맷팅 정리
- TokenService: reissueToken 로직 수정 (RT 검증 → Redis 대조 → 기존 RT 삭제 → 새 토큰 발급)
- LoginResponse, RefreshResponse: record → class + @builder + of() 정적 팩토리 적용
- RefreshTokenService: 미사용 클래스 삭제
- OAuth 관련 클래스 코드 포맷팅 및 정리
@gratisreise gratisreise merged commit 076932e into main Mar 8, 2026
0 of 3 checks passed
@coderabbitai
Copy link

coderabbitai bot commented Mar 8, 2026

Caution

Review failed

The pull request is closed.

Note

.coderabbit.yaml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key(s) in object: 'linters', 'tools', 'pre_merge_checks', 'path_filters', 'path_instructions'
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ba1824c4-ac23-4445-95d7-78f7e8fca1f9

📥 Commits

Reviewing files that changed from the base of the PR and between 8d964af and 8181442.

⛔ Files ignored due to path filters (2)
  • .serena/cache/java/document_symbols.pkl is excluded by !**/*.pkl
  • .serena/cache/java/raw_document_symbols.pkl is excluded by !**/*.pkl
📒 Files selected for processing (88)
  • .serena/.gitignore
  • .serena/project.yml
  • compose.dev.yml
  • src/main/java/com/mylog/common/annotations/OAuthServiceType.java
  • src/main/java/com/mylog/common/enums/AnalyzeStatus.java
  • src/main/java/com/mylog/common/enums/WritingStyle.java
  • src/main/java/com/mylog/common/exception/ErrorCode.java
  • src/main/java/com/mylog/common/response/SuccessResponse.java
  • src/main/java/com/mylog/config/QuerydslConfig.java
  • src/main/java/com/mylog/domain/article/ArticleController.java
  • src/main/java/com/mylog/domain/article/ArticleService.java
  • src/main/java/com/mylog/domain/article/dto/request/ArticleCreateRequest.java
  • src/main/java/com/mylog/domain/article/entity/Article.java
  • src/main/java/com/mylog/domain/article/entity/ArticleTag.java
  • src/main/java/com/mylog/domain/article/entity/Tag.java
  • src/main/java/com/mylog/domain/article/repository/ArticleRepository.java
  • src/main/java/com/mylog/domain/article/repository/ArticleRepositoryCustom.java
  • src/main/java/com/mylog/domain/article/repository/TagRepository.java
  • src/main/java/com/mylog/domain/article/repository/impl/ArticleRepositoryImpl.java
  • src/main/java/com/mylog/domain/article/service/ArticleReader.java
  • src/main/java/com/mylog/domain/article/service/ArticleWriter.java
  • src/main/java/com/mylog/domain/article/service/TagReader.java
  • src/main/java/com/mylog/domain/article/service/TagWriter.java
  • src/main/java/com/mylog/domain/auth/AuthController.java
  • src/main/java/com/mylog/domain/auth/dto/request/LoginRequest.java
  • src/main/java/com/mylog/domain/auth/dto/request/OAuthRequest.java
  • src/main/java/com/mylog/domain/auth/dto/request/RefreshRequest.java
  • src/main/java/com/mylog/domain/auth/dto/request/SignUpRequest.java
  • src/main/java/com/mylog/domain/auth/dto/response/LoginResponse.java
  • src/main/java/com/mylog/domain/auth/dto/response/RefreshResponse.java
  • src/main/java/com/mylog/domain/auth/service/AuthService.java
  • src/main/java/com/mylog/domain/auth/service/RefreshTokenService.java
  • src/main/java/com/mylog/domain/auth/service/TokenService.java
  • src/main/java/com/mylog/domain/auth/service/oauth/OAuthUserService.java
  • src/main/java/com/mylog/domain/auth/service/oauth/OAuthUserServiceFactory.java
  • src/main/java/com/mylog/domain/auth/service/oauth/impl/GoogleOAuthUserService.java
  • src/main/java/com/mylog/domain/auth/service/oauth/impl/KakaoOAuthUserService.java
  • src/main/java/com/mylog/domain/auth/service/oauth/impl/NaverOAuthUserService.java
  • src/main/java/com/mylog/domain/category/Category.java
  • src/main/java/com/mylog/domain/category/CategoryController.java
  • src/main/java/com/mylog/domain/category/dto/CategoryCreateRequest.java
  • src/main/java/com/mylog/domain/category/dto/CategoryResponse.java
  • src/main/java/com/mylog/domain/category/dto/CategoryUpdateRequest.java
  • src/main/java/com/mylog/domain/category/repository/CategoryRepository.java
  • src/main/java/com/mylog/domain/category/service/CategoryReader.java
  • src/main/java/com/mylog/domain/category/service/CategoryWriter.java
  • src/main/java/com/mylog/domain/comment/CommentController.java
  • src/main/java/com/mylog/domain/comment/dto/CommentCreateRequest.java
  • src/main/java/com/mylog/domain/comment/dto/Reply.java
  • src/main/java/com/mylog/domain/comment/entity/Comment.java
  • src/main/java/com/mylog/domain/comment/repository/CommentRepository.java
  • src/main/java/com/mylog/domain/comment/repository/CommentRepositoryCustom.java
  • src/main/java/com/mylog/domain/comment/service/CommentReader.java
  • src/main/java/com/mylog/domain/comment/service/CommentWriter.java
  • src/main/java/com/mylog/domain/member/MemberController.java
  • src/main/java/com/mylog/domain/member/MemberService.java
  • src/main/java/com/mylog/domain/member/dto/MemberResponse.java
  • src/main/java/com/mylog/domain/member/dto/NotificationSettingResponse.java
  • src/main/java/com/mylog/domain/member/entity/Member.java
  • src/main/java/com/mylog/domain/member/entity/NotificationSetting.java
  • src/main/java/com/mylog/domain/member/repository/MemberRepository.java
  • src/main/java/com/mylog/domain/member/repository/NotificationSettingRepository.java
  • src/main/java/com/mylog/domain/member/service/MemberReader.java
  • src/main/java/com/mylog/domain/member/service/MemberWriter.java
  • src/main/java/com/mylog/domain/member/service/NotificationSettingReader.java
  • src/main/java/com/mylog/domain/member/service/NotificationSettingWriter.java
  • src/main/java/com/mylog/domain/notification/Notification.java
  • src/main/java/com/mylog/domain/notification/NotificationController.java
  • src/main/java/com/mylog/domain/notification/repository/NotificationRepositoryCustom.java
  • src/main/java/com/mylog/domain/notification/service/NotificationReader.java
  • src/main/java/com/mylog/domain/notification/service/NotificationWriter.java
  • src/main/java/com/mylog/domain/notificationsetting/NotificationSettingController.java
  • src/main/java/com/mylog/domain/notificationsetting/service/NotificationSettingReader.java
  • src/main/java/com/mylog/domain/tag/repository/TagRepositoryCustom.java
  • src/main/java/com/mylog/domain/tag/service/TagWriter.java
  • src/main/java/com/mylog/external/oauth/OAuthUserInfo.java
  • src/main/java/com/mylog/external/oauth/google/GoogleApiClient.java
  • src/main/java/com/mylog/external/oauth/google/GoogleTokenResponse.java
  • src/main/java/com/mylog/external/oauth/google/GoogleUserInfoResponse.java
  • src/main/java/com/mylog/external/oauth/kakao/KakaoApiClient.java
  • src/main/java/com/mylog/external/oauth/kakao/KakaoTokenResponse.java
  • src/main/java/com/mylog/external/oauth/kakao/KakaoUserInfoResponse.java
  • src/main/java/com/mylog/external/oauth/naver/NaverApiClient.java
  • src/main/java/com/mylog/external/oauth/naver/NaverTokenResponse.java
  • src/main/java/com/mylog/external/oauth/naver/NaverUserInfoResponse.java
  • src/main/java/com/mylog/external/redis/RedisConfig.java
  • src/main/java/com/mylog/external/redis/RedisService.java
  • src/main/resources/application-dev.yml

📝 Walkthrough

Walkthrough

프로젝트 전반에 걸친 대규모 리팩토링으로, Member와 NotificationSetting 엔티티를 entity 서브패키지로 이동, Tag를 article 도메인으로 통합, OAuth 서비스 주석 명칭 변경, 토큰 관리를 RedisService로 중앙화하고, 응답 상태 코드를 204 No Content로 표준화했습니다.

Changes

Cohort / File(s) Summary
토큰 및 인증 관리
src/main/java/com/mylog/domain/auth/service/TokenService.java, src/main/java/com/mylog/external/redis/RedisService.java
Refresh token과 blacklist 관리를 RedisService로 중앙화했으나, reissueToken에서 제공된 refreshToken을 Redis에 저장된 토큰과 비교하는 로직의 타이밍과 삭제 순서 검증 필요.
OAuth 사용자 저장 흐름
src/main/java/com/mylog/domain/auth/service/oauth/impl/GoogleOAuthUserService.java, src/main/java/com/mylog/domain/auth/service/oauth/impl/KakaoOAuthUserService.java, src/main/java/com/mylog/domain/auth/service/oauth/impl/NaverOAuthUserService.java, src/main/java/com/mylog/domain/member/service/MemberWriter.java
authenticate 메서드에서 memberWriter.saveOrUpdate를 호출하는데, saveOrUpdate가 provider/providerId 조회에 실패하면 새 회원 생성. 중복 가입 방지 로직과 provider 필드 업데이트 일관성 확인 필요.
Article 이미지 처리
src/main/java/com/mylog/domain/article/ArticleService.java
updateArticle에서 file이 null이거나 empty일 때 imageUrl을 null로 설정하는데, 기존 이미지를 제거할 의도인지 명확하지 않음. 부분 업데이트 시 S3 정리 로직 확인 필요.
삭제 메서드 리팩토링
src/main/java/com/mylog/domain/member/MemberService.java, src/main/java/com/mylog/domain/member/service/MemberWriter.java
deleteMember → delete로 변경, writer.delete(member)에서 writer.deleteById(memberId)로 변경. 메시지, 알림, 카테고리 등 FK 제약조건 처리 전략 확인 필요.
에러 처리 표준화
src/main/java/com/mylog/domain/member/service/NotificationSettingReader.java, src/main/java/com/mylog/domain/comment/service/CommentReader.java, src/main/java/com/mylog/domain/notification/service/NotificationReader.java
CMissingDataException → BusinessException + ErrorCode로 변경했으나, 일부 메서드가 null을 반환하는 stub으로 변경됨. getComments1 메서드명이 부자연스러우며 실제 구현 상태 확인 필요.
CommentRepositoryCustom 제거
src/main/java/com/mylog/domain/comment/repository/CommentRepositoryCustom.java
findMyArticlesComments 메서드가 제거되었으나, 이를 대체하는 쿼리가 명확하지 않음. CommentReader.getComments 구현 완료 필요.
Tag 도메인 이동
src/main/java/com/mylog/domain/article/entity/Tag.java, src/main/java/com/mylog/domain/article/service/TagWriter.java
Tag.from(tagname) 팩토리 메서드 추가, TagWriter 새로 추가되었으나 saveTag 메서드 본문이 비워있음. 비동기 저장 로직 구현 상태 확인 필요.
Configuration 추가
.serena/project.yml, src/main/java/com/mylog/config/QuerydslConfig.java, compose.dev.yml
Serena 프로젝트 설정 및 QuerydslConfig 추가되었으나, QuerydslConfig가 빈 설정 클래스. Querydsl 의존성 필요 시 설정 누락 확인.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

Poem

🔄 회원과 토큰, 태그를 정리하고
🎯 응답은 204로 맞춰서
🔐 Redis에서 토큰을 지키고
🚀 OAuth 사용자를 우아하게 담아내네
✨ 구조는 깔끔해졌지만, 빈 구현이 노크하고 있어

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch dev

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai bot mentioned this pull request Mar 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant