Spring

Spring Boot + Flyway를 이용한 데이터베이스 마이그레이션

Beekei 2021. 9. 16. 15:29
반응형

Flyway란?

오픈소스 마이그레이션 툴

자바나 c++같은 프로그램의 소스 코드는 svn, git과 같은 형상관리 툴로 쉽게 관리할 수 있지만 테이블의 스키마나 데이터는 위와 같은 툴로 변경이력을 관리할 수 없습니다.

따라서 SQL 스크립트문을 실행하거나 직접 DB 콘솔이나 Toad 같은 툴을 통해 직접 수동으로 처리해줘야 하는 단점이 있습니다.

Flyway는 버전 관리 목적인 SCHEMA_VERSION 테이블을 통해 SQL 스크립트의 변화를 추적하면서 자동적으로 관리하는 방법으로 위와 같은 문제를 해결합니다.


구현 예제

1. build.grade 설정

dependencies {
	...
	// flyway
  implementation 'org.flywaydb:flyway-core'
	// jpa
  implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	...
}

2. application.yml 설정

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/study?serverTimezone=Asia/Seoul&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true
    username: root
    password: rootPassword

  flyway:
    enabled: true # flyway 사용여부
    baseline-on-migrate: true # baseline 설정
    baseline-version: 1 # baseline-version을 몇부터 실행할지 설정
    url: jdbc:mysql://localhost:3306/study
    user: root
    password: rootPassword

  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    generate-ddl: false # DDL 생성 여부
    open-in-view: false # View 단에서 Session(영속성 컨텍스트) 적용 여부 - 확작성 측면으로 볼때 false 권장 (default: true)
    hibernate:
      ddl-auto: validate # ddl 전략 설정 none, update, validata, create, create-drop
      #      naming:
      #        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl # 테이블 매핑 시 네이밍 전략 설정(카멜)
      use-new-id-generator-mappings: false #  Hibernate의 id 생성 전략을 그대로 사용
    show-sql: true # sql 출력
    properties:
      hibernate:
        enable_lazy_load_no_trans: true # LAZY 로드를 default로 설정
        format_sql: true # sql을 보기 좋게 출력

Flyway와 JPA를 함께 사용할 경우 generate-ddl: false, ddl-auto: validate(or none)으로 설정해야 형상 관리가 가능하다.

3. 스키마 파일 생성

Flyway에서 따르라고 하는 컨벤션에 맞춰 resources/db/migration 하위에 스키마 파일을 생성

flyway file naming

V1__init.sql

CREATE DATABASE IF NOT EXISTS `study`
USE `study`;

DROP TABLE IF EXISTS `users`;
CREATE TABLE IF NOT EXISTS `users` (
    `id` bigint NOT NULL AUTO_INCREMENT,
    `email` varchar(200) NOT NULL,
    `loginid` varchar(100) NOT NULL,
    `name` varchar(50) NOT NULL,
    `password` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3;

V2__alter_user_add_phone_number.sql

ALTER TABLE users ADD phone_number VARCHAR(13) NULL;

4. Server Run

데이터베이스를 확인해보면 flayway_schema_history 테이블이 생성된 것을 확인할 수 있다.

실행된 스키파 정보가 데이터로 저장되어있다.

물론 직접 @Configuration을 통해 flyway initializing을 직접 수행할 수도 있다.

users 테이블을 확인해 보면 phone_number 컬럼이 생성되어있다.(V2__alter_user_add_phone_number.sql)

 

주의사항

  1. flayway_schema_history 테이블의 version1의 로그가 남아있는 상태에서 V1_~.sql 스키파 파일을 다시 생성 후 실행하면 실행되지 않는다.
  2. flyway clean은 정말 왠만하면 사용하면 안된다. (실행 시 경고 문구 없이 바로 삭제됨)

 

 

GitHub - devbeekei/flyway: flyway example

flyway example. Contribute to devbeekei/flyway development by creating an account on GitHub.

github.com

 

반응형