π€ OSIVμ λν΄ μμ보기 μ .. Persistence Context λ₯Ό λͺ¨λ₯Έλ€λ©΄?
π€§ OSIV μμ½
νΉμ§
- OSIVλ ν΄λΌμ΄μΈνΈ μμ²μ΄ λ€μ΄μ¬ λ μμμ± μ»¨ν
μ€νΈλ₯Ό μμ±ν΄μ μμ²μ΄ λλ λκΉμ§ κ°μ μμμ± μ»¨ν
μ€λ₯Ό μ μ§νλ€.
λ°λΌμ ν λ² μ‘°νλ μν°ν°λ μμ²μ΄ λλ λκΉμ§ μμ μνλ₯Ό μ μ§νλ€. - μν°ν° μμ μ νΈλμμ μ΄ μλ κ³μΈ΅(μλΉμ€, λ ν¬μ§ν 리 κ³μΈ΅)μμλ§ λμνλ€. νΈλμμ μ΄ μλ νλ μ ν μ΄μ κ³μΈ΅μ μ§μ° λ‘λ©μ ν¬ν¨ν΄ μ‘°νλ§ ν μ μλ€.
λ¨μ
- μμμ± μ»¨ν μ€νΈμ DB 컀λ₯μ μ 1:1λ‘ λ¬Όκ³ μλ κ΄κ³μ΄κΈ° λλ¬Έμ νλ μ ν μ΄μ λ‘μ§κΉμ§ DB 컀λ₯μ μμμ λλΉνκ² λλ€.
- OSIVλ₯Ό μ μ©νλ©΄ κ°μ μμμ± μ»¨ν μ€νΈλ₯Ό μ¬λ¬ νΈλμμ μ΄ κ³΅μ νκ²λ μλ μλ€.
- νλ μ ν μ΄μ μμ μν°ν°λ₯Ό μμ νκ³ λΉμ¦λμ€ λ‘μ§μ μννλ©΄ μν°ν°κ° μμ λ μ μλ€.
- νλ μ ν
μ΄μ
κ³μΈ΅μμ λ λλ§ κ³Όμ μμ μ§μ° λ‘λ©μ μν΄ SQLμ΄ μ€νλλ€.
λ°λΌμ μ±λ₯ νλμμ νμΈν΄μΌ ν λΆλΆμ΄ λμ΄μ§λ€.
μ€νλ§μ κΈ°λ³ΈμΌλ‘ νΈλμμ λ²μμ μμμ± μ»¨ν μ€νΈ μ λ΅μ μ¬μ©νλ€.
- λΉμμ
- μμμ± μ»¨ν μ€νΈμ μ ν κ΄κ³κ° μλ μλ‘μ΄ μν
- κ°μ²΄λ₯Ό μμ±λ§ ν μν
- μμ
- μμμ± μ»¨ν μ€νΈμ κ΄λ¦¬λλ μν
- κ°μ²΄ μμ± ν em.persist(member)λ‘ μ μ₯ν μν
- μ€μμ
- μμμ± μ»¨ν μ€νΈμ μ μ₯λμλ€κ° λΆλ¦¬λ μν
- em.detach(member)λ‘ μμμ΄ λΆλ¦¬λ μν
- μμ
- μμ λ μν
- em.remove(member)λ‘ μꡬ μ μ₯ν λ°μ΄ν°λ² μ΄μ€λ₯Ό μ§μ°λ μν
π€ λΉμμκ³Ό μ€μμ μνμ μ°¨μ΄μ μ΄ λκΉ?
λμ κ°μ₯ ν° μ°¨μ΄λ νλ² μμ μνκ° λ μ μ΄ μλκ° μλκ°μ μ°¨μ΄
μμ μνκ° λλ €λ©΄ μλ³μκ° λ°λμ μ‘΄μ¬ν΄μΌνκΈ° λλ¬Έμ μμ μνκ° λμλ€κ° λ€μ μ€μμ μνκ° λλ©΄ μλ³μκ° νμ μ‘΄μ¬νλ€.
ex) μν°ν° μ‘°ν ν νΈλμμ μ΄ λλ μμμ± μ»¨ν μ€νΈκ° μ¬λΌμ§λ κ²½μ° μ‘°νν μν°ν°κ° μ€μμ μνκ° λ¨
νΈλμμ μ λ³΄ν΅ μλΉμ€ κ³μΈ΅μμ μμλκΈ° λλ¬Έμ μλΉμ€ κ³μΈ΅μ΄ λλλ μμ μ νΈλμμ μ΄ μ’ λ£λμ΄ μμμ± μ»¨ν μ€νΈλ μ’ λ£λλ€.
νΈλμμ μ»€λ° μ JPAλ μμμ± μ»¨ν μ€νΈλ₯Ό λ¨Όμ flush ν΄ λ³κ²½ λ΄μ©μ DBμ λ°μν ν DB νΈλμμ μ 컀λ°νλ€.
(μμΈκ° λ°μν΄ νΈλμμ μ΄ λ‘€λ°± ν μ’ λ£λ κ²½μ° flush νΈμΆ X)
λ°λΌμ νΈλμμ μ΄ μλ νλ μ ν μ΄μ κ³μΈ΅(Controller)μμ μ‘°νν μν°ν°λ μ€μμ μνκ° λλ€.
→ μ€μμ μνκ° λ κ²½μ° λ³κ²½ κ°μ§μ μ§μ° λ‘λ©μ΄ λμνμ§ μλλ€.
π λ³κ²½ κ°μ§κ° μλλ©΄ μ΄λ€ μΌμ΄ λ²μ΄μ§λμ?
λ³΄ν΅ λ³κ²½ κ°μ§ κΈ°λ₯μ μλΉμ€ κ³μΈ΅μμ λΉμ¦λμ€ λ‘μ§μ μννλ©΄μ λ°μνκ³
λ¨μν λ°μ΄ν°λ₯Ό 보μ¬μ£Όλ μ©λμΈ νλ μ ν μ΄μ κ³μΈ΅μμ λ°μ΄ν°λ₯Ό μμ ν μΌμ κ±°μ μκΈ° λλ¬Έμ ν° λ¬Έμ κ° λμ§λ μλλ€.
π₯Ή μ§μ° λ‘λ©μ..?
μ€μμ μνμμ μ§μ° λ‘λ©μ΄ λμνμ§ μλ κ²μ λ¬Έμ κ° λλ€..
μλ₯Όλ€μ΄ νλ μ ν μ΄μ κ³μΈ΅μμ μ°κ΄λ μν°ν°λ ν¨κ» μ¬μ©ν΄μΌ λλλ° ν΄λΉ μν°ν°λ₯Ό μ§μ° λ‘λ©μΌλ‘ μ€μ νμ κ²½μ° LazyInitializationException μμΈκ° λ°μνλ€.
@Entity
public class ReviewImage {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String imageUrl;
@ManyToOne(fetch = FetchType.LAZY) // μ§μ° λ‘λ©
private Review review;
}
μμ κ°μ΄ 리뷰 μ΄λ―Έμ§ μν°ν°μμ 리뷰 μν°ν°λ₯Ό μ§μ° λ‘λ©μΌλ‘ μ€μ ν κ²½μ° μμ§ μ΄κΈ°ννμ§ μμ νλ‘μ κ°μ²΄λ₯Ό μ‘°ννκΈ° λλ¬Έμ 컨νΈλ‘€λ¬λ λ·°μ μ§μ° λ‘λ© μμ μμ μμΈκ° λ°μνλ€.
class ReviewController {
public String view(Long reviewId) {
Review review = reviewService.findOne(reviewId);
ReviewImage reviewImage = review.getReview();
reviewImage.getImageUrl(); // μ§μ° λ‘λ© μ μμΈ λ°μ
}
}
μ€μμ μνμμ μ§μ° λ‘λ© λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²
π λ·°κ° νμν μν°ν° 미리 λ‘λ©ν΄λκΈ°
1οΈβ£ κΈλ‘λ² νμΉ μ λ΅μ μ¦μ λ‘λ©μΌλ‘ μμ
@Entity
public class ReviewImage {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String imageUrl;
@ManyToOne(fetch = FetchType.EAGER) // μ¦μ λ‘λ© μ λ΅
private Review review;
}
μ ν리μΌμ΄μ μ 체μμ μν°ν°λ₯Ό λ‘λ©ν λλ§λ€ ν΄λΉ μν°ν°μ fetch νμ μΌλ‘ μ§μ ν μ λ΅μ μ¬μ©νλ―λ‘ κΈλ‘λ² νμΉ μ λ΅μ΄λΌ νλ€.
κΈλ‘λ² νμΉ μ λ΅μ FetchType.EAGERλ‘ μ€μ νκ³ ReviewImage μν°ν° μ‘°ν μ μ°κ΄λ review μν°ν°λ νμ ν¨κ» λ‘λ©νλ€. λ°λΌμ μ€μμ μνκ° λμ΄λ reviewλ₯Ό μ¬μ©ν μ μλ€.
νμ§λ§ μ΄λ κ² μ¦μ λ‘λ©μΌλ‘ κΈλ‘λ² νμΉ μ λ΅μ μ¬μ© μ μ¬μ©νμ§ μλ μν°ν°λ₯Ό νμ λ‘λ©ν΄μ€λ λ¬Έμ μ N+1 λ¬Έμ κ° λ°μνλ€.
π€§ N+1 λ¬Έμ λ?
select p.*, m.*
from Post p
left outer join Member m on p.MEMBER_ID=m.MEMBER_ID
where p.id=1
em.findλ‘ post μν°ν° μ‘°ν μ μ¦μ λ‘λ©μΌλ‘ μ€μ ν member μν°ν°λ₯Ό JOIN μΏΌλ¦¬λ‘ ν¨κ» μ‘°ννλ€.
μ΄λ₯Ό JPQLλ‘ μ‘°ν μ
List<Post> posts = em.createQuery("select p from Post p", Post.class)
.getResultList(); // μ°κ΄λ λͺ¨λ μν°ν° μ‘°ν
μ€νλλ SQLμ μλμ κ°λ€.
select * from Post # JPQLλ‘ μ€νλ SQL
select * from Member where id=? # EAGERλ‘ μ€νλ SQL
select * from Member where id=? # EAGERλ‘ μ€νλ SQL
select * from Member where id=? # EAGERλ‘ μ€νλ SQL
select * from Member where id=? # EAGERλ‘ μ€νλ SQL
JPAκ° JPQLμ λΆμν΄ SQLμ μμ±ν λλ κΈλ‘λ² νμΉ μ λ΅μ μ°Έκ³ νμ§ μκ³ JPQL μμ²΄λ§ μ¬μ©νκΈ° λλ¬Έμ μ¦μ λ‘λ©μ΄λ μ§μ° λ‘λ©μ΄λ μκ΄μμ΄ SQLμ λ§λ λ€.
λ§μ½ μ‘°νν post μν°ν°κ° 20κ°μ΄λ©΄ memberλ₯Ό μ‘°ννλ SQLλ 20λ² μ€νλλ κ²μ΄λ€. μ΄λ₯Ό N+1 λ¬Έμ λΌ νλ€.
κΈλ‘λ² νμΉ μ λ΅μ μ¦μ λ‘λ©μΌλ‘ μ€μ νλ©΄ μ ν리μΌμ΄μ μ 체μ μν₯μ μ£Όλ―λ‘ λΉν¨μ¨μ μ΄λ€.
2οΈβ£ JPQL νμΉ μ‘°μΈ
νμΉ μ‘°μΈ μ¬μ© μ JPQLμ νΈμΆνλ μμ μ ν¨κ» λ‘λ©ν μν°ν°λ₯Ό μ νν μ μλ€.
νμΉ μ‘°μΈμ μ¬μ©νλ©΄ SQL JOINμ μ¬μ©ν΄ νμΉ μ‘°μΈ λμκΉμ§ ν¨κ» μ‘°ννκΈ° λλ¬Έμ N+1 λ¬Έμ κ° λ°μνμ§ μλλ€.
# JPQL
SELECT p FROM Post p JOIN FETCH p.member
# SQL
SELECT p.*, m.*
FROM Post p
JOIN Member m on p.MEMBER_ID=m.MEMBER_ID
νμ§λ§ νμΉ μ‘°μΈμ 무λΆλ³νκ² μ¬μ©νλ©΄ νλ©΄μ λ§μΆ λ ν¬μ§ν 리 λ©μλκ° μ¦κ°ν μ μκΈ° λλ¬Έμ μ μ ν μ μμ ννμ μ μ°Ύλ κ²μ΄ ν©λ¦¬μ μ΄λ€.
3οΈβ£ κ°μ μ΄κΈ°ν
κ°μ μ΄κΈ°νλ μμμ± μ»¨ν μ€νΈκ° μ΄μμμ λ νλ μ ν μ΄μ κ³μΈ΅μ΄ νμν μν°ν°λ₯Ό κ°μ λ‘ μ΄κΈ°νν΄μ λ°ννλ λ°©λ²μ΄λ€.
class ReviewService {
@Transactional
public Review findReview(id) {
Review review = reviewRepository.findReview(id);
review.getReviewImage().getUrl(); // νλ‘μ κ°μ²΄ κ°μ μ΄κΈ°ν
return review;
}
}
κΈλ‘λ² νμΉ μ λ΅μ μ§μ° λ‘λ©μΌλ‘ μ€μ μ μ°κ΄λ μν°ν°λ μ€μ μν°ν°κ° μλ νλ‘μ κ°μ²΄λ‘ μ‘°νλλ©°, νλ‘μ κ°μ²΄λ μ€μ μ¬μ©νλ μμ μ μ΄κΈ°νλλ€.
λ°λΌμ μμ²λΌ νλ μ ν μ΄μ κ³μΈ΅μμ νμν νλ‘μ κ°μ²΄λ₯Ό μλΉμ€ κ³μΈ΅μμ μμμ± μ»¨ν μ€νΈκ° μ΄μ μμ λ κ°μ λ‘ μ΄κΈ°νν΄ λ°ννλ©΄ μ΄λ―Έ μ΄κΈ°ννκΈ° λλ¬Έμ μ€μμ μνμμ μ΄κΈ°νν μ μλ€.
νμ§λ§ νλ‘μλ₯Ό μ΄κΈ°ννλ μν μ μλΉμ€ κ³μΈ΅μ΄ λ΄λΉνλ©΄ λ·°κ° νμν μν°ν°μ λ°λΌ μλΉμ€ κ³μΈ΅μ λ‘μ§μ λ³κ²½ν΄μΌ λκΈ° λλ¬Έμ νλ μ ν μ΄μ κ³μΈ΅μ΄ μλΉμ€ κ³μΈ΅μ μΉ¨λ²νλ μν©μ΄ λ°μνλ€.
λ°λΌμ μλΉμ€ κ³μΈ΅μμ νλ μ ν μ΄μ κ³μΈ΅μ μν νλ‘μ μ΄κΈ°ν μν μ λΆλ¦¬νλ FACADE κ³μΈ΅μ μΆκ°ν΄ μ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
λ·°λ₯Ό μν νλ‘μ μ΄κΈ°νλ₯Ό FACADE κ³μΈ΅μμ λ΄λΉν΄ μλΉμ€ κ³μΈ΅κ³Ό νλ μ ν μ΄μ κ³μΈ΅ μ¬μ΄ λ Όλ¦¬μ μμ‘΄μ±μ λΆλ¦¬ν μ μμ§λ§ μ€μ©μ μΈ κ΄μ μμ λ³Ό λ μ€κ°μ κ³μΈ΅μ΄ νλ λ λΌμ΄ κ²°κ΅ λ λ§μ μ½λλ₯Ό μμ±ν΄μΌ λλ λ¨μ μ΄ μλ€.
βοΈ OSIVλ₯Ό μ¬μ©ν΄ μν°ν°λ₯Ό νμ μμ μνλ‘ μ μ§νκΈ°
μκΉ νΈλμμ μ΄ μλ νλ μ ν μ΄μ κ³μΈ΅(Controller)μμ μ‘°νν μν°ν°λ μ€μμ μνκ° λλ€λ λ§μ λ κΉκ² νκ³ λ€μ΄λ³΄μ
OSIVλ μμ²μ΄ μ²λ¦¬λλ λμ μμμ± μ»¨ν μ€νΈλ₯Ό μ΄μ΄λκ³ νΈλμμ λ²μλ₯Ό λμ΄μ λ μ΄μ΄κΉμ§ μ°κ΄λ μν°ν°λ₯Ό λ‘λ©ν μ μλλ‘ νλ€.
OSIVκ° trueAPIμΌ κ²½μ° ν΄λΌμ΄μΈνΈμκ² μλ΅λ λκΉμ§, ViewμΌ κ²½μ° Viewκ° λ λλ§λ λκΉμ§ μμμ± μ»¨ν μ€νΈκ° μ΄μμλ€.
π± λΉμ¦λμ€ κ³μΈ΅μμ νΈλμμ μ μ¬μ©νλ OSIVμ λμ μ리 π±
1. ν΄λΌμ΄μΈνΈμ μμ²μ΄ λ€μ΄μ€λ©΄ μλΈλ¦Ώ νν°λ, μ€νλ§ μΈν°μ ν°μμ μμμ± μ»¨ν μ€νΈλ₯Ό μμ± λ¨, νΈλμμ μ μμνμ§ μμ
2. μλΉμ€ κ³μΈ΅μμ @Transactionalλ‘ νΈλμμ μ μμν λ 1λ²μμ 미리 μμ±ν΄λ μμμ± μ»¨ν μ€νΈλ₯Ό μ°Ύμμ νΈλμμ μμ
3. μλΉμ€ κ³μΈ΅μ΄ λλλ©΄ νΈλμμ commit, μμμ± μ»¨ν μ€νΈ flush
μ΄λ νΈλμμ μ λλ΄μ§λ§ μμμ± μ»¨ν μ€νΈλ μ’ λ£νμ§ μμ
4. 컨νΈλ‘€λ¬μ λ·°κΉμ§ μμμ± μ»¨ν μ€νΈκ° μ μ§λλ―λ‘ μ‘°νν μν°ν°λ μμ μν μ μ§μ€
5. μλΈλ¦Ώ νν°λ, μ€νλ§ μΈν°μ ν°λ‘ μμ²μ΄ λμμ€λ©΄ μμμ± μ»¨ν μ€νΈ μ’ λ£.
μ΄λ flushλ₯Ό νΈμΆνμ§ μκ³ λ°λ‘ μ’ λ£
βοΈ νΈλμμ κ³Ό μμμ± μ»¨ν μ€νΈ
- μμμ± μ»¨ν μ€νΈλ νΈλμμ λ²μ μμμ μν°ν°λ₯Ό μ‘°ννκ³ μμ ν μ μλ€.
- μμμ± μ»¨ν μ€νΈλ νΈλμμ λ²μ λ°μμ μν°ν°λ₯Ό μ‘°νλ§ ν μ μλ€. (νΈλμμ μμ΄ μ½κΈ°: Nontransactional reads)
βοΈ μ€νλ§μ΄ μ 곡νλ OSIV νΉμ§
- μμμ± μ»¨ν μ€νΈλ₯Ό νλ μ ν μ΄μ κ³μΈ΅κΉμ§ μ μ§νλ€.
- νλ μ ν μ΄μ κ³μΈ΅μ νΈλμμ μ΄ μκΈ° λλ¬Έμ μν°ν°λ₯Ό μμ ν μ μλ€.
- νλ μ ν μ΄μ κ³μΈ΅μμ νΈλμμ μμ΄ μ½κΈ°λ₯Ό μ¬μ©ν΄ μ§μ° λ‘λ©μ ν μ μλ€.(νλ‘μ κ°μ²΄ μ΄κΈ°ν κ°λ₯)
- μν°ν°κ° μ€μμ μνμ¬μ λ°μνλ λ¬Έμ ν΄κ²°
- OSIVκ° μΌμ ΈμμΌλ©΄ μμ² λΉ μν°ν° 맀λμ λ ν λ² μμ±λκ³ , λ·° λ λλ§μ΄ λλ λκΉμ§ μν°ν° 맀λμ λ μ’ λ£λμ§ μμ
λν νΈλμμ μ΄ λ€λ₯΄λλΌλ 1μ°¨ μΊμ 곡μ
λ§μ½ νΈλμμ λ²μ λ°μΈ 컨νΈλ‘€λ¬μ λ·°μμ μν°ν°λ₯Ό μμ ν΄λ μμμ± μ»¨ν μ€νΈμ λ³κ²½ κ°μ§μ μν λ°μ΄ν° μμ μ΄ λ€μ λκ°μ§ μ΄μ λ‘ λμνμ§ μλλ€.
- μμμ± μ»¨ν μ€νΈμ λ³κ²½ λ΄μ©μ DBμ λ°μνλ €λ©΄ μμμ± μ»¨ν μ€νΈλ₯Ό flush ν΄μΌ νλ€. μ€νλ§μ΄ μ 곡νλ OSIVλ μμ²μ΄ λλλ©΄ flushλ₯Ό νΈμΆνμ§ μκ³ em.close()λ‘ μμμ± μ»¨ν μ€νΈλ§ μ’ λ£μμΌ λ²λ¦°λ€.
- νλ μ ν μ΄μ κ³μΈ΅μμ em.flush()λ₯Ό νΈμΆνμ¬ κ°μ λ‘ flush ν΄λ νΈλμμ λ²μ λ°μ΄λ―λ‘ λ°μ΄ν°λ₯Ό μμ ν μ μλ€λ μμΈκ° μΌμ΄λλ€. → javax.persistence.TransactionRequiredException
π€ νΈλμμ μ΄ λλλ connectionμ΄ λ°λ©λμ§ μλλ€κ³ ?
JPAμ open-in-view μ€μ μ΄ trueμΌ κ²½μ° apiμ μμ²λΆν° μλ΅κΉμ§ μμμ± μ»¨ν μ€νΈκ° μ μ§λλ€.
μ€νλ§ λΆνΈμμλ open-in-view μμ±μ default κ°μ΄ trueμ΄κΈ° λλ¬Έμ νΈλμμ μ΄ λλλ DB connectionμ΄ λ°λ©λμ§ μλ κ²μ΄λ€.
π€© OSIV μ¬μ©μ μ£Όμμ
μ€μ μ μ무κ²λ 건λλ¦¬μ§ μκ³ κΈ°λ³Έκ°μΌλ‘ μ ν리μΌμ΄μ μ ꡬλνλ©΄ μ ν리μΌμ΄μ μμ μ μμμ 보μ΄λ WARN λ‘κ·Έκ° λ¬λ€.
μμμ μ€λͺ νλ―μ΄ νλ‘μλ₯Ό μ΄κΈ°ννλ μμ μ Service κ³μΈ΅μμ λλ΄μ§ μκ³ λ λλ§ μ μλμΌλ‘ ν΄κ²°λλ OSIV μ λ΅μ κ²½κ³ λ₯Ό μ£Όλ μ΄μ κ° λκΉ?
OSIV μ λ΅μ λ무 μ€λμκ° DB connection μμμ μ¬μ©νκΈ° λλ¬Έμ, μ€μκ° νΈλν½μ΄ μ€μν μ ν리μΌμ΄μ μμλ 컀λ₯μ μ΄ λͺ¨μλ μ μκ³ μ΄κ²μ μ₯μ λ‘ μ΄μ΄μ§κ² λλ€.
μλ₯Ό λ€μ΄ 컨νΈλ‘€λ¬μμ μΈλΆ API νΈμΆ μ μΈλΆ API λκΈ° μκ°λ§νΌ 컀λ₯μ μμμ λ°ννμ§ λͺ»νκ³ , μ μ§ν΄μΌ νλ€.
→ OISVμ μΉλͺ μ μΈ λ¨μ μΈ, 컀λ₯μ μ μμμ± μ»¨ν μ€νΈκ° μ’ λ£λ λκΉμ§ 1:1λ‘ κ³μ λ¬Όκ³ μλ κ²μ΄λ€.
π€ open-in-view μ€μ μ μμ νλ©΄ μ΄λ»κ² λλκ±°μΌ?
open-in-viewλ₯Ό falseλ‘ μ€μ ν κ²½μ° νΈλμμ μ΄ λλκ³ DB connectionμ΄ λ°λ©λμ§ μλ λ¬Έμ λ ν΄κ²°λλ€.
νμ§λ§ lazy loadingμ μ¬μ©ν κ²½μ° λ¬Έμ κ° λ°μν μ μλ€. μ§κΈκΉμ§ μμ±ν λ§μ μ§μ° λ‘λ© μ½λλ₯Ό νΈλμμ μμΌλ‘ λ£μ΄μΌ νλ κ²μ΄λ€.
EntityManagerκ° νΈλμμ μ 컀λ°κ³Ό ν¨κ» λ«ν νΈλμμ μΈλΆμμ lazy loadingμ μ¬μ©νλ©΄ no Session μ΄λΌλ μμΈκ° λ°μνκ² λλ€.
μ΄λ μμ²λΆν° μλ΅κΉμ§λ₯Ό νλμ νΈλμμ μΌλ‘ λ¬Άλ λ°©λ²μΌλ‘ ν΄κ²°ν μ μμ§λ§ μ΄λ open-in-viewλ₯Ό trueλ‘ μ€μ νλ κ²κ³Ό λΉμ·νλ€.
π€§ Commandμ Query λΆλ¦¬
μ€λ¬΄μμ OSIVλ₯Ό λ μνλ‘ λ³΅μ‘μ±μ κ΄λ¦¬νλ μ’μ λ°©λ²μ Commandμ Queryλ₯Ό λΆλ¦¬νλ κ²μ΄λΌκ³ νλ€.
보ν΅μ λΉμ¦λμ€ λ‘μ§μ νΉμ μν°ν° λͺ κ°λ₯Ό λ±λ‘νκ±°λ μμ νλ κ²μ΄κΈ° λλ¬Έμ μ±λ₯μ΄ ν¬κ² λ¬Έμ λμ§ μλλ€.
κ·Έλ¬λ 볡μ‘ν νλ©΄μ μΆλ ₯νκΈ° μν 쿼리λ νλ©΄μ λ§μΆμ΄ μ±λ₯μ μ΅μ ν νλ κ²μ΄ μ€μνλ€.
νμ§λ§ κ·Έλ° λμμ 볡μ‘μ±μ λΉν΄ ν΅μ¬ λΉμ¦λμ€μ ν° μν₯μ μ£Όλ κ²μ μλλ€.
λ°λΌμ ν¬κ³ 볡μ‘ν μ ν리μΌμ΄μ μ κ°λ°νλ€λ©΄, μ΄ λμ κ΄μ¬μ¬λ₯Ό λͺ ννκ² λΆλ¦¬νλ μ νμ΄ μ μ§λ³΄μμ κ΄μ μμ μλ―Έκ° μμ κ²μ΄λ€.
ex) OrderService
- OrderService: ν΅μ¬ λΉμ¦λμ€ λ‘μ§
- OrderQueryService: νλ©΄μ΄λ APIμ λ§μΆ μλΉμ€ (μ£Όλ‘ μ½κΈ° μ μ© νΈλμμ μ¬μ©)
λ μλΉμ€ λͺ¨λ νΈλμμ μ μ μ§νλ©΄μ μ§μ° λ‘λ©μ μ¬μ©ν μ μλ€.
μλ κΈμμ μν°ν° 맀λμ κ° μμ±λλ κ³Όμ μ μμ² μμΈν μ μ μλ€.
μν°ν° 맀λμ λ 리νμ€νΈ λΉ νλλ§ μμ±λμ§ μμ μ μλ€.
https://perfectacle.github.io/2021/05/24/entity-manager-lifecycle/
'Back-end' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Spring] μμ‘΄μ± μ£Όμ μ @Autowiredλ³΄λ€ μμ±μ μ£Όμ μ κΆμ₯νλ μ΄μ (0) | 2024.02.28 |
---|---|
[JPA] μμμ± μ»¨ν μ€νΈμ λμμ리μ μ΄μ (0) | 2024.02.14 |
[JPA] Hibernate Cacheλ? (0) | 2023.09.03 |
[Spring] @Transaction(readOnly = true) μ€μ (0) | 2023.09.01 |
[JPA] JPA, Hibernate, Spring Data JPAμ λν μ΄λ°μ λ°.. μ 리 (0) | 2023.08.29 |