[spring] Spring Boot Flyway 적용 By starseat 2023-04-05 15:14:24 java/spring Post Tags # init - 적용 버전 - Spring Boot: 2.7.10 - Flyway: 7.15.0 - PostgreSQL: 15.2 # build.gradle [Maven Repository](https://mvnrepository.com/artifact/org.flywaydb/flyway-core) 에서 `Flyway Code` 검색 후 `build.gradle` 에 dependency 추가 ```text plugins { ... id 'org.flywaydb.flyway' version '7.15.0' } ... dependencies { ... // flyway implementation "org.flywaydb:flyway-core:7.15.0" } ... ``` # application.yml ## 옵션 - [[spring] Spring Boot application.yml 의 Flyway 옵션](https://starseat.net/blog/view/178) ## 예시 난 기존 설정은 그대로 두고 `local-flyway` 라고 추가하였다. - default 설정 ```yaml spring: config: activate: on-profile: local, default flyway: enabled: false ``` - local-flyway - `db/migration/versioned`: version 으로 관리할 sql 파일을 두었다. - `db/migration/environment/local`: 환경 별로 설정할 파일들을 두었다. 일단은 local 설정에 필요한 파일만 있다. ```yaml spring: config: activate: on-profile: local-flyway flyway: enabled: true validate-migration-naming: true locations: classpath:db/migration/versioned, classpath:db/migration/environment/local clean-on-validation-error: false ## 필요시 추가 #schemas: db_version_test #baselineOnMigrate: true #baselineVersion: 2023.05.02.09.00.00 ``` - `baselineOnMigrate` - flyway_schema_history 자동 생성 여부 - 기본값은 `false` 이며 **flyway_schema_history** 가 존재하여야 함. - `baselineVersion`: - **flyway_schema_history** 테이블이 없을 경우 테이블을 생성하면서 baseline 정보를 입력하면서 시작되는 번호 - 기본값: `1` - 보통은 버전 파일을 `V1__`, `V2__` 형태로 버전 1부터 시작하기 때문에 **0 으로 설정하는 것을 추천** - 특정 버전을 입력하여 사용 - 신규 추가 sql 파일이 있다면 **적용되어 있던 마지막 버전 기입** # flyway 관련 구조 및 파일 ## 구조 ```text {Spring Boot Project} ㄴ src/ ㄴ main/ ㄴ resources ㄴ db ㄴ init - schema_initialization.sql // db 및 계정 생성 파일 ㄴ flyway-conf ㄴ versioned - V2023.05.02.09.00.00__init_create.sql // 최초 생성에 필요한 ddl - V2023.05.02.09.30.00__init_data.sql // 기초 데이터 ㄴ environment.local - V2023.05.02.08.00.00__set_timezone.sql // 타임존 설정 ``` ## 파일 - version 파일을 V1, V2, ... 처럼 하여도 되지만 날짜 이력 관리를 위하여 날짜 형식으로 지정하였다. ### schema_initialization.sql ```sql CREATE USER flyway_user WITH PASSWORD 'flyway_user_pw' SUPERUSER; CREATE DATABASE flywaydb OWNER flyway_user ENCODING 'UTF-8' LC_COLLATE 'ko_KR.utf8'; ``` ### V2023.05.02.09.00.00__init_create.sql ```sql create sequence if not exists flywaydb.seq_member increment by 1 minvalue 1 maxvalue 9223372036854775807 start 1 cache 1 no cycle ; CREATE TABLE flywaydb.member ( member_seq int8 NOT NULL DEFAULT nextval('flywaydb.seq_member'::regclass), id varchar(16) NOT NULL, pwd varchar(256) NOT NULL, name varchar(16) NULL, grade varchar(8) NOT NULL, create_at timestamp NOT NULL DEFAULT now(), update_at timestamp NULL CONSTRAINT member PRIMARY KEY (member_seq) ); CREATE INDEX idx_member_01 ON flywaydb.member USING btree (id); ... ``` ### V2023.05.02.09.30.00__init_data.sql ```sql insert into flywaydb.member (id, pwd, name, grade) values ('tester', '1234', 'tester', 'test'); ``` ### V2023.05.02.08.00.00__set_timezone.sql ```sql set timezone='Asia/Seoul'; ``` # 실행 Run/Debug Configurations 에 `flyway` 용으로 추가하여 실행하였다. - **설정** ![image.png](/uploads/_temp/20230427/b7ff450b98b41e610b82fbec1006a3a3.png) - **실행** ![image.png](/uploads/_temp/20230427/8f226bff007487bd23ed89b413551831.png) # 결과 db 에 접속해보면 flyway 용으로 등록된 테이블 및 데이터가 생성되어 있을 것이다. # 추가 특정 환경별로 할 경우 아래처럼 해주면 된다. - `local`, `dev` 환경에만 **flyway-baseline** 적용 ```yaml spring: profiles: active: local # detault profile (when no specified any active profile --- ########## [local group] ########## spring: profiles: group: "local": common-config, flyway-baseline --- ########## [devg roup] ########## spring: profiles: group: "dev": common-config, flyway-baseline --- ########## [prod group] ########## spring: profiles: group: "prod": common-config --- ################################## ########### [db 설정] ############ spring: datasource: testdb: driver-class-name: org.postgresql.Driver jdbc-url: jdbc:postgresql://127.0.0.1:5432/test username: test password: test123 hikari: connection-timeout: 3000 max-lifetime: 180000 maximum-pool-size: 3 --- ################################ ########## [공통 설정] ########## spring: config: activate: on-profile: "common-config" application: name: flywaytest --- ######################################## ########## [flyway-baseline ] ########## # flyway-baseline 설정 spring: config: activate: on-profile: flyway-baseline flyway: enabled: true validate-migration-naming: true baseline-version: 2023.05.02.09.00.00 baseline-on-migrate: true locations: classpath:db/migration/common/versioned clean-on-validation-error: false driver-class-name: ${spring.datasource.testdb.driver-class-name} url: ${spring.datasource.testdb.jdbc-url} user: ${spring.datasource.testdb.username} password: ${spring.datasource.testdb.password} ``` # 참조 - [https://flywaydb.org/](https://flywaydb.org/) - [Spring Boot Reference Documentation - Database Migration Tool](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto.data-initialization.migration-tool) - [https://sabjili.tistory.com/entry/flyway-관련](https://sabjili.tistory.com/entry/flyway-관련) Previous Post Flyway 란 Next Post [spring] Spring Boot application.yml 의 Flyway 옵션