Gradle Multi Module설정법

taehee kim·2023년 3월 28일

0.기술 사용 배경

  • 기존 프로젝트에서 Spring-Batch를 활용하게 되면서 빌드 시 Web API 와 Batch Server를 각각 빌드하고 배포할 필요가 생김.(SSE도 추가 예정.)

1. 구현 시 중점을 둔 부분

  • module을 총 3개(module-api, module-core, module-batch)로 구성하여 Web관련 부분과 Batch관련 부분이 따로 빌드될 수 있도록 하였음.
  • module-core에는 Domain Model내 포함된 핵심 비지니스 로직과 데이터 접근 계층만 포함되도록 분리하고 이를 다른 모듈에서 활용할 수 있도록 하였음.
    • 비지니스 로직을 Service Layer가 아닌 Domain Model Entity에 포함되도록 해야 module-batch 비지니스 로직을 잘 활용할 수 있음을 확인하고 이를 지키기 위해 노력하였음.
    • Entity, DAO가 주를 이룸.
  • module-api에는 WAS를 빌드하는데 필요한 Controller, Service, Spring Security등의 인증/인가 내용을 포함.
  • module-batch에는 Job, Tasklet, 비동기 알림 처리시 필요한 Service, Scheduling과 관련된 설정등을 위치시킴.
  • module-sse

2. 구현 상세

1. 프로젝트 및 모듈 생성

  • Root project 생성
    • src삭제
    • build.gradle 삭제
  • module-api생성
    • settings.gradle삭제
  • module-batch생성
    • settings.gradle삭제
  • module-core생성
    • settings.gradle삭제

2. root project경로 settings.gradle 설정

rootProject.name = '42Partner'
include 'module-api'
include 'module-core'
include 'module-batch'
  • 현재 root project가 어떤 모듈들을 사용하고 있는지 설정.
  • settings.gradle은 root project에만 존재하고 각각의 모듈내에 존재하지 않도록 삭제.

3. module-core에 의존하는 module build.gradle설정에 의존성 추가

//module-core참조, settings.gradle에서 세팅한 모듈이름과 같아야함.
implementation project(':module-core')

4. tasks.register("prepareKotlinBuildScriptModel"){}

  • api, batch등의 빌드되는 모듈에 build.gradle에 다음 문구 추가
    • tasks.register("prepareKotlinBuildScriptModel"){}

5. SpringBootApplication ComponentScan 경로 수정

  • @SpringBootApplication은 현재 위치한 경로및 하위에서 ComponentScan을 하기 때문에 module-core에 있는 bean들은 스캔되지 못하므로 명시적으로 설정해준다.
@SpringBootApplication(
	scanBasePackages = {"partner42.moduleapi", "partner42.modulecommon"}
)
public class ModuleApiApplication {
	public static void main(String[] args) {
		SpringApplication.run(ModuleApiApplication.class, args);
	}
}
  • 위와 같이 설정해도 Entity, 와 JpaRepository는 스캔되지 못한다.
    • 그 이유는 @SprintBootApplication 안에 있는 @EnableAutoConfiguration은 ComponentScan과 마찬 가지로 현재디렉토리및 하위에서 스캔을 수행하기 때문이다.
    • 따라서 다음과 같이 추가로 엔티티와 repository를 어디서 스캔할지 지정해야한다.
@EnableJpaAuditing
@EnableJpaRepositories(basePackages =  "partner42.modulecommon.repository")
@EntityScan(basePackages = "partner42.modulecommon.domain")
@Configuration
public class JPAConfig {

}
profile
Fail Fast

0개의 댓글