본문 바로가기
학습/Spring

[spring] 데이터베이스 초기화 및 마이그레이션

by KKambi 2020. 5. 17.

 

1번 - Spring Data JPA를 사용한 데이터베이스 초기화

1. spring.jpa.generate-ddl=true

- @entity가 명시된 클래스를 찾아서, 해당 클래스에 맞는 ddl을 생성하고 실행

 

2. spring.jpa.hibernate.ddl-auto

  1. create-drop : 어플리케이션 실행 시, 테이블 생성하고, 종료 시 drop
  2. create : 어플리케이션 실행 시, 기존 테이블 drop하고 테이블 생성
  3. update : 어플리케이션 실행 시, Entity 클래스와 스키마를 비교해서, DB에 없는 테이블, 컬럼만을 추가
    (기존 스키마의 정보를 바꿀 수는 없음)

 

3. spring.jpa.show-sql=true

- 콘솔에 JPA를 통해 실행되는 SQL문을 출력

 

4. spring.jpa.hibernate.ddl-auto=validate

- 시작 시 Entity 클래스와 스키마를 비교해서, 다르면 예외를 던진다.

 

 

2번 - SQL 스크립트를 사용한 데이터베이스 초기화

- jpa을 통한 ddl 자동생성에서 출력되는 SQL문을 복사하여 이용하면 편함

- 스키마 스크립트가 먼저 실행된 후, 초기 데이터 삽입하는 스크립트가 실행된다.

- resource 디렉토리 내 schema.sql OR schema-${platform}.sql에 작성

- 테스트할 때마다 OR 어플리케이션이 실행될 때마다 해당 SQL문을 실행

- 플랫폼에 특화된 스키마 초기화 가능

- spring.datasource.platform에 정의된 값이 ${platform}에 들어간다.

 

 

저자의 전략

1. 개발 초창기에는 spring.jpa.hibernate.ddl-auto=update

  • 기존 컬럼이 삭제되지 않으므로 운영 시에는 위험
  • 없는 스키마 정보를 추가하는 것만 가능하다.

 

2. 스키마가 안정되면 schema.sql에 잘 변하지 않는 SQL문을 넣어 사용

 

3. 스키마 버전 관리를 위해 마이그레이션 툴 사용

 

 

3번 - DB 마이그레이션 툴 사용하기

- DB의 스키마 변경 / 데이터 변경을 버전 관리하듯 관리할 수 있음

- 매번 schema.sql를 변경할 필요 없다.

- FlyWay의 경우 다양한 버전의 sql파일을 쌓아간다.

 

 

FlyWay?

- sql파일 사용하는 마이그레이션 툴

- org.flywaydb:flyway-core 의존성 추가
- resources/db.migration 디렉토리 추가 (특정 벤더마다 만들 수도 있다) (mysql용, postgresql용, ...)
- 스키마 히스토리를 관리하는 별도의 테이블을 생성

 

 

FlyWay + Hibernate validation으로 스키마 변경하고 검증하기

1. V1__init.sql 생성하여 Hibernate auto ddl로 실행했던 초기 SQL문 붙여넣기

2. spring.jpa.hibernate.ddl-auto=validate

 

→ FlyWay를 통해 초기화 스크립트가 실행되고, 하이버네이트 Validation에 의해 검증된다.

→ Entity 클래스의 내용과 스크립트의 내용이 다르면 예외를 던진다.

 

★한 번 적용이 된 스크립트 파일은 절대 변경해선 안 된다. 무조건 새 파일을 만든다. (버전관리!)

 

 

FlyWay 스크립트 파일을 만드는 규칙

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

 

 

Flyway 설정

- In-memory DB를 사용할 땐 Datasource 설정이 없어도 알아서 마이그레이션이 작동

- 외부 DB를 사용할 땐 spring.datasource 설정을 따라간다.

- 추가적인 커스터마이징을 하고 싶다면 build.gradle에 해당 플러그인 추가 후, flyway section을 통해 설정

- flywaydb.org/documentation/gradle/

plugins {
    id "org.flywaydb.flyway" version "6.4.4"
}

//예시
flyway {
    url = 'jdbc:h2:mem:mydb'
    user = 'myUsr'
    password = 'mySecretPwd'
    schemas = ['schema1', 'schema2', 'schema3']
    placeholders = [
        'keyABC': 'valueXYZ',
        'otherplaceholder': 'value123'
    ]
}

댓글