본문 바로가기
기타등등

JPA 데이터 스키마 셋팅 및 초기 데이터 셋팅 + hibernate

by 큣큣 2025. 6. 24.

데이터 스키마 셋팅 

 

Spring에서 table 스키마를 통해 자동으로 테이블을 생성하는 방법은 script-based initialization 과  Hibernate initalization

이렇게 2가지가 있다. 둘다 셋팅해 놓다면, 에러를 발생시킬확률이 높으니 아래 옵션 중 하나만 설정해야한다. 

 

방법 1. script-based initialization(=schema.sql 사용)

스프링 부트 JPA는 classpath에 `schema.sql` 이란 이름의 파일이 있다면 자동으로 이 파일을 토대로 db 테이블을 구성한다. 

`프로젝트이름/src/main/resources` 에  `schema.sql`을 넣는다. 

 

`schema.sql` 예시 

create table USERS(
  ID int not null AUTO_INCREMENT,
  NAME varchar(100) not null,
  STATUS int,
  PRIMARY KEY ( ID )
);

이렇게 script-based initialization을 사용하려면 hibernate initalization 방법과 충돌을 피하기 위해 반드시 아래 설정을 추가해준다.

 

아래 설정을 통해 hibernate initalization 을 확실히 disable 할수 있음

spring.jpa.hibernate.ddl-auto=none

 

 

방법 2. Hibernate initialization(설정파일을 통해 셋팅함)

JPA 구현체로 Hibernate를 사용하고 있다면, 엔티티만 등록해놓으면 설정파일을 통해서만으로 db 테이블을 구성할수있다.

  jpa.hibernate.ddl-auto: create
                          # none (default 값)   
                          # create-drop
                          # update
                          # validate

 

<jpa.hibernate.ddl-auto 옵션 설명>

1. none 

2.create : 엔티티로 등록된 클래스와 매핑되는 테이블을 자동 생성해줌, 만약 해당 테이블이 이미 존재하면, 기존 테이블 삭제 후 테이블 재생성

3.create-drop : `create` 와 똑같은 기능 + 추가로 애플리케이션 종료될때 만들어진 테이블 모두 삭제함.

4.update : 엔티티로 등록된 클래스와 매핑되는 테이블을 자동 생성해줌, 만약 해당 테이블이 이미 존재하면, 기존 테이블을 삭제하는게 아니라 update 해줌.

!주의) 모든 변경사항을 업데이트 해주지 않는다. 새로운 컬럼이 추가되는 사항만 반영하고 기존에 존재하는 컬럼의 속성(nullable, 크기, 데이터 타입, unique, fk 제약조건  등)은 변경되었다고 하더라도 업데이트 해주지 않음.

5.validate : 위의 속성들과는 다르게 테이블을 생성/업데이트/삭제 해주지 않음. 단순히 엔티티 클래스와 테이블이 정상적으로 매핑이 되는지만 검사함. 만약 다르다면, 아예 애플리케이션 종료시킴

!주의) 테이블이 존재하고, 테이블의 컬럼이 엔티티 클래스의 필드와 일치만 한다면 통과이다. 엔티티보다 테이블의 컬럼이 더 많더라도, 엔티티 필드는 다 가지고있으므로 통과한다.  

 

테이블 초기 데이터 셋팅 

스프링 부트 JPA에서 테이블에 초기 데이터를 셋팅하는 방법은  script-based initialization 를 이용하는 1가지뿐이다.

classpath에 `data.sql` 이란 파일이 있다면 이 파일을 토대로 db 테이블에 데이터를 삽입한다. 

 

`data.sql` 예시

INSERT INTO country (name) VALUES ('India');
INSERT INTO country (name) VALUES ('Brazil');
INSERT INTO country (name) VALUES ('USA');
INSERT INTO country (name) VALUES ('Italy');

 

단, 주의할 점은 `data.sql` 스크립트는 기본적으로 hibernate가 초기화되기도 전에 실행된다.  만약 table 을 생성할때 방법 2. Hibernate initialization(설정파일을 통해 셋팅함) 을 사용했다면 오류가 생기므로 , hibernate가 테이블을 생성한 뒤, `data.sql` 스크립트을 실행하도록 설정을 반드시 해주어야한다. 

 

spring.jpa.defer-datasource-initialization=true

위의 설정은,

Hibernate 스키마로 테이블 자동 생성 -> (schema.sql 파일이 있으면) schema 변경 사항 있으면 적용 -> ( data.sql있으면)테이블에  데이터 삽입

를 의미한다. 

 

추가 팁

스키마를 생성하든, 테이블에 데이터를 생성하든, script-based initialization 방법을 사용했다면 아래 설정을 넣어주는게 좋다. 

spring.sql.init.mode=always # 항상 실행(외부 DB에서도 실행됨)
                     #embedded (기본값, 내장 DB에서만 실행됨)

왜냐하면 script-based initialization은 DB가 embedded 데이터베이스일때만 기본으로 자동 실행되고 외부 DB(MySQL, PostgreSQL 등)는 자동으로 실행되지 않는다. 

 

 

 

 

참고 : 

https://www.baeldung.com/spring-boot-data-sql-and-schema-sql

https://colabear754.tistory.com/136