SQL Mapper vs ORM (feat. Hibernate vs Spring Data JPA)
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๋ฅผ ์ฐ๋ผ๊ณ ๊ถ์ฅํ๊ณ ์๋ค.