반응형
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 하위에 스키마 파일을 생성
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)
주의사항
- flayway_schema_history 테이블의 version1의 로그가 남아있는 상태에서 V1_~.sql 스키파 파일을 다시 생성 후 실행하면 실행되지 않는다.
- flyway clean은 정말 왠만하면 사용하면 안된다. (실행 시 경고 문구 없이 바로 삭제됨)
반응형
'Spring' 카테고리의 다른 글
Spring Cloud Config 소개 & 예제 (0) | 2021.10.18 |
---|---|
Spring Boot + log4j2 (0) | 2021.10.07 |
Querydsl 설명 및 예제 (0) | 2021.09.15 |
Spring AOP란? (0) | 2021.09.11 |
Spring REST Docs 구축 예시 (0) | 2021.09.10 |