[JPA] could not initialize proxy - no Session
1. λ°μ
κΉμν κ°λ°μλμ JPA μλ¦¬μ¦ μκ° ν 볡μ΅μ κ²Ένμ¬ κ°μΈ νλ‘μ νΈλ₯Ό μ§ννλ λμ€ λ―μ΄ μ΅μ μμΈκ° λ°μνλ€.
λ°λ‘ could not initialize proxy - no Session μμΈμΈλ°, κ΄λ ¨ μ 보λ₯Ό μ°Ύμλ³΄λ€ λ³΄λ JPA κΈ°λ³ΈνΈ μμ μμ ν΄λΉ μλ¬μ λν΄ βJPAλ₯Ό μ¬μ©ν΄μ κ°λ°νμλ€ λ³΄λ©΄ λ°λμ νλ²μ λ§μ£ΌμΉ μλ¬β λΌκ³ λ§μνμ ¨λ λ΄μ©μ΄ κΈ°μ΅μ΄ λ μ¬λλ€.
λ§μ μ²μ μλ¬λ₯Ό λ°κ²¬νκ³ λμλ κ°μμμ λ€μλ λ΄μ©μ΄ κΈ°μ΅μ΄ κ°λ¬Όκ°λ¬Ό νμλ ν°λΌ νλ² μ 리λ₯Ό ν΄λκ³ μ κΈ°λ‘μ λ¨κΈ΄λ€.
2. μμΈ
2-1. ν΄λΉ μλ¬μ μμΈ
μλ¬μ μμΈμ λ€μκ³Ό κ°λ€.
-
μν°ν°μ μ‘°μΈ κ΄κ³μμ μ§μ° λ‘λ©μ μ¬μ©νλ νλ(FetchType.LAZY) κ° μλ μν°ν°λ₯Ό μ‘°ν μ, ν΄λΉ μν°ν° κ°μ²΄μ νλ‘μ κ°μ²΄κ° λ°νλλ€.
-
μμμ± μ»¨ν μ€νΈ λ²μ λ°μμ μμ νλ‘μ κ°μ²΄κ° μ‘°μΈ λ μ°κ΄ κ΄κ³ νλλ₯Ό μ‘°ννλ €κ³ νλ©΄ ν΄λΉ μλ¬κ° λ°μνλ€.
2-2. μλ¬ λ°μ μ μν©
- μλ¬κ° λ°μν λΆλΆμ μν°ν° μ°κ΄ κ΄κ³λ νμκ³Ό νμ-κ·Έλ£Ή (1:N) κ΄κ³μ΄λ€.
- νΉμ API μμ² μ Filter μμ μΈκ°(Authorization) ν ν°μΌλ‘ νμμ κ΄ν μμ κ·Έλ£Ή μ 보λ₯Ό μ‘°ννλ€.
- μμ² μ€λ λ 컨ν μ€νΈμ νμ μ 보λ₯Ό μ μ₯νκΈ° μν΄ Entity μ 보λ₯Ό DTO λ‘ λ³ν νλ€.
- DTO λ³ν κ³Όμ μμ μμμ± μ»¨ν μ€νΈλ₯Ό λΉ μ Έλμ¨ μν°ν° νλ‘μ κ°μ²΄κ° μμ κ·Έλ£Ή μ 보λ₯Ό μμ²νλ€.
3. ν΄κ²° λ°©λ²
κ²°κ΅ μ μ€λ₯λ νλ‘μ κ°μ²΄κ° μμμ± μ»¨ν μ€νΈ λ²μ λ°μμ μ§μ° λ‘λ© νλμ κ°μ μμ² νμ λ λ°μνλ μ€λ₯μ΄λ―λ‘ ν΄κ²° λ°©λ²μ ν¬κ² μΈκ°μ§λ‘ λλ μ μλ€.
3-1. μμμ± μ»¨ν μ€νΈ λ²μ λ΄μμ νμν κ°μ μ¬μ©νλ€. (μ κ²½μ°μλ DTO λ³ν)
ꡬ쑰μ μΌλ‘ κΉλν΄μ§λ μ΄μ μ μκ² μ§λ§, λ§μ½ μμ£Ό νΈμΆλλ 쿼리λΌλ©΄ νΈμΆμλ§λ€ LAZY νμ μ νλλ₯Ό λ°λ³΅ν΄μ μΆκ°λ‘ μ‘°ννλ N+1 λ¬Έμ κ° λ°μν μ μλ€.
3-2. FetchType μ EAGER λ‘ λ³κ²½νλ€. (νλ‘μ κ°μ²΄ μ¬μ© X)
νλ FetchType μ체λ₯Ό λ°κΎΈμ΄ λ²λ¦¬λ λ°©λ²μΈλ°, μ΄λ ν΄λΉ μ°κ΄ κ΄κ³ νλμ μ‘°μΈ μ λ³΄κ° νμ μλ κ²½μ°μλ κ³μν΄μ Join μΌλ‘ λ°μ΄ν°λ₯Ό κ°μ Έμ€κΈ° λλ¬Έμ λΆνμν μμλ₯Ό λ°μμν¬ μ μλ€.
3-3. FetchJoin μ μ¬μ©νλ€.
κ°μ₯ μ μ μμ λ²μ λ΄μμ μ¬λ¬ λ¬Έμ λ₯Ό λμμ ν΄κ²°ν μ μλ λ°©λ²μ΄λ€. Β μμ Jpa μ κ²½μ° JPQL λ¬Έλ²μμ join
λμ join fetch
λ₯Ό, data jpa μ¬μ©μμλ @EntityGraph
μ λ
Έν
μ΄μ
μ, QueryDSL μ¬μ©μμλ .fetchJoin()
λ©μλ 체μ΄λμ ν΅ν΄ μ μ© κ°λ₯νλ€.