오랜만에 글을 작성하네요.
테스트 환경을 위한 컨테이너를 세팅하는 경우가 있을 것 같습니다. 저 또한 각종 미들웨어를 도커 컨테이너로 설정하고 있는데요.
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 하나 더 만들어서 부모 경로 지정
각 모듈의 application.yml에서
spring.docker.compose.file
프로퍼티를 설정하는 방법도 존재할 것 같습니다.