[쿠링] 형상관리를 위한 Flyway 도입기
해당 글은 개인 프로젝트를 개선해 나가면서 내용을 정리하는 글입니다.
1. 도입 배경
이번 쿠링 전 학과별 공지 지원 과정에서 기존의 Notice 테이블이 아닌, DepartmentNotice가 추가적을 발생하게 되었다.
새로운 테이블을 기존의 Notice테이블에 Dtype으로 구분하기 시작하면서, 추가된 속성들이 있고, 새로운 값들이 추가되었다.
물론 나야 내가 변경했으니 해당 의미들 을 빠르게 파악 가능하지만, 과연 다른 이가 봐도 이를 빠르게 이해할 수 있을까? 란 의문이 들었다.
또한 서로 다른 환경(local, test, prod)간에 통일된 스키마를 가지기 위해서 많은 리소스가 사용된다.
그러한 과정 속에서 다음 3가지 목표가 생기게 되었다.
- 업데이트마다 운영 DDL과 개발 DDL을 하나하나 비교하면서 확인하지 않을 방법, 정확한 유효성 검증 방법이 있을까?
- 스키마가 변경되어온 과정의 history를 확인할 수 있는 방법이 없을까? (나중의 팀원을 위해)
- 개발환경 스키마만 변경하고, 운영 스키마는 변경하지 않는 휴면 에러 근절하기!
그렇게 방법을 찾아보던 도중, 쿠킴, 포키가 형상관리 도구로 Flyway를 추천해줬으며, 추가적인 아이디어를 제공해 주었다!
나도 예저에 유스콘에 갔을때 해당 세션에 참여한적이 있어서 "이것닷!"이라는 생각이 들었고, 바로 적용하게 되었다.
즉 스키마를 코드로 관리하자는 것 이다!
가장 매력적으로 느낀점이
▶ 환경 구축과 협업이 편리해진다
- 변경 이력이 코드로 남게 되니, 리뷰가 편해진다.
- Migration을 자동화시켜, 각기 다른 환경 사이에 스키마를 통일시키기 쉬워진다.
2. 적용해 보기
2-1) 의존성 추가
build.gradle에 다음과 같이 추가해 준다.
plugins {
// 생략...
id "org.flywaydb.flyway" version "9.16.1" // flyway gradle plugin 의존성
}
// flyway
implementation 'org.flywaydb:flyway-core'
2-2) 기존 데이터가 존재하는 상황에서 형상관리를 시작할 baseline 만들기
나 같은 경우 기존에 JPA에서 생성해 줬던 auto-ddl의 스키마들이 있으며, 데이터 또한 있는 상황이다.
따라서 기존의 스키마를 v1_base_line.sql로 만들어주도록 하자!
2-2-1) application.yml에 설정을 추가합니다.
yml에 baseline-on-migrate: true를 설정해 주었습니다.
spring:
# ... 생략
flyway:
enabled: true
baseline-on-migrate: true // 추가된 부분
url: url
user: id
password: password
2-2-2) resources/db/migration 위치에 V1 migration script를 작성합니다.
이때 반드시 스크립트 파일이 있어야 합니다.
특별한 버전 1 없이, 그냥 기존 테이블과 데이터를 유지하고자 해도 빈 script를 작성해야 합니다.
즉, 파일 자체는 있어야 한다는 의미입니다.
위와 같이 설정해 준 후, 애플리케이션을 실행시켜 봅시다!
성공적으로 flyway에서 첫 schema_history를 만드는 것 을 확인할 수 있었습니다.
테이블에 직접 접근하여 확인한 결과, 다음과 같이 Baseline이 생성된 것 을 확인할 수 있었습니다.
https://flywaydb.org/documentation/configuration/parameters/baselineOnMigrate
2-3) 새로운 스크립트 추가하기
다음과 같이 V220330_xxx.sql 스크립트를 하나 추가해 주었습니다.
(참고로 V다음에는 버전 정보가 오름차순으로 설정되면 되기 때문에 저는 날짜를 사용할 것입니다)
변경 전의 Notice 스키마 구조는 다음과 같습니다.
다음으로 flyway migration을 gradle을 통해 수행해 줍니다.
다음과 같이 성공적으로 수행된 것을 확인할 수 있었습니다.
성공적으로 Notice 테이블의 스키마 구조가 변경된 것을 확인할 수 있었습니다!!
3. 참고
https://backtony.github.io/spring/2021-10-22-spring-db-1/