Skip to content

flyway 개요와 활용법

정진혁 edited this page Sep 27, 2022 · 2 revisions

flyway 개요

공식문서

build.gradle

implementation 'org.flywaydb:flyway-core:6.4.2'

application.yml

spring:
  flyway:
    baselineOnMigrate: true // 베이스라인을 기준으로 시작한다.
    locations: classpath:db/migration/prod //버전 파일들의 위치. 디폴트는 main/java/resources/db/migration
    enabled: true // 플라이웨이 버전 검사 및 새로운 버전의 sql 실행 여부를 결정

flyway 의존성을 받아주고, 스프링에서 세가지의 설정을 해준다. 버전에 적용되어야 할 sql은 locations에 적어준 디렉토리, resources/db/migration/prod 에 변경해야할 스키마 및 데이터 처리 쿼리를 적어주면 된다.

실제 작성 예시

추가

  • Member에 a라는 칼럼을 추가하는 예시
public class Member {
...
    @Column
    private String a;
...

migrate sql 파일이름 양식 : V{버전명}__{상세내용}.sql (중간 언더바는 두 개여야 인식한다 __)

V2__add_column_a.sql

alter table member add a varchar(255) null; 

적용 결과

스크린샷 2021-09-07 오후 4 38 15

롤백

공식 문서에선 UNDO 태스크를 제공하지만, community 버전에선 지원하지 않는다. 대안으로, 롤백해야 되는 스키마와 DDL을 다음 버전으로 만들어 커밋하는 방법이 있다.

  • Member에서 a라는 칼럼을 삭제하는 예시
public class Member {
...
   /*
    * @Column
    * private String a;
   */
...

V3__delete_column_a.sql

alter table member drop column a; 

적용 결과

스크린샷 2021-09-07 오후 4 44 15

주의사항

  • 현재 dev와 prod는 ddl-auto : validate 이므로, 테이블 스키마와 객체 필드간의 연관관계가 틀리다면 서버가 실행되지 않는다.
ERROR [org.springframework.boot.SpringApplication.reportFailure]:871] 
    > Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' ... Schema-validation: missing column [a] in table [member]

flyway 로컬에서 확인

확인 방법

  1. docker 폴더에서 아래의 명령어를 입력해 mysql 실행
docker-compose -p prolog up -d
  1. flyway 프로필 설정 후 애플리케이션 실행
스크린샷 2022-09-26 오후 2 44 03
  1. flyway 정상 작동 확인
스크린샷 2022-09-26 오후 2 46 20 실행 시 확인된 로그를 통해 flyway 정상 작동 확인

관련 이슈

local 프로필에 적용하려 했으나 DataLoaderApplicationListener에서 예외 발생

  • docker로 mysql 세팅후 local 프로필에서만 동작하는 DataLoaderApplicationListener로 더미 데이터 추가 시 아래의 예외가 발생 스크린샷 2022-09-26 오후 2 00 23

  • 역량 추가하는 부분에서 예외 발생

    스크린샷 2022-09-26 오후 2 00 43
  • 원인을 정확히 찾기 힘들어서 flyway 프로필을 새로 생성해 DataLoaderApplicationListener를 실행하지 않도록 설정 (추후 원인 파악 후 수정 필요)

Clone this wiki locally