이 설정에 대해 매우 주의할것.
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 말고는 쓰지 말자.
예상치 못한 오류의 원인이 될 가능성이 매우 높다.
차례로 각 옵션별 동작을 간단하게 설명하면,
관련해 아무 동작도 실행하지 않겠다는 설정.
hibernate 의 편의 기능을 사용하지 않고, 모든 테이브를 직접 관리 할 때 사용할 것.
DB 의 테이블과 엔티티가 정상적으로 매핑되는지 검사만 수행하고,
실패하면 예외를 발생시키고 어플리케이션을 종료한다. (권장설정)
이때, 엔티티 필드에 해당하지 않는 추가 컬럼이 존재 여부는 검사하지 않는다.
create
의 경우, 엔티티 클래스의 테이블을 생성할 수 있는 DDL 이 작성되어
어플리케이션 실행시 DB에 반영된다.
이 때, drop table if exists
로 동작하기 때문에 주의할것. 파괴적인 opearation 이 진행된다.
create-drop
의 경우는 create
와 비슷하지만, 어플리케이션이 종료될 때 테이블을 삭제한다.
update
의 경우, 엔티티 필드의 추가 사항이 있으면 이를 반영해주는데,
이미 존재하는 컬럼의 속성 변경 (nullabe, 크기, 타입)등은 관리해주지 않는다.
새로 추가된 필드가 nonNull 이라면, 해당 변경사항이 반영되지 않는 버전 배포시, 데이터 insert 가 불가능해질수도.
공식 문서에서 보면 따로 설정을 하지 않았을 경우
embedded db 의 경우에는 create-drop
을 기본적으로 적용한다고 하는데,
이게 뭔가 싶어서 찾아보니
in-memory, 혹은 file system 으로 저장하는
외부 서버와 통신이 없이 어플리케이션 내부에서 사용할 수 있는 DB 를 의미한다.
위키 Embedded database
테스트, 개발 환경에서는 해당 옵션이 유용하기 때문에.
개발바닥의 이 유튜브를 이전에 본 기억이 있는데, 오늘 정리한 내용과 관련한 이야기였구나?
처음에 볼땐 그냥 웃기다고만 생각했는데, 단순 설정파일 한줄에 따라서 이렇게 치명적인 결과가 나올 수 있을줄이야...