본문 바로가기

카테고리 없음

Spring Boot 3.1+에서 Docker로 MySQL 컨테이너 자동 실행

최근 프로젝트를 진행하면서 애플리케이션 실행의 필수적인 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의 컨테이너가 생성된다.