본문 바로가기

Study

Spring JPA ddl-auto 옵션 정리(주의해야 할 점)

Spring boot를 사용하고 데이터베이스 관련 설정을 하다 보면, jpa hibernate의 ddl-auto 속성을 마주하게 된다.

 

ddl-auto 속성은 어플리케이션을 시작할 때 데이터베이스 스키마의 변화에 대해 테이블을 새로 만들거나(create) 변경사항을 업데이트(update)하는 등에 대한 것들을 어떻게 적용할지에 대한 옵션이다. 쉽게 말해, 엔티티로 등록된 클래스가 테이블로 매핑될 수 있도록 ddl을 작성해야 하는데, 이것을 Hibernate에서 자동으로 작성해주도록 설정하는 옵션이라고 생각하면 된다.

 

ddl-auto 로 ddl을 자동 작성하는 기능은 테스트나 로컬 환경에서 테이블 관리를 편하게 할 수 있게 해주어 흔히들 사용하지만, 운영서버에서 사용할 때는 주의를 기울여야 한다. ddl-auto 옵션의 종류와, 어떤 상황에서 지양해야 하는지를 알아보자.

 

먼저 ddl-auto 옵션의 종류는 다음과 같다.


ddl-auto : create

ddl-auto : create-drop

ddl-auto : update

ddl-auto : validate

ddl-auto : none

 

 

ddl-auto :  create

엔티티로 등록된 클래스와 매핑되는 테이블이 있을 때, 기존 테이블을 삭제(drop)하고 새로 생성(create) 하는 ddl을 자동으로 작성해 준다. 기존 테이블이 존재할경우, 어플리케이션이 시작할 때마다 기존 테이블을 아예삭제해버리기 때문에 운영서버에서는 절대 사용해선 안되고, 개발 초기단계나 로컬 서버에서 사용하는 것이 권장되는 옵션이다.

 

ddl-auto : create-drop

create 옵션과 마찬가지로 테이블을 새로 생성하되, 어플리케이션 종료 시 테이블을 삭제한다. 테이블 삭제 시점만 다를 뿐 기존 테이블을 삭제하는 것은 똑같기 때문에 create와 마찬가지로 운영 서버에서 사용해선 안된다.

 

ddl-auto : update

기존 테이블이 있을 때, 엔티티의 변경 사항을 테이블에 반영한다. 다만 모든 것이 반영되진 않고, 엔티티에 새로운 필드가 추가되었을 경우에만 테이블에 새로운 컬럼을 추가한다. 엔티티의 기존 필드의 속성을 변경(String → int)하는 경우 등은 반영되지 않는다. 즉, 엔티티의 필드가 추가되는 변경만 반영하고 속성의 변경은 반영하지 않는다.

 

ddl-auto : validate

validate 옵션은 엔티티와 테이블이 올바로 매핑되었는지만 검사한다. 엔티티 클래스에 매핑되는 테이블이 없거나, 엔티티의 필드에 매핑되는 컬럼이 테이블에 존재하지 않을 경우 예외를 발생시키고 어플리케이션을 종료한다. 

 

ddl-auto : none

none 옵션은 어떤 역할을 하는 옵션은 아니고, ddl-auto의 기능을 사용하지 않음을 의미한다. validatie나 none 으로 설정할 경우, jpa는 ddl 작성에 아무 개입이 없거나 올바르게 작성되었는지 검증하는 역할만 하므로 ddl은 사용자가 직접 작성해야 한다. 운영 서버의 경우 validate나 none 옵션을 사용하는 것이 권장되기 때문에 데이터베이스 스키마는 사용자가 직접 ddl을 작성하여 관리하는 것이 바른 방법일 것이다.