애플리케이션 코드를 작성하다보면 초기 데이터가 있어야하는 경우들이 있다. (PATCH, GET, DELETE 기능 점검 등)
물론 테스트 케이스를 작성하여 실행할수도 있지만, Postman 등을 활용해 간단히 확인하고싶을 때 활용할 수 있는 방법이다.
1. application.yml 설정파일 수정
현재 진행중인 과정에서 hibernate: ddl-auto: true로 설정하여 사용하고 있다.
Hibernate가 애플리케이션이 시작되면 데이터베이스 테이블을 자동으로 설정해준다.
그러면 그렇게 생성된 테이블에 초기 데이터를 자동으로 추가해주면 된다.
하지만 여기서 한가지 문제가 있다. Hibernate 와 Sql의 기본 우선순위로 인해서 데이터를 추가하는 sql 파일이 먼저 실행되게 된다.
그러면 테이블이 생성되지 않은 상태로 데이터를 추가하게 되므로 에러가 발생한다.
실제로, Member 엔티티를 통해 Member 테이블을 생성하고 초기 데이터를 넣으려고 했으나 [Table "MEMBER" not found] 에러가 발생한다.
이 때 추가해야하는 설정이 spring: jpa: defer-datasource-initialization: true 이다.
spring:
h2:
console:
enabled: true
path: /h2
datasource:
url: jdbc:h2:mem:kiosk
jpa:
hibernate:
ddl-auto: create
show-sql: true
defer-datasource-initialization: true // 데이터 소스가 완전히 준비될때까지 대기하는 옵션이다.
// 이 설정을 통해 테이블이 생성된 후 데이터베이스 초기화 작업을 수행하게 된다.
2. data.sql 파일 생성
테이블 준비가 완료되었으므로, 실제로 데이터베이스에 초기값으로 넣어줄 데이터를 준비해야한다.
가장 간단한 방법은 resource 폴더 안에 data.sql 파일을 생성해서 SQL 문을 작성하는 것이다.
애플리케이션을 실행하면 자동으로 data.sql 파일을 실행해서 데이터를 초기화하게된다.
만약 data.sql 이라는파일명을 사용하지 않거나 다른 경로에 초기 데이터 파일을 생성하려면 아래와 같은 설정을 추가해주어야한다.
(yml 설정파일을 활용할때는 들여쓰기에 따라 코드 깊이(depth)를 의미하므로 들여쓰기에 주의한다.)
spring:
sql:
init:
data-locations: classpath*:test.sql
초기 데이터 소스를 지정해주는 설정 코드이다. classpath* 란 클래스 경로에서 다음 내용을 찾는다는 의미이며
지금 진행중인 프로젝트에서는 경로가 설정되어있지 않아서 바로 파일명을 사용했지만
혹시 경로가 있다면 "classpath*:경로1/경로2/.../파일명" 형태로 사용할 수 있다.
참고자료
'에러 해결기록' 카테고리의 다른 글
[Spring] JWT 사용시 javax/xml/bind/DatatypeConverter 에러 (0) | 2024.05.07 |
---|---|
Git SSH 등록, CLI 사용을 위한 인증(remote: Support for password authentication was removed on August 13, 2021.) (0) | 2024.01.18 |
[JAVA] JWT, WeakKeyException (0) | 2023.05.17 |
[MAC] 사용중인 포트 종료하기 (0) | 2023.04.17 |
문자열을 요소로 갖는 배열의 가장 긴 글자, 작은 글자 제거하기 (0) | 2023.03.21 |