190430

<Spring Boot 2.x 기준>

개발 중에 DB 초기화를 자동으로 하기 위한 방법들?

1. JPA-Hibernate 고유 기능 사용

spring.jpa.generate-ddl 속성

  • true로 설정 시, Entity 어노테이션(@Entity)이 명시된 클래스를 찾아서 ddl을 생성하고 실행

spring.jpa.hiberante.ddl-auto 속성

  • 옵션
    • none: 자동 생성하지 않음
    • create: 항상 다시 생성
    • create-drop: 시작 시 생성 후 종료 시 제거
    • update: 시작 시 Entity 클래스와 DB 스키마 구조를 비교해서 DB쪽에 생성되지 않은 테이블, 컬럼 추가 (제거는 하지 않음)
    • validate: 시작 시 Entity 클래스와 DB 스키마 구조를 비교해서 같은지만 확인 (다르면 예외 발생)
  • "시작", "종료"는 hibernate SessionFactory를 기준으로 하며, SessionFactory는 transaction 처리를 위한 Session을 관리해주는 객체 (SessionFactory의 life cycle이나 자세한 기능은 따로 알아봐야..)
  • ddl-auto를 create나 create-drop으로 설정 시 classpath 경로의 import.sql 파일이 있으면 파일 내의 query들을 hibernate가 자동으로 실행(spring boot와는 관계 없음)

2. Spring Boot 기능 사용 (Hibernate 기능과 별개)

  • spring.datasource.initialization-mode를 alwasy로 설정해야 외장 DB 초기화 가능
    • 설정하지 않으면 기본으로 never로 설정: Embedded DB 사용 -> ex. HSQL, H2, Derby
  • spring.datasource.data에 sql 파일 경로를 지정하면 지정된 파일의 스크립트를 실행
    • ex. spring.datasource.data=classpath:member.sql, book.sql
    • 기본값은 classpath:schema.sql, classpath:data.sql
    • DB 종류에 따라 다른 스크립트를 사용하려면 spring.datasource.platform을 해당 DB종류(ex. mysql, posgresql)로 설정하고 schema-mysql.sql, data-mysql.sql과 같이 사용

참고:

85. Database Initialization
Spring에서 JPA / Hibernate 초기화 전략
스프링부트 JPA 프로퍼티
스프링 부트(Spring Boot), JPA에서 데이터베이스 초기화 방법
[Spring Boot #25] 스프링 부트 데이터베이스 초기화