[스프링 데이터]_08_데이터베이스 마이그레이션

1 minute read

스프링 데이터 8부: 데이터베이스 마이그레이션

Flyway와 Liquibase가 대표적인데, 지금은 Flyway를 사용하겠습니다.

https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/#howto-execute-flyway-database-migrations-on-startup

의존성 추가

  • org.flywaydb:flyway-core

마이그레이션 디렉토리

  • db/migration 또는 db/migration/{vendor}
  • spring.flyway.locations로 변경 가능

마이그레이션 파일 이름

  • V숫자__이름.sql
  • V는 꼭 대문자로.
  • 숫자는 순차적으로 (타임스탬프 권장)
  • 숫자와 이름 사이에 언더바 두 개.
  • 이름은 가능한 서술적으로.

데이터베이스 마이그레이션

스키마와 데이터를 체계적으로 관리하고 싶다면 DB 마이그레이션 툴을 사용하면 된다.

DB스키마와 데이터의 변경사항을 버전관리를 할 수 있다.

Flyway는 기본적으로 sql 파일을 사용한다.

(실습)

의존성 추가

  • org.flywaydb:flyway-core

마이그레이션 디렉토리

  • db/migration 또는 db/migration/{vendor}
    • 벤더마다 만들어 줄 수도 있다.
  • spring.flyway.locations로 변경 가능

마이그레이션 파일 이름 규칙

  • 예시) V숫자__이름.sql
  • V는 꼭 대문자로.
  • 숫자는 순차적으로 (타임스탬프 권장)
  • 숫자와 이름 사이에 언더바 두 개.
  • 이름은 가능한 서술적으로.

마이그레이션 파일에 스키마 sql 저장

  • V1__init.sql
drop table if exists account CASCADE;
drop sequence if exists hibernate_sequence;
create sequence hibernate_sequence start with 1 increment by 1;
create table account (id bigint not null, password varchar(255), username varchar(255), primary key (id));

application.properties 설정

  • ddl-auto=validate

  • 하이버네이트는 엔티티와 DB의 맵핑 검증만 한다.

spring.jpa.hibernate.ddl-auto=validate
spring.jpa.generate-ddl=false
spring.jpa.show-sql=true
동작 순서

flywqy가 먼저 마이그레이션 디렉토리 경로에 파일이 있는지 확인

파일을 찾아서 쿼리를 실행하면 스키마가 생성된다.

그 후, 하이버네이트가 (ddl-auto=validate로 설정했으므로) validate을 수행한다. 스키마가 잘 생성되었다면 문제없이 애플리케이션이 실행되고 테이블도 만들어 진 것 확인 가능

image-20210104163325364

  • flyway_schema_histroy : flyway가 자기 정보를 관리하는 테이블

엔티티에 속성을 추가하면?

flyway는 스키마파일의 변동이 없으므로 아무런 변화도 일어나지 않고,

하이버네이트에서는 validation하다가 맵핑이되지 않으므로 에러가 발생한다.

⇒ 에러메시지 : account 테이블에 active 컬럼이 없다.

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing column [active] in table [account]

그렇다면 스키마를 어떻게 변경해야하나?

기존에 적용된 V1__init.sql 파일을 수정해야할까?

★ 절대로 한 번 적용된 스크립트는 건드리면 안 된다.★

어떠한 변경이던지 새파일로 만들어서 써야한다.

V2__add_active.sql 파일을 만들어서 수정된 사항을 반영한다.

ALTER TABLE account ADD COLUMN active BOOLEAN;

flyway가 두 번째 스크립트를 찾아서 적용해주고, 하이버네이트가 validation하고 이상이 없으므로 정상적으로 떠있게 된다.

image-20210104164547630