flyway를 사용한 데이터 형상관리
flyway 설정
Section titled “flyway 설정”- flyway 패키지 설정
build.gradle.kts dependencies {implementation("org.flywaydb:flyway-core")implementation("org.flywaydb:flyway-mysql")} - flyway 설정
resources/application.yaml spring:application:flyway:enabled: truebaseline-on-migrate: truebaseline-version: 1.0.0
디렉토리 구조
Section titled “디렉토리 구조”Directoryresources/
Directorydb.migration/
Directorydata/ #데이터 디렉토리
- V1_02_001__DATA_USER_MS.sql
- V1_02_002__DATA_CODE_MS.sql
Directoryddl/ #테이블생성 스크립트
- V1_01_001__TABLE_USER_MS.sql
- V1_01_002__TABLE_CODE_MS.sql
- ddl 디렉토리
- 테이블 생성을 위한 SQL 파일이 위치하는 공간.
- ddl 디렉토리의 파일 샘플
DROP TABLE IF EXISTS LABEL_MS;CREATE TABLE IF NOT EXISTS LABEL_MS (LABEL_ID INT NOT NULL AUTO_INCREMENT COMMENT '라벨 ID',LABEL_NAME VARCHAR(40) NOT NULL COMMENT '라벨 이름',LABEL VARCHAR(80) NOT NULL COMMENT '라벨',LANG_CD VARCHAR(2) NOT NULL COMMENT '언어 코드',USE_YN VARCHAR(1) NOT NULL COMMENT '사용 여부',CREATE_DT TIMESTAMP NOT NULL COMMENT '등록 일시',CREATE_USER_ID INT NOT NULL COMMENT '등록자 ID',CREATE_IP VARCHAR(40) NOT NULL COMMENT '등록 IP',UPDATE_DT TIMESTAMP NOT NULL COMMENT '수정 일시',UPDATE_USER_ID INT NOT NULL COMMENT '수정자 ID',UPDATE_IP VARCHAR(40) NOT NULL COMMENT '수정 IP',PRIMARY KEY(LABEL_ID));CREATE INDEX LABEL_MS_IX1 ON LABEL_MS (LANG_CD);ALTER TABLE LABEL_MS COMMENT = '라벨';ALTER TABLE LABEL_MS AUTO_INCREMENT = 1000;
- 테이블 생성 스크립트보다 상위에 테이블 삭제 스크립트(DROP TABLE…)를 작성해 놓으면 향후 테이블 재 생성시에 유용하다.
- data 디렉토리
- 데이터 생성을 위한 SQL 파일이 위치하는 공간.
- 파일 샘플
INSERT INTO LABEL_MS (LABEL_NAME, LABEL, LANG_CD, USE_YN, CREATE_DT, CREATE_USER_ID, CREATE_IP, UPDATE_DT, UPDATE_USER_ID, UPDATE_IP)VALUES('LOGIN_TITLE', 'Login', 'ko', 'Y', NOW(), 1000, '0:0:0:0:0:0:0:1', NOW(), 1000, '0:0:0:0:0:0:0:1'),('EMAIL', '이메일', 'ko', 'Y', NOW(), 1000, '0:0:0:0:0:0:0:1', NOW(), 1000, '0:0:0:0:0:0:0:1'),('PASSWORD', '패스워드', 'ko', 'Y', NOW(), 1000, '0:0:0:0:0:0:0:1', NOW(), 1000, '0:0:0:0:0:0:0:1');
파일명 규칙
Section titled “파일명 규칙”- ddl 디렉토리
- 파일명 패턴
V1_${MODULE_NO}_${SEQ}__TABLE_${TABLE_NAME}.sql
- 테이블 생성 스크립트는 V1.01.xx 버전을 사용한다.
- 테이블이 만드는 작업이 가장 우선순위를 가지기 때문에 V1 버전을 사용한다.
- 파일명 패턴
- data 디렉토리
- 파일명 패턴
V2_${MODULE_NO}_${SEQ}__DATA_${TABLE_NAME}.sql
- 데이터 생성 스크립트는 V2.xx.xx 버전을 사용한다.
- V3.xx.xx 이후 버전은 별도의 규칙을 정의해서 사용할 수 있다.
- 파일명 패턴
- MODULE_NO
- 서브 모듈이나 업무 영역을 상수로 정의해서 사용한다.
- 사용예
No. MODULE_NO DESC 1 00 공통 2 10 사용자 3 20 제품
- SEQ
- 프로젝트별로 사용 용도를 유동적으로 정의해서 사용한다.
- 테이블에 일대일로 매칭되는 일련번호를 사용할 수 있다.
- 번호 자체에 의미를 부여하지 않고 형상관리를 위한 버전번호 용도로 사용할 수 있다.
작업 프로세스
Section titled “작업 프로세스”- 스프링 부트 서버가 기동될 때마다 flyway가 실행된다.
- flyway 이력 테이블 이름은 flyway_schema_history 이다.
- flyway가 실행될 때마다 이력 테이블에 최종 버전이 저장된다.
- flyway가 기동되었을 때, 마지막 버전보다 상위 버전의 파일이 있는 경우 해당 파일을 실행하고 이력 데이터를 생성한다.
- 이력 테이블을 삭제하고 스프링 부트 서버를 재기동하는 방식으로 테이블과 데이터를 재생성할 수 있다.
변경사항 적용 전략
Section titled “변경사항 적용 전략”- 테이블 컬럼 변경시
- 데이터 추가하는 경우