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 로 설정을 관리할 수 있다.
의존성 추가하면 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을 적용해도 된다.