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 κ΄€λ¦¬ν•˜μ§€ μ•ŠμŒμš΄μ˜ ν™˜κ²½(μˆ˜λ™ 관리 μ‹œ)μ—†μŒ

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=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 μ—λŠ” μœ„μ™€ 같이 id κ°€ 1 λΆ€ν„° μ‹œμž‘ν•˜μ—¬, κΈ°μ‘΄ table 의 data κ°€ μ™„μ „νžˆ μ‚­μ œλ˜κ³  μƒˆλ‘œ 생긴 것을 λ³Ό 수 μžˆλ‹€.

μΆ”κ°€μ μœΌλ‘œ auto-generation 의 option 을 create μ—μ„œ update 둜 λ°”κΏ”μ„œ test 해보면 μ–΄λ–»κ²Œ 될까?

update option 은 기쑴의 table 을 μ‚­μ œν•˜μ§€ μ•ŠκΈ° 떄문에 object κ°€ λ‹¨μˆœνžˆ μΆ”κ°€λ˜λŠ” μ‹μœΌλ‘œ κ²°κ³Όκ°€ λ°œμƒν•  것이닀. 그럼 test ν•΄λ³΄μž.

λͺ©ν‘œν•œ μ˜λ„λŒ€λ‘œ κ²°κ³Όκ°€ 잘 λ„μΆœλœ 것을 λ³Ό 수 μžˆλ‹€.