Search

[springboot] flyway 로 DB 마이그레이션 하기

타입
스터디
태그
springboot
PostgreSQL
상태
Published
생성일
2023/01/04 08:24
최종 편집 일시
2023/02/24 12:11
2 more properties

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 파일을 새로 생성하게 다시 적용하는 수 밖에 없다.
참고자료