Flyway 적용

Kyojun Jin·2024년 8월 15일
0

Insta Tistory Automator

목록 보기
4/8

Flyway란

sql database 버전 관리해주는 툴
sql server에 바로 쿼리를 날리지 않고 .sql 파일을 만들어 버전과 함께 기록한 다음 flyway 프로그램을 돌리면 (혹은 spring server를 실행하면), 설정한 버전에 따라 스크립트를 자동 실행한다.

이런 식으로 버저닝을 할 수 있다. 위 이름 규칙은 맞춰야 한다. (커스터마이징 할 수 있다는데 그 방법은 찾아봐야 한다. 딱히 그럴 필요성은 못 느끼고 있다.)

flyway는 db의 버전을 flyway_schema_history라는 테이블로 관리한다.

spring 이랑 연동 가능하다.
이럴 경우 실행할 스크립트 위치의 기본값은 resources/db/migration 이다.

의존성

implementation("org.flywaydb:flyway-core")
runtimeOnly("org.flywaydb:flyway-database-postgresql")

db별 flyway 구현체 다르므로 maven repository 에서 먼저 찾아봐야 한다. 이 프로젝트에선 postgres를 사용할 것이다.

설정

spring flyway 를 사용한다면 application.yml 로 설정을 관리할 수 있다.

Spring 측 공식 flyway 설정

의존성 추가하면 flyway는 자동으로 enable 된다. 혹 테스트 중 꼬여서 꺼야 한다면 spring.flyway.enabled: fasle로 끌 수 있다.

baseline-on-migrate
이건 기존 db에 flyway 를 적용할 때를 말하는데, db가 비어있지 않다면 true를 해야 한다. 기본값은 false인데 이게 false인 채로 서버를 시작하면 baseline을 생성하라는 오류가 난다.
spring.flyway.baseline-on-migrate: true

이 설정값을 사용하면 자동으로 flyway_schema_history 란 테이블이 생성되며 baseline을 설정하는 첫 행이 삽입된다.

flyway의 baseline (시작하는 버전)은 1이다. 만약 기존 Db에 flyway를 적용한다면, 그 이후로 작성하는 스크립트들을 1보다 큰 넘버링을 사용해야 한다. 무조건 1보다 큰 스크립트들만 실행하기 때문이다.
(파싱할 때 버전은 문자가 아니라 정수로 받는다고 한다. 따라서 V10이 V2보다 나중 버전이다.)

비어있는 db에 한다면 버저닝을 1부터 해도 무방하다.

flyway 설정값은 이 이 링크를 참조하면 된다. spring에서 지원 안 하는 설정값도 있다.

적용

나는 처음부터 flyway를 적용하기 때문에 아래 세 스크립트만 넣어줬다.

V1.1__create_insta_post.sql 예시)

create type media_type as enum('IMAGE', 'VIDEO', 'CAROUSEL_ALBUM');

create table insta_post
(
    insta_id          char(64) not null
        constraint insta_post_pk
            primary key,
    media_type        media_type,
    media_url         varchar(2083),
    permalink         varchar(2083),
    caption           text,
    timestamp         timestamp,
    fetched_timestamp timestamp
);

comment on table insta_post is 'instagram api에서 가져온 데이터';

comment on column insta_post.insta_id is 'instagram 게시물 고유 id';

comment on column insta_post.media_type is '미디어의 유형. IMAGE, VIDEO 또는 CAROUSEL_ALBUM일 수 있습니다.  ';

comment on column insta_post.media_url is '이미지 url (carousel_album일 경우 앞에 한 장만)';

comment on column insta_post.permalink is '인스타 게시글 url';

comment on column insta_post.caption is '게시글 본문, 해시태그 포함';

comment on column insta_post.timestamp is '게시 시간';

comment on column insta_post.fetched_timestamp is 'api를 통해 게시글을 가져온 시간';

원래 세 테이블을 한꺼번에 만들었지만 성격상 다 다른 파일로 만드는 게 편해서 1.1, 1.2, 1.3으로 분리했다.

intellij의 기능을 이용해서 ddl을 생성한 후 sql파일을 만들어 스크립트를 복사해서 만들어도 된다.

아니면 entity class 를 만든 다음 create flyway migration을 적용해도 된다.

0개의 댓글