-
FlyWay로 DB 형상 관리DB 2023. 6. 15. 12:13test
개발을 하다보니 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에는 롤백 기능도 제공하나 무료기능 에서는 제공하지 않는다.
'DB' 카테고리의 다른 글
Mysql(Maraidb) 실행 계획 살펴보기 (0) 2023.11.12 트랜잭션의 격리 수준 이라는 등가교환 (0) 2023.08.04 db column명은 snake_case 가 최고다 (0) 2023.08.02