부트 개념과 활용-26.데이터베이스 초기화/마이그레이션(스프링 데이터)
스프링 데이터 7부: 데이터베이스 초기화
JPA를 사용한 데이터베이스 초기화
spring.jpa.hibernate.ddl-auto spring.jpa.generate-dll=true로 설정 해줘야 동작함.
ex.
## 돌릴때마다 drop - create, 데이터 다 날아감.
#spring.jpa.hibernate.ddl-auto=create
## 스키마가 없는 거만 바꾼다.(엔티티에 칼럼 신규 추가시 반영, 하이버네이트가 이름 바꾼건 인식 못함. username -> name 모른다, name 만 신규 생성. 기존 username을 지우지는 못한다. 칼럼 지저분해짐)
spring.jpa.hibernate.ddl-auto=update
## 검증만 한다 (ex.테이블에 엔티티로 새로 만든 값 있으면 에러)
#spring.jpa.hibernate.ddl-auto=validate
spring.jpa.generate-ddl=true
spring.jpa.show-sql=true
초반 개발시에는 update로 사용하다가 (스카마가 지저분해짐. 이름을 바꾸거나 안쓰는 칼럼들이 그대로 남아있음)
어느정도 안정되고, 배포시기쯤 되면 테스트에서 깔끔한 스키마를 생상하도록 만든 다음 넣어놓고,
validate로 사용.
SQL 스크립트를 사용한 데이터베이스 초기화
- schema.sql 또는 schema-${platform}.sql
기본적으로 임베디드db(h2) 만 지원하나 설정을 통해 다른 db들도 적용이 가능하다.
spring.datasource.initialization-mode=always를 properties에 추가하여 적용 ~~~ [Note] Spring Boot automatically creates the schema of an embedded DataSource. This behaviour can be customized by using the spring.datasource.initialization-mode property. For instance, if you want to always initialize the DataSource regardless of its type:
spring.datasource.initialization-mode=always
- data.sql 또는 data-${platform}.sql
- ${platform} 값은 spring.datasource.platform 으로 설정 가능(플랫폼에 특화된 sql도 가능)
>spring.datasource.platform=postgresql
설정 후 schema-postgresql.sql
## 스프링 데이터 8부: 데이터베이스 마이그레이션
Flyway와 Liquibase가 대표적인데, 지금은 Flyway를 사용.
[https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/#howto-execute-flyway-database-migrations-on-startup](https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/#howto-execute-flyway-database-migrations-on-startup)
### Flyway 구현
의존성 추가
- 마이그레이션 디렉토리
db/migration 또는 db/migration/{vendor}
spring.flyway.locations로 변경 가능
- 마이그레이션 파일 이름 (버전 관리)
V숫자__이름.sql
V는 꼭 대문자로.
숫자는 순차적으로 (타임스탬프 권장)
숫자와 이름 사이에 언더바 두 개.
이름은 가능한 서술적으로
– v1 drop table if exists account; drop sequence if exists hibernate_sequence; create sequence hibernate_sequence start with 1 increment by 1; create table account (id bigint not null, email varchar(255), password varchar(255), username varchar(255), primary key (id));
– v2 alter table account add column active boolean; ~~~
지금은 단순히 칼럼 변경의 예제만 넣었지만,
insert 구문 등 다 잘 작동한다.
즉, 데이터베이스 구조가 바뀌었을때, 데이터를 이렇게 이관하고 이런 칼럼이 추가되고, 기존 칼럼을 삭제하고.. 등 다 버전별 히스토리 관리 가능