이 설정에 대해 매우 주의할것.
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
테스트, 개발 환경에서는 해당 옵션이 유용하기 때문에.
개발바닥의 이 유튜브를 이전에 본 기억이 있는데, 오늘 정리한 내용과 관련한 이야기였구나?
처음에 볼땐 그냥 웃기다고만 생각했는데, 단순 설정파일 한줄에 따라서 이렇게 치명적인 결과가 나올 수 있을줄이야...