๐Ÿšง

SQL Mapper vs ORM (feat. Hibernate vs Spring Data JPA)

purpplee 2021. 12. 25. 11:57

Persistence Framework

ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์–ด๋„ ์‚ฌ๋ผ์ง€๋ฉด ์•ˆ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด ์žˆ๋‹ค. ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ๋“ค์„ ์šฐ๋ฆฌ๋Š” DB์— ์ €์žฅํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์–ด๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ์„ฑ์งˆ์„ ์˜์†์„ฑ(Persistence)๋ผ๊ณ  ํ•œ๋‹ค. Java ์—์„œ๋Š” ๋ฐ์ดํ„ฐ์˜ ์˜์†์„ฑ์„ ์œ„ํ•ด, ์ฆ‰ DB ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” JDBC(Java Database Connectivity) ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ง€์›ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.

 

JDBC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฝค ๋ฒˆ๊ฑฐ๋กญ๋‹ค. DB์— ์ ‘๊ทผํ•ด Connection์„ ์–ป๊ณ , SQL ๋ฅผ ์ˆ˜ํ–‰ํ•ด ์–ป์€ ๊ฒฐ๊ณผ๊ฐ’์„ Java Object Type ์— ๋งž๊ฒŒ ๋ณ€ํ™˜(Mapping) ํ•˜๋Š” ์ž‘์—…์„ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ•˜๋‚˜ํ•˜๋‚˜ ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฐ ๋ฒˆ๊ฑฐ๋กœ์šด JDBC ์ž‘์—…์„ ๋Œ€์‹  ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ SQL Mapper ์™€ ORM ์ด๋‹ค.

 

SQL Mapper

SQL Mapper ๋Š” SQL ๋ฌธ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ณ  ๊ฒฐ๊ณผ๊ฐ’์„ ์–ด๋–ค Object ์™€ ๋ฐ”์ธ๋”ฉํ• ์ง€๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ž๋™์œผ๋กœ JDBC ์ž‘์—…์„ ํ•ด์ฃผ๋Š” SQL ์˜์กด์ ์ธ Persistence Framework ๋‹ค. ์ด SQL ๋ฌธ์€ xmlํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธํ•˜๊ณ , SQL ์ฟผ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์„œ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Join์ด ๋งŽ๋‹ค๊ฑฐ๋‚˜..)์„ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์ ํ•ฉํ•˜๋‹ค.

 

๋‹จ์ ์€ SQL ์ฟผ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • DB์— ์ข…์†์ ์ด๋ž€ ์ ์ด๋‹ค. ๋‹ค๋ฅธ DB๋ฅผ ๋„์ž…ํ•˜๊ฑฐ๋‚˜ ๊ทธ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ SQL ์ฟผ๋ฆฌ๋ฅผ ๊ทธ DB์— ๋งž๊ฒŒ ํ•˜๋‚˜ ๋” ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ๋‹ค๋ฃฌ๋‹ค๋Š” ์ ์—์„œ... ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•˜๊ณ  ๊ฐ์ฒด๋ฅผ ๋„์ถœํ•˜๊ณ  ๊ทธ ๋‘˜์„ ๋งคํ•‘ํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๊ณ ... SQL ์„ค๊ณ„ํ•˜๋Š” ๋ฐ์„œ ์‹œ๊ฐ„์„ ๋” ์žก์•„๋จนํžŒ๋‹ค. (๋‚ด๊ฐ€ Java ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๋ผ SQL ๊ฐœ๋ฐœ์ž์ธ๊ฐ€..!?)

 

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

 

ORM (Object Relational Mapping)

ORM์€ SQL๋ฌธ์ด ์•„๋‹Œ, Object ์™€ DB table ์„ Mapping ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. SQL Mapper ์—์„œ๋Š” create SQL ๋ฌธ์„ ์ž‘์„ฑํ•˜๋“  ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” table ๊ณผ Mapping ํ•˜๋“  ํ•ด์•ผ ํ•˜์ง€๋งŒ, ORM ์—์„œ๋Š” Java Class ๋ฅผ ๋งŒ๋“ค๊ณ  ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‹ฌ์•„์ฃผ๋ฉด ์ž๋™์œผ๋กœ create ํ•ด์ค€๋‹ค. ๋ฐ”๋กœ ๊ฐ์ฒด๋ž‘ ๋งคํ•‘ํ•˜๋ฏ€๋กœ ๊ฐ์ œ ๋ชจ๋ธ์—๋งŒ ์ง‘์ค‘ํ•ด ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๊ณ , SQL ๋ฌธ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋จธ๋ฆฌ์•„ํ”Œ ์ผ์ด ์ ์–ด์ง„๋‹ค(ใ…‹ใ…‹). ๋˜ ํŠน์ • DB์— ์ข…์†์ ์ด์ง€ ์•Š์•„์„œ ์œ ์ง€๋ณด์ˆ˜ ํ•˜๊ธฐ๋„ ํŽธํ•˜๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ณ , DB table ๊ณผ Java Class ๊ฐ„ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. SQL Mapper ๊ฐ€ ์ด๋Ÿฐ ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(ํŠนํžˆ ๋งŽ์€ join์ด ๊ฑธ๋ ค ์žˆ๊ณ , ๋ˆ ๊ด€๋ จ๋œ ๊ณ„์‚ฐ์ด๋ผ๋ฉด...) ์˜ ๊ฒฝ์šฐ์—๋Š” ์ง์ ‘ SQL ๋ฌธ์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋” ํŽธํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ORM ์€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ด€๊ณ„ํ˜• DB ๋‘˜ ๋‹ค ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•ด์„œ ์•„๋ฌด๋ž˜๋„ ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋†’๋‹ค. ์ด๊ฑด... ์ง์ ‘ ํ•ด๋ณด๋ฉด ์•Œ๊ฒŒ ๋œ๋‹ค.

 

Hibernate vs Spring Data JPA

JPA ๋Š” Java ์ชฝ์˜ ORM ๊ธฐ์ˆ ์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์ด JPA ๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๊ฒŒ ๋ฐ”๋กœ Hibernate ๋‹ค. Hibernate ๋ฅผ ๋ฐ”๋กœ ์จ๋„ ๋ฌธ์ œ๋˜์ง€ ์•Š์ง€๋งŒ, ๋งŒ์•ฝ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋กœ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ „๋ถ€ ๊ฐˆ์•„์—Ž์–ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด Spring Data JPA ๊ฐ€ ๋‚˜์™”๋‹ค.

 

Spring Data JPA ๋Š” Hibernate ๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋” ๊ฐ์‹ธ๋†“์€ ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•œ๋ฒˆ ๋” ๊ฐ์‹ธ๋†“์œผ๋ฉด, Spring Data JPA ๊ฐ€ ์•Œ์•„์„œ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด์™€ ๋งคํ•‘ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ฒด ๊ต์ฒด๊ฐ€ ์šฉ์ดํ•˜๋‹ค. ๋˜ ๊ธฐ๋ณธ์ ์œผ๋กœ ORM ๊ตฌํ˜„์ฒด๋“ค์€ ๊ด€๊ณ„ํ˜• DB ๋ฅผ ์ดˆ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์—, ๋งŒ์•ฝ ๋‹ค๋ฅธ DB(NoSQL ์ด๋ผ๋“ ์ง€..)๋ฅผ ์จ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ.. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐˆ์•„์—Ž์–ด์•ผํ•œ๋‹ค. Spring Data JPA ๋Š” ์ด๊ฒƒ๋„ ๋‹จ์ˆœํžˆ ์˜์กด์„ฑ๋งŒ ๊ต์ฒดํ•˜๋ฉด ๋˜๋Š” ์‹์œผ๋กœ ์ž๋™ํ™”ํ•ด์„œ DB ๊ต์ฒด์—๋„ ์šฉ์ดํ•˜๋‹ค. Spring ํŒ€์€ ์ด๋Ÿฐ ์ด์œ ๋กœ Hibernate ๋ฅผ ์ง์ ‘ ์“ฐ๊ธฐ๋ณด๋‹ค Spring Data JPA๋ฅผ ์“ฐ๋ผ๊ณ  ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•