🫤 문제 발생

메모리 데이터베이스인 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버전이었는데 젤 최근 버전에 맞춰서 해보고 싶어서 하고 있는데, 시간은 오래걸리는데 나름 배워가는 것이 더 많은거 같아서 재밌다. 😮

+ Recent posts