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 생성
- module-api생성
- module-batch생성
- module-core생성
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 {
}