Skip to content

flyway를 사용한 데이터 형상관리

  1. flyway 패키지 설정
    build.gradle.kts
    dependencies {
    implementation("org.flywaydb:flyway-core")
    implementation("org.flywaydb:flyway-mysql")
    }
  2. flyway 설정
    resources/application.yaml
    spring:
    application:
    flyway:
    enabled: true
    baseline-on-migrate: true
    baseline-version: 1.0.0
  • 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
  1. ddl 디렉토리
    1. 테이블 생성을 위한 SQL 파일이 위치하는 공간.
    2. 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;
    3. 테이블 생성 스크립트보다 상위에 테이블 삭제 스크립트(DROP TABLE…)를 작성해 놓으면 향후 테이블 재 생성시에 유용하다.
  2. data 디렉토리
    1. 데이터 생성을 위한 SQL 파일이 위치하는 공간.
    2. 파일 샘플
      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')
      ;
  1. ddl 디렉토리
    1. 파일명 패턴
      V1_${MODULE_NO}_${SEQ}__TABLE_${TABLE_NAME}.sql
    2. 테이블 생성 스크립트는 V1.01.xx 버전을 사용한다.
    3. 테이블이 만드는 작업이 가장 우선순위를 가지기 때문에 V1 버전을 사용한다.
  2. data 디렉토리
    1. 파일명 패턴
      V2_${MODULE_NO}_${SEQ}__DATA_${TABLE_NAME}.sql
    2. 데이터 생성 스크립트는 V2.xx.xx 버전을 사용한다.
    3. V3.xx.xx 이후 버전은 별도의 규칙을 정의해서 사용할 수 있다.
  3. MODULE_NO
    1. 서브 모듈이나 업무 영역을 상수로 정의해서 사용한다.
    2. 사용예
      No.MODULE_NODESC
      100공통
      210사용자
      320제품
  4. SEQ
    1. 프로젝트별로 사용 용도를 유동적으로 정의해서 사용한다.
    2. 테이블에 일대일로 매칭되는 일련번호를 사용할 수 있다.
    3. 번호 자체에 의미를 부여하지 않고 형상관리를 위한 버전번호 용도로 사용할 수 있다.
  1. 스프링 부트 서버가 기동될 때마다 flyway가 실행된다.
  2. flyway 이력 테이블 이름은 flyway_schema_history 이다.
  3. flyway가 실행될 때마다 이력 테이블에 최종 버전이 저장된다.
  4. flyway가 기동되었을 때, 마지막 버전보다 상위 버전의 파일이 있는 경우 해당 파일을 실행하고 이력 데이터를 생성한다.
  5. 이력 테이블을 삭제하고 스프링 부트 서버를 재기동하는 방식으로 테이블과 데이터를 재생성할 수 있다.
  1. 테이블 컬럼 변경시
  2. 데이터 추가하는 경우