๐Ÿ“˜Spring Data JPA vs MyBatis

JPA๋ž€ ์ž๋ฐ” ์ง„์˜์—์„œ ORM๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ์Œ์ด๋‹ค. ์‹ค์ œ์ ์œผ๋กœ ๊ตฌํ˜„๋œ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ตฌํ˜„๋œ ํด๋ž˜์Šค์™€ ๋งคํ•‘์„ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ ˆ์ž„ ์›Œํฌ์ด๋‹ค . ๋จผ์ € ORM์ด ๋ญ”์ง€ ์•Œ์•„๋ณด์ž

ORM (Object-Relational Mapping)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ class์™€ RDB์˜ ํ…Œ์ด๋ธ”์„ ๋งคํ•‘ํ•œ๋‹ค๋Š” ๋œป์ด๋ฉฐ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ์ฒด๋ฅผ RDBํ…Œ์ด๋ธ”์— ์ž๋™์œผ๋กœ ์˜์†ํ™”ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

ORM์˜ ์žฅ์ 

  1. SQL๋ฌธ์ด ์•„๋‹Œ Method๋ฅผ ํ†ตํ•ด DB๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด, ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ์ฒด ๋ชจ๋ธ์„ ์ด์šฉํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Œ. (๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ DB๋ฅผ ์กฐ์ž‘ํ•จ. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋ฅผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„๋จ)
  2. Query์™€ ๊ฐ™์ด ํ•„์š”ํ•œ ์„ ์–ธ๋ฌธ, ํ• ๋‹น ๋“ฑ์˜ ๋ถ€์ˆ˜์ ์ธ ์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ค์–ด, ๊ฐ์ข… ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•˜์—ฌ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ž„
  3. ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ค์ง ๊ฐ์ฒด์ง€ํ–ฅ์  ์ ‘๊ทผ๋งŒ ๊ณ ๋ คํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์‚ฐ์„ฑ ์ฆ๊ฐ€
  4. ๋งคํ•‘ํ•˜๋Š” ์ •๋ณด๊ฐ€ Class๋กœ ๋ช…์‹œ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ERD๋ฅผ ๋ณด๋Š” ์˜์กด๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๊ณ  ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ๋ฆฌํŒฉํ† ๋ง์— ์œ ๋ฆฌ
  5. ๊ธฐ์กด ๋ฐฉ์‹์—์„œ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ PostgreSQL๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๋ฉด, ์ƒˆ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์งœ์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊น€. ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ORM์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Œ

ORM์˜ ๋‹จ์ 

  1. ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ํฌ๊ณ  ๋ณต์žกํ•˜์—ฌ ์„ค๊ณ„๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ, ์†๋„ ์ €ํ•˜ ๋ฐ ์ผ๊ด€์„ฑ์„ ๋ฌด๋„ˆ๋œจ๋ฆฌ๋Š” ๋ฌธ์ œ์ ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ
  2. ๋ณต์žกํ•˜๊ณ  ๋ฌด๊ฑฐ์šด Query๋Š” ์†๋„๋ฅผ ์œ„ํ•ด ๋ณ„๋„์˜ ํŠœ๋‹์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ SQL๋ฌธ์„ ์จ์•ผํ•  ์ˆ˜๋„ ์žˆ์Œ

JPA

  • Java ์ง„์˜์—์„œ ORM๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ์Œ
  • ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค
  • ์ธํ„ฐํŽ˜์ด์Šค ์ด๊ธฐ ๋•Œ๋ฌธ์— Hibernate,OpenJPA๋“ฑ์ด JPA๋ฅผ ๊ตฌํ˜„ํ•จ

JPA ์žฅ์ 

  1. ์ฟผ๋ฆฌ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์–ด ์ฝ”๋“œ๋Ÿ‰์ด ์ค„์–ด๋“ ๋‹ค
  2. ๊ฐ€๋…์„ฑ์ด์ข‹๋‹ค.
  3. ๊ฐ„ํŽธํ•˜๊ฒŒ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค (์œ ์ง€๋ณด์ˆ˜, ๋ฆฌํŒฉํ† ๋ง ์šฉ์ด)
  4. ๋™์ผํ•œ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์บ์‹œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”์šฑ ๋†’์€ ์„ฑ๋Šฅ์„ ๋‚ผ์ˆ˜ ์žˆ๋‹ค.

JPA ๋‹จ์ 

  1. ๋งคํ•‘ ์„ค๊ณ„๋ฅผ ์ž˜๋ชปํ–ˆ์„ ๋•Œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. JPA๋ฅผ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•Œ์•„์•ผํ•  ๊ฒƒ์ด ๋งŽ์•„์„œ ํ•™์Šตํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.
  3. ๋‹ค์ˆ˜์˜ ํ…Œ์ด๋ธ” ์กฐ์ธ์‹œ ์‹ ๊ฒฝ์จ์•ผ ํ• ๊ฒŒ ๋งŽ๋‹ค.

MYBatis

  • ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์ธ ์ž๋ฐ”์˜ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ข€ ๋” ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€ ์ฃผ๋Š” ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„ ์›Œํฌ
  • JDBC๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—‘์„ธ์Šคํ•˜๋Š” ์ž‘์—…์„ ์บก์Šํ™”ํ•˜๊ณ  ์ผ๋ฐ˜ SQL ์ฟผ๋ฆฌ, ์ €์žฅ ํ”„๋กœ ์‹œ์ € ๋ฐ ๊ณ ๊ธ‰ ๋งคํ•‘์„ ์ง€์›ํ•˜๋ฉฐ ๋ชจ๋“  JDBC ์ฝ”๋“œ ๋ฐ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ์ค‘๋ณต์ž‘์—…์„ ์ œ๊ฑฐ
  • Mybatis์—์„œ๋Š” ํ”„๋กœ๊ทธ๋žจ์— ์žˆ๋Š” SQL์ฟผ๋ฆฌ๋“ค์„ ํ•œ ๊ตฌ์„ฑํŒŒ์ผ์— ๊ตฌ์„ฑํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์™€ SQL์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

MYBatisํŠน์ง•

  • ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋‚˜ ๋‹ค์ด๋‚˜๋ฏนํ•œ ์ฟผ๋ฆฌ์— ๊ฐ•ํ•จ
  • ๋น„์Šทํ•œ ์ฟผ๋ฆฌ๋Š” ๋‚จ๋ฐœํ•˜๊ฒŒ ๋˜๋Š” ๋‹จ์ 
  • ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์™€ sql์ฟผ๋ฆฌ์˜ ๋ถ„๋ฆฌ๋กœ ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ
  • resultType, resultClass๋“ฑ Vo๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์กฐํšŒ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ DTO, MAP ๋“ฑ์œผ๋กœ ๋งตํ•‘ํ•˜์—ฌ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋น ๋ฅธ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ์ƒ์‚ฐ์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค
  • SQL์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ž๋ฐ” ๋นˆ์ฆˆ ๋˜๋Š” Map๊ฐ์ฒด์— ๋งคํ•‘ํ•ด์ฃผ๋Š” Persistence ์†”๋ฃจ์…˜์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. SQL์„ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ XML๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค
  • SQL๋ฌธ๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๊ตฌํ˜„ํ•œ๋‹ค
  • ๋ฐ์ดํ„ฐ ์†Œ์Šค ๊ธฐ๋Šฅ๊ณผ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค

MyBatis ์žฅ์ 

  1. ์ ‘๊ทผ์ด ์‰ฝ๊ณ  ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐ
  2. SQL๋ฌธ๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฝ”๋“œ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด์„œ SQL๋ฌธ์— ๋ณ€๊ฒฝ์ด ์žˆ์„๋•Œ๋งˆ๋‹ค ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ปดํŒŒ์ผ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  3. ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค

MyBatis๋‹จ์ 

  1. ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์‹œ SQL์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค
  2. ๋ฐ˜๋ณต๋œ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋ฐ˜๋ณต ์ž‘์—…์ด ์žˆ๋‹ค.
  3. ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ข…์†๋œ ์ฟผ๋ฆฌ๋ฌธ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ์‹œ ๋กœ์ง๋„ ํ•จ๊ป˜ ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค

JPA vs MyBatis

JPA๋Š” ๊ฐ์ฒด ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ์ง€์›ํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์—… SQL์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋”ฐ๋Š” ์žฅ์ ์ด ์žˆ๊ณ , Mybatis๋Š” SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋”์šฑ ์ž์œ ๋กญ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: