1. 들어가며
이전 포스트에서 멀티 모듈 프로젝트를 생성해보았다.
본격적으로 개발을 시작하며 Controller나 Service 코드는 api 모듈에서 관리하고, Entity나 Repository 코드는 domain 모듈에서 관리하고 있다.
그러다보면 api 모듈에서 domain 모듈의 코드가 필연적으로 필요하고, 모듈 간 의존성을 주입해주어야 하는 일이 생긴다.
이번 포스트에서는 멀티 모듈 프로젝트에서 한 모듈에 다른 모듈의 의존성을 주입하는 방법을 알아보자.
2. api 모듈의 build.gradle 수정
api 모듈이 domain 모듈에 의존하도록 해야하므로 api 모듈의 build.gradle에 의존성을 추가해준다.
Reload all Gradle Projects를 한 뒤 우측 Gradle 탭에서 의존성이 주입된 모습을 확인할 수 있다.
하지만 이 상태로 마치고 서버를 실행시켜보면 실패하는 것을 확인할 수 있다.
그 이유는 domain 모듈의 설정 파일(application.yml)에 적혀있는 데이터베이스 정보를 읽어올 수 없기 때문이다. 그러므로 우리는 다른 모듈의 설정 파일을 읽어올 수 있도록 코드를 추가해야 한다.
3. 모듈별로 설정 파일을 분리하는 방법
각 모듈에서 application-{모듈명}.yml로 이름을 관리하고 있다. 만약 application.yml로 이름을 짓는다면 후술할 setProperty 메서드에서 가까운 설정 파일을 읽어오기 때문에 원하는 모듈의 설정 파일을 읽어오지 못하는 일이 발생할 수 있어 모듈명을 뒤에 붙여주고 있다.
api 모듈에서 domain 모듈의 설정 파일을 사용하기 위에서는 main 클래스에 setPropoerty 메서드를 추가해주면 된다. 이는 첫 번째 인자를 key, 두 번째 인자를 value로 하여 환경변수를 등록해주는 과정이다.
application-api.**, application-domain.** 파일들을 읽어와서 사용한다는 의미이다.
이 때, value에는 설정 파일 이름이 들어가며 설정 파일끼리 이름이 겹치지 않도록 주의하자 !!
@SpringBootApplication
public class ApiApplication {
public static void main(String[] args) {
System.setProperty("spring.config.name", "application-api, application-domain");
SpringApplication.run(ApiApplication.class, args);
}
}
이제 다시 실행시키면 설정 파일에 있는 데이터베이스 정보를 잘 읽어와 서버가 실행되는 모습을 확인할 수 있다.
4. 마치며
멀티 모듈에 대해 대충만 알고 있을 때는 implementation project만 하면 끝이라고 생각했지만 그리 단순히 끝나는 작업이 아니였다. 그리고 database url이 잘못 되었다고 하여 설정 파일을 읽지 못하는 문제라고 파악하는데까지 많은 시간이 소요되었다.
의존성을 모듈에 추가도 하고, 삭제도 하고, 설정 파일을 다양한 방식으로 작성하며 트러블 슈팅을 하면서 멀티 모듈 프로젝트에서는 의존 관계를 정확히 파악하고 있는 것이 중요하다는 것을 배울 수 있었다.
Reference
- https://velog.io/@jonghyun3668/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-%EB%8B%A8%EC%9D%BC-%EB%AA%A8%EB%93%88-%EC%BD%94%EB%93%9C%EC%97%90-%EB%A9%80%ED%8B%B0-%EB%AA%A8%EB%93%88%EC%9D%84-%EC%A0%81%EC%9A%A9%ED%95%98%EC%97%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%A1%B0-%EA%B0%9C%EC%84%A0%ED%95%98%EA%B8%B0
- https://devlog-wjdrbs96.tistory.com/435