🫤 문제 발생
메모리 데이터베이스인 H2에서 서버를 열고 닫을 때 마다 데이터가 없어지기 때문에 별도의 data-h2.sql 파일을 만들어 서버를 열 때마다 초기 데이터를 저장하도록 하려는 도중 모든 설정을 끝내고 확인해봤는데 데이터가 초기화되지 않는 문제가 발생
data-h2.sql
INSERT INTO posts (id, created_date, modified_date, title, content, author) VALUES (1, now(), now(), '제목1', '본문1', '작성자1');
INSERT INTO posts (id, created_date, modified_date, title, content, author) VALUES (2, now(), now(), '제목2', '본문2', '작성자2');
application.yml
spring:
config:
activate:
on-profile:
active: local
---
spring:
profile: local
jpa:
open-in-view: false
show-sql: true
generate-ddl: true
hibernate:
ddl-auto: create-drop
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
password:
data: classpath:data-h2.sql
h2:
console:
enabled: true
main:
allow-circular-references: true
🔎 문제 해결 방안 찾기
1. 첫 번째로 찾았던 방법은 spring boot 2.5 버전 이상에서는 아래와 같은 옵션을 추가해줘야된다고 한다.
jpa.defer-datasource-initialization=true
Spring Boot 2.5버전 부터 스크립트 기반 초기화의 동작과정을 Flyway, Liquibase와 일치시키기 위해서 data.sql은 Hibernate 초기화되기 전에 실행된다고 한다.
즉, 생성된 스키마에 data.sql의 데이터를 초기화하고 싶다면 위에서 말한 jpa.defer-datasource-initialization=true에 대한 옵션을 추가해줘야 한다. 더 자세한 내용이 궁금하다면 참고했던 블로그인데, 참고하면 좋을 것 같다.
해당 옵션을 추가해주고난 후 실행해봤다. 근데 왜 작동이 안 되지…라는 생각을 하고 더 찾아봤다. 속 시원하게 나왔던 stackoverflow의 내용을 가져와봤다.
2. data.sql과 data-h2.sql의 차이점
내가 지금하고 있는 실습에서는 data.sql이 아닌 data-h2.sql을 사용하고 있다. 위 링크에 들어가서 확인해본 내용은 다음과 같다.
data-h2.sql 또는 data-mysql.sql의 경우에는 내가 설정한 database platform에 따라서 결정된다고 한다.
spring.sql.init.platform=h2 # Spring Boot >=v2.5.0
spring.datasource.platform=h2 # Spring Boot <v2.5.0
나는 2.7.7 버전을 사용하고 있기 때문에 spring.sql.init.platform=h2 옵션을 추가해줬다.
최종 application.yml 파일
jpa에 해당하는 부분만 수정이 있었기 때문에 그 부분만 확인해보시면 빠를 거 같습니다!
spring:
config:
activate:
on-profile:
active: local
---
spring:
profile: local
sql:
init:
platform: h2
jpa:
open-in-view: false
defer-datasource-initialization: true
show-sql: true
generate-ddl: true
hibernate:
ddl-auto: create-drop
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
password:
data: classpath:data-h2.sql
h2:
console:
enabled: true
main:
allow-circular-references: true
정상적으로 돌아가는 것을 확인했다.
실습 권장 버전은 1.5.0버전이었는데 젤 최근 버전에 맞춰서 해보고 싶어서 하고 있는데, 시간은 오래걸리는데 나름 배워가는 것이 더 많은거 같아서 재밌다. 😮
'🧑🏻💻 Dev > SpringBoot' 카테고리의 다른 글
[Spring] ExceptionHandler가 작동안 되는 오류 (컴포넌트 스캔) (0) | 2023.04.03 |
---|---|
[Spring] 프로젝트 실행 시 Please Sign in 페이지 해결 (0) | 2023.02.19 |
[Spring] Mac OS : Web server failed to start. Port 8080 was already in use 문제 해결하기 (0) | 2023.02.19 |
[SpringBoot] mysql 연동 후 data.sql 적용하기 (0) | 2023.01.23 |
[SpringBoot] Annotation(@) 기능 정리 (0) | 2023.01.17 |