1번 - Spring Data JPA를 사용한 데이터베이스 초기화
1. spring.jpa.generate-ddl=true
- @entity가 명시된 클래스를 찾아서, 해당 클래스에 맞는 ddl을 생성하고 실행
2. spring.jpa.hibernate.ddl-auto
- create-drop : 어플리케이션 실행 시, 테이블 생성하고, 종료 시 drop
- create : 어플리케이션 실행 시, 기존 테이블 drop하고 테이블 생성
- 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 스크립트 파일을 만드는 규칙
- V숫자__이름.sql
- V는 꼭 대문자로.
- 숫자는 순차적으로 (타임스탬프 권장)
- 숫자와 이름 사이에 언더바 두 개.
- 이름은 가능한 서술적으로.
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'
]
}
'학습 > Spring' 카테고리의 다른 글
[spring] 스프링 부트에서 Spring Security 사용하기 (0) | 2020.05.19 |
---|---|
[spring] 스프링 부트에서 Redis 사용하기 (0) | 2020.05.18 |
[spring] 스프링 어노테이션 및 메소드 정리 (1) | 2020.05.10 |
[spring] 스프링 부트에서 Spring Data JPA 사용하기 (0) | 2020.05.07 |
[spring] 스프링 부트에서 MySQL과 PostgreSQL 사용하기 (0) | 2020.05.06 |
댓글