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 삭제 | 테스트 환경 | 높음 |
| update | schema 를 수정(새로운 column/table 추가만 가능) | 개발 환경 | 중간 |
| validate | schema 와 entity mapping 확인(수정 없음) | 운영 환경 | 없음 |
| none | Hibernate 가 schema 관리하지 않음 | 운영 환경(수동 관리 시) | 없음 |
create 나 create-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=tracedebug 는, 작성된 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=createMain App code 에서 commandLineRunner 에 이전에 만들었던 createMultipleStudent() method 만을 넣고 Application 을 실행하여 결과를 보자.

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

실제 Database Table 에는 위와 같이 id 가 1 부터 시작하여, 기존 table 의 data 가 완전히 삭제되고 새로 생긴 것을 볼 수 있다.
추가적으로 auto-generation 의 option 을 create 에서 update 로 바꿔서 test 해보면 어떻게 될까?
update option 은 기존의 table 을 삭제하지 않기 떄문에 object 가 단순히 추가되는 식으로 결과가 발생할 것이다. 그럼 test 해보자.

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