RDBMS
๐Spring Data JPA vs MyBatis
JPA๋ ์๋ฐ ์ง์์์ ORM๊ธฐ์ ํ์ค์ผ๋ก ์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค์ ๋ชจ์์ด๋ค. ์ค์ ์ ์ผ๋ก ๊ตฌํ๋๊ฒ์ด ์๋๋ผ ๊ตฌํ๋ ํด๋์ค์ ๋งคํ์ ํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํ๋ ์ ์ํฌ์ด๋ค . ๋จผ์ ORM์ด ๋ญ์ง ์์๋ณด์
ORM (Object-Relational Mapping)
์ ํ๋ฆฌ์ผ์ด์ class์ RDB์ ํ ์ด๋ธ์ ๋งคํํ๋ค๋ ๋ป์ด๋ฉฐ, ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ฒด๋ฅผ RDBํ ์ด๋ธ์ ์๋์ผ๋ก ์์ํํด์ฃผ๋ ๊ฒ์ด๋ค.
ORM์ ์ฅ์
- SQL๋ฌธ์ด ์๋ Method๋ฅผ ํตํด DB๋ฅผ ์กฐ์ํ ์ ์์ด, ๊ฐ๋ฐ์๋ ๊ฐ์ฒด ๋ชจ๋ธ์ ์ด์ฉํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌ์ฑํ๋๋ฐ๋ง ์ง์คํ ์ ์์. (๋ด๋ถ์ ์ผ๋ก๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ DB๋ฅผ ์กฐ์ํจ. ํ์ง๋ง ๊ฐ๋ฐ์๊ฐ ์ด๋ฅผ ์ ๊ฒฝ ์ฐ์ง ์์๋๋จ)
- Query์ ๊ฐ์ด ํ์ํ ์ ์ธ๋ฌธ, ํ ๋น ๋ฑ์ ๋ถ์์ ์ธ ์ฝ๋๊ฐ ์ค์ด๋ค์ด, ๊ฐ์ข ๊ฐ์ฒด์ ๋ํ ์ฝ๋๋ฅผ ๋ณ๋๋ก ์์ฑํ์ฌ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์
- ๊ฐ์ฒด์งํฅ์ ์ธ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํ๋ค. ์ค์ง ๊ฐ์ฒด์งํฅ์ ์ ๊ทผ๋ง ๊ณ ๋ คํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์์ฐ์ฑ ์ฆ๊ฐ
- ๋งคํํ๋ ์ ๋ณด๊ฐ Class๋ก ๋ช ์ ๋์๊ธฐ ๋๋ฌธ์ ERD๋ฅผ ๋ณด๋ ์์กด๋๋ฅผ ๋ฎ์ถ ์ ์๊ณ ์ ์ง๋ณด์ ๋ฐ ๋ฆฌํฉํ ๋ง์ ์ ๋ฆฌ
- ๊ธฐ์กด ๋ฐฉ์์์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค๊ฐ PostgreSQL๋ก ๋ณํํ๋ค๊ณ ๊ฐ์ ํด๋ณด๋ฉด, ์๋ก ์ฟผ๋ฆฌ๋ฅผ ์ง์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๊น. ์ด๋ฐ ๊ฒฝ์ฐ์ ORM์ ์ฌ์ฉํ๋ค๋ฉด ์ฟผ๋ฆฌ๋ฅผ ์์ ํ ํ์๊ฐ ์์
ORM์ ๋จ์
- ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ํฌ๊ณ ๋ณต์กํ์ฌ ์ค๊ณ๊ฐ ์๋ชป๋ ๊ฒฝ์ฐ, ์๋ ์ ํ ๋ฐ ์ผ๊ด์ฑ์ ๋ฌด๋๋จ๋ฆฌ๋ ๋ฌธ์ ์ ์ด ์๊ธธ ์ ์์
- ๋ณต์กํ๊ณ ๋ฌด๊ฑฐ์ด Query๋ ์๋๋ฅผ ์ํด ๋ณ๋์ ํ๋์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ SQL๋ฌธ์ ์จ์ผํ ์๋ ์์
JPA
- Java ์ง์์์ ORM๊ธฐ์ ํ์ค์ผ๋ก ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค ๋ชจ์
- ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ ์ํ ์ธํฐํ์ด์ค
- ์ธํฐํ์ด์ค ์ด๊ธฐ ๋๋ฌธ์ Hibernate,OpenJPA๋ฑ์ด JPA๋ฅผ ๊ตฌํํจ
JPA ์ฅ์
- ์ฟผ๋ฆฌ๋ฅผ ํ๋ํ๋ ์์ฑํ ํ์๊ฐ ์์ด ์ฝ๋๋์ด ์ค์ด๋ ๋ค
- ๊ฐ๋ ์ฑ์ด์ข๋ค.
- ๊ฐํธํ๊ฒ ์์ ์ด ๊ฐ๋ฅํ๋ค (์ ์ง๋ณด์, ๋ฆฌํฉํ ๋ง ์ฉ์ด)
- ๋์ผํ ์ฟผ๋ฆฌ์ ๋ํ ์บ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋์ฑ ๋์ ์ฑ๋ฅ์ ๋ผ์ ์๋ค.
JPA ๋จ์
- ๋งคํ ์ค๊ณ๋ฅผ ์๋ชปํ์ ๋ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- JPA๋ฅผ ์ ๋๋ก ์ฌ์ฉํ๋ ค๋ฉด ์์์ผํ ๊ฒ์ด ๋ง์์ ํ์ตํ๋๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค.
- ๋ค์์ ํ ์ด๋ธ ์กฐ์ธ์ ์ ๊ฒฝ์จ์ผ ํ ๊ฒ ๋ง๋ค.
MYBatis
- ๊ฐ์ฒด ์งํฅ ์ธ์ด์ธ ์๋ฐ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๋ก๊ทธ๋๋ฐ์ ์ข ๋ ์ฝ๊ฒ ํ ์ ์๊ฒ ๋์ ์ฃผ๋ ๊ฐ๋ฐ ํ๋ ์ ์ํฌ
- JDBC๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ธ์คํ๋ ์์ ์ ์บก์ํํ๊ณ ์ผ๋ฐ SQL ์ฟผ๋ฆฌ, ์ ์ฅ ํ๋ก ์์ ๋ฐ ๊ณ ๊ธ ๋งคํ์ ์ง์ํ๋ฉฐ ๋ชจ๋ JDBC ์ฝ๋ ๋ฐ ๋งค๊ฐ ๋ณ์์ ์ค๋ณต์์ ์ ์ ๊ฑฐ
- Mybatis์์๋ ํ๋ก๊ทธ๋จ์ ์๋ SQL์ฟผ๋ฆฌ๋ค์ ํ ๊ตฌ์ฑํ์ผ์ ๊ตฌ์ฑํ์ฌ ํ๋ก๊ทธ๋จ ์ฝ๋์ SQL์ ๋ถ๋ฆฌํ ์ ์๋ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์
MYBatisํน์ง
- ๋ณต์กํ ์ฟผ๋ฆฌ๋ ๋ค์ด๋๋ฏนํ ์ฟผ๋ฆฌ์ ๊ฐํจ
- ๋น์ทํ ์ฟผ๋ฆฌ๋ ๋จ๋ฐํ๊ฒ ๋๋ ๋จ์
- ํ๋ก๊ทธ๋จ ์ฝ๋์ sql์ฟผ๋ฆฌ์ ๋ถ๋ฆฌ๋ก ์ฝ๋์ ๊ฐ๊ฒฐ์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ ํฅ์
- resultType, resultClass๋ฑ Vo๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์กฐํ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉ์ ์ ์ DTO, MAP ๋ฑ์ผ๋ก ๋งตํํ์ฌ ์ฌ์ฉ ํ ์ ์๋ค
- ๋น ๋ฅธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ์ฌ ์์ฐ์ฑ์ด ํฅ์๋๋ค
- SQL์คํ ๊ฒฐ๊ณผ๋ฅผ ์๋ฐ ๋น์ฆ ๋๋ Map๊ฐ์ฒด์ ๋งคํํด์ฃผ๋ Persistence ์๋ฃจ์ ์ผ๋ก ๊ด๋ฆฌํ๋ค. SQL์ ์์ค ์ฝ๋๊ฐ ์๋ XML๋ก ๋ถ๋ฆฌํ๋ค
- SQL๋ฌธ๊ณผ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํด์ ๊ตฌํํ๋ค
- ๋ฐ์ดํฐ ์์ค ๊ธฐ๋ฅ๊ณผ ํธ๋์ญ์ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค
MyBatis ์ฅ์
- ์ ๊ทผ์ด ์ฝ๊ณ ์ฝ๋๊ฐ ๊ฐ๊ฒฐ
- SQL๋ฌธ๊ณผ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๊ฐ ๋ถ๋ฆฌ๋์ด ์์ด์ SQL๋ฌธ์ ๋ณ๊ฒฝ์ด ์์๋๋ง๋ค ์๋ฐ ์ฝ๋๋ฅผ ์์ ํ๊ฑฐ๋ ์ปดํ์ผ ํ์ง ์์๋ ๋๋ค.
- ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค
MyBatis๋จ์
- ์คํค๋ง ๋ณ๊ฒฝ์ SQL์ฟผ๋ฆฌ๋ฅผ ์ง์ ์์ ํด์ฃผ์ด์ผ ํ๋ค
- ๋ฐ๋ณต๋ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ์ฌ ๋ฐ๋ณต ์์ ์ด ์๋ค.
- ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข ์๋ ์ฟผ๋ฆฌ๋ฌธ์ด ๋ฐ์ํ ์ ์๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ์ ๋ก์ง๋ ํจ๊ป ์์ ํด์ฃผ์ด์ผ ํ๋ค
JPA vs MyBatis
JPA๋ ๊ฐ์ฒด ์ค์ฌ์ ๊ฐ๋ฐ ๋ฐฉ์์ ์ง์ํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์์ SQL์ ์์ฑํ์ง ์๊ณ ๋ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ ์ ์๋ฐ๋ ์ฅ์ ์ด ์๊ณ , Mybatis๋ SQL์ ์ง์ ์์ฑํ ์ ์์ด ๊ฐ๋ฐ์๊ฐ ๋์ฑ ์์ ๋กญ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃฐ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.