스프링부트 웹 서버 실행시 자동으로 DB 삽입하기

유튜브에서 박재성님이 올려놓으신 Spring-Boot, JPA로 질문/답변 게시판 구현과정을 보며 게시판 만드는 연습을 하고 있다. 4-2 영상에서 import.sql 파일을 생성해서 서버 실행시마다 자동으로 데이터를 주입하는 방법을 알려주셨는데, 처음에 잘 안되서 몇시간 삽질을 하다가 정호영님이 남겨놓으신 댓글을 통해 해결을 해서 여기에 정리해본다.

우선 현재 이 프로젝트는 H2 데이터베이스를 사용해서 연습을 하고 있다. H2 데이터베이스는 In-Memory 방식이기 때문에 서버가 재실행할 때마다 DB가 초기화되는 특징이 있다. 이렇기 때문에 연습하기에 좋기도 하지만, 단 회원 DB를 다루기 위해서 매번 프로그래머가 임의로 회원 DB를 생성하는 일은 번거로웠다. 그런데 resources 디렉토리에 import.sql 이라는 파일명의 sql 파일을 저장하면 sql파일 안의 쿼리를 읽어들여서 DB에 자동으로 주입해준다고 한다.

이렇게 resources 디렉토리 바로 하위에 import.sql을 생성하고, 파일 안에 유저정보를 추가하는 쿼리를 추가했다.

1
2
3
INSERT INTO USER (USER_EMAIL, USER_NAME, USER_PASSWORD) VALUES('user1@email.com', 'user1', '12345678');
INSERT INTO USER (USER_EMAIL, USER_NAME, USER_PASSWORD) VALUES('user2@email.com', 'user2', '12345');
INSERT INTO USER (USER_EMAIL, USER_NAME, USER_PASSWORD) VALUES('user3@email.com', 'user3', '3456789');

여기서 처음에 삽질했던 포인트 하나.

sql 쿼리의 테이블 컬럼으로 도메인에 있는 User 객체의 컬럼명으로 입력했는데, 에러가 발생하면서 sql을 정상적으로 긁어오지 못했다. 그래서 아래의 h2-console에 접속해서 테이블 컬럼을 확인하고 다시 입력했다.

하지만 이렇게까지 해도 에러가 발생한다.

1
org.hibernate.tool.schema.spi.CommandAcceptanceException: Unable to execute command

뭐 이런 에러가 발생하는데 실행하려는 명령어를 제대로 인식하지 못한다는 에러로 보여진다. 위에 sql 쿼리에 따로 ID 컬럼을 작성하지 않았는데, 이는 User.java에서 id 필드에 @GeneratedValue 어노테이션을 했기 때문에 입력하지 않아도 자동으로 입력되는줄 알았기 때문이다. 이 때 호영님의 댓글덕분에 해결할 수 있었다.

@GeneratedValue 어노테이션에 속성값으로 (strategy = GenerationType.IDENTITY)를 입력하니까 ID 컬럼을 입력하지 않아도 자동으로 ID를 부여했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

...
}

이클립스에서 확인해보니 GenerationType의 IDENTITY는 DB 컬럼에 사용되는 primary key를 명시하는 기능(?)으로 추정된다.

이제 서버 재실행을 할 때마다 유저정보가 자동으로 입력된다.