본문 바로가기
JPA

JPA H2 데이터베이스 및 서버 실행시 자동 Insert

by khds 2021. 6. 29.

1. application.properties 에 아래 코드를 삽입한다.

 

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

spring.jpa.hibernate.ddl-auto=create 
spring.jpa.properties.hibernate.format_sql=true //true 설정 시, 콘솔에 표시되는 쿼리를 가독성있게 보여준다.
spring.jpa.show-sql=true  // true 설정 시, 콘솔에 JPA 쿼리를 보여준다.

 

Spring은 Hibernate가 DDL 생성을 위해 사용 하는 JPA 특정 속성을 제공한다.

 spring.jpa.hibernate.ddl-auto 에서 표준 Hibernate 속성 값은 create , update , create-drop , validate, none으로 5가지이다.

  • create : Hibernate는 먼저 기존 테이블을 삭제 한 다음 새 테이블을 생성한다.
  • update : 매핑 (어노테이션 또는 XML)을 기반으로 생성 된 객체 모델을 기존 스키마와 비교 한 다음 Hibernate가 d차이에 따라 스키마를 업데이트를 한다. 응용 프로그램에서 더 이상 필요하지 않더라도 기존 테이블 또는 열을 삭제하지 않는다.
  • create-drop : create 와 유사하며  모든 작업이 완료된 후 Hibernate가 데이터베이스를 삭제한다는 추가 사항이 있다. 일반적으로 단위 테스트에 사용된다.
  • validate : Hibernate는 테이블과 열이 존재하는지 여부 만 확인한다. 그렇지 않으면 예외가 발생한다.
  • none : 이 값은 서버 실행시 자동으로 DDL 생성이 되는 것을 해제한다.

Spring Boot 는 스키마 관리자가 감지되지 않은 경우 내부적으로이 매개 변수 값을 create-drop으로 기본 설정하고 , 그렇지 않은 경우 다른 모든 경우에는 none  기본값으로 설정한다.

 

 

2. http://localhost:8080/h2-console/ 로 접속한다. 아래 화면과 같이 나올 것이다.

 

 

3. properties에 입력한 password를 넣고 접속한다. 위에서는 빈칸으로 띄어놨으므로 그냥 바로 Connect할 수 있다.

아래는 접속했을 때 사진이다.

 

 

왼쪽에 내가 만든 테이블들을 확인할 수 있고 편집을 누르면 임의적으로 값을 넣을 수 있다.

기본적으로 서버를 다시 실행할 때마다 데이터는 초기화되고 빈 테이블만 남게된다.

 

여기서 resources 안에 import.sql 파일을 만들면 서버를 실행할 때 마다 import.sql 안에 작성한 sql 문을 실행한다.

예시로 아래와 같이 작성하였다고 하자.

 

INSERT INTO FREQ_QUESTION (CATEGORY, TITLE, CONTENT) VALUES('테스트 카테고리','제목1!','내용내용1!');
INSERT INTO FREQ_QUESTION (CATEGORY, TITLE, CONTENT) VALUES('테스트 카테고리','제목2!','내용내용2!');
INSERT INTO FREQ_QUESTION (CATEGORY, TITLE, CONTENT) VALUES('테스트 카테고리','제목3!','내용내용3!');

 

서버를 실행시 위 sql문이 실행하여 h2-database로 가면 FREQ_QUESTION 테이블에는 위 3개의 데이터가 삽입된 상태로 존재하게 된다.

 

만약 import.sql 대신 다른 이름을 쓰고싶다면(예를들면 data.sql) 아래와 같은 코드를 사용한다.

 

spring.jpa.defer-datasource-initialization=true 
spring.sql.init.data-locations=classpath:data.sql;   //데이터 관련
spring.sql.init.schema-locations=classpath:schema.sql; // 테이블 생성 관련

 

첫번째줄은 쓴 이유는 만약 2번째 줄만 쓴다면  h2가 초기화되서 h2-db에 테이블이 생성되는 것보다 data.sql을 통해 insert 되는 것이 먼저 일어나서 테이블을 찾을 수 없다는 에러가 발생하기 때문이다. 이 문제는 3번째 줄에 schama.sql로 테이블을 먼저 만들어서 해결할 수도 있다. 

참고

https://recordsoflife.tistory.com/249?category=874063 

 

Spring Boot로 초기 db 데이터로드하는 방법

1. 개요 Spring Boot를 사용하면 데이터베이스 변경 사항을 쉽게 관리 할 수 ​​있습니다. 기본 구성을 그대로두면 패키지에서 엔터티를 검색하고 각 테이블을 자동으로 생성합니다. 그러나 때때

recordsoflife.tistory.com

https://velog.io/@khsb2012/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-2.5-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-hibernate-data.sql-%EA%B4%80%EB%A0%A8-%EB%B3%80%EB%8F%99%EC%82%AC%ED%95%AD

 

스프링 부트 2.5 업데이트 : hibernate, data.sql 관련 변동사항

spring boot 2.5 hibernate, data.sql 관련 변동사항 정리

velog.io