[Java] ORM, MyBatis์ JPA ์ฐจ์ด
๐น 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