◼ flyway는 데이터 베이스의 현상관리를 목적으로 하는 툴이다.
◼ 데이터 베이스의 DDL 이력을 쌓아서 DDL이 어떻게 변화되었는지 관리하고, 사용하는 데이터 베이스의 스키마 버전을 관리할 수 있다.
💬 스키마의 이력관리와 프로덕션 코드 작성 시, SQL 문도 함께 작성하여 배포 시 자동으로 DB 스키마 수정이 가능하도록 하기 위해 사용한다.
사용하기
✔ build.gradle.kts 파일에 다음과 같은 의존성을 추가한다.
implementation("org.flywaydb:flyway-core")
implementation("org.flywaydb:flyway-mysql")
💥 MariaDB 10.6 이상 버전을 사용하는데 implementation("org.flywaydb:flyway-mysql") 의존성을 추가하지 않으면 다음과 같은 에러가 발생한다.
✔ application.yml 파일에 다음을 추가한다.
spring:
flyway:
enabled: true
baseline-on-migrate: true
◼ 원하는 profile에 해당 옵션을 설정하면 datesource에 등록된 데이터 베이스에 flyway가 적용된다.
◼ 보통 local, dev, prod 환경에 사용하고 test 환경에서는 enabled: false로 설정한다.
✔ resources/db/migration에 .sql 파일 추가
◼ resources/db/migration 경로에 마이그레이션 파일을 추가한다.
◼ 파일 이름은 다음과 같은 형식을 따른다.
Prefix - (V, U, R)
V: Verion, U: undo, R: Repeatable
Version - 버전 정보(정수, 소수, 날짜 등...)
Seperator - __ (underscore 2개)
Description - 설명
✔ spring boot 애플리케이션 실행
◼ spring boot 애플리케이션을 실행하면 flyway가 적용된다.
◼ gradle build 시 flyway를 실행하고 싶다면, plugin을 사용해서 gradle에 설정하면 된다.
✔ flyway_schema_history 테이블
◼ flyway에서 형상 관리를 위하여 자동으로 만드는 테이블이다.
◼ 위 구조에서 중요한 것은 version, checksum, success 필드이다.
version: .sql 파일 V 뒤에 붙어 있는 숫자로, 낮은 숫자부터 실행되며 해당 숫자가 기록된다.
checksum: 파일의 내용을 hashing한 값으로 파일의 내용이 달라지면 체크섬 값이 달라져 에러가 발생한다.
success: 파일의 실행이 성공했는지를 나타내는 값이다.
JPA의 ddl-auto: update를 사용하는 것이 아닌 flyway를 사용하는 이유
◼ 의도치 않은 데이터의 변경을 막기 위해
◼ ddl-auto: update를 사용하면 엔티티의 변화에 따라 DB 스키마가 바로 반영되기 때문에, 의도치 않은 데이터 손실이 발생할 수 있다.
◼ flyway를 사용하여 변경 이력을 직접 작성하고 검증하는 과정을 통해 위 상황을 방지할 수 있다.
'Backend > Spring' 카테고리의 다른 글
Kotlin에서 Rest Docs 문서화 코드 개선하기 (0) | 2023.05.29 |
---|---|
Kotest를 통한 DCI 패턴 적용 (0) | 2023.05.27 |
[Spring] checkstyle 적용하기 (0) | 2023.05.03 |
DDD(Domain Driven Design)란? (1) | 2023.04.03 |
[Spring] Rest-Docs 연결 (0) | 2023.01.13 |