처음에는 멀티 모듈이 MSA인줄 알았는데, 서로가 다른 것이라는 것을 깨달음.
다만 모노릭보다 멀티 모듈이 좀 더 MSA와 비슷한 시스템이고, 나중에 마이그레이션할때 더 쉽게 갈 수 있다고 한다.
MSA - API Gateway를 통한 기능별 API 서버 분할
Multi Module - Common Module에 있는 공통된 코드를 각종 Module에서 사용
하나의 공통적인 모듈이 있고, 거기서 다른 서버(모듈)이 그 것을 이용.
Multi Module
Root가 되는 패키지를 생성
Root 패키지에서 새로운 모듈을 생성, API서버나, Common 등의 모듈들을 생성..
그 후, 루트 패키지의 settings.gradle에 어떤 모듈을 가지고 있다고 알려줘야됨
includ 'module-name'
또한 모듈간에도 의존성 설정을 해 주어야 한다.
API 모듈을 만들었을시 이 API 모듈은 Common 모듈을 참조한다.
build.gradle
implementation project(':module-common')
이런식으로 참조한다. 이때 :module-common은 루트에 있는 settings.gradle 것을 참조한다고 한다.
이렇게 되면 세팅은 끝이나는데, 이때 각 모듈에 있는 settings.gradle을 삭제해줘야된다.
그래야 root에 있는 settings.gradle을 참조한다. (더 좁은 범위의 것이 우선순위이기 때문에..)
그후, 실제 참조가 되는지 확인을 해보면?
순수 Java 객체 - 문제 없이 작동 한다.
Spring Bean 참조 -> API에서 Common의 Spring Bean을 참조해 올 수 있나? 아무런 건드림이 없다면 되지 않는다.
Why?
API 모듈의 ComponentScan범위가 다르기때문에 참조가 되지 않고 있다.
이때의 경로가
module.test.common
module.test.api
이럴때, 루트 패키지의 영향을 받아 하위 경로에 스캔을 전부 한다.
다만, module.test 다음에 api와 common으로 나뉘기 때문에, 경로가 같은 module.test로 옮기면 전부 스캔 가능.
다만 이렇게 경로를 옮겨 하는게 좋은 방법인가??? -> xxxxxx
@SpringBootApplication(
scanBasePackges = {"module.test.api", "module.test.common"}
)
이런 식으로 직접 범위를 지정해 주는 방법을 사용해보자.
또, SpringBootApplication에서 지정해주는거 말고, Entity가 등록이 안되고,
@EntityScan
@EnableJpaRepositories
를 통해서 또 Scan 범위를 잡아야 된다.
정말 좋은 정보 감사합니다!