요구 사항
만약, 아래와 같은 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 과 같이 사용해줄 수 있다.
참고 자료
'프로그래밍 > Spring' 카테고리의 다른 글
[JPA] Oracle 을 사용해서 Native Query 로 출력 개수까지 다 가져와보기 (0) | 2022.10.17 |
---|---|
[Spring] 라이브러리 등록 시 라이브러리를 외부에서 소스를 볼 수 있도록 하기 (0) | 2022.10.13 |
[Spring] Kafka 이용 시 __TypeId__ 에 대하여 (0) | 2022.08.02 |
[Spring] @ModelAttribute 파라미터에서 사용 방법 및 원리 (0) | 2022.07.30 |
[Spring] JPA 에서 Oracle DB 사용할 때 DB 함수 사용하기 (0) | 2022.04.04 |