Skip to content

Chore: 패키지 구조 변경 #299#307

Closed
kjyy08 wants to merge 3 commits intomainfrom
chore/modular-monolith-architecture
Closed

Chore: 패키지 구조 변경 #299#307
kjyy08 wants to merge 3 commits intomainfrom
chore/modular-monolith-architecture

Conversation

@kjyy08
Copy link
Member

@kjyy08 kjyy08 commented Oct 4, 2025

#️⃣연관된 이슈

#299

📝작업 내용

개요

레이어드 아키텍처의 한계를 극복하고 도메인 경계를 명확히 하기 위해 모듈러 모놀리스 아키텍처로 패키지 구조를 전환했습니다.

주요 변경사항

1. 모듈 구조 재편

  • Common 모듈: 공통 인프라 레이어

    • annotation/: AOP 기반 커스텀 애노테이션 (AlarmTrigger, CheckPostMetaData)
    • config/: 공통 설정 (ai, db, infra, storage, swagger, web)
    • exception/: 공통 예외 클래스
    • handler/: 글로벌 예외 핸들러
    • jwt/: JWT 인증/인가 유틸리티
    • model/: 공통 도메인 모델 (BaseEntity, ErrorCode, PageInfo 등)
    • utils/: 유틸리티 클래스
  • Domain 모듈: 18개 비즈니스 도메인

    • 각 도메인별로 controller/, service/, repository/, model/ 구조화
    • 도메인: user, auth, post, comment, like, bookmark, follow, alarm, report, community, topic, project, together, it, directmessage, file, verify, ai

2. 패키지 경로 전면 변경

  • 기존: kr.co.amateurs.server.domain.controller.* → 신규: kr.co.amateurs.server.domain.*/controller/*
  • 기존: kr.co.amateurs.server.domain.dto.* → 신규: kr.co.amateurs.server.domain.*/model/dto/*
  • 기존: kr.co.amateurs.server.domain.entity.* → 신규: kr.co.amateurs.server.domain.*/model/entity/*
  • 약 398개 파일의 import 문 자동 수정

3. 도메인별 모델 재구성

각 도메인은 다음과 같은 표준 구조를 따릅니다:

domain/{domain-name}/
├── config/                    # 도메인별 설정 (인가 정책 등)
├── controller/                # REST API 엔드포인트
├── service/                   # 비즈니스 로직
├── repository/                # 데이터 액세스 (JPA + JOOQ)
└── model/                     # 도메인 모델
    ├── dto/                   # Request/Response DTO
    ├── entity/                # JPA 엔티티
    ├── event/                 # 도메인 이벤트 (해당 시)
    └── enums/                 # 도메인 Enum

4. 테스트 코드 정리

  • 테스트 패키지 구조를 프로덕션 코드와 동일하게 정렬
  • test/java/kr/co/amateurs/server/common/: 공통 테스트 설정
  • test/java/kr/co/amateurs/server/domain/*/: 도메인별 테스트

5. 문서 및 빌드 설정 개선

  • CLAUDE.md: 모듈러 모놀리스 아키텍처 상세 설명 추가
    • 프로젝트 구조 다이어그램
    • 도메인 모듈 구조 가이드
    • Windows 사용자를 위한 Gradle 명령어 가이드 (gradlew.bat 사용법)
  • build.gradle: Jacoco 커버리지 제외 패턴을 새 구조에 맞게 수정
    • **/common/**, **/domain/*/config/**, **/domain/*/model/**, **/domain/*/repository/** 제외

아키텍처 변경의 장점

  1. 도메인 경계 명확화: 각 도메인이 자체 모델, 서비스, 리포지토리를 포함하여 독립성 강화
  2. 코드 응집도 향상: 관련 기능이 도메인 단위로 그룹화되어 유지보수성 개선
  3. 테스트 용이성: 도메인별 격리된 테스트 작성 가능
  4. 확장성: 향후 마이크로서비스로 전환 시 도메인 단위 분리 용이
  5. 가독성: 패키지 구조만으로 비즈니스 도메인 파악 가능

Breaking Changes

⚠️ 전체 프로젝트 패키지 구조 변경

  • 모든 import 경로 변경
  • 기존 브랜치와의 병합 충돌 가능성 높음
  • 팀원들은 최신 main 브랜치를 pull 받은 후 작업 브랜치를 rebase 해야 합니다

💬리뷰 요구사항(선택) 및 기타 참고사항

테스트 실행

모든 테스트가 정상적으로 통과하는지 확인 부탁드립니다:

# Windows 사용자
gradlew.bat test

# Linux/Mac 사용자
./gradlew test

빌드 확인

JOOQ 코드 생성 및 전체 빌드가 성공하는지 확인 부탁드립니다:

# Windows 사용자
gradlew.bat clean build

# Linux/Mac 사용자
./gradlew clean build

리뷰 포인트

  1. 도메인 모듈 구조가 적절한지 검토 부탁드립니다
  2. Common 모듈의 책임 범위가 명확한지 확인 부탁드립니다
  3. 누락된 import 변경이나 패키지 이동이 있는지 점검 부탁드립니다

✅ 체크리스트

  • 코드 점검 완료했습니다
  • 문서/주석 최신화 완료했습니다
  • 모든 테스트 통과 확인했습니다
  • JOOQ 코드 생성 및 빌드 성공 확인했습니다
  • 398개 파일의 import 경로 변경 완료했습니다

kjyy08 and others added 3 commits October 4, 2025 10:56
- Common 모듈: annotation, config, exception, handler, jwt, model, utils 통합
- Domain 모듈: 17개 도메인별로 config, controller, model, repository, service 구조화
- 테스트 코드 패키지 선언을 실제 디렉토리 구조에 맞게 수정

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- 모듈러 모놀리스 구조 변경으로 인한 import 경로 업데이트
- Config 파일들의 import 경로 수정
- 테스트 코드의 import 경로 수정

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
CLAUDE.md 개선:
- Windows 환경 지원 추가 (gradlew.bat 사용 안내)
- JOOQ 생성 방법 명확화 (jooq-docker 플러그인 vs 로컬 MySQL)
- 모듈러 모놀리스 아키텍처 구조 상세화 (common 모듈 + 18개 domain 모듈)
- 테스트 커버리지 제외 항목 구체화

build.gradle 개선:
- Jacoco 커버리지 제외 패턴을 모듈러 모놀리스 구조에 맞게 수정
- JOOQ 생성 클래스만 정확히 제외 (org/jooq/**)
- 도메인별 설정/모델/리포지토리 제외 패턴 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@coderabbitai
Copy link

coderabbitai bot commented Oct 4, 2025

Important

Review skipped

More than 25% of the files skipped due to max files limit. The review is being skipped to prevent a low-quality review.

193 files out of 300 files are above the max files limit of 100. Please upgrade to Pro plan to get higher limits.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch chore/modular-monolith-architecture

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.

@kjyy08 kjyy08 changed the title Chore: 레이어드 아키텍처에서 모듈러 모놀리스 아키텍처로 전환 #299 Chore: 레이어드 아키텍처에서 모듈러 모놀리스 아키텍처로 패키지 구조 변경 #299 Oct 4, 2025
@github-actions
Copy link

github-actions bot commented Oct 4, 2025

테스트 커버리지

Overall Project 60.47% 🍏
File Coverage
SseController.java 100% 🍏
CommunityController.java 100% 🍏
ReportTargetHandler.java 100% 🍏
ReportController.java 100% 🍏
DirectMessageWebSocketController.java 100% 🍏
LikeController.java 100% 🍏
BookmarkController.java 100% 🍏
CommentController.java 100% 🍏
ProjectController.java 100% 🍏
ITController.java 100% 🍏
AiController.java 100% 🍏
ReportService.java 97.95% 🍏
DirectMessageService.java 97.64% 🍏
AuthService.java 96.25% 🍏
ViewCountService.java 96.13% 🍏
PopularPostService.java 94.21% 🍏
CommentService.java 93.46% 🍏
ProjectService.java 91.21% 🍏
AuthController.java 90.8% 🍏
CommunityService.java 87.75% 🍏
PasswordResetService.java 85.71% 🍏
RefreshTokenService.java 84.56% 🍏
GatheringController.java 83.93% 🍏
MarketController.java 83.93% 🍏
MatchController.java 83.93% 🍏
GatheringService.java 83.04% 🍏
AlarmController.java 82.61% 🍏
MarketService.java 82.57% 🍏
PostRecommendService.java 81.47% 🍏
MatchService.java 80.73% 🍏
AiProfileService.java 80.25% 🍏
DirectMessageController.java 80% 🍏
ITService.java 79.1% 🍏
AlarmService.java 74.07% 🍏
LikeService.java 73.39% 🍏
ViewCountScheduler.java 69.23% 🍏
CustomOAuth2UserService.java 68.73% 🍏
SseService.java 61.94% 🍏
UserController.java 49.37% 🍏
PostEmbeddingService.java 48.72% 🍏
ReportTargetHandlerFactory.java 43.48% 🍏
BookmarkService.java 42.19% 🍏
PostViewEventHandler.java 30.77% 🍏
PopularPostSchedulerService.java 20% 🍏
ReportProcessingManager.java 18.11% 🍏
EmbeddingCleanupSchedulerService.java 17.39% 🍏
FileService.java 16.94% 🍏
PostService.java 14.81% 🍏
PostEmbeddingManageService.java 9.52% 🍏
PopularPostCacheService.java 8.33% 🍏
GeminiReportLLMService.java 7.02% 🍏
AiLlmService.java 5.63% 🍏
UnreferencedImageClearScheduler.java 5% 🍏
AiPostRecommendScehdularService.java 4.17% 🍏
AiProfileSchedulerService.java 3.7% 🍏
EmailService.java 3.67% 🍏
AiAdminController.java 3.45% 🍏
ReportProcessor.java 2.78% 🍏
OAuth2LoginSuccessHandler.java 1.45% 🍏
ReportEventListener.java 0% 🍏
CommentTargetHandler.java 0% 🍏
PostTargetHandler.java 0% 🍏
FileController.java 0% 🍏
FollowService.java 0% 🍏
FollowController.java 0% 🍏

@github-actions
Copy link

github-actions bot commented Oct 4, 2025

테스트 결과

571 tests  ±0   571 ✅ ±0   1m 3s ⏱️ -1s
146 suites ±0     0 💤 ±0 
146 files   ±0     0 ❌ ±0 

Results for commit 74f8d90. ± Comparison against base commit f38a8d5.

This pull request removes 570 and adds 570 tests. Note that renamed tests count towards both.
kr.co.amateurs.server.annotation.alarmtrigger.AlarmAspectTest$AOP_알람_트리거_동작_검증 ‑ 다이렉트_메시지_전송_시_수신자에게_알람이_자동으로_생성된다()
kr.co.amateurs.server.annotation.alarmtrigger.AlarmAspectTest$AOP_트랜잭션_분리_검증 ‑ 알람_생성_실패가_메인_비즈니스_로직에_영향을_주지_않는다()
kr.co.amateurs.server.config.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ ADMIN_권한은_모든_게시판에_접근할_수_있다()
kr.co.amateurs.server.config.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ ANONYMOUS_권한으로_TOGETHER_게시판_접근_시_예외가_발생한다()
kr.co.amateurs.server.config.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ COMMUNITY_카테고리_쓰기_권한을_확인한다()
kr.co.amateurs.server.config.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ COMMUNITY_카테고리_읽기_권한을_확인한다()
kr.co.amateurs.server.config.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ GUEST_권한으로_IT_게시판_쓰기_시_예외가_발생한다()
kr.co.amateurs.server.config.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ IT_카테고리_쓰기_권한을_확인한다()
kr.co.amateurs.server.config.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ IT_카테고리_읽기_권한을_확인한다()
kr.co.amateurs.server.config.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ PROJECT_카테고리_쓰기_권한을_확인한다()
…
kr.co.amateurs.server.common.annotation.alarmtrigger.AlarmAspectTest$AOP_알람_트리거_동작_검증 ‑ 다이렉트_메시지_전송_시_수신자에게_알람이_자동으로_생성된다()
kr.co.amateurs.server.common.annotation.alarmtrigger.AlarmAspectTest$AOP_트랜잭션_분리_검증 ‑ 알람_생성_실패가_메인_비즈니스_로직에_영향을_주지_않는다()
kr.co.amateurs.server.common.annotation.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ ADMIN_권한은_모든_게시판에_접근할_수_있다()
kr.co.amateurs.server.common.annotation.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ ANONYMOUS_권한으로_TOGETHER_게시판_접근_시_예외가_발생한다()
kr.co.amateurs.server.common.annotation.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ COMMUNITY_카테고리_쓰기_권한을_확인한다()
kr.co.amateurs.server.common.annotation.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ COMMUNITY_카테고리_읽기_권한을_확인한다()
kr.co.amateurs.server.common.annotation.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ GUEST_권한으로_IT_게시판_쓰기_시_예외가_발생한다()
kr.co.amateurs.server.common.annotation.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ IT_카테고리_쓰기_권한을_확인한다()
kr.co.amateurs.server.common.annotation.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ IT_카테고리_읽기_권한을_확인한다()
kr.co.amateurs.server.common.annotation.checkpostmetadata.CheckPostMetaDataPolicyTest ‑ PROJECT_카테고리_쓰기_권한을_확인한다()
…

@kjyy08 kjyy08 changed the title Chore: 레이어드 아키텍처에서 모듈러 모놀리스 아키텍처로 패키지 구조 변경 #299 Chore: 패키지 구조 변경 #299 Oct 13, 2025
@kjyy08 kjyy08 closed this Oct 13, 2025
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

Comments