최근 프로젝트를 진행하면서 애플리케이션 실행의 필수적인 DB를 연결하기 위해 Docker로 일일히 Mysql 컨테이너를 실행후에 애플리케이션을 실행해야해서 매우 번거로웠다.
하지만 Spring Boot 3.1.x 버전부터 자동으로 docker-compose.yml파일을 사용해서 자동으로 실행부터 연결까지 해주는 기능이 있어 구현했다.
1. build.gradle설정
runtimeOnly 'mysql:mysql-connector-java:8.0.32' // MySql 연결 JDBC 드라이버
implementation 'org.springframework.boot:spring-boot-docker-compose' // docker-compose 통합 기능
의존성은 2개를 추가해주면 된다.
혹여나 아래와 같이 추가하셨던 분들도 있을 것이다.
runtimeOnly 'mysql:mysql-connector-java'
위와같은 설정 진행시에는 application.yaml 설정에서 driver-class-name: com.mysql.cj.jdbc.Driver 부분의 에러가 발생한다. 에러가 발생하는 이유는 호환되지 않는 버전문제인것 같다. 따라서 버전을 명시하여 해결
2. docker-compose.yml 설정
docker-compose.yml 파일을 생성하고 아래와 같이 코드를 작성하면된다.
version: '3'
services:
mysql:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: testdb
ports:
- "3306:3306"
3. application.yaml 설정
기본적으로 Docker에서 사용하기 때문에 아래와 같은 설정을 진행하면된다
Spring:
datasource:
url: jdbc:mysql://mysql:3306/testdb
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
use_sql_comments: true
defer-datasource-initialization: true
docker:
compose:
file: ${FILE_PATH}
lifecycle-management: start-only
주의사항!
docker:
compose:
file: ${FILE_PATH}
이부분의 file은 없어도 동작할 수 있지만 간혹 not found docker-compose.yml 에러가 발생할 수 있다.
docker-compose.yml 파일 경로를 찾지 못해서 그런것이다.
따라서 안될때는 위와같이 경로를 추가하면 된다.
경로를 못찾겠다면 Intellij 프로젝트 목록에서 본인이 생성한 docker-compose.yml파일을 클릭한 후 ctrl+ shift + c 를 눌러주면 가볍게 해당하는 파일의 경로가 복사된다.
lifecycle-management 옵션 (필요한 기능 선택 설정)
- start-and-stop (기본값): Spring Boot 애플리케이션 시작 시 컨테이너를 실행하고, 애플리케이션 종료 시 컨테이너도 종료.
- start-only: 애플리케이션 시작 시 컨테이너를 실행하고, 애플리케이션 종료 후에도 컨테이너는 계속 실행됨.
- none: 컨테이너 관리 기능을 비활성화하여 애플리케이션이 Docker Compose 컨테이너를 전혀 제어하지 않음.
위의 설정을 마치고 실행하면 아래와 같이 Docker의 컨테이너가 생성된다.