내가 JPA에 대해서 익숙하지 않을 때, DB인 MySQL과 연동하려고 하면 테이블과 관련된 오류들이 많았다.
그래서 이를 위해 어려움을 겪을 모든 개발자들을 위해 조금이나마 도움이 됐으면 하는 마음에서 이 글을 쓰게 됐다.
ddl-auto 옵션 종류
- create: 애플리케이션 빌드 시, 기존테이블 삭제 후 다시 생성 (DROP + CREATE)
- create-drop: create와 같으나 종료시점에 테이블 DROP
- update: 변경분만 반영 (운영DB에서는 사용하면 안됨)
- validate: 엔티티와 테이블이 정상 매핑되었는지만 확인
- none: 사용하지 않음(사실상 없는 값이지만 관례상 none이라고 한다.
주의할 점
- 운영 장비에서는 절대 crate, create-drop, update 사용하면 안된다.
- 개발 초기 단계는 create 또는 update
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
여기에서 유의해야 할 점은,
1. 개발 초기 단계 즉, 엔티티를 만들고 있는 과정에서 이를 통해 MySQL에서 테이블을 생성하는 시점에서, ddl-auto: create 로 해야한다.
: 이를 validate로 할 경우, 아직 테이블이 만들어지지 않은 상태에서 엔티티와 테이블을 비교하게 되어, 엔티티와 DB의 테이블간, 매치가 안되어 오류가 발생할 수 있다.
2. MySQL의 명령어와 똑같이 엔티티의 name을 짓지는 않았는지 고려해야 한다.
: 나의 경우 주문 엔티티의 이름을 order로 지어 Mysql에서 테이블 생성 시 오류가 생겼던 적이 있었다. order의 경우 MySQL의 명령어 중 하나이므로, 따로 @Table(name = "orders")를 통해 테이블명을 지정해 주어야 한다.
개발 초기에는 데이터의 양도 적고, 실행하는데 큰 문제가 없어 이를 간과하고 사용할 수 있겠지만, 다뤄야할 데이터의 양이 많아지고 로컬,운영,테스트 서버환경을 분리해서 사용하다 보면 얼마나 중요한지 깨닫게 될것이다.
ex) 로컬에서 'ddl-auto: create'로 설정된 상태로 운영서버를 붙여 돌릴경우 실 사용자의 데이터들이 들어있는 DB의 테이블이 날아가는 불상사가 일어날 수 있다.