Java

[Java] ORM, MyBatis์™€ JPA ์ฐจ์ด

jeong_ii 2025. 3. 13. 23:48

๐Ÿ”น ORM (Object-Relational Mapping) ์ด๋ž€ ?

ORM์ด๋ž€ ๊ฐ์ฒด(Object)์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ๋งคํ•‘(Mapping) ์‹œ์ผœ, RDB๋ฅผ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ RDB ํ…Œ์ด๋ธ”์€ ์ƒ์†, ๋‹คํ˜•์„ฑ, ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ™์€ ๊ฐ์ฒด์ง€ํ–ฅ ๊ฐœ๋…์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—, Java์™€ ๊ฐ™์€ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ ์ง์ ‘์ ์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ต๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ORM์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ๋ฐฉ์‹์œผ๋กœ DB๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

๐Ÿ”ธ Java์—์„œ ๋Œ€ํ‘œ์ ์ธ ORM

  • JPA (Java Persistence API) : ์ž๋ฐ” ORM ๊ธฐ์ˆ ์˜ ํ‘œ์ค€
  • Hibernate : JPA์˜ ๋Œ€ํ‘œ์ ์ธ ๊ตฌํ˜„์ฒด
  • MyBatis : SQL ๋งคํผ ๊ธฐ์ˆ ๋กœ, ์—„๋ฐ€ํžˆ๋Š” ORM์€ ์•„๋‹ˆ์ง€๋งŒ ์ข…์ข… ๋น„๊ต ๋Œ€์ƒ์ด ๋จ

JPA๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ „์—๋Š” MyBatis๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉฐ, MyBatis๋Š” SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด์— ์ˆ˜๋™ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ฐ˜๋ฉด, JPA๋Š” ๊ฐ์ฒด ์ž์ฒด๊ฐ€ DB์™€ ์—ฐ๊ฒฐ๋˜๋ฏ€๋กœ, SQL ์—†์ด๋„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฆ‰, ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ์ ์ด ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋‹ค.

 

๐Ÿ”ธ  MyBatis vs Hibernate (JPA)

   ๊ตฌ๋ถ„    MyBatis     Hibernate (JPA)
   ์ฟผ๋ฆฌ ์ž‘์„ฑ    ์ง์ ‘ ์ž‘์„ฑ (SQL ๊ธฐ๋ฐ˜)    ์ž๋™ ์ƒ์„ฑ ๊ฐ€๋Šฅ (JPQL, Criteria ๋“ฑ)
   ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค    ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์œ ๋ฆฌ    ๋‹จ์ˆœํ•œ CRUD ์ž‘์—…์— ์œ ๋ฆฌ
   ๋™์  ์ฟผ๋ฆฌ ์ž‘์„ฑ    ์‰ฌ์›€ (if, choose ๋“ฑ ํ™œ์šฉ ๊ฐ€๋Šฅ)    QueryDSL ๋“ฑ ๋ณ„๋„ ๋„๊ตฌ ํ•„์š”
   ์ƒ์‚ฐ์„ฑ    ์ˆ™๋ จ๋˜๋ฉด ๋น ๋ฆ„    ์ต์ˆ™ํ•ด์ง€๋ฉด ์ž๋™ํ™” ๊ธฐ๋ฐ˜์œผ๋กœ ๋†’์€ ์ƒ์‚ฐ์„ฑ ๊ฐ€๋Šฅ
  • ๊ตญ๋‚ด SI๋‚˜ ๊ธˆ์œต ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋†’์€ ์•ˆ์ •์„ฑ · ์„ฑ๋Šฅ์ด ์š”๊ตฌ๋˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ์ง์ ‘ SQL์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” MyBatis๊ฐ€ ๋” ์ ํ•ฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
  • ํ•˜์ง€๋งŒ Hibernate (JPA)์— ์ต์ˆ™ํ•ด์ง€๋ฉด ์ƒ์‚ฐ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ํšจ์œจ์„ฑ ๋ฉด์—์„œ ํฐ ์ด์ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜ํ•œ, JPA๋Š” ๋ณต์žกํ•œ ํ†ต๊ณ„๋‚˜ ๋™์  ์ฟผ๋ฆฌ์— ํ•œ๊ณ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๋ฐ˜์ ์œผ๋กœ QueryDSL๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ๋งŽ์ด ํ™œ์šฉ๋œ๋‹ค.

โœ… ๊ฒฐ๋ก 

MyBatis์™€ JPA(Hibernate)๋Š” ๊ฐ๊ฐ ๋ช…ํ™•ํ•œ ์žฅ๋‹จ์ ์„ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๊ฒฉ๊ณผ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ ์ ์ ˆํ•œ ๊ธฐ์ˆ ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค.

 

๐Ÿ”น MyBatis๋ณด๋‹ค Hibernate (JPA)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ์ด์œ 

JPA๋Š” MyBatis์— ๋น„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค.

  • ์—”ํ‹ฐํ‹ฐ์— ๊ธฐ๋ฐ˜ ํ…Œ์ด๋ธ” ๋ฐ DB ์ž๋™ ์ƒ์„ฑ
  • ๊ฐ์ฒด ์ง€ํ–ฅ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ ๊ตฌ์กฐ
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์— ์šฉ์ด
  • ๊ธฐ๋ณธ์ ์ธ CRUD ์ž๋™ํ™”
  • ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋Š” QueryDSL์„ ํ†ตํ•ด ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

โœ… ์—”ํ‹ฐํ‹ฐ ๊ธฐ๋ฐ˜ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ฐ DB ์ž๋™ํ™”

JPA๋Š” ์„ค์ •์— ๋”ฐ๋ผ ๋งคํ•‘๋œ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์ž๋™ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ์ดˆ๊ธฐ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

๋ฌผ๋ก  ์ƒ์„ฑ๋˜๋Š” ํ…Œ์ด๋ธ” ์ด๋ฆ„์ด๋‚˜ ์ปฌ๋Ÿผ๋ช…์ด ๊ฐ€๋…์„ฑ ์ธก๋ฉด์—์„œ ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์ง์ ‘ ๋ชจ๋“  DDL์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ํ›จ์”ฌ ํšจ์œจ์ ์ด๋‹ค.

 

โœ… ๊ฐ์ฒด ์ง€ํ–ฅ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ

JPA๋Š” ๊ฐ์ฒด ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•˜๋ฉฐ, DB ์ค‘์‹ฌ์ด ์•„๋‹Œ ๋„๋ฉ”์ธ ๋ชจ๋ธ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋•๋ถ„์— ์ƒ์†, ์บก์Аํ™” ๋“ฑ Java์˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํŠน์„ฑ์„ ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋”์šฑ ๋ช…ํ™•ํ•˜๊ณ  ์œ ์—ฐํ•ด์ง„๋‹ค.

 

MyBatis๋Š” SQL ์ค‘์‹ฌ์ด๊ณ , JPA๋Š” ๊ฐ์ฒด ์ค‘์‹ฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ง๊ด€์ ์ธ ์ฝ”๋“œ ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

โœ… ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์— ์œ ๋ฆฌ

JPA๋Š” Repository ์ค‘์‹ฌ์˜ ๊ตฌ์กฐ ๋•๋ถ„์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฝ๋‹ค.

ํŠนํžˆ Spring์—์„œ๋Š” @DataJpaTest๋ฅผ ํ†ตํ•ด ์ธ๋ฉ”๋ชจ๋ฆฌ DB(H2 ๋“ฑ)์™€ ํ•จ๊ป˜ ์†์‰ฝ๊ฒŒ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ DB ์ ‘๊ทผ ์ฝ”๋“œ๊ฐ€ ์ž˜ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋˜๋Š” Mock ํ…Œ์ŠคํŠธ์—๋„ ์œ ๋ฆฌํ•˜๋‹ค.

๋ฐ˜๋ฉด, MyBatis๋Š” SQL ์ฟผ๋ฆฌ์™€ Mapper XML์— ์˜์กดํ•˜๋ฏ€๋กœ ํ…Œ์ŠคํŠธ ์‹œ ๋” ๋งŽ์€ ์„ค์ •๊ณผ ๊ตฌ์กฐ ๋ถ„๋ฆฌ๊ฐ€ ์š”๊ตฌ๋œ๋‹ค.

 

โœ… ๊ธฐ๋ณธ์ ์ธ CRUD ์ž๋™ํ™”

JPA๋Š” save(), findById(), delete() ๋“ฑ ๊ธฐ๋ณธ์ ์ธ CRUD ๋ฉ”์„œ๋“œ๋ฅผ JpaRepository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ž๋™ ์ œ๊ณตํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐ˜๋ณต์ ์ธ SQL์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†๋งŒ์œผ๋กœ DB ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋ชจ๋‘ ํ–ฅ์ƒ๋œ๋‹ค.

 

โœ… ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋Š” QueryDSL๋กœ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌ

JPA๋Š” ๊ธฐ๋ณธ์ ์ธ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ์—๋Š” ๊ฐ•ํ•˜์ง€๋งŒ, ๋ณต์žกํ•œ ์กฐ๊ฑด์˜ ๋™์  ์ฟผ๋ฆฌ ์ž‘์„ฑ์—๋Š” ์ œ์•ฝ์ด ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์€ QueryDSL์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋‹ค.

QueryDSL์€ Java ์ฝ”๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์„ ์ œ๊ณตํ•œ๋‹ค.

  • ํƒ€์ž… ์•ˆ์ •์„ฑ
  • IDE ์ž๋™์™„์„ฑ ์ง€์›
  • ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ์‚ฌ์ „ ๋ฐฉ์ง€
  • ๋ฆฌํŒฉํ† ๋ฆฌ ์šฉ์ด์„ฑ

 

 

 

 

 

๐Ÿ“ƒ reference