yeon's blog

[JPA] JPA-DDL 설정 본문

JPA

[JPA] JPA-DDL 설정

yeonii 2023. 12. 12. 18:36

JPA의 구현체 중 하나인 하이버네이트는 다양한 기능을 제공하는데 그 중 엔티티만 등록해 놓으면 DDL(Data Definition Language)을 자동으로 작성하여 테이블을 생성하거나 수정해주는 ddl-auto라는 설정이 있다.

 

이번 포스트에서는 JPA 하이버네이트에서 제공하는 ddl-auto의 종류와 기능, 그리고 주의 사항에 대해서 정리하려고 한다!

 

초기 application.yml 설정에서 JPA DDL-AUTO 값을 create로 설정해 두면, 서버가 재시작 될 때마다 기존에 생성된 테이블을 삭제하고 다시 생성한다.

만약 데이터값이 들어가 있다면 모든 데이터 값이 사라지는 문제가 발생하는 것이다.🚫🚫🚫
이러한 문제 발생을 방지하기 위해 ddl-auto 옵션에 대해 알아보고자 한다.

 

✔️ DDL-AUTO 속성의 종류
1. create
2. create-drop
3. update
4. validation
5. none

 

하나씩 자세하게 알아보자!!!

1. create

1) 엔티티로 등록된 클래스와 매핑되는 테이블을 자동으로 생성(create)
2) 이 과정에서 기존에 해당 클래스와 매핑되는 테이블이 존재한다면 기존 테이블을 삭제(drop)하고 테이블을 생성

 

2. create-drop

엔티티로 등록된 클래스와 매핑되는 테이블이 존재한다면 기존 테이블을 삭제하고 자동으로 테이블을 생성
→ 애플리케이션이 종료될 때 테이블을 삭제

 

3. update

변경분만 엔티티로 ,
1) 등록된 클래스와 매핑되는 테이블이 없으면 새로 생성
2) 기존 테이블이 존재한다면 위의 두 경우와 달리 테이블의 컬럼을 변경

 

*하지만, 일반적으로 생각하는 update와는 달리 모든 변경사항을 반영하는 것이 아니다.

기존에 존재하는 컬럼의 속성(nullable, 크기, 데이터 타입 등)은 건드리지 않고, 새로운 컬럼이 추가되는 변경사항만 반영한다.
가령, 어떠한 엔티티 클래스의 String 필드를 Int로 변경하더라도 해당 엔티티에 매핑되는 테이블의 해당 컬럼은 숫자타입으로 바뀌지 않고 문자열 타입으로 유지된다.

 

4. validate

1) 엔티티 클래스와 테이블이 정상적으로 매핑되는지 검사
2) 만약 테이블이 아예 존재하지 않거나, 테이블에 엔티티의 필드에 매핑되는 컬럼이 존재하지 않으면 예외를 발생시키며 애플리케이션을 종료

 

*이 경우도 update와 비슷하게 엔티티 클래스의 필드가 매핑되는 테이블에 모두 존재하기만 한다면, 테이블의 컬럼이 더 많더라도 아무 일도 일어나지 않는다.

 

5. none

위의 4가지 경우를 제외한 모든 경우에 해당
(다만 스프링부트의 경우에는 none이라고 명시하거나 아예 ddl-auto 속성을 명시하지 않아야 한다.)
→ 이 경우에는 아무 일도 일어나지 않는다.

 


 

프로그램 제작 단계에서는 create 또는 update를 사용한다.
Entity가 추가되거나 변경되는 일이 많고 DB에 실제 사용되는 데이터가 들어있지 않기 때문이다.

 

실제 운영되는 서버에서는 절대로 create와 create-drop, update를 사용하면 안된다.
기존 데이터가 날아가는 문제도 있지만, 테이블 구조가 변경되면서 문제가 발생할 수 있다.


따라서 실제 운영중인 서버에서는 validate 또는 none를 사용한다.✨

개발 초기 단계 또는 로컬에서 테스트 : create 또는 update
테스트 서버 : update 또는 validate
스테이징 및 운영 서버 : validate 또는 none

 

 


이 글은 hanteng.log 님의 velog와 https://colabear754.tistory.com/ tistory를 참조하고 있습니다.

 

'JPA' 카테고리의 다른 글

[JPA] 연관관계  (0) 2023.12.27
[JPA] 기본적인 매핑  (0) 2023.12.27