요구 사항

만약, 아래와 같은 Entity 를 H2 데이터베이스 같은 곳에서 자동으로 DDL 이 이루어진 다음, 그 후에 스크립트 기반으로 데이터를 미리 넣어서 테스트 코드로 데이터를 사용하고 싶다고 해보자

@Builder
@Getter
@NoArgsConstructor @AllArgsConstructor
@Entity
@Table(name = "BOOKS")
@DynamicInsert @DynamicUpdate
public class Books {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false)
    private Long id;

    @Column(name = "BOOK_CODE", nullable = false)
    private Long bookCode;
...

 

방법

우선 아래의 두 가지 속성을 이용해서 위 요구 사항을 만족시킬 수 있다.

  • spring.sql.init.mode - 데이터베이스의 초기화 설정
    • 파라미터 종류 
      • always - 항상 데이터베이스를 초기화
      • embeded - 임베디드 데이터베이스만 초기화
      • never - 데이터베이스 초기화를 하지 않음
    • Spring Boot 2.5.0 이전에는 spring.datasource.initialization-mode 로 사용됨
  • spring.jpa.defer-datasource-initialization - EntityManagerFactory Bean 을 생성하고 초기화를 마칠 때까지 DataSource 초기화를 미룰지를 설정
    (schema.sql 로 Hibernate 가 생성할 스키마를 추가적으로 생성할 수 있고, data.sql 를 사용하여 데이터를 채울 수 있다)
spring:
  jpa:
    hibernate:
      ddl-auto: create-drop
    defer-datasource-initialization: true
  sql:
    init:
      mode: always
      encoding: utf-8
      platform: h2

위와 같이 설정하고 data.sql 에 데이터를 채울 Query 문을 작성하면 된다.

 

Spring 은 기본적으로 classpath root 에 있는 표준 schema.sql, data.sql 을 사용한다. 만약, 여러 DataSource 를 사용중이고, 벤더에 따라 구분을 해야 한다면 spring.sql.init.platform 으로 이를 구분해줄 수 있다.

예를 들어, spring.sql.init.platform 이 h2 라고 지정하면, data-h2.sql 과 같이 사용해줄 수 있다.

 

 

참고 자료

https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.data-initialization.using-basic-sql-scripts