Spring에서 초기 테이블과 데이터 관리를 위해서 data.sql과 schema.sql을 사용하였다. 하지만 테이블 스키마가 변경되거나 필수로 초기에 들어가야하는 데이터들이 추가되거나 수정되었을 때 히스토리 관리가 잘 되지 않았다.
특히 서로 교류가 잘 되지 않은 경우에서는 컬럼이 추가되거나 무엇이 변경되었는지 알지 못해서 문제를 유발할 수 있기에 이를 관리 할 수 있는 무언가가 필요했다.
그래서 Redgate에서 제공하는 Flyway를 사용해보기로 했다. 우선 내 개인 프로젝트인 timeline에 적용시켜봤다.
데이터베이스 버전관리 Flyway
동작 방식
Flyway가 버전관리를 하기위해서 테이블이 생성된다. Flyway가 버전관리는 이 테이블에 데이터베이스의 상태를 기록하면서 진행한다.
Flyway가 시작되면 파일시스템 또는 마이그레이션 대상의 classpath를 스캔해서 Sql 또는 Java로 쓰여진 파일을 찾는다. 이 마이그레이션 작업은 파일에 적혀있는 version number대로 순서대로 진행된다. 그리고 현재 마이그레이션 해야할 파일의 버전과 테이블에 기록된 버전을 확인해보고 같으면 넘어간다.
Flyway에서 사용하는 테이블은 flyway_schema_history로 아래와 같이 구성되어있다.
CREATE TABLE `flyway_schema_history` (
`installed_rank` int(11) NOT NULL,
`version` varchar(50) DEFAULT NULL,
`description` varchar(200) NOT NULL,
`type` varchar(20) NOT NULL,
`script` varchar(1000) NOT NULL,
`checksum` int(11) DEFAULT NULL,
`installed_by` varchar(100) NOT NULL,
`installed_on` timestamp NOT NULL DEFAULT current_timestamp(),
`execution_time` int(11) NOT NULL,
`success` tinyint(1) NOT NULL,
PRIMARY KEY (`installed_rank`),
KEY `flyway_schema_history_s_idx` (`success`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
installed_rank | 인덱스 |
version | 버전명 (V나 R 뒤에 붙는 숫자) |
description | 설명 |
type | SQL 또는 JDBC |
script | 스크립트 이름 V1__kdjlkdf.sql |
checksum | checksum |
installed_by | 실행 주최자 |
installed_on | 설치된 시간 |
execution_time | 총 실행시간 |
success | 성공여부 |
간단히 말해 변경된 데이터나 테이블 스키마를 적용하기 위해서는 마지막 버전보다 높은 파일을 만들어서 애플리케이션을 구동하면 된다.
애플리케이션에 적용
그럼 flyway를 적용하기 위해 gradle에 라이브러리부터 추가해보자.
dependency {
compile group: "org.flywaydb", name: "flyway-core", version: '5.2.4'
}
그리고 application.yml을 설정하자.
spring:
flyway:
enabled: true
baselineOnMigrate: true
encoding: UTF-8
그리고 테이블과 데이터를 넣을 sql을 만들자.
그리고 Springboot 애플리케이션을 실행시키면 해당 테이블에 버전 히스토리가 기록된다.
버전관리하기에 좋은거 같다.
'web > Spring' 카테고리의 다른 글
RestHighLevelClient를 사용하여 search after 기능 구현하기 (1) | 2019.11.14 |
---|---|
JPA 다양한 Join 방법 정리 (N+1, queryDSL, fetch join) (3) | 2019.11.04 |
Redis에서 Pub/Sub 방식 소개 및 Spring Boot에서 구현해보기 (2) | 2019.08.21 |
Spring5 리액티브 스트림 정리 및 api 전달 방식 정리 (0) | 2019.08.16 |
Spring boot 모니터링 Actuator 소개 및 설치 (0) | 2019.08.11 |