π[Spring] JPAμμ μ°κ΄κ΄κ³λ₯Ό μ¬μ©νλ κ²μ΄ νμ μ’μκΉμ?
- JPAμμ μ°κ΄κ΄κ³λ₯Ό μ¬μ©νλ κ²μ΄ λ§μ μ₯μ μ μ 곡νμ§λ§, νμ μ΅μ μ μ νμ μλ μ μμ΅λλ€.
- μν©μ λ°λΌ μ°κ΄κ΄κ³λ₯Ό μ¬μ©νμ§ μλ κ²μ΄ λ μ 리νκ±°λ, νμν κ²½μ° μ μ€νκ² μ€μ ν΄μΌ ν λλ μμ΅λλ€.
- μ°κ΄κ΄κ³μ 무λΆλ³ν μ¬μ©μ μ±λ₯ λ¬Έμ λ μ€κ³μ 볡μ‘μ±μ μ΄λν μ μκΈ° λλ¬Έμ λλ€.
- μν©μ λ°λΌ μ°κ΄κ΄κ³λ₯Ό μ¬μ©νμ§ μλ κ²μ΄ λ μ 리νκ±°λ, νμν κ²½μ° μ μ€νκ² μ€μ ν΄μΌ ν λλ μμ΅λλ€.
1οΈβ£ μ°κ΄κ΄κ³λ₯Ό μ¬μ©νμ§ μμμΌ νλ μν© λλ μ£Όμν΄μΌ ν μν©.
1οΈβ£ 볡μ‘ν μ°κ΄κ΄κ³λ‘ μΈν μ±λ₯ λ¬Έμ .
- μ°κ΄κ΄κ³κ° λ§μμ§μλ‘ SQL μ‘°μΈ μΏΌλ¦¬κ° λ³΅μ‘ν΄μ§κ³ , μ±λ₯ μ νμ μμΈμ΄ λ μ μμ΅λλ€.
- νΉν μ¦μ λ‘λ©(Eager Loading)μ λ¨μ©νλ©΄ λΆνμν λ°μ΄ν°κΉμ§ λͺ¨λ λ‘λνλ―λ‘ N+1 λ¬Έμ κ° λ°μν μ μμ΅λλ€.
- μ΄λ κ°μ²΄ κ·Έλνμ ν¬κΈ°κ° 컀μ§μλ‘ μ±λ₯μ ν¬κ² μ νμν΅λλ€.
- νμν λ°μ΄ν°λ§ μ‘°νν΄μΌ ν κ²½μ° μ°κ΄κ΄κ³λ₯Ό νΌνκ³ νμν μ 보λ§μ κ°μ Έμ€λ JPQLμ΄λ λ€μ΄ν°λΈ 쿼리λ₯Ό μ¬μ©νλ κ²μ΄ λ λμ μ μμ΅λλ€.
πββοΈ κ°μ²΄ κ·Έλν(Object Graph)
κ°μ²΄λ€ κ°μ κ·Έλνλ‘ ννν κ²μ μλ―Έν©λλ€.
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμ κ°μ²΄λ λ€λ₯Έ κ°μ²΄μ μ°κ΄ κ΄κ³λ₯Ό κ°μ§ μ μλλ°, μ΄λ¬ν κ°μ²΄λ€μ΄ μλ‘ μ°Έμ‘°νλ©΄μ ꡬμ±λ μ°κ²° ꡬ쑰λ₯Ό κ·Έλν ννλ‘ λνλΈ κ²μ΄ κ°μ²΄ κ·Έλνμ λλ€.
κ°μ²΄ κ·Έλν(Object Graph)λ νΉμ κ°μ²΄λ₯Ό μ‘°νν λ μ°κ΄λ λ€λ₯Έ κ°μ²΄λ€κΉμ§ ν¨κ» νμνκ² λλ ꡬ쑰λ₯Ό 보μ¬μ€λλ€.
πββοΈ JPQL(Java Persistence Query Language)
JPA(Java Persistence API)μμ μν°ν° κ°μ²΄λ₯Ό λμμΌλ‘ νλ 쿼리 μΈμ΄μ λλ€.
JPQLμ SQLκ³Ό λΉμ·ν λ¬Έλ²μ μ¬μ©νμ§λ§, λ°μ΄ν°λ² μ΄μ€μ ν μ΄λΈμ΄ μλ μν°ν° κ°μ²΄λ₯Ό λμμΌλ‘ 쿼리λ₯Ό μμ±νλ μΈμ΄μ λλ€.
μ΄λ₯Ό ν΅ν΄ JPAλ₯Ό μ¬μ©νλ μ ν리μΌμ΄μ μ΄ λ°μ΄ν°λ² μ΄μ€μ λ 립μ μΈ μΏΌλ¦¬λ₯Ό μμ±νκ³ μ€νν μ μμ΅λλ€.
2οΈβ£ μ°κ΄κ΄κ³λ‘ μΈν 볡μ‘ν νΈλμμ κ΄λ¦¬.
- μ°κ΄κ΄κ³κ° μ½ν μνμμ νΈλμμ μ μ²λ¦¬ν λ, μν°ν° κ° λ°μ΄ν° μΌκ΄μ±μ μ μ§νκΈ° μν κ΄λ¦¬κ° 볡μ‘ν΄μ§ μ μμ΅λλ€.
- Cascade μ΅μ μ΄λ orphanRemoval μ΅μ μ μ€μ νμ¬ λΆλͺ¨-μμ μν°ν°μ μλͺ μ£ΌκΈ°λ₯Ό ν¨κ» κ΄λ¦¬ν μ μμ§λ§, μλͺ»λ μ€μ μΌλ‘ μΈν΄ μλμΉ μμ λ°μ΄ν° μμ λ λ°μ΄ν° μΌκ΄μ± λ¬Έμ κ° λ°μν μ μμ΅λλ€.
3οΈβ£ νμ μ΄μμ μ‘°μΈ ν μ΄λΈ μμ±.
- λ€λλ€(N:M) κ΄κ³λ₯Ό μ§μ μ°κ΄κ΄κ³λ‘ μ€μ νλ©΄ μλμΌλ‘ μ‘°μΈ ν μ΄λΈμ΄ μμ±λλλ°, μ΄λ‘ μΈν΄ μ±λ₯ μ ν λ° μΏΌλ¦¬ μ΅μ νκ° μ΄λ €μμ§ μ μμ΅λλ€.
- μ€λ¬΄μμλ λ€λλ€ κ΄κ³λ₯Ό μ§μ μ¬μ©ν기보λ€λ μ‘°μΈ ν μ΄λΈμ μν°ν°λ‘ λΆλ¦¬νμ¬ λ€λμΌ(N:1) λ° μΌλλ€(1:N) κ΄κ³λ‘ λλμ΄ κ΄λ¦¬νλ λ°©μμ΄ λ κΆμ₯λ©λλ€.
4οΈβ£ μ°κ΄κ΄κ³λ‘ μΈν λ°μ΄ν° μμ‘΄μ±.
- μ°κ΄κ΄κ³λ₯Ό ν΅ν΄ κ°μ²΄ κ°μ μμ‘΄μ±μ λμ΄λ©΄, λ¨μΌ μν°ν°μ λ
립μ μΈ μ¬μ©μ΄ μ΄λ €μμ§ μ μμ΅λλ€.
- μλ₯Ό λ€μ΄ Orderμ Customerκ° κ°νκ² μ°κ²°λ μνμμλ Orderλ₯Ό μ‘°νν λ νμ Customerμ κ΄λ ¨λ λ°μ΄ν°λ ν¨κ» μ‘°νλ μ μμ΅λλ€.
- μ΄λ μλ‘ λ€λ₯Έ λλ©μΈ λ‘μ§μ μν₯μ λ―ΈμΉ μ μμ΅λλ€.
- μλ₯Ό λ€μ΄ Orderμ Customerκ° κ°νκ² μ°κ²°λ μνμμλ Orderλ₯Ό μ‘°νν λ νμ Customerμ κ΄λ ¨λ λ°μ΄ν°λ ν¨κ» μ‘°νλ μ μμ΅λλ€.
5οΈβ£ λ¨μν κ° μ‘°νμ κ²½μ°.
- λ¨μν IDλ§ νμνκ±°λ κ°λ¨ν μ‘°νλ₯Ό ν΄μΌ νλ κ²½μ°μλ κ΅³μ΄ μ°κ΄κ΄κ³λ₯Ό μ€μ νμ¬ κ°μ²΄λ₯Ό μ°Έμ‘°νλ κ²μ κ³Όλν μ μμ΅λλ€.
- μ΄ κ²½μ°μλ μ°κ΄κ΄κ³λ₯Ό μ€μ νμ§ μκ³ , IDλ₯Ό ν΅ν΄ νμν λ°μ΄ν°λ₯Ό μ‘°ννκ±°λ DTOλ₯Ό μ¬μ©νμ¬ νμν λ°μ΄ν°λ§ κ°μ Έμ€λ κ²μ΄ λ λμ μ μμ΅λλ€.
6οΈβ£ API μλ΅ μ λ°μ΄ν° κ³Όλ€ λ‘λ© λ¬Έμ .
- REST API κ°λ° μ μ°κ΄κ΄κ³λ₯Ό μ€μ νλ©΄, μ§λ ¬ν κ³Όμ μμ μλ°©ν₯ κ΄κ³μ μν 무ν 루νλ κ³Όλν λ°μ΄ν° λ‘λ©μ΄ λ°μν μ μμ΅λλ€.
- μ΄λ₯Ό λ°©μ§νκΈ° μν΄ λ¨λ°©ν₯ μ°κ΄κ΄κ³λ‘ μ€κ³νκ±°λ, νμν κ²½μ° DTO(Data Transfer Object)λ₯Ό μ¬μ©ν΄ νμν λ°μ΄ν°λ§ μ νμ μΌλ‘ μ λ¬νλ λ°©λ²μ΄ λ μ μ ν μ μμ΅λλ€.
πββοΈ DTO(Data Transfer Object)
DTO(Data Transfer Object)λ λ°μ΄ν° μ μ‘ κ°μ²΄λΌλ λ»μΌλ‘, μ ν리μΌμ΄μ μ μ¬λ¬ κ³μΈ΅ κ°μ λ°μ΄ν°λ₯Ό μ λ¬νκΈ° μν΄ μ¬μ©νλ κ°μ²΄μ λλ€.
μ£Όλ‘ λ°μ΄ν°λ₯Ό μ΄λ°νλ μν μ νλ©°, λ‘μ§μ΄λ κΈ°λ₯ μμ΄ μμνκ² λ°μ΄ν°λ§μ ν¬ν¨νκ³ μμ΅λλ€.
DTO(Data Transfer Object)λ μΌλ°μ μΌλ‘ λΉμ¦λμ€ λ‘μ§μ΄ μλ μν°ν° κ°μ²΄μ λΆλ¦¬νμ¬, νμν λ°μ΄ν°λ§ μΆμΆνμ¬ μ μ‘νκ±°λ λ°μμ€λ λ° μ¬μ©λ©λλ€.
7οΈβ£ μΊμ±κ³Όμ μΆ©λ.
- μ°κ΄κ΄κ³κ° λ§μ κ²½μ°, μΊμ± μμ€ν
κ³Ό μΆ©λν μ μμΌλ©°, λ°μ΄ν°μ κ°±μ μμ μ΄λ μ‘°ν μμ μμ μΊμ λ°μ΄ν°μ μ€μ λ°μ΄ν° κ°μ μΌκ΄μ±μ κ΄λ¦¬νκΈ° μ΄λ €μΈ μ μμ΅λλ€.
- νΉν μ§μ° λ‘λ©(Lazy Loading)κ³Ό μΊμ±μ ν¨κ» μ¬μ©ν κ²½μ° μμμΉ λͺ»ν μΏΌλ¦¬κ° λ°μνκ±°λ, μΊμμμ μλͺ»λ λ°μ΄ν°κ° λ°νλ κ°λ₯μ±μ΄ λμ΅λλ€.
2οΈβ£ μ°κ΄κ΄κ³ μ¬μ© μ μ£Όμμ¬ν.
1οΈβ£ νμν κ²½μ°μλ§ μ¬μ©.
- μ°κ΄κ΄κ³λ νμν κ²½μ°μλ§ μ€μ νκ³ , κ°λ₯ν ν λ¨μν κ΄κ³λ‘ μ μ§νλ κ²μ΄ μ’μ΅λλ€.
2οΈβ£ μ§μ° λ‘λ©(Lazy Loading)μ κΈ°λ³ΈμΌλ‘ μ€μ .
- μ¦μ λ‘λ©(Eager Loading)μ N+1 λ¬Έμ λ₯Ό μΌμΌν¬ μ μμΌλ―λ‘, κΈ°λ³Έμ μΌλ‘ μ§μ° λ‘λ©(Lazy Loading)μ μ¬μ©νκ³ , νμν λ νμΉ μ‘°μΈ(Fetch Join)μ΄λ μ§μ μ μΈ JPQL μΏΌλ¦¬λ‘ νμν λ°μ΄ν°λ₯Ό κ°μ Έμ€λ κ²μ΄ μ’μ΅λλ€.
πββοΈ N+1 λ¬Έμ
N+1 λ¬Έμ λ JPAμ κ°μ ORM(Object-Relational Mapping) λꡬλ₯Ό μ¬μ©ν λ μ°κ΄λ λ°μ΄ν°λ₯Ό μ‘°ννλ κ³Όμ μμ λΆνμνκ² λ§μ μΏΌλ¦¬κ° μ€νλλ λ¬Έμ λ₯Ό μλ―Έν©λλ€.
μ£Όλ‘ μ§μ° λ‘λ©(Lazy Loading) μ€μ μ΄ μλ μ°κ΄ κ΄κ³μμ λ°μνλ©°, νλμ λ°μ΄ν°λ₯Ό μ‘°νν λ μΆκ°λ‘ μ°κ΄λ λ°μ΄ν°λ₯Ό κ°κ° μ‘°ννλλΌ N+1κ°μ μΏΌλ¦¬κ° μ€νλλ νμμ λ§ν©λλ€.
3οΈβ£ λ¨λ°©ν₯ μ°κ΄κ΄κ³ μ°μ .
- μλ°©ν₯ κ΄κ³λ μλ‘ κ°μ μ°Έμ‘°λ‘ μΈν΄ 볡μ‘μ±μ΄ μ¦κ°ν μ μμΌλ―λ‘, λ¨λ°©ν₯ μ°κ΄κ΄κ³λ₯Ό μ°μ μ μΌλ‘ μ¬μ©νκ³ , μ λ§ νμν κ²½μ°μλ§ μλ°©ν₯ μ°κ΄κ΄κ³λ₯Ό μ€μ ν©λλ€.
4οΈβ£ μ‘°ν μ μ© μ°κ΄κ΄κ³.
- μ°κ΄κ΄κ³λ₯Ό μ¬μ©νλ κ²½μ°, λ°μ΄ν°μ λ³κ²½μ΄ νμ μλ€λ©΄ μ½κΈ° μ μ©μΌλ‘ μ€μ νμ¬ λ³κ²½ μμ μ μ±λ₯ λ¬Έμ λ λ¬΄κ²°μ± λ¬Έμ κ° λ°μνμ§ μλλ‘ ν©λλ€.
3οΈβ£ μμ½.
- μ°κ΄κ΄κ³λ κ°μ²΄ κ°μ κ΄κ³λ₯Ό μμ°μ€λ½κ² νννκ³ μ½λμ μ§κ΄μ±μ λμ΄μ§λ§, μλͺ»λ μ€μ μ΄λ κ³Όλν μ¬μ©μ μ±λ₯ μ νμ 볡μ‘μ±μ μ΄λν μ μμ΅λλ€.
- μν©μ λ°λΌ μ°κ΄κ΄κ³λ₯Ό λ¨μννκ±°λ νμν λ°μ΄ν°λ§ μ§μ μ‘°ννλ λ°©μλ κ³ λ €ν΄μΌ νλ©°, νΉν νΈλμμ κ΄λ¦¬μ λ°μ΄ν° μΌκ΄μ± μ μ§μ μ£Όμν΄μΌ ν©λλ€.