문제
멀티 모듈 구조에서 JpaRepository 빈을 읽어오지 못하는 문제가 있었다.
상황
우리는 멀티 모듈을 채택했고, 스프링 앱, 도메인 코어, 데이터베이스 모듈로 3개를 분리했다. 스프링 앱에서 실행 시, 데이터베이스 모듈의 JpaConfig 설정을 읽어오지 못해서 도메인 코어의 repository에 JpaRepository를 빈이 없다고 주입을 못해주고 있었다.
간단하게 현제 문제인 것들만 정리하자면
모듈
- payment-core : 결제 도메인의 핵심 부분 (서비스, 도메인, 리포지토리 포함)
- 모듈 위치 : service:payment:core
- 패키지 시작점 : radiata.service.payment.core
- payment-api : 결제 도메인의 외부 요청 부분 (스프링 애플리케이션, 컨트롤러, 앤드포인트 포함)
- 모듈 위치 : service:payment:api
- 패키지 시작점 : radiata.service.payment.api
- database : 데이터베이스 관련 부분 (설정 yml 및 Config 객체 포함)
- 모듈 위치 : database
- 패키지 시작점 : radiata.database
객체
database 모듈에는 JpaConfig가 있고,
payment-core 모듈 에는 Repository, JpaRepository가 있고 (둘을 분리해둠),
payment-api 모듈 에서는 PaymentApplication의 스프링 앱이 있다.
인텔리제이 측에서는 Repository가 빈이 있다고 표시되지만, 실제 실행 시 찾을 수 없다고 떴다.
해결
package radiata.service.payment.core;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
@EnableAutoConfiguration
@Configuration
public class ComponentScanConfiguration {
}
payment-core의 최상의 패키지에 위 객체를 두면 해결이 된다.
...가 아니라 하나 더 해야 된다.
package radiata.service.payment.api;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = { "radiata.service.payment" })
public class PaymentApplication {
public static void main(String[] args) {
SpringApplication.run(PaymentApplication.class, args);
}
}
payment-api 모듈의 스프링 애플리케이션에 스캔 패키지를 지정해주어야 한다.
@SpringBootApplication(scanBasePackages = { "radiata.service.payment" })
@SpringBootApplication(scanBasePackages = { "radiata.database" })
둘 중 하나를 해주면 실행이 된다. 하지만 database 모듈은 언제든지 실행이될 수 있으니 위의 코드를 쓰기로 했다.
참고로 api 모듈은 radiata.service.payment.api에 SpringApplication이 있는 최상위 패키지이고,
core 모듈은 radiata.service.payment.core가 최상위 패키지라서,
둘의 상위인 radiata.service.payment로 지정을 해주었다.
이후로 스프링이 빈을 스캔하는 방식을 더 공부해서 정리해볼 예정이다.
'TIL ✍️' 카테고리의 다른 글
TIL #112 : 자바 애플리케이션을 도커 이미지로 만들 때 용량 줄이기 (6) | 2024.11.13 |
---|---|
TIL #111 : ID를 가진 JPA 엔티티 생성 시 SELECT 문이 나가는 문제 (2) | 2024.11.11 |
24/09/30(월) 109번째 TIL : 카프카 직렬화 및 역직렬화 (0) | 2024.10.01 |
24/08/28(수) 108번째 TIL : EmbeddedId 식별자 값객체 (0) | 2024.09.09 |
24/08/27(화) 107번째 TIL : Embeddable 값객체 (0) | 2024.09.09 |