π[Spring] JPAλ₯Ό μ¬μ©νλ μ΄μ .
- JPA(Java Persistence API) λ₯Ό μ¬μ©νλ μ΄μ λ μ£Όλ‘ λ°μ΄ν°λ² μ΄μ€μ κ°μ²΄ κ°μ μνΈμμ©μ ν¨μ¨μ μΌλ‘ μ²λ¦¬νκ³ , κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°(OOP) μ λ°μ΄ν°λ² μ΄μ€μ μ½κ² μ μ©νκΈ° μν΄μ μ λλ€.
- JPAλ λ°μ΄ν°λ² μ΄μ€ μμ μ λ¨μννκ³ , κ°λ°μκ° λ°μ΄ν°λ² μ΄μ€μ μμ‘΄μ μΈ SQL 쿼리λ₯Ό μ§μ μμ±νλ λμ , κ°μ²΄ λͺ¨λ€μ ν΅ν΄ λ°μ΄ν°λ₯Ό κ΄λ¦¬ν μ μκ² ν΄μ€λλ€.
πββοΈ μννΈμ¨μ΄ 곡νμμμ λͺ¨λ
πββοΈ λͺ¨λκ³Ό μ»΄ν¬λνΈλ₯Ό λ κ³ λΈλ‘μ λΉμ ν΄λ³΄λ©΄?!
1οΈβ£ JPAλ₯Ό μ¬μ©νλ μ£Όμ μ΄μ .
1. κ°μ²΄-κ΄κ³ λ§€ν(ORM, Object-Relational Mapping) μ§μ.
- JPAλ ORM(Object-Relational Mapping) νμ€μ μ 곡ν©λλ€.
- ORMμ μ¬μ©νλ©΄ κ°μ²΄μ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈ κ°μ λ³νμ μλνν μ μμ΅λλ€.
- μ¦, λ°μ΄ν°λ² μ΄μ€μ ν(row)μ κ°μ²΄λ‘ λ§€ννκ³ , κ°μ²΄μ μμ±μ λ°μ΄ν°λ² μ΄μ€μ μ΄(column)κ³Ό μ°κ²°ν©λλ€.
- μ΄λ₯Ό ν΅ν΄ κ°λ°μλ SQL 쿼리 μμ±μ μ κ²½ μ°μ§ μκ³ , κ°μ²΄ μ§ν₯μ μΌλ‘ λ°μ΄ν°λ₯Ό μ²λ¦¬ν μ μμ΅λλ€.
2. λ°μ΄ν°λ² μ΄μ€ λ 립μ±.
- JPAλ λ°μ΄ν°λ² μ΄μ€ λ°΄λμ μ’ μμ μ΄μ§ μμ μΆμν κ³μΈ΅μ μ 곡ν©λλ€.
- JPAλ₯Ό μ¬μ©νλ©΄ μ ν리μΌμ΄μ μμ νΉμ λ°μ΄ν°λ² μ΄μ€μ μμ‘΄νμ§ μμΌλ―λ‘, λ°μ΄ν°λ² μ΄μ€λ₯Ό κ΅μ²΄νκ±°λ λ€μ€ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©ν λλ μ ν리μΌμ΄μ μ½λλ₯Ό ν¬κ² λ³κ²½ν νμκ° μμ΅λλ€.
- μλ₯Ό λ€μ΄, MySQLμμ PostgreSQLλ‘ μ νν΄λ JPAμ μ€μ λ§ λ³κ²½νλ©΄ λλΆλΆμ μ½λλ₯Ό μμ νμ§ μκ³ μ¬μ©ν μ μμ΅λλ€.
πββοΈ DIPμ μ μμμ λ§νλ βμΆμνλ κ²βκ³Ό βμΆμνβμ κ°λ μ μ°¨μ΄μ .
3. SQL μμ± λΆλ΄ κ°μ.
- JPAλ λ°μ΄ν°λ₯Ό μ‘°ν, μ μ₯, μμ , μμ νλ λ° νμν SQL 쿼리λ₯Ό μλμΌλ‘ μμ±ν΄μ€λλ€.
- κ°λ°μκ° μ§μ SQLμ μμ±νμ§ μμλ λκ³ , κ°μ²΄ μ§ν₯μ μΌλ‘ λ°μ΄ν° μ²λ¦¬λ₯Ό ν μ μμ΅λλ€.
- μ΄λ₯Ό ν΅ν΄ κ°λ°μλ λΉμ¦λμ€ λ‘μ§μ μ§μ€ν μ μμΌλ©°, 볡μ‘ν SQL μμ±μ λΆλ΄μ μ€μΌ μ μμ΅λλ€.
4. λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§ κ΄λ¦¬.
- JPAλ λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§λ₯Ό μλμΌλ‘ μμ±νκ±°λ μ λ°μ΄νΈνλ κΈ°λ₯μ μ 곡ν©λλ€.
- μ΄λ₯Ό ν΅ν΄ κ°λ°μλ μ ν리μΌμ΄μ μ½λλ§μΌλ‘ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ μλμΌλ‘ μμ±νκ±°λ κ°±μ ν μ μμ΅λλ€.
- μ ν리μΌμ΄μ μ΄ μμλ λ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ μλμΌλ‘ μμ±νκ³ , μλ‘μ΄ μν°ν°(κ°μ²΄)λ₯Ό μΆκ°νλ©΄ κ·Έμ λ°λΌ λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§λ₯Ό μλμΌλ‘ μ λ°μ΄νΈν μ μμ΅λλ€.
5. μΊμ± μ§μ.
- JPAλ 1μ°¨ μΊμμ 2μ°¨ μΊμλ₯Ό μ 곡νμ¬ μ±λ₯μ μ΅μ νν μ μμ΅λλ€.
- 1μ°¨ μΊμλ μμμ± μ»¨ν μ€νΈ(Entity Manager)κ° κ΄λ¦¬νλ μΊμλ‘, λμΌν νΈλμμ λ΄μμ μ΄λ―Έ μ‘°νλ μν°ν°λ λ€μ λ°μ΄ν°λ² μ΄μ€μμ μ‘°ννμ§ μκ³ μΊμμμ κ°μ Έμ΅λλ€.
- 2μ°¨ μΊμλ μ ν리μΌμ΄μ μ 체μμ 곡μ λλ μΊμλ‘, μ ν리μΌμ΄μ μ±λ₯μ λμ΄λ λ° λμμ μ€λλ€.
6. νΈλμμ κ΄λ¦¬.
- JPAλ νΈλμμ κ΄λ¦¬λ₯Ό λ¨μνν©λλ€.
- JPAλ λ°μ΄ν°λ² μ΄μ€ μμ μ νΈλμμ μΌλ‘ λ¬Άμ΄μ£ΌκΈ° λλ¬Έμ, νΈλμμ μ΄ μλ£λλ©΄ λͺ¨λ λ³κ²½ μ¬νμ΄ μμμ μΌλ‘ λ°μ΄ν°λ² μ΄μ€μ λ°μλκ±°λ λ‘€λ°±λ©λλ€.
- μ΄λ₯Ό ν΅ν΄ λ°μ΄ν° μΌκ΄μ±κ³Ό 무결μ±μ 보μ₯ν μ μμ΅λλ€.
7. Lazy Loadingκ³Ό Eager Loading.
- JPAλ μ°κ΄λ μν°ν°λ₯Ό μ§μ° λ‘λ©(Lazy Loading) νκ±°λ μ¦μ λ‘λ©(Eager Loading) ν μ μμ΅λλ€.
- Lazy Loadingμ μ°κ΄λ λ°μ΄ν°λ₯Ό νμν λλ§ κ°μ Έμ€κ³ , Eager Loadingμ μ¦μ λͺ¨λ μ°κ΄ λ°μ΄ν°λ₯Ό νκΊΌλ²μ κ°μ Έμ΅λλ€.
- μ΄λ₯Ό ν΅ν΄ μ ν리μΌμ΄μ μ±λ₯μ μ΅μ νν μ μμ΅λλ€.
8. JPQL(Java Persistence Query Language).
- JPAλ JPQL(Java Persistence Query Language) μ΄λΌλ κ°μ²΄ μ§ν₯ μΈμ΄λ₯Ό μ 곡ν©λλ€.
- JPQLμ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈ λμ μν°ν° κ°μ²΄ λ₯Ό λμμΌλ‘ 쿼리λ₯Ό μμ±ν μ μκ² ν΄μ€λλ€.
- μ΄λ₯Ό ν΅ν΄ SQLμ²λΌ λ°μ΄ν°λ² μ΄μ€ μ’ μμ μΈ μΏΌλ¦¬ λμ , κ°μ²΄λ₯Ό λμμΌλ‘ ν 쿼리λ₯Ό μμ±ν μ μμ΅λλ€.
μλ₯Ό λ€μ΄, SQLμ΄ μλ κ°μ²΄ κΈ°λ°μΌλ‘ μμ±λ JPQL 쿼리
SELECT u FROM User u WHERE u.age > 20
- μ 쿼리λ User κ°μ²΄λ₯Ό λμμΌλ‘ νλ©°, λ°μ΄ν°λ² μ΄μ€μ μμ‘΄νμ§ μμ΅λλ€.
9. μ μ°ν κ΄κ³ λ§€ν.
- JPAλ λ€μν λ°μ΄ν°λ² μ΄μ€ κ΄κ³λ₯Ό κ°μ²΄λ‘ λ§€ννλ λ°©λ²μ μ§μν©λλ€.
- μλ₯Ό λ€μ΄, 1λ1, 1λλ€, λ€λμΌ, λ€λλ€ κ΄κ³λ₯Ό κ°μ²΄ μ§ν₯μ μΌλ‘ ννν μ μμΌλ©°, μΈλ ν€(foreign key)μ κ°μ λ°μ΄ν°λ² μ΄μ€ κ΄κ³λ₯Ό κ°μ²΄ κ°μ μ°Έμ‘°λ‘ μμ°μ€λ½κ² μ²λ¦¬ν μ μμ΅λλ€.
10. νμ€νλ API.
- JPAλ μλ° EEμ νμ€ APIμ΄κΈ° λλ¬Έμ, μ¬λ¬ ꡬν체λ€(Hibernate, EclipseLink λ±)μμ λμΌν APIλ‘ λ°μ΄ν°λ² μ΄μ€ μμ μ μ²λ¦¬ν μ μμ΅λλ€.
- μ΄λ κ°λ°μλ€μ΄ νΉμ ꡬν체μ μ’ μλμ§ μκ³ μ½λλ₯Ό μμ±ν μ μλλ‘ ν΄μ€λλ€.
2οΈβ£ κ²°λ‘ .
- JPAλ₯Ό μ¬μ©νλ©΄ κ°μ²΄ μ§ν₯μ μΌλ‘ λ°μ΄ν°λ² μ΄μ€μ μνΈμμ©ν μ μμ΄, κ°λ°μλ SQL μμ± λ° λ°μ΄ν°λ² μ΄μ€ μ’ μμ±μ μ€μ΄κ³ , λΉμ¦λμ€ λ‘μ§μ μ§μ€ν μ μμ΅λλ€.
- λν λ°μ΄ν°λ² μ΄μ€ λ 립μ±, νΈλμμ κ΄λ¦¬, μΊμ±κ³Ό κ°μ κΈ°λ₯μ ν΅ν΄ μ ν리μΌμ΄μ μ±λ₯κ³Ό μ μ§λ³΄μμ±μ λμΌ μ μμ΅λλ€.
- JPQLκ³Ό κ°μ 쿼리 μΈμ΄λ₯Ό ν΅ν΄ κ°μ²΄ μ€μ¬μΌλ‘ λ°μ΄ν° μ‘°ν λ° κ΄λ¦¬λ₯Ό ν μ μμΌλ©°, λ€μν λ°μ΄ν°λ² μ΄μ€ κ΄κ³λ₯Ό μ½κ² λ§€νν μ μλ μ₯μ λ μ 곡ν©λλ€.
JPAλ μΆμν κ³μΈ΅μ μ 곡νμ¬ κ°μ²΄ μ§ν₯ μ€κ³μ λ°μ΄ν°λ² μ΄μ€ κ°μ κ°κ·Ήμ μ€μ΄κ³ , κ°λ° μμ°μ±μ ν¬κ² λμΌ μ μλ λꡬμ λλ€.