JPA/Hibernate 는 단순히 Database Table 에 object 를 추가하는 것뿐만이 아니라 Table 자체도 생성할 수 있다.

Annotation 을 사용하여 Java Code 를 작성하고, JPA/Hibernate 환경에서 실행하면 SQL 로 변환되어 실제 Database 에 적용된다.

Configuration

Java code 통하여 Database Table 을 생성하기 위하여는 application.properties file 에 다음을 추가해주어야 한다.

spring.jpa.hibernate.ddl-auto=create

또한 위와 같은 create option 에서는, Application 을 실행하면 JPA/Hibernate 는 table 을 drop 한 뒤에 생성한다. drop 을 통한 삭제는 모든 data 를 잃어버리기 떄문에 주의해야 한다.

이외의 Table 을 생성하는 options 는 다음과 같다.

옵션동작 내용사용 사례데이터 손실 위험
create기존 table 삭제 후 새로 생성개발/테스트 환경높음
create-drop기존 table 삭제 후 새로 생성, Application 종료 시 table 삭제테스트 환경높음
updateschema 를 수정(새로운 column/table 추가만 가능)개발 환경중간
validateschema 와 entity mapping 확인(수정 없음)운영 환경없음
noneHibernate 가 schema 관리하지 않음운영 환경(수동 관리 시)없음

createcreate-drop option 은 절대 Production 단계에서는 사용을 지양해야 한다. 모든 data 가 날아갈 수 있기 때문이다.

Recommendation

일반적으로, 기업이나 real-time projects 에서는 Database Table 을 auto generation 하지 않는다. 단순히 option 하나 바꾼 것만으로도 이전에 쌓았던 모든 data 를 읿어버릴 수 있기 때문이다.

DBA(Database Administrator) 들도 Application 의 관리나 code review 를 위하여 SQL scripts 를 선호한다. SQL scripts 는 customize 될 수 있으며 복잡한 DB Design 에 대하여 fine-tuning 이 가능하다.

auto generation test 환경에서 사용하거나, 즐거움을 추구하는 아주 작은 project 등에서나 사용하는 것이 좋다.

DB Table Auto Generation - Test

우선 Hibernate 에서 제공하는 SQL logging 기능을 사용해보자.

# Add logging configs to display SQL statements  
logging.level.org.hibernate.SQL=debug  
logging.level.org.hibernate.orm.jdbc.bind=trace

debug 는, 작성된 Java Code 를 기반으로 Hibernate 가 실행하는 SQL query 를 Log 에 출력하는 설정이다. 실제 어떤 query 를 실행하여 Database 와 interacting 하는지를 알 수 있다.

trace 는 SQL query 에 binding 된 parameter 값을 Log 에 출력하는 설정이다.

우선 test 를 진행하기 전에 현재 DB Table 에 어떤 obejct 들이 있는지 확인해보자.

이제 아래 configuration 을 추가하여 기존의 table 을 drop 시킨 이후에 생성하도록 하자.

# Add logging configs to display SQL statements  
spring.jpa.hibernate.ddl-auto=create

Main App code 에서 commandLineRunner 에 이전에 만들었던 createMultipleStudent() method 만을 넣고 Application 을 실행하여 결과를 보자.

우선 Log 상에서는 위 이미지와 같이 drop 에 사용한 SQL, create 에 사용한 SQL, 그리고 table 에 row 를 insert 하는 SQL 들이 logging 된 것을 볼 수 있고, insert query 에 사용된 parameter 에 각각 어떤 값들이 mapping 되었는지도 확인할 수 있다.

실제 Database Table 에는 위와 같이 id1 부터 시작하여, 기존 table 의 data 가 완전히 삭제되고 새로 생긴 것을 볼 수 있다.

추가적으로 auto-generation 의 option 을 create 에서 update 로 바꿔서 test 해보면 어떻게 될까?

update option 은 기존의 table 을 삭제하지 않기 떄문에 object 가 단순히 추가되는 식으로 결과가 발생할 것이다. 그럼 test 해보자.

목표한 의도대로 결과가 잘 도출된 것을 볼 수 있다.