Spring Boot 학습 중에 test
디렉토리에 resources
디렉토리를 만들고 data.sql
을 만들었다.
data.sql
을 만들면 그 동안 잘 되던 RepositoryTest에서 오류가 발생한다.
원인은 내 SQL 실수와 Spring Boot의 변경 사항 때문이었다.
내 SQL 실수
학습 중인 내용에서 data.sql
을 추가하여 기초 데이터를 초기화 할 수 있게 스프링이 load 될 때 한 번 실행된다고 하였다.
그래서 insert 문을 넣었는데 내가 좀 다르게 작성해서 문제가 되었다.
/* 정확한 내용 */
call next value for hibernate_sequence;
insert into users(`id`, `name`, `email`, `created_at`, `updated_at`) values (1, 'name01', 'email01', now(), now());
/* 내가 작성한 내용 */
call next value for hibernate_sequence;
insert into users("id", "name", "email", "created_at", "updated_at") values (1, "name01", "email01", now(), now());
비교해 보면 column 값을 감쌀 때 backtick을 써야하고 value를 작성할 때는 single quotation을 사용해야한다.
column 값은 backtick으로 감싸지 않고 그냥 써도 된다.
call next value for hibernate_sequence;
insert into users(id, name, email, created_at, updated_at) values (1, 'name01', 'email01', now(), now());
Spring Boot 변경 사항
내가 학습하던 내용의 자료가 약 2년 쯤 지난 자료라 스프링의 버전이 차이가 난다.
Spring Boot 버전 2.5.x 부터는 스크립트 파일의 동작에 차이가 있다고 한다.
script 파일 실행 이후 hibernate가 초기화되는데 hibernate 초기화 이후 script 파일을 동작 시키기 위해 application 설정 파일에 옵션을 추가해야 한다고 한다.
내 기준으로는 application.yaml
파일에 아래 내용만 추가해주면 정상적으로 동작하였다.
spring:
jpa:
defer-datasource-initialization: true
기타 오류
data.sql
파일을 만들기만 하고 내용을 작성 안 해도 이런 오류가 발생하니 주의해야 한다.
java.lang.IllegalArgumentException: 'script' must not be null or empty