JPA를 사용하면서 편한 기능 중 하나는 Query문을 전혀 사용하지 않고도
테이블을 생성하고 작성할 수 있다는 것이다.
보통 JPA가 익숙해지기 전까지는 테이블을 자동으로 생성해주는 옵션을 사용한다.
하지만 프로젝트를 진행할 때마다 자동 생성 옵션으로 테이블을 생성할 것인가?
아니면 쿼리문을 통해 직접 수동 생성할 것인가? 두가지 옵션 중 고민을 하게 된다.
우선 테이블을 자동 생성했을 때를 알아보자
편하게만 보이는 테이블 자동 생성이 운영 중이나 개발 중에 치명적인 오류나 불편함을 초래할 수 있다.
우선 테이블 생성 옵션부터 알아보면 다음과 같다. (설정파일에서 옵션 변경)
- none : 기본 값이며 아무 일도 일어나지 않는다.
- create-only : 데이터베이스를 새로 생성한다.
- drop : 데이터베이스를 drop한다.
- create : 데이터베이스를 drop한 후, 데이터베이스를 새로 생성한다. (drop + create-only)
- create-drop : SessionFactory 가 시작될 때 스키마를 drop하고 재생성하며, SessionFactory가 종료될 때도 스키마를 drop한다.
- validate : 데이터베이스 스키마를 검증한다.
- update : 데이터베이스 스키마를 갱신한다.
create와 create-drop은 애플리케이션을 시작할 때마다 DB가 초기화되어야 한다면 이 설정이 적합하다.
개발 초기나 프로토타입 제작에 적합한 옵션은 update가 될 것이다.
하지만 이러한 옵션을 상용 프로덕션 설정파일에 쓰는 것은 상당히 위험한 일이다.
계속해서 객체-매핑을 해서 테이블을 수정하고 생성하기 때문에 코드를 잘못 건드리는 순간
데이터베이스의 데이터 변형이 일어나기 때문이다.
그렇다면 자동 생성을 안하는 것이 좋은 것일까?
JPA의 객체-매핑 관계에 익숙해지기 전까지 create와 update옵션을 써서 테스트해보는 것도 좋을 것이다.
하지만 validate옵션이나 none옵션을 사용해서 테이블은 쿼리문으로 생성하는 것이 적합해보인다.
상용 프로덕션 설정파일은 vaildate | none옵션을 주고, 로컬 설정파일은 따로 두는 것도 방법 중 하나일 것이다.
결론
테이블 생성은 쿼리문으로 하는 것이 가독성이 좋고 무엇보다 DBMS는 하이버네이트가
자동으로 만들어주는 스키마로 만족하기에는 훨씬 더 넓은 선택의 폭과 기능을 가지고 있다.
테이블 생성은 쿼리문으로 하고 객체를 매핑을 한 후에,
JPA를 활용하기 위해 외래키 설정이나 데이터포맷 설정 등은 하이버네이트에서 설정하는 것이 좋아보인다.
※ 참고
https://github.com/HomoEfficio/dev-tips/blob/master/hibernate.hbm2ddl.auto%20위험%20헷지.md
http://egloos.zum.com/gyumee/v/2483659
'Programming > Java & JSP & Spring' 카테고리의 다른 글
[SpringBoot] 프로파일(Profile) 설정 (0) | 2018.01.31 |
---|---|
[Spring Boot] 스프링부트에서 JSP 사용하기 (0) | 2018.01.25 |
[Java] HashMap 사용법과 정렬 (0) | 2018.01.08 |
[Java] 문자열 거꾸로 뒤집기 (0) | 2017.12.24 |
[Java] Comparable, Comparator (0) | 2017.12.18 |