본문 바로가기
Spring/Spring Study

[JPA] hibernate의 ddl-auto 속성의 종류 및 주의

by ♡˖GYURI˖♡ 2024. 4. 19.

개요

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

 

 

ddl-auto 속성의 종류

  • create
  • create-drop
  • update
  • validate
  • none(default)

 

create

entity로 등록된 클래스와 매핑되는 테이블을 자동으로 생성해준다.

이 과정에서 기존에 해당 클래스와매핑되는 테이블이 존재한다면 기존 테이블을 삭제하고 테이블을 생성한다.

 

create-drop

create와 비슷하게 entity로 등록된 클래스와 매핑되는 테이블이 존재한다면 기존 테이블을 삭제하고 자동으로 생성하지만, 애플리케이션이 종료될 때 테이블을 삭제한다는 차이점이 있다.

 

update

entity로 등록된 클래스와 매핑되는 테이블이 없으면 새로 생성하는 것은 create와 동일하지만, 기존 테이블이 존재한다면 위의 두 경우와 달리 테이블의 컬럼을 변경하게 된다.

 

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

기존에 존재하는 컬럼의 속성은 건드리지 않고, 새로운 컬럼이 추가되는 변경사항만 반영한다.

예를 들어, 어떤 entity 클래스의 String 필드를 Int로 변경하더라도, 해당 entity에 매핑되는 테이블의 해당컬럼은 Int로 변경되지 않고 String으로 유지 된다.  

 

validate

validate는 다른 속성들과는 다르게 DDL을 작성하여 테이블을 생성하거나 수정하지않고, entity 클래스와 테이블이 정상적으로 매핑되는지만 검사한다.

만약 테이블이 아예 존재하지 않거나, 테이블에 entity의 필드에 매핑되는 컬럼이 존재하지 않으면 예외를 발생시키고 애플리케이션을 종료한다.

 

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

 

 none

none은 위의 4가지 경우를 제외한 모든 경우를 말한다.

spring boot의 경우 none이라고 명시하거나 아예 ddl-auto 속성을 작성하지 말아야 한다.

이 경우에는 아무 일도 일어나지 않는다.

 

 

주의점

지금 진행 중인 개인 프로젝트들은 상관없지만, 운영 DB에는 validate와 none을 제외한 다른 속성들을 절대! 사용하면 안 된다고 한다.

update는 그나마 낫지만, create나 create-drop을 사용할 시 테이블이 전부 삭제될수 있기 때문이다.

update도 문제가 없는 것은 아니다.

만약 update로 인해 새로 추가된 컬럼이 not null이라면 해당 변경사항이 반영되지 않은 버전을 배포할 경우 테이블에 데이터가 INSERT되지 않을 수도 있다.

 

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

 

 

 

 


 

 

[JPA] hibernate의 ddl-auto 속성의 종류와 주의해야할 점

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

colabear754.tistory.com