โถ ๊ฐ๋
๐ก ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ ์ํ ์ธํฐํ์ด์ค
์๋ฐ ์ง์์์ ORM( Object - Relational Mapping ) ๊ธฐ์ ํ์ค์ผ๋ก ์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค ๋ชจ์
- ๊ตฌํ๋ ํด๋์ค์ ๋งคํ์ ํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํ๋ ์์ํฌ
- JPA๋ฅผ ๊ตฌํํ ๋ํ์ ์ธ ์คํ์์ค๋ก๋ Hibernate๊ฐ ์๋ค.
โถ JPA ๋์
- ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ JDBC ์ฌ์ด์์ ๋์ํ๋ค.
- JPA๋ฅผ ์ฌ์ฉํ๋ฉด JPA ๋ด๋ถ์์ JDBC API๋ฅผ ์ฌ์ฉํ์ฌ SQL์ ํธ์ถํด์ DB์ ํต์
- ํ๋์ ์ฑ์๋ ํ๋์ EntityManager Factory๋ฅผ ์์ฑํ๊ณ ๊ฐ ์์ฒญ์ ๋ฐ๋ผ EntityManager๋ฅผ ์์ฑํ์ฌ ์ปค๋ฅ์ ํ์ ๋ง๋ค๊ณ DB์ ์์ฒญ
- EntityManager๋ ํ๋์ ์ค๋ ๋์์ ์ฌ์ฉํ๊ณ , ์ฌ์ฉ์ด ๋๋๋ฉด ๋ฐ๋ฉ
- ๊ทธ ์ด์ ๋ ํธ๋์ญ์ ๋จ์๋ก EntityManager๋ฅผ ์ฌ์ฉํ๋ค. ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ฌ์ฉํ๋ค๋ฉด, ์์์ฑ ์ปจํ ์คํธ์ DB ๊ฐ์ ๋ฐ์ดํฐ ๋๊ธฐํ๊ฐ ๊นจ์ง๊ฒ ๋๋ค. ์ปค๋ฐ์ด ๋ ์ดํ์๋ ์์์ฑ ์ปจํ ์คํธ๋ ๋ฐ๋ฉํ๋ค๊ฐ ์๋กญ๊ฒ ์์ฑํด์ผ ํ๋ค.
โถ JPA ์ฌ์ฉ์ด์
๐กSQL์ ๋ฌธ์ ์ ?
- ๊ฐ์ ์ฝ๋์ ๋ฌดํ ๋ฐ๋ณต → sql ์ฝ๋, ๊ธฐ๋ณธ CRUD์ ๋ฐ๋ณต
- ํจ๋ฌ๋ค์์ ๋ถ์ผ์น: ๊ฐ์ฒด์ ๊ด๊ณํ DB์ ์ฐจ์ด → ๊ฐ์ฒด๋ฅผ DB์ ๋ฃ์ ๋ ๋ฌธ์ ๋ฐ์
- SQL ์์กด์ ๊ฐ๋ฐ: ๋ง์ฝ ํ ์ด๋ธ์ ํ๋์ Column์ ์ถ๊ฐํด์ผ ํ๋ค๋ฉด ๋ชจ๋ SQL์ ๋ณ๊ฒฝ(INSERT, UPDATE, SELECT ๋ฑ ๊ด๋ จ๋ ๋ชจ๋ ์ฟผ๋ฆฌ์ ๋ฉ์๋)์ด ํ์ํ๋ค. ๋ ผ๋ฆฌ์ ์ธ ๊ณ์ธต ๋ถํ ์ด ์ด๋ ต๊ฒ ๋๋ค.
- **๊ฐ์ฒด -RDB ํจ๋ฌ๋ค์์ ๋ถ์ผ์น : ๊ฐ์ฒด๋ ์ถ์ํ, ์์, ๋คํ์ฑ(ํด๋์ค, ๋ฉ์๋)**์ ํน์ง์ ๊ฐ์ง๊ณ , RDB๋ ๋ฐ์ดํฐ ์ค์ฌ์ผ๋ก ์ด๋ค์ ธ,RDB์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๋ฐ ๋ถ์ผ์น๊ฐ ๋ฐ์ํจ
- ์์: ๊ฐ์ฒด๋ ๋ค๋ฅด๊ฒ ํ ์ด๋ธ์ ์์์ด๋ผ๋ ๊ธฐ๋ฅ์ด ์์ด์, ๊ฐ๋ฐ์๊ฐ ์ฌ๋ฌ ์ค์ /์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ผ ํจ
- ์ฐ๊ด๊ด๊ณ: ๊ฐ์ฒด๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํด์ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์กฐํํ๋ ๋ฐ, ํ ์ด๋ธ์ ์ธ๋ ํค๋ก ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ค์ ํ๊ณ ์กฐ์ธ์ผ๋ก ์ฐ๊ด ํ ์ด๋ธ์ ์กฐํํจ
๐ก์ด๋ฅผ ๊ทน๋ณตํ JPA๋ฅผ ์ฌ์ฉํ๋ ์ด์
- SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์์ ๊ฐ์ฒด ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ค.
- ์์ฐ์ฑ์ด ์ฆ๊ฐํ๋ค.
- DDL๋ฌธ ์๋ ์์ฑ
- ๊ฐ๋จํ ๋ฉ์๋๋ก CRUD๊ฐ ๊ฐ๋ฅํด์ง๋ค.
- SQL์ ์์ฑํ๊ณ JDBC API ๋ฅผ ์ฌ์ฉํ๋ ๋ฐ๋ณต์ ์ธ ์ผ์ ๋์ ์ฒ๋ฆฌํด์ค๋ค.
- ์ ์ง ๋ณด์๊ฐ ์ฝ๋ค.
- ๊ธฐ์กด : ํ๋ ๋ณ๊ฒฝ ์ ๋ชจ๋ SQL ์์
- JPA : ํ๋๋ง ์ถ๊ฐํ๋ฉด ๋๋ค. SQL์ JPA ๊ฐ ์ฒ๋ฆฌํ๋ค.
- Object์ RDB๊ฐ์ ํจ๋ฌ๋ค์ ๋ถ์ผ์น ํด๊ฒฐ
- ์์ / ์ฐ๊ด ๊ด๊ณ / ๊ฐ์ฒด-RDB ํจ๋ฌ๋ค์ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํ๋ค.
- JAVA์ ์กด์ฌํ๋ ์์ ๊ด๊ณ๋ฅผ ๊ฐ์ฒด์ ์์ ๊ด๊ณ๋ฅผ ์ง์ํ์ง ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ JPA๋ ์๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐ
- ์ฑ๋ฅ ์ต์ ํ ๊ธฐํ๋ฅผ ์ ๊ณตํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์์ ์ฑ๋ฅ ์ต์ ํ ๊ธฐํ๋ฅผ ์ ๊ณตํ๋ค.
- ๊ฐ์ ํธ๋์ญ์ ์์์๋ ๊ฐ์ ์ํฐํฐ๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์์ ํต์ ํ์๋ฅผ ์ค์ผ ์ ์๋ค. ๋ํ, ํธ๋์ญ์ ์ commitํ๊ธฐ ์ ๊น์ง ๋ฉ๋ชจ๋ฆฌ์ ์๊ณ ํ๋ฒ์ SQL์ ์ ์กํ๋ค.
- ๋ฐ์ดํฐ ์ ๊ทผ ์ถ์ํ์ ๋ฒค๋ ๋
๋ฆฝ์ฑ
- RDB๋ ๊ฐ์ ๊ธฐ๋ฅ์ด๋ผ๋ ๋ฒค๋๋ง๋ค ์ฌ์ฉ๋ฒ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฒ์ ์ ํํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข ์๋๊ณ ๋ณ๊ฒฝ์ด ์ด๋ ต๋ค. JPA๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์์ ์ถ์ํ ๋ ๋ฐ์ดํฐ ์ ๊ทผ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ข ์์ด ๋์ง ์๋๋ก ํ๋ค.
- ๋ง์ฝ DB๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ JPA์๊ฒ ์๋ ค์ฃผ๋ฉด ๊ฐ๋จํ๊ฒ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค. (์ ์ฐํ๋ค)
โถ JPA ์ ์ฅ / ๋จ์
์ฅ์
- SQL๋ฌธ์ด ์๋ ๋ฉ์๋๋ฅผ ํตํด์ DB ์กฐ์์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ์๋ ๊ฐ์ฒด ๋ชจ๋ธ์ ์ด์ฉํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌ์ฑํ๋๋ฐ ๋ง ์ง์ค์ด ๊ฐ๋ฅํด์ง๋ค.
- Query์ ๊ฐ์ด ํ์ํ ์ ์ด๋ฌธ / ํ ๋ฑ๋ฑ์ ๋ถ์์ ์ธ ์ฝ๋๊ฐ ์ค์ด๋ค์ด ๊ฐ์ข ๊ฐ์ฒด์ ๋ํ ์ฝ๋๋ฅผ ๋ณ๋๋ก ์์ฑํ์ฌ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ผ์ ์๋ค.
- ๊ฐ์ฒด ์งํฅ์ ์ธ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํด์ง๋ค.
- ์ ์ง ๋ณด์ ๋ฐ ๋ฆฌํฉํ ๋ง์ ์ ๋ฆฌํ๋ค.
๋จ์
- ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ํฌ๊ณ ๋ณต์กํ์ฌ ์ค๊ณ๊ฐ ์๋ชป๋ ๊ฒฝ์ฐ์๋ ์๋ ์ ํ ๋ฐ ์ผ๊ด์ฑ์ ๋ฌด๋๋จ๋ฆฌ๋ ๋ฌธ์ ์ ์ด ๋ฐ์ํ ์๋ ์๋ค. ( ๊ฐ๋ฐ์๊ฐ ์๋ํ์ง ์์ ์๋์ผ๋ก ์์ฑ๋ Query๋ก ์ธํด ์ฑ๋ฅ์ด ์ ํ๋๊ธฐ๋ ํจ )
- ๋ณต์กํ๊ณ ๋ฌด๊ฑฐ์ด Query๋ฌธ์ ์๋๋ฅผ ์ํด ๋ณ๋์ ํ๋์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ SQL๋ฌธ์ ์ฐ๋๊ฒ ๋์ ์ํฉ์ด ๋ฐ์ํ ์๋ ์๋ค.
- ํ์ต ๋น์ฉ์ด ๋น์ธ๊ณ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค.
**์ถ๊ฐ JPA ๊ด๋ จ ์ฉ์ด**
โป ORM( Object - Relational Mapping )
- ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก Mapping( ์ฐ๊ฒฐ ) ํด์ฃผ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ⇒ ํด๋์ค ์ฌ์ฉ / ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ⇒ ํ ์ด๋ธ ์ฌ์ฉ
- ๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด๊ณํ ๋ชจ๋ธ ๊ฐ์ ์กด์ฌํ๋ ๋ถ์ผ์น๋ฅผ ORM์ ํตํด ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ฐํ์ผ๋ก SQL์ ์๋์ผ๋ก ์์ฑํ์ฌ ๋ถ์ผ์น ํด๊ฒฐํ๋ค.
โป Hibernate
- : JPA ๊ตฌํ์ฒด์ ํ ์ข ๋ฅ๋ก, (DataNucleus, EclipseLink๋ฑ ๋ค๋ฅธ ๊ตฌํ์ฒด๋ ์กด์ฌ): JPA๊ฐ DB์ ์๋ฐ ๊ฐ์ฒด๋ฅผ ๋งคํํ๊ธฐ ์ํ ์ธํฐํ์ด์ค์ด๊ณ Hibernate๋ ์ด๋ฅผ ๊ตฌํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๐ Spring Data JPARepository๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉํ๋ ๋ ์ฌ์ด ๋ฐฉ๋ฒ(Repository ๋ด๋ถ์ ์ผ๋ก๋ EntityManager์ ์ฌ์ฉ)
- JPA๋ฅผ ํธํ๊ฒ ์ฐ๊ธฐ ์ํ ๋ชจ๋
๐ JPQL์ด๋JPQL์ DB SQL์ ์์กดํ์ง ์๊ณ , ์ฝ๊ฒ ๋งํ๋ฉด ๊ฐ์ฒด ์งํฅ SQL์ด๋ผ ๋ณด๋ฉด ๋๋ค.
- ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ (๋ฐ๋ฉด SQL์ ํ ์ด๋ธ์ ๋์์ผ๋ก ์ฟผ๋ฆฌ)
- nativeQuery = true → SQL
- nativeQuery = false (default) → JPQL
๐ query DSL
query DSL์ ์ ํ์ ์ ์ด์ฉํด์ SQL, JPQL์ ์ฝ๋๋ก ์์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ ์คํ์์ค ๋น๋ API
- query DSL์ ์ฌ์ฉํ๋ ๋ชฉ์ ์ ๋๋ ทํ๋ค.๊ธฐ์กด ๋ฐฉ์(Mybatis, JPQL, etc..)์ ๋ชจ๋ ๋ฌธ์์ด(=String) ํํ๋ก ์ฟผ๋ฆฌ๊ฐ ์์ฑ๋์๊ณ ์ด๋ก ์ธํด Compile ๋จ๊ณ์์ Type-Check ๋ถ๊ฐํ๋ค.์ด๋ฌํ risk๋ฅผ ์ค์ด๊ธฐ ์ํด query DSL์ด ๋ฑ์ฅํ๊ณ ์ด๋ฅผ ํตํด Compile ๋จ๊ณ์์ Type-check๊ฐ ๊ฐ๋ฅํด์ง ๊ฒ์ด๋ค.
- JPQL์ ๋ํ ๋ณด์์ ์ํด ๋์จ ๊ฒ์ด query DSL์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.