์ง„์‹ค ์šฐ์„ , ๋˜๋Š” ์‹œ์Šคํ…œ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์–ด์•ผ ํ•˜๋Š” ์ด์œ 

ํ—ค์ด ํ•˜๋ธŒ๋ฅด!

์šฐ๋ฆฌ๋Š” ์ฃผ์ œ๋ฅผ ๊ณ„์† ํƒ๊ตฌํ•ฉ๋‹ˆ๋‹ค ์ž๋ฐ” ะธ ๋ด„๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜์ค€์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๋Œ€๊ทœ๋ชจ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค๊ณ„ํ•  ๋•Œ Java ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๊ฐ€ ๊ฒฐ์ •์ ์œผ๋กœ ์ค‘์š”ํ•œ ์ด์œ , ์ด๊ฒƒ์ด ์ˆ˜ํ–‰๋˜๋Š” ๋ฐฉ๋ฒ• ๋ฐ ์ด ๊ทœ์น™์˜ ์˜ˆ์™ธ๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ์ฝ์„ ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์†Œ ๋’ค๋Šฆ์€ ์ด ๊ธฐ์‚ฌ์—์„œ ๋‚˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์ด "Java์˜ ๊ธฐ๋Šฅ"(๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ์–ธ์–ด๊ฐ€ ๋ฌด์—‡์ด๋“ )์ด ์•„๋‹ˆ๋ผ "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ" ์„ค๊ณ„๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘์—…). ๋‘ ๋ฒˆ์งธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๊ฐ€ ์„ฑ์žฅํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๊ธด ๊ณ ํ†ต๊ณผ ๊ดด๋กœ์›€์˜ ๊ธธ์— ๋“ค์–ด์„œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค ํ•˜๋‚˜์˜ ์งˆ๋ฌธ, ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์„น์…˜์˜ reddit์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ํ† ๋ก  /r/์ž๋ฐ” ะธ /r/ํ”„๋กœ๊ทธ๋ž˜๋ฐ.

์ฝ”๋“œ ์ƒ์„ฑ

jOOQ๋ฅผ ์•Œ๊ฒŒ ๋œ ํ›„ jOOQ๊ฐ€ ์†Œ์Šค ์ฝ”๋“œ ์ƒ์„ฑ์— ์‹ฌ๊ฐํ•˜๊ฒŒ ์˜์กดํ•˜์—ฌ ์‹คํ–‰๋œ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋ถ„๊ฐœํ•˜๋Š” ์†Œ์ˆ˜์˜ ์‚ฌ์šฉ์ž ๊ณ„์ธต์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ์–ผ๋งˆ๋‚˜ ๋†€๋ž์Šต๋‹ˆ๊นŒ? ์•„๋ฌด๋„ ๋‹น์‹ ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ jOOQ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์ง€ ์•Š์œผ๋ฉฐ, ์•„๋ฌด๋„ ๋‹น์‹ ์ด ์ฝ”๋“œ ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ์ ์œผ๋กœ(๋งค๋‰ด์–ผ์— ์„ค๋ช…๋œ ๋Œ€๋กœ) jOOQ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. (๋ ˆ๊ฑฐ์‹œ) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋กœ ์‹œ์ž‘ํ•˜์—ฌ jOOQ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋กœ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋งํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค ์„ธํŠธ๋ฅผ ์–ป์€ ๋‹ค์Œ ์œ ํ˜•์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์•ˆ์ „ํ•œ ์ฟผ๋ฆฌ:

	for (Record2<String, String> record : DSL.using(configuration)
//   ^^^^^^^^^^^^^^^^^^^^^^^ ะ˜ะฝั„ะพั€ะผะฐั†ะธั ะพ ั‚ะธะฟะฐั… ะฒั‹ะฒะตะดะตะฝะฐ ะฝะฐ 
//   ะพัะฝะพะฒะฐะฝะธะธ ัะณะตะฝะตั€ะธั€ะพะฒะฐะฝะฝะพะณะพ ะบะพะดะฐ, ะฝะฐ ะบะพั‚ะพั€ั‹ะน ััั‹ะปะฐะตั‚ัั ะฟั€ะธะฒะตะดะตะฝะฝะพะต
// ะฝะธะถะต ัƒัะปะพะฒะธะต SELECT 
 
       .select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)
//           vvvvv ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^ ัะณะตะฝะตั€ะธั€ะพะฒะฐะฝะฝั‹ะต ะธะผะตะฝะฐ
       .from(ACTOR)
       .orderBy(1, 2)) {
    // ...
}

์ฝ”๋“œ๋Š” ๋นŒ๋“œ ์™ธ๋ถ€์—์„œ ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ๋ชจ๋“  ๋นŒ๋“œ์—์„œ ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋Ÿฌํ•œ ์žฌ์ƒ์€ ์งํ›„์— ๋’ค๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™ ๋˜๋Š” ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋Š” ์ด๋™๊ฒฝ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜.

์†Œ์Šค ์ฝ”๋“œ ์ƒ์„ฑ

์ฝ”๋“œ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹(์ˆ˜๋™ ๋ฐ ์ž๋™)๊ณผ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ์ฒ ํ•™, ์žฅ์  ๋ฐ ๋‹จ์ ์ด ์žˆ์œผ๋ฉฐ ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์ž์„ธํžˆ ๋…ผ์˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์˜ ์š”์ ์€ ์šฐ๋ฆฌ ์‹œ์Šคํ…œ ๋‚ด์—์„œ๋“  ์™ธ๋ถ€์—์„œ๋“  ์šฐ๋ฆฌ๊ฐ€ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ธฐ๋Š” "์ง„์‹ค"์„ Java๋กœ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์˜๋ฏธ์—์„œ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ, ๊ธฐ๊ณ„ ์ฝ”๋“œ ๋˜๋Š” ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ด์œ ์— ๊ด€๊ณ„์—†์ด ๋‹ค๋ฅธ ์–ธ์–ด๋กœ "์ง„์‹ค"์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌํ•œ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, XJC๋Š” XSD ๋˜๋Š” WSDL ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Java ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.. ์›์น™์€ ํ•ญ์ƒ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

  • ์ผ๋ถ€ ์ง„์‹ค(๋‚ด๋ถ€ ๋˜๋Š” ์™ธ๋ถ€)์ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์‚ฌ์–‘, ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๋“ฑ).
  • ์šฐ๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ด ์‚ฌ์‹ค์„ ์ง€์—ญ์ ์œผ๋กœ ํ‘œํ˜„ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ค‘๋ณต์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ํ‘œํ˜„์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ํ•ญ์ƒ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ๊ณต๊ธ‰์ž ๋ฐ ์ฃผ์„ ์ฒ˜๋ฆฌ

์ฐธ๊ณ : jOOQ์˜ ์ฝ”๋“œ ์ƒ์„ฑ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๋ณด๋‹ค ํ˜„๋Œ€์ ์ด๊ณ  ๊ตฌ์ฒด์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ์œ ํ˜• ๊ณต๊ธ‰์ž ์‚ฌ์šฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. F#์—์„œ ๊ตฌํ˜„๋˜๋ฏ€๋กœ. ์ด ๊ฒฝ์šฐ ์ฝ”๋“œ๋Š” ์‹ค์ œ๋กœ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์›์น™์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋Š” ์†Œ์Šค ์ฝ”๋“œ ํ˜•ํƒœ๋กœ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Java์—๋Š” ์šฐ์•„ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์œ ์‚ฌํ•œ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์„ ํ”„๋กœ์„ธ์„œ์ž…๋‹ˆ๋‹ค. ์น ๋ ˆ ๊ณ ์ถ”๋ฅผ ๋„ฃ์€ ์ €๋ฏผ ๊ณ ๊ธฐ์™€ ๊ฐ•๋‚ญ์ฝฉ ์ŠคํŠœ.

์–ด๋–ค ์˜๋ฏธ์—์„œ, ๋‹ค์Œ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์™€ ๋™์ผํ•œ ์ผ์ด ์—ฌ๊ธฐ์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒ์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์œ ํ˜•์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, "true"๋ฅผ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "์ง„์‹ค"๋กœ ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ๋กฌ๋ณต์˜ ๊ฒฝ์šฐ์—๋Š” ์‰ฝ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ผ์ด๋ธŒ ์—ฐ๊ฒฐ์— ์˜์กดํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ์—์„œ๋Š” ์กฐ๊ธˆ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์ƒ์„ฑ์— ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ˆ˜๋™ ๋˜๋Š” ์ž๋™์œผ๋กœ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊นŒ๋‹ค๋กœ์šด ์งˆ๋ฌธ ์™ธ์—๋„ ์ฝ”๋“œ ์ƒ์„ฑ์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋ฏฟ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์žˆ์Œ์„ ์–ธ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ž์ฃผ ์ ‘ํ•˜๋Š” ์ด ๊ด€์ ์— ๋Œ€ํ•œ ์ •๋‹น์„ฑ์€ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋„ค, ์ •๋ง ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ธํ”„๋ผ ๋น„์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์ œํ’ˆ(jOOQ, JAXB ๋˜๋Š” Hibernate ๋“ฑ)์„ ์ด์ œ ๋ง‰ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ API ์ž์ฒด๋ฅผ ํ•™์Šตํ•˜์—ฌ ๊ฐ€์น˜๋ฅผ ์–ป์„ ์›Œํฌ๋ฒค์น˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. .

์ƒ์„ฑ๊ธฐ ์žฅ์น˜๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋“œ๋Š” ๋น„์šฉ์ด ๋„ˆ๋ฌด ๋†’์œผ๋ฉด ์‹ค์ œ๋กœ API๊ฐ€ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์˜ ์œ ์šฉ์„ฑ์— ๋Œ€ํ•ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค(ํ–ฅํ›„์—๋Š” ์‚ฌ์šฉ์ž ์ง€์ •๋„ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค). ์‚ฌ์šฉ์„ฑ์€ ๊ทธ๋Ÿฌํ•œ API์— ๋Œ€ํ•ด ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ฝ”๋“œ ์ƒ์„ฑ์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ์ฃผ์žฅ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‚ด๋ถ€ ๋˜๋Š” ์™ธ๋ถ€ ์ง„๋ฆฌ์˜ ๋กœ์ปฌ ํ‘œํ˜„์„ ์†์œผ๋กœ ์™„์ „ํžˆ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด ๋ชจ๋“  ๊ฒƒ์„ ํ•  ์‹œ๊ฐ„์ด ์—†๋‹ค๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์Šˆํผ ์ œํ’ˆ์˜ ๋งˆ๊ฐ์ผ์ด ๋‹ค๊ฐ€์™”์Šต๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€๋Š” ์กฐ๋ฆฝ ์ปจ๋ฒ ์ด์–ด๋ฅผ ๋น—์งˆํ•˜๊ณ  ์‹œ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์—๊ฒŒ ๋Œ€๋‹ตํ•  ๊ฒƒ์ด๋‹ค:

์ง„์‹ค ์šฐ์„ , ๋˜๋Š” ์‹œ์Šคํ…œ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์–ด์•ผ ํ•˜๋Š” ์ด์œ 
๋…์ฐฝ์  ์ธ, Alan O'Rourke, ์ฒญ์ค‘ ์Šคํƒ

๊ทธ๋Ÿฌ๋‚˜ Hibernate/JPA์—์„œ๋Š” "Java๋กœ" ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ •๋ง. Hibernate์™€ ๊ทธ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ์ด๊ฒƒ์€ ํ˜œํƒ์ด์ž ์ €์ฃผ์ž…๋‹ˆ๋‹ค. Hibernate์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช‡ ๊ฐ€์ง€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

	@Entity
class Book {
  @Id
  int id;
  String title;
}

๊ทธ๋ฆฌ๊ณ  ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์ด ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ Hibernate์˜ ๋งŽ์€ ๋ถ€๋ถ„์€ ์ด ์—”ํ„ฐํ‹ฐ๊ฐ€ SQL "dialect"์˜ DDL์—์„œ ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ์ •์˜๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ณต์žกํ•œ "์„ธ๋ถ€ ์‚ฌํ•ญ"์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

	CREATE TABLE book (
  id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  title VARCHAR(50),
 
  CONSTRAINT pk_book PRIMARY KEY (id)
);
 
CREATE INDEX i_book_title ON book (title);

... ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๊ฒƒ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ง ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ๋‚ด๊ฐ€ ๋ณด์ž. ๋‚˜๋Š” ๊ฑฐ์ง“๋ง์„ ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

  • Hibernate๋Š” ์ด ๋ช…๋ช…๋œ ๊ธฐ๋ณธ ํ‚ค์˜ ์ •์˜๋ฅผ ์‹ค์ œ๋กœ ์‹œํ–‰ํ•ฉ๋‹ˆ๊นŒ?
  • Hibernate๋Š” TITLE์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹คํžˆ ์••๋‹ˆ๋‹ค.
  • Hibernate๋Š” ์ด ํ‚ค๋ฅผ ID ์‚ฌ์–‘์˜ ID ํ‚ค๋กœ ๋งŒ๋“ค๊นŒ์š”?

์•„๋งˆ ์•„๋‹ ๊ฒ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ ํ•„์š”ํ•œ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ฆ‰์‹œ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์ƒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Book ์—”ํ„ฐํ‹ฐ๋Š” ๊ฒฐ๊ตญ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค.

	@Entity
@Table(name = "book", indexes = {
  @Index(name = "i_book_title", columnList = "title")
})
class Book {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  int id;
  String title;
}

์‹œ์›ํ•œ. ์žฌ์ƒํ•˜๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด ๊ฒฝ์šฐ ์ฒ˜์Œ์—๋Š” ๋งค์šฐ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‚˜์ค‘์— ๋น„์šฉ์„ ์ง€๋ถˆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์กฐ๋งŒ๊ฐ„ ์ƒ์‚ฐ์— ๋“ค์–ด๊ฐ€์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋ธ์ด ์ž‘๋™์„ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด:

ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ๊ธฐํ•˜๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ๊ฒƒ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ ˆ๊ฑฐ์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ๋ถ€ํ„ฐ ์˜์›ํžˆ ๋‹น์‹ ์€ ์จ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค DDL ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ(์˜ˆ: Flyway ์‚ฌ์šฉ). ์ด ๊ฒฝ์šฐ ์—”ํ„ฐํ‹ฐ๋Š” ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค์„ ์ˆ˜๋™์œผ๋กœ ์กฐ์ •ํ•˜๊ฑฐ๋‚˜(๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์˜ ์›Œํฌ๋กœ๋“œ๋ฅผ ๋‘ ๋ฐฐ๋กœ) Hibernate๊ฐ€ ๋‹น์‹ ์„ ์œ„ํ•ด ๊ทธ๊ฒƒ๋“ค์„ ์žฌ์ƒ์„ฑํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค(๋‹น์‹ ์˜ ๊ธฐ๋Œ€๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”๊ฐ€?) ๋‹น์‹ ์€ ์–ด๋Š ์ชฝ์ด๋“  ์žƒ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ”„๋กœ๋•์…˜์œผ๋กœ ์ด๋™ํ•˜๋Š” ์ฆ‰์‹œ ํ•ซ ํŒจ์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์€ ๋งค์šฐ ๋นจ๋ฆฌ ์ƒ์‚ฐ์— ํˆฌ์ž…๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜์„ ์œ„ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์˜ ์›ํ™œํ•œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ค€๋น„ํ•˜๊ณ  ๊ตฌ์„ฑํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด๋ฆฌํ•˜๊ฒŒ ํŒจ์น˜๋ฅผ ์ ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ์ผ์„ ์ œ๋Œ€๋กœ ํ•  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ํ•ญ์ƒ ๋ˆ„๊ตฐ๊ฐ€์˜ ์ž˜๋ชป์ด๊ธฐ ๋•Œ๋ฌธ์— Hibernate๋ฅผ ๊พธ์ง–์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ์•„๋‹™๋‹ˆ๋‹ค ...

๋Œ€์‹  ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ๊ฒƒ์ด ์™„์ „ํžˆ ๋‹ค๋ฅด๊ฒŒ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž์ „๊ฑฐ์— ๋‘ฅ๊ทผ ๋ฐ”ํ€ด๋ฅผ ๋‹ฌ์ž.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์šฐ์„ 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์˜ ์ง„์ •ํ•œ "์ง„์‹ค"๊ณผ ์ด์— ๋Œ€ํ•œ "์ฃผ๊ถŒ"์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์— ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž์ฒด์—์„œ๋งŒ ์ •์˜๋˜๊ณ  ๋‹ค๋ฅธ ๊ณณ์—์„œ๋Š” ์ •์˜๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ฐ ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ์Šคํ‚ค๋งˆ์˜ ๋ณต์‚ฌ๋ณธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์Šคํ‚ค๋งˆ์™€ ๊ทธ ๋ฌด๊ฒฐ์„ฑ์„ ์ค€์ˆ˜ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ์ •๋ณด๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ์ง„๋ถ€ํ•˜๊ธฐ๊นŒ์ง€ ํ•œ ์˜ค๋ž˜๋œ ์ง€ํ˜œ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ฐ ๊ณ ์œ  ํ‚ค๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค. ์™ธ๋ž˜ ํ‚ค๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ œ์•ฝ ์กฐ๊ฑด ํ™•์ธ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฃผ์žฅ - ๊ดœ์ฐฎ์€.

๊ทธ๋ฆฌ๊ณ , ๊ทธ๊ฒŒ ์ „๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Oracle์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ…Œ์ด๋ธ”์ด ์žˆ๋Š” ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค
  • ๊ทธ๋…€์˜ PCTFREE ๊ฐ€์น˜๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ
  • ์‹œํ€€์Šค์˜ ์บ์‹œ ํฌ๊ธฐ๋Š” ์–ผ๋งˆ์ž…๋‹ˆ๊นŒ(id ๋’ค)

์†Œ๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์ด ์ค‘์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ "๋น… ๋ฐ์ดํ„ฐ" ์˜์—ญ์œผ๋กœ ์ „ํ™˜๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฒค๋” ์ œ๊ณต ์Šคํ† ๋ฆฌ์ง€ ์ตœ์ ํ™”์˜ ์ด์ ์„ ํ›จ์”ฌ ์ผ์ฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณธ ์–ด๋–ค ORM(jOOQ ํฌํ•จ)๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ „์ฒด DDL ์˜ต์…˜ ์„ธํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ORM์€ DDL ์ž‘์„ฑ์— ๋„์›€์ด ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ๊ตญ ์ž˜ ์„ค๊ณ„๋œ ์Šคํ‚ค๋งˆ๋Š” DDL๋กœ ์†์œผ๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ๋ชจ๋“  DDL์€ ๊ทผ์‚ฌ์น˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํด๋ผ์ด์–ธํŠธ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์˜ ๋ณต์‚ฌ๋ณธ์ธ ํด๋ผ์ด์–ธํŠธ ๋ณด๊ธฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋งํ•  ํ•„์š”๋„ ์—†์ด ์ด ํด๋ผ์ด์–ธํŠธ ๋ณด๊ธฐ๋Š” ์‹ค์ œ ๋ชจ๋ธ๊ณผ ๋™๊ธฐํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋กœ.

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” SQL์„ ํ†ตํ•ด ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ SQL ์–ธ์–ด๋กœ ๋œ ๋ชจ๋“  ํ…Œ์ด๋ธ”์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

	-- H2, HSQLDB, MySQL, PostgreSQL, SQL Server
SELECT table_schema, table_name
FROM information_schema.tables
 
-- DB2
SELECT tabschema, tabname
FROM syscat.tables
 
-- Oracle
SELECT owner, table_name
FROM all_tables
 
-- SQLite
SELECT name
FROM sqlite_master
 
-- Teradata
SELECT databasename, tablename
FROM dbc.tables

์ด๋Ÿฌํ•œ ์ฟผ๋ฆฌ(๋˜๋Š” ๋ทฐ, ๊ตฌ์ฒดํ™”๋œ ๋ทฐ, ํ…Œ์ด๋ธ” ๋ฐ˜ํ™˜ ํ•จ์ˆ˜๋„ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์œ ์‚ฌํ•œ ์ฟผ๋ฆฌ)๋Š” ๋‹ค์Œ์„ ํ˜ธ์ถœํ•˜์—ฌ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. DatabaseMetaData.getTables() JDBC์—์„œ ๋˜๋Š” jOOQ ๋ฉ”ํƒ€ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์—์„œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ์— ๊ด€๊ณ„์—†์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ์˜ ํด๋ผ์ด์–ธํŠธ ์ธก ํ‘œํ˜„์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฝ์Šต๋‹ˆ๋‹ค.

  • JDBC ๋˜๋Š” Spring์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ จ์˜ ๋ฌธ์ž์—ด ์ƒ์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์—”ํ„ฐํ‹ฐ ์ž์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • jOOQ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ jOOQ ๋ฉ”ํƒ€ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ API(์˜ˆ: jOOQ ๋˜๋Š” JPA)๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ์–‘์— ๋”ฐ๋ผ ์ƒ์„ฑ๋œ ๋ฉ”ํƒ€ ๋ชจ๋ธ์ด ์ •๋ง ํ’๋ถ€ํ•˜๊ณ  ์™„์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•”์‹œ์  ์กฐ์ธ์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์ƒ๊ฐํ•ด ๋ณด์‹ญ์‹œ์˜ค. jOOQ 3.11์— ๋„์ž…๋จ, ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์™ธ๋ž˜ ํ‚ค ๊ด€๊ณ„์— ๋Œ€ํ•ด ์ƒ์„ฑ๋œ ๋ฉ”ํƒ€ ์ •๋ณด์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฆ๋ถ„์ด ์ž๋™์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค.

ALTER TABLE book RENAME COLUMN title TO book_title;

์ •๋ง ์ด ์ผ์„ ๋‘ ๋ฒˆ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์–ด๋– ํ•œ ๊ฒฝ์šฐ์—๋„. DDL์„ ์ปค๋ฐ‹ํ•˜๊ณ  ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ์‹คํ–‰ํ•˜๊ณ  ์—…๋ฐ์ดํŠธ๋œ ์—”ํ„ฐํ‹ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

@Entity
@Table(name = "book", indexes = {
 
  // ะ’ั‹ ะพะฑ ัั‚ะพะผ ะทะฐะดัƒะผั‹ะฒะฐะปะธััŒ?
  @Index(name = "i_book_title", columnList = "book_title")
})
class Book {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  int id;
 
  @Column("book_title")
  String bookTitle;
}

๋˜๋Š” ์—…๋ฐ์ดํŠธ๋œ jOOQ ํด๋ž˜์Šค. ๋Œ€๋ถ€๋ถ„์˜ DDL ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๊ตฌ๋ฌธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์˜๋ฏธ ์ฒด๊ณ„์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฆ๊ฐ€๋กœ ์ธํ•ด ์˜ํ–ฅ์„ ๋ฐ›๋Š”(๋˜๋Š” ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”) ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ์ผํ•œ ์ง„์‹ค

์–ด๋–ค ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋“ ์ง€ ํ•ญ์ƒ ์ผ๋ถ€ ํ•˜์œ„ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์œ ์ผํ•œ ์ง„์‹ค ์†Œ์Šค์ธ ํ•˜๋‚˜์˜ ๋ชจ๋ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์ ์–ด๋„ ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  "์ง„์‹ค"์ด ์–ด๋””์—๋‚˜ ์žˆ๊ณ  ๋™์‹œ์— ์–ด๋””์—๋„ ์—†๋Š” ๊ธฐ์—… ํ˜ผ๋ž€์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. XML ํŒŒ์ผ์„ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ ๊ตํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” XSD๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. XML ํ˜•์‹์˜ jOOQ์˜ INFORMATION_SCHEMA ๋ฉ”ํƒ€ ๋ชจ๋ธ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.
https://www.jooq.org/xsd/jooq-meta-3.10.0.xsd

  • XSD๋Š” ์ž˜ ์ดํ•ด๋จ
  • XSD๋Š” XML ์ฝ˜ํ…์ธ ๋ฅผ ๋งค์šฐ ์ž˜ ํ‘œ์‹œํ•˜๊ณ  ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ์–ธ์–ด์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • XSD๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
  • XJC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ XSD๋ฅผ Java ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ํฌ์ธํŠธ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. XML ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ํ†ต์‹ ํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” JAXB, XJC ๋ฐ XSD๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ฌ์„ฑํ•˜๊ธฐ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋ฅผ Java ๊ฐœ์ฒด๋กœ ๋งŒ๋“œ๋Š” Java ์šฐ์„  ์„ค๊ณ„ ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ XML๋กœ ๋ Œ๋”๋งํ•˜๊ณ  ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๋ฏธ์นœ ์ง“์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ XML์€ ํ’ˆ์งˆ์ด ๋งค์šฐ ๋‚ฎ๊ณ  ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ๊ฐœ๋ฐœํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์„œ๋น„์Šค ํ’ˆ์งˆ(SLA) ์ˆ˜์ค€์— ๋Œ€ํ•œ ํ•ฉ์˜๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์ฆ‰์‹œ ๊ทธ๊ฒƒ์„ ๋ง์ณค์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด์„œ ์ด๊ฒƒ์€ JSON API์—์„œ ํ•ญ์ƒ ์ผ์–ด๋‚˜๋Š” ์ผ์ด์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์— ๋…ผ์Ÿํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ...

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: ๊ทธ๋“ค์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ž‘์—…ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋‘ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์Šคํ‚ค๋งˆ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ˆ˜์ • ์‚ฌํ•ญ์€ DDL์—์„œ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ๋‹จ์ผ ์ •๋ณด ์†Œ์Šค๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

์†Œ์Šค ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋Š” ๋ชจ๋ธ ์‚ฌ๋ณธ๋„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ํด๋ผ์ด์–ธํŠธ๋Š” jOOQ ๋ฐ Hibernate ๋˜๋Š” JDBC(๋˜๋Š” ๋‘˜ ๋‹ค)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Java๋กœ ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๋Š” Perl๋กœ ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ๊ณ (ํ–‰์šด์„ ๋นŒ์ž), ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๋Š” C#์œผ๋กœ ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ์Šต๋‹ˆ๋‹ค. ORM์œผ๋กœ ์ƒ์„ฑ๋œ ๋ชจ๋ธ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ’ˆ์งˆ์ด ๋‚ฎ๊ณ  ๋ฌธ์„œํ™”๋„ ์ž˜ ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉฐ ๊ฐœ๋ฐœํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ์‹ค์ˆ˜ํ•˜์ง€ ๋งˆ์„ธ์š”. ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹ค์ˆ˜ํ•˜์ง€ ๋งˆ์„ธ์š”. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋ณต์‚ฌํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์— ๋คํ”„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ทธ๋“ค์€ ์ข‹๋‹ค. ๊ทธ๋“ค๊ณผ ํ•จ๊ป˜ํ•˜๋ฉด ์ƒ์‚ฐ์„ฑ์ด ๋†’์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ์„ค์ •ํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ช‡ ๋…„ ๋™์•ˆ ํ”„๋กœ์ ํŠธ์˜ ์Šคํ† ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ๋‚˜์—๊ฒŒ ๊ฐ์‚ฌํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์„ค๋ช…

๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ: ์ด ๊ธฐ์‚ฌ๋Š” ์ „์ฒด ์‹œ์Šคํ…œ(์ฆ‰, ๋„๋ฉ”์ธ, ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ ๋“ฑ)์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ์— ๋งž๊ฒŒ ์กฐ์ •๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜์—ฌ "์ผ๋ฅ˜" ์ƒํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ์„ ์žฌ์ƒ์‚ฐํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋…ผ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ์žฅ์†Œ์—์„œ ์—ฌ์ „ํžˆ ๋ณด์กด๋˜๋Š” XNUMX๋‹จ๊ณ„ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ ๋ชจ๋ธ์ด ๊ฐ€๋Šฅํ•œ ์œ ์ผํ•œ ๋ชจ๋ธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ์—์„œ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ์„ ์บก์Šํ™”ํ•˜๋Š” "ํ•˜์œ„ ์‹œ์Šคํ…œ"์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์˜ˆ์™ธ

๋ชจ๋“  ๊ทœ์น™์—๋Š” ์˜ˆ์™ธ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์šฐ์„  ๋ฐ ์†Œ์Šค ์ฝ”๋“œ ์ƒ์„ฑ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋•Œ๋•Œ๋กœ ๋ถ€์ ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ด์ „์— ๋ง์”€๋“œ๋ฆฐ ๋ฐ” ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๊ทธ๋Ÿฌํ•œ ์˜ˆ์™ธ๊ฐ€ ๋ช‡ ๊ฐ€์ง€ ์žˆ์Šต๋‹ˆ๋‹ค(์•„๋งˆ๋„ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋„ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

  • ์Šคํ‚ค๋งˆ๋ฅผ ์•Œ ์ˆ˜ ์—†๊ณ  ์—ด์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํœด. ์—ฌ๊ธฐ์—๋Š” ์ฝ”๋“œ ์ƒ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ-์šฐ์„  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค.
  • ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฆ‰์„์—์„œ ํšŒ๋กœ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ. ์ด ์˜ˆ๋Š” ํŒจํ„ด์˜ ์•ฝ๊ฐ„ ํ”„๋ฆด ๋ฒ„์ „์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—”ํ‹ฐํ‹ฐ ์†์„ฑ ๊ฐ’์ฆ‰, ์ž˜ ์ •์˜๋œ ์Šคํ‚ค๋งˆ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ RDBMS๊ฐ€ ์ ํ•ฉํ• ์ง€ ์ „ํ˜€ ํ™•์‹ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์˜ˆ์™ธ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์˜ˆ์™ธ์ ์ž…๋‹ˆ๋‹ค. RDBMS ์‚ฌ์šฉ๊ณผ ๊ด€๋ จ๋œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์Šคํ‚ค๋งˆ๋Š” ๋ฏธ๋ฆฌ ์•Œ๋ ค์ ธ ์žˆ๊ณ  RDBMS ๋‚ด๋ถ€์— ์žˆ์œผ๋ฉฐ "์ง„์‹ค"์˜ ์œ ์ผํ•œ ์†Œ์Šค์ด๋ฉฐ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋Š” ์—ฌ๊ธฐ์—์„œ ํŒŒ์ƒ๋œ ๋ณต์‚ฌ๋ณธ์„ ํš๋“ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€