Skip to content

Conversation

@essaysir
Copy link
Contributor

@essaysir essaysir commented Feb 1, 2026

단일 모듈 구조에서 멀티모듈 구조로 마이그레이션하는 작업입니다.

1. 왜 멀티모듈인가?

기존 (단일 모듈) 변경 후 (멀티모듈)
모든 코드가 하나의 모듈에 혼재 관심사별로 모듈 분리 가능
의존성이 전체에 영향 모듈별 독립적인 의존성 관리
빌드 시 전체 재빌드 변경된 모듈만 빌드 (증분 빌드)
테스트 범위 불명확 모듈 단위 테스트 가능

새로운 프로젝트 구조

juinjang/
├── build.gradle.kts # 루트: 공통 설정, BOM 관리
├── settings.gradle # 모듈 정의
├── gradle/
│ └── libs.versions.toml # Version Catalog (의존성 버전 중앙 관리)
└── apps/
└── juinjang-api/ # API 모듈 (현재 모든 소스)
└── build.gradle.kts
Summary

기존 단일 모듈 Spring Boot 프로젝트를 Gradle 멀티모듈 구조로 전환하고, 빌드
시스템을 Kotlin DSL로 마이그레이션한 대규모 리팩터링입니다.

변경 개요
커밋: refactor: Gradle Kotlin DSL로 빌드 시스템 마이그레이션
설명: build.gradle → build.gradle.kts 전환, Groovy DSL에서 Kotlin DSL로
마이그레이션
────────────────────────────────────────
커밋: refactor: 멀티모듈 구조로 소스 코드 이동
설명: 기존 src/ 하위 소스를 apps/juinjang-api/ 모듈로 이동 (389개 파일)
────────────────────────────────────────
커밋: build: CI/CD 및 Docker 설정 멀티모듈 구조 반영
설명: GitHub Actions CI/CD 워크플로우 및 Dockerfile 경로를 멀티모듈 구조에 맞게
수정
────────────────────────────────────────
커밋: chore: EditorConfig 설정 추가
설명: 프로젝트 전체 코드 스타일 통일을 위한 .editorconfig 추가
────────────────────────────────────────
커밋: build: 루트 빌드 스크립트 및 버전 관리 체계 개편
설명: 루트 build.gradle.kts 전면 재작성, gradle.properties 버전 중앙 관리,
settings.gradle.kts pluginManagement 구성
────────────────────────────────────────
커밋: refactor: 공통 모듈 분리 (jpa, redis)
설명: BaseEntity, JpaConfig, QueryDslConfig, RedisConfig를 독립 라이브러리 모듈로
분리
────────────────────────────────────────
커밋: refactor: 지원 모듈 분리 (logging, monitoring)
설명: logback 설정 및 Actuator/Micrometer Prometheus 설정을 지원 모듈로 분리
────────────────────────────────────────
커밋: refactor: API 모듈 의존성 정리 및 설정 통합
설명: API 모듈에서 이동된 설정 제거, config import 기반 application.yml 통합,
TestContainers 적용
────────────────────────────────────────
커밋: fix: 타임존 Asia/Seoul 설정 추가
설명: Dockerfile TZ 환경변수 + JVM 옵션 + Application 레벨 타임존 설정
────────────────────────────────────────
커밋: chore: 로컬 개발 Docker Compose 환경 구성
설명: MySQL 8.0 + Redis 7.0 로컬 개발용 Docker Compose 추가
모듈 구조

juinjang (root)
├── apps/
│ └── juinjang-api/ # API 애플리케이션 (bootJar)
├── modules/
│ ├── jpa/ # JPA/QueryDSL 공통 설정 + BaseEntity + TestContainers
│ └── redis/ # Redis 공통 설정
├── supports/
│ ├── logging/ # Logback 설정 (프로필별 파일/콘솔 로깅)
│ └── monitoring/ # Actuator + Micrometer Prometheus 메트릭
└── docker/ # 로컬 개발 인프라 (MySQL, Redis)

주요 변경 사항

  1. 빌드 시스템
  • Groovy → Kotlin DSL 전면 전환
  • 버전 관리: libs.versions.toml → gradle.properties로 중앙 관리
  • 플러그인: settings.gradle.kts의 pluginManagement에서 버전 해석
  • kapt + Lombok 공존: keepJavacAnnotationProcessors = true로 javac AP 보존
  • Jacoco, ktlint 전 서브프로젝트 공통 적용
  1. 모듈 분리
  • modules/jpa: BaseEntity, JpaConfig, QueryDslConfig + 프로필별 datasource 설정
    (jpa.yml)
  • modules/redis: RedisConfig + 프로필별 Redis 설정 (redis.yml)
  • supports/logging: logback 설정을 리소스 전용 모듈로 분리 (appender 재사용,
    프로필별 로깅)
  • supports/monitoring: Actuator + Prometheus 메트릭 설정 분리 (관리 포트 8081)
  • 각 모듈은 java-test-fixtures 플러그인으로 테스트 지원 코드 제공
  1. 설정 통합
  • application.yml에서 spring.config.import로 모듈별 설정 파일 통합
    spring.config.import: monitoring.yml, jpa.yml, redis.yml, logging.yml
  • 프로필별(local/test/dev/prod) 설정이 각 모듈 yml에 자체 포함
  1. 테스트 인프라
  • TestContainers MySQL 8.0 설정 추가 (modules/jpa/src/testFixtures/)
  • IntegrationTestSupport에 @import(MySqlTestContainersConfig.class) 적용
  1. 기타
  • 타임존: Dockerfile + JVM + Application 3중 Asia/Seoul 설정
  • Docker Compose: MySQL 8.0 + Redis 7.0 로컬 개발 환경
  • .editorconfig: 프로젝트 전체 코드 스타일 통일

Test plan

  • ./gradlew :apps:juinjang-api:build -x test 빌드 성공 확인
  • ./gradlew :apps:juinjang-api:test 테스트 통과 확인
  • ./gradlew :modules:jpa:build JPA 모듈 단독 빌드 확인
  • ./gradlew :modules:redis:build Redis 모듈 단독 빌드 확인
  • Docker Compose로 로컬 인프라 기동 확인 (docker compose -f
    docker/infra-compose.yml up -d)
  • dev 프로필로 애플리케이션 정상 기동 확인

essaysir and others added 10 commits February 1, 2026 23:40
- build.gradle -> build.gradle.kts 변환
- Version Catalog (libs.versions.toml) 적용
- 멀티모듈 구조 설정 (settings.gradle)

Co-Authored-By: Claude Opus 4.5 <[email protected]>
- src/ -> apps/juinjang-api/ 모듈로 이동
- OpenFeign, Spring Retry, Redis 의존성 추가

Co-Authored-By: Claude Opus 4.5 <[email protected]>
- GitHub Actions 워크플로우 경로 업데이트
- Dockerfile 빌드 경로 수정

Co-Authored-By: Claude Opus 4.5 <[email protected]>
Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Gradle Kotlin DSL 루트 빌드 스크립트 전면 재작성 (kapt, jacoco, ktlint 통합)
- gradle.properties로 버전 중앙 관리 체계 전환 (libs.versions.toml 제거)
- settings.gradle.kts로 멀티모듈 includes 및 pluginManagement 구성
- .gitignore에 .claude/, .kotlin/ 추가

Co-Authored-By: Claude Opus 4.6 <[email protected]>
- modules/jpa: BaseEntity, JpaConfig, QueryDslConfig, TestContainers 설정 분리
- modules/redis: RedisConfig 및 프로필별 Redis 설정 분리
- 프로필별 datasource/redis 설정을 각 모듈의 yml로 관리

Co-Authored-By: Claude Opus 4.6 <[email protected]>
- supports/logging: logback 설정을 독립 모듈로 분리 (프로필별 파일/콘솔 로깅)
- supports/monitoring: Actuator + Micrometer Prometheus 메트릭 모듈 분리

Co-Authored-By: Claude Opus 4.6 <[email protected]>
- 공통 모듈(jpa, redis)과 지원 모듈(logging, monitoring) 의존성으로 전환
- application.yml에서 config import로 모듈별 설정 통합
- API 모듈에서 이동된 설정 파일 제거 (JpaConfig, RedisConfig, BaseEntity, logback-*.xml)
- IntegrationTestSupport에 TestContainers 설정 적용

Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Dockerfile-dev/prod: TZ 환경변수 및 JVM -Duser.timezone 옵션 추가
- JuinjangApplication: TimeZone.setDefault로 애플리케이션 레벨 타임존 설정

Co-Authored-By: Claude Opus 4.6 <[email protected]>
- MySQL 8.0, Redis 7.0 로컬 개발용 Docker Compose 설정 추가
- 개발 환경 구성 가이드 README 추가

Co-Authored-By: Claude Opus 4.6 <[email protected]>
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