Skip to content

SCRUM-498 refactor: 바운디드 컨텍스트 기준 멀티모듈 전환 - #119

Open
jih023 wants to merge 12 commits into
developfrom
refactor/SCRUM-498-multi-module
Open

jih023 wants to merge 12 commits into
developfrom
refactor/SCRUM-498-multi-module

Conversation

@jih023

@jih023 jih023 commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Jira

SCRUM-498

변경 요약

단일 Gradle 모듈을 바운디드 컨텍스트 기준 멀티모듈로 전환했다. 모듈 하나 = 컨텍스트 하나(user-api·user·place·course·report·area·direction·media) + 보조 모듈(common·mobile·app). 패키지 구조·코드 로직은 바뀌지 않았고, ArchUnit이 테스트 시점에 잡던 경계가 컴파일 시점(Gradle 의존 선언)으로 당겨진다.

app      → 전부 (BackendApplication·bootstrap·application.yml·Flyway·통합 테스트)
mobile   → user-api, course, place, area
user     → user-api, course, place, media, area
course   → user-api, place, area
report   → user-api, course
place    → area
user-api, area, direction, media → common

단계별 커밋 5개로 나눴다(각 단계마다 build·archTest·전체 테스트·Docker 빌드 통과 확인).

  1. refactor(build) — src/ → app/, buildSrc 컨벤션 플러그인(backend.kotlin-conventions), 루트 JaCoCo 집계, Dockerfile·CI 경로
  2. refactor(common) — common 모듈 + bootstrap 에 있던 계약(@RequiresAppFeature·@CurrentUserId·@AccessTokenRequired·OpenSearchProperties)을 common 으로, *Properties·JwtTokenProvider 를 소유 컨텍스트로 이동 → 도메인→bootstrap 의존 0
  3. refactor(domain) — area·direction·media 모듈 + backend.domain-conventions 플러그인
  4. refactor(domain) — place·course·user 모듈. user⇄course 순환은 user-api(user 의 도메인 모델 + 인바운드 포트·DTO = Published Language)를 분리해 해소
  5. refactor(mobile) — BFF 모듈 분리. app 에는 부트스트랩 22 파일·리소스·통합 테스트만 남음

이후 추가 커밋:

  • chore(build) — 버전 카탈로그 도입. Spring Boot BOM 밖이라 각 build.gradle.kts 에 문자열로 흩어져 있던 버전(플러그인 4 + 라이브러리 15)을 gradle/libs.versions.toml 로 모았다. 모듈은 libs.* 접근자, buildSrc 도 같은 toml 을 읽어 플러그인 버전까지 한곳에서 관리한다(컨벤션 플러그인은 접근자가 없어 lib("alias") 이름 조회). BOM 관리 라이브러리·보안 패치 extra[] 는 그대로. 전 모듈 의존성 해석 결과 전후 동일 확인.
  • chore(merge) — develop 머지(신고·따라가기·애플 로그인 등). develop 의 단일 모듈 위치 코드를 멀티모듈로 옮기며 정리:
    • 신고(report) 컨텍스트 → report 모듈 신설(backend.domain-conventions, user-api·course 의존). settings·루트 JaCoCo 집계·app 의존·Dockerfile COPY 등록. ReportControllerTest(통합)는 app, ReportServiceTest(단위)는 모듈에.
    • 색인용 OpenSearch 클라이언트 qualifier(OpenSearchConfig.INDEX_CLIENT)는 place·course 가 app 을 참조할 수 없어 common.search.OpenSearchIndexClient.NAME 으로 이동.
    • AppleOauthProperties 는 카카오·구글과 같이 user/adapter/outbound/social 로, 따라가기 등 새 코드의 bootstrap.* import 는 common.*·user 모듈 경로로 교정.
    • develop 이 삭제한 TracingCourseTable·AddedPlaceTable·CourseInteractionRepository(따라가기 course 이관, SCRUM-583)는 삭제 수용.
  • chore(architecture) — ArchUnit domains 목록에 report 추가(도메인 간 inbound 포트만 참조 규칙 적용). coreDomains 에는 넣지 않음.

리뷰 시 알아야 할 결정

  • 영속성 internal 해제(33 파일): internal 이 Gradle 모듈 단위가 되면서 app 에 남은 통합 테스트가 Exposed Table 로 픽스처를 넣을 수 없어 해제했다. 접근 제한은 모듈 의존 선언 + ArchUnit 규칙 2·4·5·7·8 이 계속 담당한다(archTest 통과).
  • 테스트 배치: 컨텍스트를 띄우지 않는 단위 테스트는 해당 모듈로 이동(총 84 파일), @SpringBootTest 통합 테스트는 app 유지. 테스트 수 1058 → 1058(동일, 전부 통과). develop 머지 후 1109 개 전부 통과 + archTest 11 개 통과.
  • CI: 커버리지는 루트 testCodeCoverageReport(jacoco-report-aggregation) xml 로 바뀌었고, diff_coverage.py 는 <module>/src/main/... 경로를 접미사 매칭한다. ktlint 글롭·opensearch-it 경로 필터·Dockerfile COPY 경로 갱신.
  • .ai 위키(architecture.md)의 패키지/internal/테스트 규칙 서술은 별도 갱신 예정.
  • develop 에서 들어온 .github/wiki-sync/mapping.tsv 는 아직 단일 모듈 경로(src/main/...)라 머지 후 위키 갱신 감지가 매칭되지 않는다 — 위키 sync.md 표와 함께 후속 갱신 필요.

변경 유형

  • chore (설정/기타) — refactor(빌드 구조)

체크리스트

  • 로컬에서 ./gradlew build 통과 (build archTest testCodeCoverageReport + Docker 빌드)
  • 테스트 추가/수정 (해당 시) — 이동만, 추가·삭제 없음
  • 민감정보(키·시크릿·application 비밀값)를 커밋하지 않음

@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

Backend CI 리포트 — 500a919 · @jih023

포맷 (ktlint) ✅

위반 없음


테스트 & 커버리지 ✅

라인 커버리지(instruction): 94.6%


변경분 커버리지 (diff) ✅

변경 라인 커버리지: 100% (39/39) · 임계 90% ✅ 통과


도커 빌드 & Trivy(패키지 CVE) ✅

이미지 빌드: 성공 · 취약점 CRITICAL 0 · HIGH 10 (CRITICAL만 차단)

취약점 보기 (베이스 이미지 패키지)
심각도 ID 패키지 버전
HIGH CVE-2026-89407 com.fasterxml.jackson.core:jackson-core 2.21.4 → 2.18.11, 2.21.7, 2.22.3
HIGH CVE-2026-89425 com.fasterxml.jackson.core:jackson-core 2.21.4 → 2.21.7, 2.22.3, 2.18.11
HIGH CVE-2026-68497 com.fasterxml.jackson.core:jackson-databind 2.21.4 → 2.18.10, 2.21.6, 2.22.2
HIGH CVE-2026-91776 com.fasterxml.jackson.core:jackson-databind 2.21.4 → 2.18.11, 2.21.7, 2.22.3
HIGH CVE-2026-91777 com.fasterxml.jackson.core:jackson-databind 2.21.4 → 2.21.7, 2.18.11, 2.22.3
HIGH CVE-2026-89407 tools.jackson.core:jackson-core 3.1.4 → 3.1.7, 3.2.2
HIGH CVE-2026-89425 tools.jackson.core:jackson-core 3.1.4 → 3.1.7, 3.2.3
HIGH CVE-2026-68497 tools.jackson.core:jackson-databind 3.1.4 → 3.2.2, 3.1.6
HIGH CVE-2026-91776 tools.jackson.core:jackson-databind 3.1.4 → 3.1.7, 3.2.3
HIGH CVE-2026-91777 tools.jackson.core:jackson-databind 3.1.4 → 3.1.7, 3.2.3

코드 보안 (Trivy fs + Semgrep) ✅

발견 1건

종류 심각도 내용 위치
🐞 SAST ERROR The Python documentation recommends using defusedxml instead of `xml .github/scripts/diff_coverage.py:20

아키텍처 경계 (ArchUnit) ✅

헥사고날·도메인 분리 경계 규칙 통과 (도메인/레이어/common 격리)

@jih023 jih023 self-assigned this Oct 4, 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