[Docker] Spring Boot에서 Docker Compose로 MySQL 환경 구성하기

2025. 9. 15. 23:13·공부일기../Docker

 

 

 

인트로

"어? 내 컴퓨터에서는 잘 되는데 왜 너 컴퓨터에서는 안 돼?" 특히 데이터베이스 연결 부분에서 이런 일이 자주 일어난다.

한 명은 MySQL을 직접 설치해서 쓰고, 다른 한 명은 Docker로 띄워서 쓰고... 이런 식으로 각자 다른 환경에서 개발하면 나중에 배포할 때 문제가 생기기 마련이다.

 

그래서 오늘은 Docker Compose를 활용해서 팀 전체가 동일한 MySQL 환경을 쓸 수 있도록 설정하는 방법을 알아보려고 한다.

그리고 내가 자꾸만....겪는 도커에서 자동으로 데이터베이스가 왜생성안되는지까지 포스팅하도록 하겠다.

 

 


 

1. Docker Compose로 MySQL 띄우기

짜잔~

[프로젝트 구조!]
├── Spring Boot App (Port 8080)
│   ├── Profile: local → MySQL (3306)
│   └── Profile: docker → Docker MySQL (3307)
├── Docker Compose
│   └── MySQL Container (3306 → 3307)
└── data/mysql/ (볼륨 마운트)

1-1. 기본 Docker Compose 설정

먼저 프로젝트 루트에 docker-compose.yml 파일을 만든다:

version: '3'
services:
  mysql:
    image: mysql:8.0
    ports:
      - "3307:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_USER=application
      - MYSQL_PASSWORD=application
      - MYSQL_DATABASE=SpringDataBase
    volumes:
      - ./data/mysql/:/var/lib/mysql

1-2. 각 설정의 의미

Host (내 컴퓨터)          Docker Container
┌─────────────────────┐   ┌──────────────────┐
│ Port 3306: 로컬MySQL │   │                  │
│ Port 3307 ────────────→ │ Port 3306: MySQL │
│ Port 8080: Spring   │   │                  │
└─────────────────────┘   └──────────────────┘

 

포트 설정 "3307:3306"

  • 왼쪽(3307): 내 컴퓨터에서 접속할 포트
  • 오른쪽(3306): 컨테이너 내부 MySQL 포트
  • 3307을 사용한 이유 :
    보통 로컬에 MySQL을 직접 설치해서 쓰는 경우가 많다.
    그러면 기본 포트인 3306이 이미 사용 중이다.
    그래서 Docker MySQL은 3307 포트로 분리해서 충돌을 피하기 위해서 포트를 다르게썼다.

내가 계속 헷갈리는 포트설정.......

더보기

포트 설정 "3307:3306" - 가장 헷갈리는 부분!

 

포트 매핑은 3307이 3306에 접근한다가 아니라 3307로 들어온 요청을 3306으로 전달한다는 뜻이다.

 


실제 흐름을 단계별로 보면

  1. Spring Boot: localhost:3307에 DB 연결할래
  2. 내 컴퓨터의 3307 포트: Docker가 listening 중
  3. Docker: 껍데기에서 3307로 온 요청을 받았구 컨테이너 내부 3306으로 보낼게 
  4. 컨테이너 내부 3306: MySQL이 실제로 돌아가는 포트
  5. MySQL: 웅 ~ 요청 받았어! 처리해줄게
  • 3307: 문 (도커 외부에서 접근하는 입구)
  • 3306: 실제 MySQL (컨테이너 내부)

 

Spring Boot는 도커 껍데기에 요청하고(3307)
Docker가 그 요청을 알맹이(3306)의 MySQL에게 전달 ~ 헷 갈 려~

 

포트를 다르게한이유는 바로 3306으로 연결하면:

  • 내 컴퓨터에 이미 MySQL이 3306에서 돌고 있을 수 있음
  • 그러면 충돌남 짜증도남  ㅜ
  • 그래서 Docker는 다른 포트(3307)를 입구로 쓰고 내부에서는 여전히 3306 사용
    mysql 기본이 3306이긴함

 

 

환경변수들

  • MYSQL_ROOT_PASSWORD=root: root 계정 비밀번호
  • MYSQL_USER=application: 새로운 사용자 이름
  • MYSQL_PASSWORD=application: 새로운 사용자 비밀번호
  • MYSQL_DATABASE=SpringDataBase: 자동으로 생성할 데이터베이스 이름

 

볼륨 설정 ./data/mysql/:/var/lib/mysql

  • MySQL 데이터를 프로젝트 폴더의 data/mysql에 저장한다.
  • 컨테이너를 삭제해도 데이터가 날아가지 않는다.

 


 

2. MySQL 자동 생성 과정


2-1. Docker가 자동으로 해주는 일들

`docker-compose up -d`를 실행하면 MySQL Docker 이미지가 다음 작업들을 자동으로 해준다.

 

1단계: 초기화

  • /var/lib/mysql 디렉토리(우리의 ./data/mysql/)가 비어있는지 확인한다.
  • 비어있다면 "최초 실행"으로 판단하고 초기화를 시작한다.

2단계: 데이터베이스 자동 생성

-- Docker가 내부적으로 실행하는 명령어
CREATE DATABASE IF NOT EXISTS SpringDataBase;

3단계: 사용자 계정 자동 생성

-- Docker가 내부적으로 실행하는 명령어들
CREATE USER 'application'@'%' IDENTIFIED BY 'application';
GRANT ALL PRIVILEGES ON SpringDataBase.* TO 'application'@'%';
FLUSH PRIVILEGES;

여기서 '%'는 "어떤 호스트에서든 접속 가능"이라는 뜻이다.
Docker 환경에서는 네트워크 구성이 복잡할 수 있어서 '%'를 사용한다.


2-2. 권한 부여의 의미

`GRANT ALL PRIVILEGES ON SpringDataBase.* TO 'application'@'%'`가 하는 일:

  • ALL PRIVILEGES: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER 등 모든 권한
  • `SpringDataBase.*`: SpringDataBase 데이터베이스의 모든 테이블에 대해
  • `TO 'application'@'%'`: application 사용자에게 부여

 


 

3. Spring Boot Profile로 환경 분리하기


3-1. 메인 애플리케이션 설정

src/main/resources/application.yml에 두 가지 프로파일을 설정한다:

spring:
  profiles:
    active: local  # 기본값은 local

---
# 로컬 MySQL 연결 (포트 3306)
spring.config.activate.on-profile: local
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/SpringDataBase
    username: application
    password: application

---
# Docker MySQL 연결 (포트 3307)
spring.config.activate.on-profile: docker
spring:
  datasource:
    url: jdbc:mysql://localhost:3307/SpringDataBase
    username: application
    password: application

3-2. Profile 활용하기

Docker 환경으로 실행

# 방법 1: 실행할 때 지정
./gradlew bootRun --args='--spring.profiles.active=docker'

# 방법 2: 환경변수로 지정 (추천)
export SPRING_PROFILES_ACTIVE=docker
./gradlew bootRun

 

로컬 MySQL 환경으로 실행

# local이 기본값이므로 그냥 실행
./gradlew bootRun

 

 


 

4.  데이터베이스 계정 자동 생성이 안 되는 경우와 해결법


4-1. 왜 자동 생성이 실패할까?

실제로 docker-compose up을 했는데 데이터베이스나 사용자가 자동으로 안 만들어지는 경우가 있다.
가장 흔한 이유는 이미 data/mysql 폴더가 존재하는 경우이다.

  • MySQL Docker는 /var/lib/mysql이 완전히 비어있을 때만 초기화를 진행한다.
  • 폴더가 이미 있거나 안에 파일이 조금이라도 있으면 "이미 초기화된 DB다"라고 판단하고 환경변수를 무시한다.

4-2. 자동 생성 확인하기

✅ 자동 생성이 제대로 되는 경우:

# 완전히 깨끗한 상태에서 시작
docker-compose down -v  # 볼륨까지 완전 삭제
rm -rf ./data/mysql/    # 로컬 데이터 폴더도 삭제
docker-compose up -d

# 로그에서 이런 메시지들을 확인할 수 있다:
docker-compose logs mysql
# [Note] [Entrypoint]: Initializing database files
# [Note] [Entrypoint]: Creating database SpringDataBase
# [Note] [Entrypoint]: Creating user application

❌ 자동 생성이 안 되는 경우:

# data/mysql 폴더가 이미 있는 상태에서 실행
docker-compose up -d

# 로그에서 이런 메시지를 볼 수 있다:
docker-compose logs mysql
# [Warn] [Entrypoint]: /var/lib/mysql is not empty, skipping initialization

4-3. 수동으로 해결하는 방법


자동 생성이 안 됐다면 수동으로 만들어줄 수 있다:

# 1. 컨테이너 이름 확인
docker ps

# 2. 수동으로 데이터베이스 생성
docker exec -it <컨테이너_이름> mysql -u root -proot -e "CREATE DATABASE IF NOT EXISTS SpringDataBase;"

# 3. 사용자에게 권한 부여
docker exec -it <컨테이너_이름> mysql -u root -proot -e "GRANT ALL PRIVILEGES ON SpringDataBase.* TO 'application'@'%';"

# 4. 권한 적용
docker exec -it <컨테이너_이름> mysql -u root -proot -e "FLUSH PRIVILEGES;"

 

 


 

 

5. 처음 시작하는 가이드


5-1. 완전히 새로 시작할 때

# 1. Docker MySQL 띄우기
docker-compose up -d

# 2. 초기화 로그 확인 (선택사항)
docker-compose logs mysql

# 3. Docker 프로파일로 애플리케이션 실행
export SPRING_PROFILES_ACTIVE=docker
./gradlew bootRun

 


5-2. 문제가 생겼을 때 완전 초기화

# 1. 모든 걸 완전히 삭제
docker-compose down -v
rm -rf ./data/mysql/

# 2. 다시 시작 (이번엔 자동 생성됨)
docker-compose up -d

# 3. 애플리케이션 실행
export SPRING_PROFILES_ACTIVE=docker
./gradlew bootRun

5-3. 협업을 위한 설정

1. .gitignore에 data 폴더 추가

# .gitignore
data/

2. README에 실행 가이드 작성

## 개발 환경 실행 방법
1. docker-compose up -d
2. export SPRING_PROFILES_ACTIVE=docker
3. ./gradlew bootRun

## 문제 해결
자동 생성이 안 되면:
- docker-compose down -v
- rm -rf ./data/mysql/
- docker-compose up -d

 

 


 

마무리

이렇게 Docker Compose와 Profile을 설정하면 팀 전체가 동일한 MySQL 환경에서 개발할 수 있다.

새로운 팀원이 와도 docker-compose up 한 번이면 똑같은 환경을 구성할 수 있고, "내 컴퓨터에서는 되는데..."라는 말을 듣지 않아도 된다.

가장 중요한 건 자동 생성이 안 될 때 당황하지 말고, data 폴더를 완전히 삭제한 후 다시 시작하면 된다는 점이다.

 

이런 문제는 실무에서도 자주 겪는 일이니까 미리 경험해보는 게 좋다. 나는 너무 많이겪음;; ㅋㅋ 

 

다음 Part 2에서는 테스트 환경 설정, OSIV 같은 설정들에 대해서 포스팅해보겠당 빠이

 

[Spring] Spring Boot MySQL 설정 (커넥션 풀, OSIV, SQL 로깅)

'공부일기.. > Docker' 카테고리의 다른 글

[도커] Docker와 Docker Compose의 차이점  (0) 2025.12.02
'공부일기../Docker' 카테고리의 다른 글
  • [도커] Docker와 Docker Compose의 차이점
s0-0mzzang
s0-0mzzang
공부한것을 기록합니다...
  • s0-0mzzang
    승민이의..개발일기..🐰
    s0-0mzzang
  • 전체
    오늘
    어제
    • 전체~ (108)
      • 마음가짐..! (10)
      • 공부일기.. (76)
        • weekly-log (6)
        • Spring (19)
        • Java (18)
        • DataBase (10)
        • git (2)
        • JPA (6)
        • kafka (1)
        • Backend Architecture (3)
        • Troubleshooting (삽질..ㅋ) (2)
        • Cloud (1)
        • Docker (2)
        • 알고리즘 (1)
        • 리액트 (2)
        • Infra (3)
      • 하루일기.. (22)
        • 그림일기 (8)
        • 생각일기 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    리팩토링
    MySQL
    다짐
    인프라 기초
    Paging
    ADC 환경
    SpringBoot
    JPA
    항해99
    TDD
    스프링부트
    StringTokenizer
    항해플러스
    BufferedReader
    ERD
    React
    swagger
    자바
    spring boot
    spring
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
s0-0mzzang
[Docker] Spring Boot에서 Docker Compose로 MySQL 환경 구성하기
상단으로

티스토리툴바