flyway 란?
DB 의 형상관리를 목적으로 하는 자바 진영의 라이브러리이다.
소스코드의 이력을 git 으로 관리하듯, DB의 이력관리를 도와주는 라이브러리라고 이해하면 된다.
flyway는 단순한 DB 백업 뿐만 아니라 마이그레이션, 테스트코드 실행 시에도 도움이 된다.
flyway 와 DB 설정
maven 을 사용했음
pom.xml
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
XML
복사
config/DatasourceConfig
package com.tutorial.config;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
@Configuration
public class DatasourceConfig {
@Bean
@Primary
@ConfigurationProperties("app.datasource.main")
public HikariDataSource hikariDataSource() {
return DataSourceBuilder
.create()
.type(HikariDataSource.class)
.build();
}
@Bean
public JdbcTemplate jdbcTemplate(HikariDataSource hikariDataSource) {
return new JdbcTemplate(hikariDataSource);
}
}
Java
복사
jdbcTemplate 객체 : hikariDataSource 를 주입 받고 bean 으로 등록
application.yml
app:
datasource:
main:
driver-class-name: org.postgresql.Driver
jdbc-url: jdbc:postgresql://localhost:5432/root
username: root
password: password
pool-size: 30
YAML
복사
이 코드 같은 경우는 application.yml 으로 직접 DB 설정을 하는 것이 아니라, DatasourceConfig 를 통해 연결하기 때문에 일반적인 application.yml 의 속성과는 다름
DB 마이그레이션 파일 작성
flyway 에서는 기존 DB 에서 다른 DB 로 옮기는 것 뿐만 아니라 flyway 를 이용해서 하는 모든 DB 작업을 마이그레이션 이라고 부른다.
마이그레이션이 이뤄지는 과정은 단순하다.
개발자가 .sql 파일을 미리 만들어놓으면 flyway 가 해당 sql 파일을 인식해서 스프링부트가 올라갈 때 DB 에 대한 작업이 들어가게 된다.
앞서 말했듯 flyway 가 해당 sql 파일을 인식 해야하기 때문에 sql 파일의 경로 위치와 파일명을 신경 써줘야 한다.
안 그러면 flyway 가 sql 파일을 인식 못하기 때문에 마이그레이션이 작동하지 않는다.
파일명 규칙
네이밍 규칙은 위 사진과 같다.
•
Prefix : V, U, R 중 하나 (일반적으로 V 를 거의 쓰는 듯하다)
•
Version : 버전정보 ( 정수 뿐만 아니라 소수, 날짜도 가능 )
•
Separator : 언더바 2개 __
•
Description : 파일 설명
파일명 예시 :
•
V1__init_table.sql
•
V20220104__insert_data.sql
경로
디폴트로 src/main/resources/db/migration 폴더가 설정돼있다.
application.yml 파일 수정으로 커스텀이 가능하다.
실습해보기
1. flyway 실행 전 DB 상태
public 스키마가 비워져 있다.
2. db migration 용 sql파일 생성
src/main/resources/db/migration/V1__InitTables.sql
CREATE TABLE movie (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
release_date DATE NOT NULL,
unique (name)
);
SQL
복사
movie 라는 테이블을 create 하는 sql
3. 스프링부트 어플리케이션 실행
스프링부트 실행 로그를 보면 flyway migrate 관련 로그가 뜬다.
o.f.c.internal.database.base.Database : Flyway upgrade recommended: org.flywaydb.core.internal.database.postgresql.PostgreSQLDatabaseType@2f4ba1ae 15.1 is newer than this version of Flyway and support has not been tested. The latest supported version of org.flywaydb.core.internal.database.postgresql.PostgreSQLDatabaseType@2f4ba1ae is 13.
o.f.core.internal.command.DbValidate : Successfully validated 1 migration (execution time 00:00.008s)
o.f.c.i.s.JdbcTableSchemaHistory : Creating Schema History table "public"."flyway_schema_history" ...
o.f.c.i.s.DefaultSqlScriptExecutor : 0 rows affected
o.f.c.i.s.DefaultSqlScriptExecutor : 0 rows affected
o.f.c.i.s.DefaultSqlScriptExecutor : 0 rows affected
o.f.core.internal.command.DbMigrate : Current version of schema "public": << Empty Schema >>
o.f.core.internal.command.DbMigrate : Migrating schema "public" to version "1 - InitTables"
o.f.c.i.s.DefaultSqlScriptExecutor : 0 rows affected
o.f.core.internal.command.DbMigrate : Successfully applied 1 migration to schema "public", now at version v1 (execution time 00:00.022s)
SQL
복사
4. 테이블 확인
flyway_schema_history, movie 테이블과 movie_id_seq 라는 시퀸스가 생겼다.
flyway_schema_history 테이블은 flyway 마이그레이션 이력 정보를 관리하는 메타테이블 이다.
•
flyway_schema_history 테이블
•
movie 테이블
row 를 안 넣었기 때문에 column 만 존재한다.
주의사항
•
한 번 마이그레이션을 한 sql 파일은 절대로 수정하면 안 된다. (에러발생함)
따라서 DB 에 변경사항이 생겨서 DB에 수정작업을 해야한다면 버전업을 한 sql 파일을 새로 생성하게 다시 적용하는 수 밖에 없다.
참고자료