legacy/Docker

[Docker] 도커로 띄운 MySQL를 스프링부트에서 사용하기

heemang.dev 2024. 5. 4. 19:02

 

도커로 데이터베이스를 실행하고, 이를 스프링부트에서 사용할 수 있습니다. 그렇다면 왜 굳이 도커로 데이터베이스를 띄울까요?

 

다양한 이유가 존재하겠지만... 이유를 하나만 뽑자면 다음과 같습니다.


팀 구성원이 모두 동일한 환경에서 작업을 진행할 수 있다. 


 

A라는 사람은 MySQL 5.7을 사용하고, B는 MySQL 8.0을 사용합니다.  서로가 다른 버전을 사용하기 때문에 호환성 문제가 발생할 수 있습니다. 특히나 배포에 있어서 예상치 못한 문제가 발생할 수 있습니다.

 

이러한 문제를 사전에 방지하고자 도커를 활용하여 개발 및 배포 환경에서 일관성, 호환성을 확보해야 합니다.

 

도커 컴포즈를 사용하여 MySQL를 띄어 스프링부트에서 사용해보도록 하겠습니다.

도커 컴포즈

도커 컴포즈란 여러 컨테이너를 손쉽게 관리할 수 있도록 해줍니다. 즉, 여러 개의 컨테이너를 사용해야 한다면 도커 컴포즈를 사용하여 실행하는 과정을 단순화할 수 있습니다.

 

docker-compose.yml

도커 컴포즈에 MySQL를 사용하기 위한 도커 컨테이너 정보를 작성합니다.  주석으로 설명이 되어 있기 때문에 이해하는 데 어려움이 없을 것이라 생각합니다.

version: '3.7'  # Docker Compose의 버전

services:  # Docker Compose를 통해 실행할 서비스(컨테이너) 정의
  db:  # 서비스의 이름
    image: mysql:8.0  # 사용할 MySQL 버전 8.0 이미지
    restart: always
    container_name: mysql_container  # 생성될 도커 컨테이너의 이름
    environment:  # MySQL 컨테이너에 필요한 환경 변수 설정
      MYSQL_DATABASE: example  # 생성할 데이터베이스의 이름
      MYSQL_USER: hope # 생성할 사용자
      MYSQL_PASSWORD: hope1234 # 사용자 비밀번호
      MYSQL_ROOT_PASSWORD: 1234  # MySQL 루트 사용자의 비밀번호 설정
    ports:  # 호스트와 컨테이너 간의 포트 매핑
      - "3307:3306"  # 호스트의 포트 3307을 컨테이너의 포트 3306으로 매핑
    volumes:  # 호스트의 디렉토리를 컨테이너에 마운트
      - mysql_data:/var/lib/mysql  # mysql_data 볼륨을 컨테이너의 /var/lib/mysql에 마운트


volumes:  # 도커 볼륨 정의
  mysql_data:  # MySQL 데이터베이스의 데이터를 저장할 볼륨

 

Volume이란 컨테이너의 데이터 저장과 관리에 중요한 역할을 합니다. 컨테이너가 종료되거나 삭제되어도 데이터를 지속적으로 보관할 수 있습니다. 

 

docker volume ls를 입력하면 로컬 환경(호스트)에 저장된 볼륨을 조회할 수 있습니다. 위에서 도커 컴포즈를 작성할 때 volumes 부분에 mysql_data를 생성하였기 때문에 dokcer_mysql_data 볼륨이 조회됩니다. 

~/desktop/study/study-spring main* ❯ docker volume ls                  18:06:45
DRIVER    VOLUME NAME
.. 생략
local     docker_mysql_data
local     e7db8f76e0d6a671f05a21d85b1a52eb8c68375a004b9551f23464211667b291

 

docker volume inspect docker_mysql_data를 통해 도커 볼륨에 대한 자세한 정보를 확인할 수 있습니다. 

볼륨 생성 시간은 UTC를 따르기 때문에 한국 시간보다 9시간 느립니다.

docker volume inspect 볼륨 이름

 

docker-compose.yml이 존재하는 경로에서 docker-compose up -d를 입력하여 컨테이너가 백그라운드에서 실행되도록 합니다.

도커 컴포즈 실행

스프링부트에서 컨테이너 사용하기

실행 중인 MySQL에 접근하기 위하여 컨테이너로 띄운 정보를 입력하면 됩니다.

application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3307/example # 컨테이너로 띄운 DB 이름
    username: root # 컨테이너로 띄운 데이터베이스 사용자 이름
    password: 1234 # 컨테이너로 띄운 데이터베이스 비밀번호

  jpa:
    hibernate:
      ddl-auto: update # application 실행 시 기존 테이블 drop 후 create
    properties:
      hibernate:
        format_sql: true

 

docker exec -it mysql_container /bin/bash를 통해 실행 중인 도커 컨테이너의 내부로 진입합니다.

  • docker exec : 실행 중인 도커 컨테이너에게 명령을 전달
  • -it : 'i' + 't'를 통해 터미널과 상호작용
  • mysql_container : 컨테이너 이름
  • /bin/bash : 컨테이너 내부에 진입하여 Bash 쉘로 명령어 전달

실행 중인 컨테이너 접근

 

도커 컴포즈에서 MySQL 컨테이너 정의를 내릴 때, 입력한 example 데이터베이스가 정상적으로 생성되었습니다.