스프링에서 JPA를 사용 시 application.yml 파일의 spring.jpa.hibernate.ddl-auto: create 설정을 통해 하이버네이트가 자동으로 테이블을 만들어주지만 실 배포 단계에서는 하이버네이트가 자동 생성한 sql을 사용하는 것은 좋지 않다.
1️⃣ schema.sql 파일
schema.sql 파일을 만들면 하이버네이트에서 기본적으로 만드는 ddl을 사용하지 않고 데이터베이스 테이블을 만들 수 있다.
해당 파일을 resources 디렉토리에 만들어준다.
drop table if exists post;
create table post (
id bigint not null auto_increment,
title varchar(255),
content text not null,
primary key (id)
);
충돌을 피하기 위해 application.yml 파일의 자동 스키마 생성 옵션을 해제한다.
spring.jpa.hibernate.ddl-auto: none
🌱 Hibernate DB 생성 제어
Spring은 spring.jpa.hibernate.ddl-auto을 통해 Hibernate가 DDL 생성을 위해 사용하는 속성을 제공한다.
속성 값은 create, update, create-drop, validate, none이 있다.
- create
- Hibernate가 기존 테이블을 삭제한 후 새 테이블 생성한다.
- update
- 매핑 기반으로 생성 된 객체 모델을 기존 스키마와 비교 후 차이가 나는 스키마를 업데이트한다.
- 응용 프로그램에서 더 이상 필요하지 않아도 기존 테이블 또는 열을 삭제하지 않는다.
- create-drop
- create와 유사하지만 모든 작업이 완료된 후 Hibernate가 데이터베이스를 삭제한다.
- validate
- Hibernate는 테이블과 열이 존재하는지의 여부만 확인한다.
- 존재하지 않으면 예외가 발생한다.
- none
- DDL 생성에 관여하지 않는다.
2️⃣ data.sql 파일
데이터를 초기 설정해 주기 위해 data.sql 파일을 작성한다.
해당 파일을 resources 디렉토리에 만들어준다.
INSERT INTO post (title, content) VALUES ('제목1', '본문2');
INSERT INTO post (title, content) VALUES ('제목1', '본문2');
3️⃣ application.yml 파일
spring:
jpa:
hibernate:
ddl-auto: none
defer-datasource-initialization: true
sql:
init:
schema-locations: classpath:schema.sql
data-locations: classpath:data.sql
mode: always
❗️yml에 defer-datasource-initialization 설정을 한 이유
Hibernate and data.sql
By default, data.sql scripts are now run before Hibernate is initialized. This aligns the behavior of basic script-based initialization with that of Flyway and Liquibase. If you want to use data.sql to populate a schema created by Hibernate, set spring.jpa.defer-datasource-initialization to true. While mixing database initialization technologies is not recommended, this will also allow you to use a schema.sql script to build upon a Hibernate-created schema before it’s populated via data.sql.
스프링 2.5 릴리즈 노트에 나와 있는 문구이다.
1. data.sql은 이제 Hibernate가 초기화되기 전에 실행된다.
2. Hibernate에 의해 생성된 스키마에 데이터를 넣기 위해 data.sql을 사용하고 싶은 경우
spring.jpa.defer-datasource-initialization 이 값을 true로 설정해라
3. 데이터베이스 초기화 기술을 섞는 것은 추천하지 않는다.
data.sql로 데이터를 넣기 전에 Hibernate가 생성한 스키마를 구축하기 위해 scchema.sql를 사용해라
'Back-end' 카테고리의 다른 글
[Gradle] Spring boot 3.0.0 이상 Querydsl build.gradle + 멀티 모듈 프로젝트 (0) | 2023.02.27 |
---|---|
[Spring Boot] 멀티모듈 java.lang.ClassNotFoundException, Gradle 의존성 옵션 (0) | 2023.02.20 |
[AWS] SpringBoot + gradle 프로젝트(jar) EC2 서버 배포 (0) | 2023.02.11 |
[Spring Security] CSRF disable? (0) | 2023.01.26 |
[Spring Boot] RestController, ResponseEntity란? (0) | 2023.01.20 |