Flyway 는 데이터 베이스 버젼관리를 위한 툴입니다. 소스코드가 SVN, GIT 으로 버젼관리가 되는 것에 비해
데이터 베이스는이력 관리가 쉽지 않았습니다.
개발시 요구사항에 따라 테이블과 컬럼이 업데이트가 되곤하는데 시간이 지나면 어떤 컬럼과 테이블이 변경되었는지 알기어렵습니다.
최근 개발자들 사이에서 JPA 사용빈도가 늘어나고, Entity 수정만으로 간단하게 테이블 반영이 되고 있습니다.
그래서 디비 버전관리 할 필요성이 더 늘어나고 DB버젼 관리가 용이하게 돕는 툴이 Flyway 입니다.
Flyway를 통해 개발자간의 동일한 DB구성과 스키마 관리를 할 수 있습니다.
(flyway를 설명한 링크가 있으니 보면 좀 더 이해하기 쉬울 것같습니다)
Flyway 는 유료모델이 존재합니다. 필요에 따라 유료버젼을 사용하면 될 것같습니다.
저는 커뮤니티 에디션의 사용예제를 준비했습니다.
스프링 부트 프로젝트 생성
의존성 추가
- Spring Data JPA
- Flyway Migration
- MySql
- Spring Web
프로젝트 생성시 모습입니다.
resources 폴더에서 db/migration이 생성된 것을 볼 수 있는데
flyway는 'classpath:db/migration' 를 사용하고 있습니다. 나중에 여기에 스키마 파일을 넣으면 됩니다.
custom하게 위치를 지정할 수 도 있습니다.
application properties에 DB연결정보를 입력합니다. 이 포스팅에서 DB연결이나 DB계정생성은 다루지 않겠습니다.
샘플로 Entity를 생성할 학생 정보입니다.
@Entity
public class Student {
@Id
private Long id;
private String name;
protected Student() {
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
}
어플리케이션을 시작하면 바로 실행되지는 않습니다. flyway 관련 설정을 해야합니다.
resources/db/migration에 스키마 파일을 넣습니다.
파일명에 규칙이 있기때문에 이를 따라야합니다.
- Prefix + Version + __ + 설명 .sql
Prefix: V(version migration), U(undo 유료버젼)
여기서 중요한 것은 언더바를 두번해야합니다.
이제 어플리케이션을 기동하면 되지 않고
baselineOnMigrate를 지정하라는 오류가 나타납니다. history table를 생성을 위한 초기화 옵션을 설정하라는 뜻입니다.
이제 시작을 누르면 정상적으로 어플리케이션이 시작됩니다.
DB를 보면 내가 생성하려는 테이블외에 flyway_schema_history라는 테이블이 생성된 것을 볼 수 있습니다.
해당 테이블을 조회하면 이력이 나타납니다.
JPA 때문에 테이블이 만들어진 것일 수 도 있다는 생각이 들어 student 테이블을 삭제하고
ddl-auto의 상태를 validate (기존 테이블의 검증) 로 변경하고 다시 실행해서 확인했습니다.
정상적으로 테이블이 다시 생성했는지 확인하고, flyway가 버젼관리를 통해 관리를 하고 있음을 확인합니다.
버젼관리
새로운 요구사항이 생겨서 Student에 age항목이 생겼다고 가정을 합시다.
@Entity
public class Student {
@Id
private Long id;
private String name;
private int age;
protected Student() {
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
디비의 버젼관리가 필요하다고 판단을 하고 새로운 스키마 파일을 생성합니다.
하지만 이대로 실행하면 V1, V2 스키마 파일을 실행하기때문에 적용할 스키마를 설정해야합니다.
baselin-version을 지정할 수 있습니다. 2버젼부터 지정하겠습니다. 2버젼 부터 마이그레이션을 사용하겠다는 것입니다.
이력테이블에 V2가 추가되었습니다.
기존의 테이블을 삭제하고 다시 어플리케이션을 실행해보면 새로운 스키마 파일로 생성되었음을 확인할 수 있습니다.
준비한 예제는 여기까지입니다.
공식문서에 보면 build.gradle에서 DB정보를 입력해서 관리하는 예제가 나오는데,
스프링부트를 사용하면 application.properties에서 관리할 수 있기때문에 사용하지 않았습니다.
또한, build.gradle에 서버 정보를 두면 보안 이슈도 고려해 봐야할 것 같습니다.
이외에도 공식문서를 보면 자바 코드로 버젼관리같은 다양한 사용방법들이 있으니 더 궁금한 점은 공식문서를 참고바랍니다.
'Spring > Spring Boot' 카테고리의 다른 글
com.querydsl.core.types.Operation com.querydsl.core.types.ExpressionUtils.operation(java.lang.Class, com.querydsl.core.types.Operator, com.google.common.collect.ImmutableList) (0) | 2024.06.20 |
---|---|
Spring boot 2.x -> 3.x (0) | 2024.02.09 |
다국어 설정 (0) | 2020.08.11 |
Gradle import (0) | 2020.02.25 |