e MYSQL_ROOT_PASSWORD=root : MySQL의 root 계정 비밀번호를 root로 설정
e MYSQL_DATABASE=spring_db : 컨테이너 생성 시 spring_db라는 이름의 데이터베이스를 미리 생성
d: 컨테이너를 백그라운드에서 실행합니다
application.yaml 설정
spring:
# 데이터베이스 연결 설정
datasource:
url: jdbc:mysql://localhost:3306/spring_db?useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# JPA 및 Hibernate 설정
jpa:
hibernate:
# ddl-auto: 애플리케이션 실행 시 스키마(테이블) 처리 전략
# none: 아무 작업도 하지 않음 (운영 환경 추천)
# create: 기존 테이블 삭제 후 다시 생성
# update: 변경된 부분만 반영
ddl-auto: none
properties:
hibernate:
# MySQL 8 버전에 맞는 Dialect(방언) 설정
dialect: org.hibernate.dialect.MySQL8Dialect
# 로깅 레벨 설정
logging:
level:
# Hibernate가 실행하는 SQL 쿼리를 DEBUG 레벨로 로그에 출력
org.hibernate.SQL: DEBUG
# 내장 웹 서버 설정
server:
port: 8080
스프링 부트 애플리케이션을 실행 시 Docker로 실행 중인 MySQL 데이터베이스에 자동 연결
2. Flyway: 데이터베이스 스키마 버전 관리
Flyway 동작 원리
Flyway의 핵심은 flyway_schema_history라는 메타데이터 테이블
애플리케이션이 실행되면 Flyway는 DB에 flyway_schema_history 테이블이 있는지 확인하고 없으면 자동으로 생성
설정한 마이그레이션 파일 위치를 스캔하여 SQL 파일 목록을 읽어온다
lyway_schema_history 테이블의 기록과 SQL 파일 목록을 비교하여, 아직 실행되지 않은 새로운 버전의 SQL 파일을 찾는다
새로운 SQL 파일들을 버전 순서대로 DB에 실행한다
실행이 성공하면 해당 파일의 버전, 이름, 실행 시간 등의 정보를 flyway_schema_history 테이블에 기록한다
이 과정을 통해 어떤 변경사항이 언제 적용되었는지 추적하며 항상 최신 버전의 DB 스키마를 유지한다
-- src/main/resources/db/migration/V1__init_table.sql
CREATE TABLE example (
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(255),
PRIMARY KEY (id)
);
Flyway는 V<버전>__<설명>.sql 형식의 파일명을 규칙으로 사용한다
파일은 src/main/resources/db/migration 경로에 위치
application.yml 추가
spring:
flyway:
enabled: true # Flyway 활성화
# 마이그레이션 파일 위치 지정 (기본값)
locations: classpath:db/migration
애플리케이션 실행시 Flyway가 SQL 파일을 읽어 데이터베이스에 자동으로 테이블 생성한다
3. HikariCP를 이용한 DB 커넥션 풀 관리
HikariCP의 역할
HikariCP는 Spring Boot 2.0부터 기본으로 채택된 매우 빠르고 안정적인 커넥션 풀 라이브러리
개발자가 별도 설정을 하지 않아도 Spring Boot가 자동으로 HikariCP를 설정하여 최적의 성능을 제공한다
HikariCP의 장단점
장점
압도적인 성능 : 바이트 코드 조작, Lock 최소화 등 저수준 최적화를 통해 다른 어떤 커넥션 풀보다 빠르며 대규모 트래픽 상황에서 큰 차이를 만든다
높은 안정성과 신뢰성 : 커넥션 누수(Leak)를 방지하고, 유휴 커넥션을 효과적으로 관리하는 등 안정성에 초점을 맞춰 설계
간결한 구성
활발한 유지보수
단점
제한적인 고급 기능
복잡한 내부 구조
Application.yml 추가
spring:
datasource:
hikari:
maximum-pool-size: 10 # 최대 커넥션 개수
connection-timeout: 30000 # 커넥션을 얻기 위해 대기하는 최대 시간 (ms)
max-lifetime: 1800000 # 커넥션의 최대 수명 (ms)
@Mapper(componentModel = "spring") // MapStruct가 생성할 구현체를 스프링 Bean으로 등록
public interface UserMapper {
// 필드명이 다를 경우 @Mapping으로 직접 지정
@Mapping(source = "email", target = "emailAddress")
UserDto toDto(UserEntity entity);
// 필드명이 같다면 별도 매핑 없이 자동으로 변환
UserEntity toEntity(UserDto dto);
}
@Mapper(componentModel = "spring") : 컴파일 시점에 MapStruct가 이 인터페이스의 구현체를 자동으로 생성하며, 이를 스프링 컨테이너에 Bean으로 등록한다
@Mapping(source = "...", target = "...") : UserEntity의 email 필드를 UserDto의 emailAddress 필드로 매핑하도록 지정하며 필드명이 동일한 경우에는 이 어노테이션을 생략해도 자동으로 매핑된다