프로젝트를 진행하면서 테스트 코드를 작성하기 위해 GPT에게 더미 SQL 파일을 만들어달라고 했다.


문제 상황
원래, 스프링 프로젝트의 resources 경로에 data.sql / schema.sql 파일은 애플리케이션 시작시 먼저 실행이 된다.
그러나 로그를 까먹고 캡쳐를 못했는데, 하이버네이트가 테이블은 정상적으로 만드는데 INSERT 문이 단 한개도 안날라갔다.
해결방법
spring:
profiles:
active: test
sql:
init:
mode: always
datasource:
url: DB 주소 입력
driver-class-name: org.h2.Driver
username: sa
password:
jpa:
database: h2
hibernate:
ddl-auto: create
show-sql: true
defer-datasource-initialization: true
해당 코드는 테스트 DB인 H2를 적용한 설정 파일인데, 중요한 옵션 두가지를 켜야 한다.
- sql.init.mode = always
- jpa.defer-datasource-initialization : true
1번 옵션을 켜야하는 이유는 H2는 잘 모르겠지만, MySql 같은 경우에는 애플리케이션 시작시 자동으로 data.sql을 실행하지 않는다. 그래서 1번 옵션을 켜줘야 한다.
2번 옵션은 실행 순서에 관련된 내용인데, 만약 data.sql이 실행 되어지고 하이버네이트가 뜨면서 ddl-auto 설정에 따라 해당 테이블을 drop하고 새로 만들어 데이터가 사라질 가능성이 있기 때문에, 반드시 하이버네이트 (JPA)가 뜨고 그 이후에 data.sql이 실행 되도록 해야한다.
내가 걸린 문제는 아마 1번 문제였던 것 같고, 혹시 모를 상황을 대비해 2번 옵션까지 적용 해주니 다음과 같이 정상적으로 로컬 DB와 테스트 DB에 모두 데이터가 잘 들어갔다.

'Error' 카테고리의 다른 글
| (배포 후기 1) 배포 자동화는 어려워 (0) | 2025.11.07 |
|---|---|
| [Docker] 도린이의 첫번째 고난 : Access denied for user ‘root’@’localhost’ (using password:YES) (0) | 2025.10.30 |
| Mac에서 Notion 한글 씹힐 때 (0) | 2025.10.07 |
| [MyBatis] 의존성 - 에러가 발생하면 공식문서를 봅시다 (0) | 2025.08.06 |
| [Java] properties 파일에 등록한 메시지들이 깨질 때 (0) | 2025.07.11 |