본문 바로가기

Programming/Java & JSP & Spring

[JPA] 테이블생성 어디서 할 것인가?

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