did_story

[JPA] ddl-auto:UPDATE, JPA์—์„œ ์–ด๋–ค์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? ๋ณธ๋ฌธ

BackEnd๐Ÿƒ/Spring boot

[JPA] ddl-auto:UPDATE, JPA์—์„œ ์–ด๋–ค์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

์–ด์ œ์‹œ์ž‘ 2026. 6. 20. 15:52

์ด์ „ ๊ธ€์„ ํ™•์ธํ• ๋ ค๋ฉด?! 

 

[Spring Boot] JPA์˜ ddl-auto ์˜ต์…˜์ด๋ž€?!

๋งค์ผ๋ฉ”์ผ์—์„œ ์งˆ๋ฌธ์„ ๋ฐ›๊ณ  ๋‹ต๋ณ€์„ ํ•˜๊ณ  ํ•ด๋‹ต์„ ์ ์–ด๋ณด๊ณ  ์žˆ๋‹ค!JPA ๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜์ธ Hibernate๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๊ด€๋ฆฌ๋ฅผ ์ œ์–ดํ•˜๋Š” ์„ค์ •์œผ๋กœ ddl-auto๊ฐ€ ์žˆ๋‹ค. ์ด๋Š”

didcheck.tistory.com

 

update ์‹คํ–‰์˜ 4๋‹จ๊ณ„ ๊ณผ์ •

1๏ธโƒฃ ์—”ํ‹ฐํ‹ฐ ์Šค์บ” ๋ฐ ๋ชจ๋ธ๋ง (Entity Scanning)
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ, Hibernate๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด์— @Entity ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋“ค์„ ์‹น ํ›‘์–ด๋ด…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ํด๋ž˜์Šค๋“ค์˜ ํ•„๋“œ, ์—ฐ๊ด€๊ด€๊ณ„, ์ œ์•ฝ์กฐ๊ฑด ๋“ฑ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ๊ฐ€์ƒ์˜ '์—”ํ‹ฐํ‹ฐ ์Šคํ‚ค๋งˆ ๋ชจ๋ธ'์„ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ DB ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ถ”์ถœ (Database Metadata Extraction)
๊ทธ๋‹ค์Œ, ์„ค์ •๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์—ฐ๊ฒฐ(JDBC Connection)ํ•˜์—ฌ ํ˜„์žฌ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” ํ…Œ์ด๋ธ”, ์ปฌ๋Ÿผ, ์ œ์•ฝ ์กฐ๊ฑด ๋“ฑ์˜ ์‹ค์ œ ๊ตฌ์กฐ ์ •๋ณด(๋ฉ”ํƒ€๋ฐ์ดํ„ฐ)๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

3๏ธโƒฃ ๋‘ ์Šคํ‚ค๋งˆ์˜ ๋น„๊ต (Comparison & Diffing)
์ด์ œ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” '์—”ํ‹ฐํ‹ฐ ๋ชจ๋ธ'๊ณผ DB์—์„œ ์ฝ์–ด์˜จ '์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ'๋ฅผ ๊ผผ๊ผผํ•˜๊ฒŒ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

  • "์–ด? ์—”ํ‹ฐํ‹ฐ์—๋Š” Member ํ…Œ์ด๋ธ”์ด ์žˆ๋Š”๋ฐ DB์—๋Š” ์—†๋„ค?"
  • "์—”ํ‹ฐํ‹ฐ์˜ Member์— age ์ปฌ๋Ÿผ์ด ์ถ”๊ฐ€๋˜์—ˆ๋Š”๋ฐ, DB์—๋Š” ์•„์ง ์—†๊ตฌ๋‚˜!"
    ์ด๋ ‡๊ฒŒ ๋‘ ๋ชจ๋ธ ์‚ฌ์ด์˜ ์ฐจ์ด์ (Diff)์„ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.

4๏ธโƒฃ DDL ์ƒ์„ฑ ๋ฐ ์‹คํ–‰ (DDL Generation & Execution)
์ฐพ์•„๋‚ธ ์ฐจ์ด์ ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ALTER TABLE์ด๋‚˜ CREATE TABLE ๊ฐ™์€ SQL ๋ฌธ(DDL)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋‚ ๋ ค ์Šคํ‚ค๋งˆ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

JPA ๊ด€์ ์—์„œ ๋ณธ update์˜ ํ•ต์‹ฌ ํŠน์ง•๊ณผ ํ•จ์ •

์ด ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์— update ์˜ต์…˜์€ ์•„์ฃผ ๋ช…ํ™•ํ•œ ํ•œ๊ณ„์™€ ํŠน์ง•์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์„ ๊ผญ ๊ธฐ์–ตํ•ด ๋‘์…”์•ผ ํ•ด์š”!

  • ์˜ค์ง '์ถ”๊ฐ€(Append)'๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค: ๋ฐ์ดํ„ฐ์˜ ์•ˆ์ „์„ ์œ„ํ•ด์„œ ๊ธฐ์กด ํ…Œ์ด๋ธ”์ด๋‚˜ ์ปฌ๋Ÿผ์„ ์‚ญ์ œ(DROP)ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ฝ”๋“œ์—์„œ ์—”ํ‹ฐํ‹ฐ์˜ ํŠน์ • ํ•„๋“œ๋ฅผ ์ง€์› ๋”๋ผ๋„, DB์˜ ์ปฌ๋Ÿผ์€ ์ง€์›Œ์ง€์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์ปฌ๋Ÿผ๋ช… ๋ณ€๊ฒฝ ์‹œ์˜ ํ•จ์ •: ์—”ํ‹ฐํ‹ฐ์—์„œ ํ•„๋“œ ์ด๋ฆ„์„ userName์—์„œ nickname์œผ๋กœ ๋ฐ”๊พธ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? JPA๋Š” "์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋„ค"๋ผ๊ณ  ๋˜‘๋˜‘ํ•˜๊ฒŒ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  "๊ธฐ์กด์˜ userName์€ ์‚ญ์ œ๋˜์—ˆ๊ณ (ํ•˜์ง€๋งŒ DROP์€ ์•ˆ ํ•จ), nickname์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ์ด ์ƒ๊ฒผ๊ตฌ๋‚˜!"๋ผ๊ณ  ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ DB์—๋Š” ๋‘ ์ปฌ๋Ÿผ์ด ๋ชจ๋‘ ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 
  • ํƒ€์ž… ๋ณ€๊ฒฝ์˜ ํ•œ๊ณ„: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ข…๋ฅ˜(Dialect)์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ, ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ปฌ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ณ€๊ฒฝ(์˜ˆ: VARCHAR -> INT)ํ•˜๋Š” ๊ฒƒ์€ ์ง€์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.