[매일메일] JPA의 ddl-auto 옵션은 각각 어떤 동작을 하고 어떤 상황에서 사용해야 할까요?

신원규·2025년 3월 25일
0

매일메일

목록 보기
2/2
post-thumbnail

이 설정에 대해 매우 주의할것.

Hibernate가 지원해주는 DDL 관련 설정

ddl-auto 는 정확히는 JPA 의 설정이 아니라,
JPA 의 구현체인 HIbernate가 지원해주는 DDL(Data Definition Language) 관련 설정이다.
관련한 스프링 공식 Docs

그래서 yaml 파일내에서 설정할 때도jpa.hibernate.ddl-auto: 로 설정해야한다.

해당 기능은 Hibernate 가 등록된 엔티티 기반으로 테이블을 생성하거나, 수정해주는 편의 기능이다.

설정할 수 있는 속성은,

  • none(default)

  • validate

  • update

  • create

  • create-drop

이렇게 총 5개의 속성이 있는데, 결론을 먼저 말하자면 validate, 아니면 none 말고는 쓰지 말자.
예상치 못한 오류의 원인이 될 가능성이 매우 높다.

차례로 각 옵션별 동작을 간단하게 설명하면,

none(default)

관련해 아무 동작도 실행하지 않겠다는 설정.
hibernate 의 편의 기능을 사용하지 않고, 모든 테이브를 직접 관리 할 때 사용할 것.

valiate

DB 의 테이블과 엔티티가 정상적으로 매핑되는지 검사만 수행하고,
실패하면 예외를 발생시키고 어플리케이션을 종료한다. (권장설정)

이때, 엔티티 필드에 해당하지 않는 추가 컬럼이 존재 여부는 검사하지 않는다.

create

create 의 경우, 엔티티 클래스의 테이블을 생성할 수 있는 DDL 이 작성되어
어플리케이션 실행시 DB에 반영된다.

이 때, drop table if exists로 동작하기 때문에 주의할것. 파괴적인 opearation 이 진행된다.

create-drop

create-drop 의 경우는 create와 비슷하지만, 어플리케이션이 종료될 때 테이블을 삭제한다.

update

update의 경우, 엔티티 필드의 추가 사항이 있으면 이를 반영해주는데,
이미 존재하는 컬럼의 속성 변경 (nullabe, 크기, 타입)등은 관리해주지 않는다.
새로 추가된 필드가 nonNull 이라면, 해당 변경사항이 반영되지 않는 버전 배포시, 데이터 insert 가 불가능해질수도.

추가 설명

공식 문서에서 보면 따로 설정을 하지 않았을 경우
embedded db 의 경우에는 create-drop을 기본적으로 적용한다고 하는데,
이게 뭔가 싶어서 찾아보니
in-memory, 혹은 file system 으로 저장하는
외부 서버와 통신이 없이 어플리케이션 내부에서 사용할 수 있는 DB 를 의미한다.
위키 Embedded database

그럼 왜 이런 설정이 필요한걸까?

테스트, 개발 환경에서는 해당 옵션이 유용하기 때문에.

여담

개발바닥의 이 유튜브를 이전에 본 기억이 있는데, 오늘 정리한 내용과 관련한 이야기였구나?
처음에 볼땐 그냥 웃기다고만 생각했는데, 단순 설정파일 한줄에 따라서 이렇게 치명적인 결과가 나올 수 있을줄이야...

profile
생존형 개발자. 어디에 던져져도 살아 남는것이 목표입니다.

0개의 댓글