JPA H2 데이터베이스 및 서버 실행시 자동 Insert
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