[Spring Boot] 멀티 모듈 프로젝트에 Docker Compose Support 세팅 시 주의 할 점

5

오랜만에 글을 작성하네요.

테스트 환경을 위한 컨테이너를 세팅하는 경우가 있을 것 같습니다. 저 또한 각종 미들웨어를 도커 컨테이너로 설정하고 있는데요.

Testcontainers 를 사용할 수도 있었는데 테스트 환경 뿐 아니라 로컬 환경에서 구성될 Redis 인스턴스가 필요했습니다.

스프링에는 Docker Compose Support 라는 기능이 있습니다.
이 기능을 사용하면 애플리케이션이 기동될 때 프로젝트 내부에 있는 docker-compose.yaml 파일을 읽어 컨테이너 구성을 도와주는데요.
로컬 환경에 필요한 Redis 컨테이너를 자동으로 올리고 내리면서 필요로하는 쉽게 인프라스트럭처를 구성할 수 있습니다.

dependencies {
    testAndDevelopmentOnly("org.springframework.boot:spring-boot-docker-compose")
}

이미 사용중이신 여러분들은 docker-compose.yaml 파일을 어디에 배치시키시나요?

choicore-project
ㄴ choicore-bootstrap
	ㄴ src
    build.gradle.kts
    
ㄴ choicore-common
	ㄴ src
    build.gradle.kts

docker-compose.yaml
settings.gradle.kts

루트 프로젝트에 배치 시키거나

choicore-project
ㄴ choicore-bootstrap
	ㄴ src
    docker-compose.yaml
    build.gradle.kts

ㄴ choicore-common
	ㄴ src
    build.gradle.kts
...

settings.gradle.kts

특정 모듈 안에 배치하거나 특정 폴더로 패키징을 할 수 있을 것 같습니다.

루트 프로젝트 하위에 배치하는 방법으로 구성해보겠습니다.

정상적으로 동작하는 것을 확인하실 수 있습니다. 이러고 저도 끝난 줄 알았습니다만

불행히도 테스트 코드에서는 Docker Compose file 'docker-compose.yaml' does not exist 라는 에러가 발생했습니다.

그러면 특정 모듈 안에 배치하면 어떻게 될까요?

애플리케이션이 구동되지 않았습니다.

하지만 테스트 코드에서는 동작을 하네요. 하...

왜 그런지 문제를 찾기 위해 디버깅을 진행했습니다.

org.springframework.boot.docker.compose.core.DockerComposeFile.java

메인 애플리케이션에서는 루트 디렉토리부터 docker-compose.yaml 파일을 찾기 시작했고,
테스트가 구동될 때는 메인 애플리케이션 모듈 안에서부터 docker-compose.yaml를 찾네요.

왜 그런가 봤더니 그 이유는 Intelij IDEA가 Working Directory를 자동으로 설정하기 때문입니다.
무슨 이유인지는 몰라도 System에서 프로젝트 경로를 main 은 루트 경로를, test는 모듈의 경로로 설정되네요.

Working Directory를 Root Project 기준으로 찾기 때문에 docker-compose 파일이 실제로 위치한

${projectDir}/choicore-bootstrap/docker-compose.yaml 파일을 찾을 수 없는 것이죠.


하지만 테스트에서는 $MODULE_WORKING_DIR$ 이라는 환경변수를 통해 모듈 안에서 docker-compose.yaml 파일을 찾았기 때문에 가능합니다.

그러면 애플리케이션에 Working Directory에 $MODULE_WORKING_DIR$ 추가해보고 실행해보겠습니다.

실행해보면

정상적으로 실행되는 것을 확인할 수 있습니다.

일단 해결 방법은 찾았지만 썩 마음에 들진 않네요, 합류한 개발자들에게 구동하기 위해서는 $MODULE_WORKING_DIR$ 를 붙여야한다는 가이드가 필요해지니까요. 조금 더 고민해보겠습니다.


방법 1.
run configuration을 내장하는 방법


xml 파일로 떨궈서 모듈 별로 구성하면 될 것 같습니다.

방법 2.

테스트에 yaml 하나 더 만들어서 부모 경로 지정

5개의 댓글

comment-user-thumbnail
2024년 10월 8일

각 모듈의 application.yml에서 spring.docker.compose.file 프로퍼티를 설정하는 방법도 존재할 것 같습니다.

1개의 답글