ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • FlyWay로 DB 형상 관리
    DB 2023. 6. 15. 12:13
    test

     

    개발을 하다보니 DB 를 마이그레이션 하는경우가 게속해서 발생되고

    테스트 db 에는 마이그레이션을 했으니 운영 db에는 마이그레이션을 안해서 장애가 발생하는 경우 등

    다양한 휴먼 에러가 많이 나타난다.

    FlyWay를 사용하여 이를 관리하려고한다.

    Flyway

    Flyway는 데이터베이스의 형상을 관리하기위한 도구로

    데이터베이스의 스키마 및 데이터의 변경사항을 관리하고 일관성 있게 유지하도록 지원한다.

     

    Flyway는 여러 마이그레이션 이력을 가지고 동작을 하면서

    각 버전 과 실행 여부를 관리하며 순차적으로 마이그레이션을 진행하여 최신상태를 유지한다.

    현재 개발도구로 SpringBoot + JPA 를 사용하기에

    여기에 Flyway를 추가한다.

    flyway 추가 및 활성

    의존성 추가

    //flyway
    implementation 'org.flywaydb:flyway-core:6.4.2'
    

    application.yml

    spring:
      flyway:
        enabled: true
        baseline-on-migrate: true
    

    마이그레이션 파일 네이밍

     

    Version 의 약자인 V 로 시작하여

    뒤에는 버전 번호를 기입하고 언더바 두개 (__) 로 이어서 설명을 작성한다.

    최초의 상태 지정

    마이그레이션 파일은 resources/db/migration 위치에 작성하게되며

    flyway에게 시작점을 알릴수있는 최초의 sql 파일을 작성해줘야한다.

     

    만약 아직 table 가 작성된게 아니라면 빈 파일을 넣고

    table 가 작성된 상황이라면 지금 상태의 DDL 을 넣으면 된다.

     

     

    -- V1.0.0__init.sql
    CREATE TABLE `tb_document` (
             `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
             `create_at` datetime(6) DEFAULT NULL,
             `author` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
             `title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
             `url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
             `library_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
             PRIMARY KEY (`id`),
             KEY `FK269m6s7lhvrk53ljnbrx7cf6y` (`library_id`),
             CONSTRAINT `FK269m6s7lhvrk53ljnbrx7cf6y` FOREIGN KEY (`library_id`) REFERENCES `tb_library` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

    이상태로 프로젝트를 시작하면

    flyway_schema_history 라는 테이블이 생성된다.

    이곳에서 버전, 적용 스크립트, 변경일 등을 관리한다.

     

     

    컬럼명 변경 및 추가 마이그레이션

    @Entity
    @Table(name = "tb_document")
    public class Document extends BaseEntity {
    
        @Id
        private UUID id;
    
        @NotNull
        @Enumerated(EnumType.STRING)
        @Column(name = "type")
        private Type type;
    }

    기존 컬럼명 ‘type’ 를 ‘sctipt_type’ 으로 변경도 하고 컬럼도 추가 해보자.

     

    마이그레이션 파일 생성

    -- V1.0.1__library_column_name.sql
    ALTER TABLE tb_library CHANGE type script_type varchar(255) NOT NULL;
    

     

    컬럼 추가와 기존의 데이터를 모두 변경하는 update 쿼리도 함께 작성.

    -- v1.0.2__library_column_add.sql
    
    ALTER TABLE tb_library ADD COLUMN library_type VARCHAR(255) DEFAULT 'common';
    UPDATE tb_library SET library_type = 'ORG';
    

    해당 마이그레이션 파일을 작성후 프로젝트를 실행시키면

     

    flyway_schema_history 테이블에 v1.0.1 과 v1.0.2 가 추가 및 적용이 되어있다.

     

     

    테스트용 데이터 추가

    매번 동작해도 상관없는 sql 파일의 프리픽스로는 R 을 사용한다.

    마이그레이션 경로인 resources/db/migration 에 함께 위치해도 상관없으나

    역활에 따라 분류 하여 관리할수있다.

     

    여기서는 마이그레이션 파일과 다르게 버전을 안붙혀도 동작한다.

    INSERT IGNORE INTO tb_member (create_at,state,url) VALUES
    ("2023-04-17 01:04:08.943", "ACTIVE","www.google.com"),
    ("2023-04-18 01:04:08.943", "ACTIVE","www.naver.com")
    

    yml 파일에서

    resources/db/migration 과 함께 resources/db/seed 가 함께 동작할수있도록 설정해줘야한다

    flyway:
        enabled: true
        baseline-on-migrate: true
        locations: classpath:db/migration, classpath:db/seed
    

    기타

    • 마이그레이션 파일의 버전은 항상 위로 올라가야한다.
    • flyway_schema_history 에 보면 사용된 마이그레이션 파일의 체크섬을 관리하는것을 볼수있는데
    • 따라서 한번 작성된 마이그레이션 파일은 수정하면 안된다.
    • flyway에는 롤백 기능도 제공하나 무료기능 에서는 제공하지 않는다.