본문 바로가기
IT

Flyway (Spring Boot + JPA)

by 최고영회 2019. 9. 10.
728x90
반응형
SMALL

 

소스코드는 svn, git 등 vcs(version control system)로 형상 관리한다.

데이터베이스의 변경 이력은 어떻게 관리해야 할까?

몇년전 flyway 와 같은 녀석(?)을 모를때에는

데이터베이스 무결성 검사 (현재 Application 에서 필요한 데이터베이스 스키마 정보와 일치하는지 확인)

를 위한 모듈을 직접 개발하여  Application 구동 시 또는 엔지니어가 버튼 클릭을 통해 확인하도록 기능을 제공했다. 

물론 현재도 해당 모듈을 이용하면 쉽게(?) 그리고 디테일 하게 필요한 테이블 스키마를 맞춰줄 수 있다.

다만, 해당 모듈을 사용하려면 각 테이블에 대한 SQL 파일 뿐 아니라 index 에 대한 파일, 각 컬럼에 대한 명세 파일 등을 수동으로 하나하나 만들어야 하는 불편함이 크다.

해당 모듈을 개선할까..생각하다가 이런건 뭐 없나? 해서 검색 해 보니 ... 바로 나오네.....

왜 5년전에는 검색해 보지 않았을까.. ㅜㅜ

Flyway는 버전별 DB 스크립트 파일을 열거 해 두면 알아서 SQL 파일을 수행해 주고 DB 변경 이력에 대한 관리를 해 주는 녀석이다 .

Flyway는 V + 버전 + __ + 설명.sql 이라는 규칙으로 파일명을 작성해야 한다. ex) V1.0__INIT.sql

그럼 Flyway Plugin 이 flyway_schema_history 내부 스키마를 이용하여 파일 버전을 관리하게 된다. 

Flyway로 관리될 SQL 파일은 반드시 src/main/resources/db/migration 위치에 저장되어야 한다. 

그래야 Flyway Plugin 이 인식한다. 그리고 위에서 언급한 파일명 규칙을 따라야 한다. 

현재 진행중인 프로젝트 (Spring Boot + JPA) 에 적용해 보자.

먼저 pom.xml 에 dependency를 추가하고

<dependency>
   <groupId>org.flywaydb</groupId>
   <artifactId>flyway-core</artifactId>
</dependency>

필요한 테이블 생성 스크립트를 약속된 위치에 생성한다.

그리고 Boot 를 run 하면 된다. 

Spring Boot 는 CoC를 추구하기 때문에 기본적으로 flyway를 dependency에 추가하면 

관례적으로 개발자들이 수행하는 작업 (flyway를 실행시켜주는 일) 을 알아서 해 준다. 

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

spring.jpa.generate-ddl, spring.jpa.hibernate.ddl-auto, schema.sql  옵션을 통해서도

데이터베이스 테이블의 초기화 전략을 가져갈 수 있으나

초기화 뿐 아니라 형상관리를 위해서라면 flyway가 필요하다.

flyway 는 버전별로 지정한 SQL을 수행하면 히스토리를 관리하기 위한 flyway_schema_history 테이블을 생성한다.

이미 수행된 SQL 파일을 수정하면 어떻게 될까?

Boot startup 시 flyway 에서 checksum 이 맞지 않는다는 예외를 던진다. 

이제 앞으로 스키마가 변경되는 일이 있을 경우 버전 명시와 이름 설정한 sql 파일만 넣어주면 된다. 

편하다.

728x90
반응형
LIST