Β κΈμΌ νμ΅ μ€ κΆκΈν μ μ΄ μκ²Όλ€.
Β update μμ μ μ€ννλ, μΏΌλ¦¬κ° μλμ κ°μ΄ μΆλ ₯λμλ€.
Hibernate:
select
q1_0.id,
q1_0.content,
q1_0.create_date,
q1_0.subject
from
question q1_0
where
q1_0.id=?
Hibernate:
insert
into
answer
(content, createdate, question_id, id)
values
(?, ?, ?, default)
Hibernate:
select
q1_0.id,
q1_0.content,
q1_0.create_date,
q1_0.subject
from
question q1_0
where
q1_0.id=?
Β μ selectκ° update μ νλ‘ 2λ²μ΄λ μ€νμ΄ λμμκΉ? κ·Έ μμΈμ JPAμ Dirty Checkingμ΄μλ€.
JPA κ° μμμ± μ»¨ν
μ€νΈμ κ΄λ¦¬λλ μν°ν°μ μνλ₯Ό κ²μ¬νκ³ , κ·Έ μ€ λ³κ²½λ λΆλΆλ§ DB μ λ°μνλ κΈ°λ₯DB μ μ ν리μΌμ΄μ
κ°μ μμ
μ μ΅μ νJPA λ μν°ν° μ μ μ₯ λ° μ‘°ν μ μμμ± μ»¨ν
μ€νΈ μ μν°ν° μ μ₯JPA λ νΈλμμ
μ μ»€λ° μμ μ μν°ν°μ νμ¬ μνμ μ€λ
μ·μ λΉκ΅λ₯Ό ν΅ν΄ λ³κ²½ μ¬ν κ°μ§UPDATE 쿼리 μ€νDirty Checking μ λ°λμ νΈλμμ
μ μ»€λ° μμ μ λμνΈλμμ
λ΄μμλ§ λμνλ―λ‘ @Transactional μ΄λ
Έν
μ΄μ
μ΄ λ°λμ νμDirty Checkingμ κ²½μ°, μ»€λ° μμ μ μμμ± μ»¨ν μ€νΈμ μν°ν°μ μ€λ μ·μ λΉκ΅
μ΄ λΉκ΅ κ³Όμ μμ Lazy Loading νλ λν λ§μ°¬κ°μ§λ‘ μ²΄νΉ μλ
Lazy Loadingλ μ°κ΄ νλλ μ€μ λ°μ΄ν°λ₯Ό κ°μ Έμ€μ§ μκ³ μλ λΉκ΅κ° λΆκ°λ₯
μ€λ
μ·κ³Όμ λΉκ΅λ₯Ό μν΄μ DB μμ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ μΆκ°μ μΈ SELECT 쿼리 λ°μ
βΌοΈ Dirty Checkingμ μ°κ΄λ Lazy Loading νλμ λ³κ²½ μ¬λΆλ νμΈνλ©°, λ‘λ©λμ§ μμμ κ²½μ°
JPAλDBμμ ν΄λΉ λ°μ΄ν° λ‘λλ₯Ό ν΅ν΄ νμΈ μλ
SELECT 쿼리λ₯Ό μ€ννλ―λ‘ μ±λ₯ μ νLazy Loading λ°μ΄ν°κ° μμμΉ μκ² λ‘λ©λ κ²½μ°, λ°μ΄ν°κ° κ°λ°μμ μλμλ λ€λ₯΄κ² μ²λ¦¬λ κ°λ₯μ± λ°μN λ²μ κ°λ³μ μΌλ‘ μ‘°ννλ μΆκ° 쿼리 λ°μ@Entity
public Class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Order> orders;
}
@Entity
public Class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
private User user;
}
List<User> users = userRepository.findAll(); // λΆλͺ¨ μν°ν°λ₯Ό κ°μ Έμ΄
for (User user : users) {
user.getOrders().size() // μμ μν°ν°(Order) μ‘°ν (Nλ²μ 쿼리 μΆκ° μ€ν)
}
User μ μ°κ΄ κ΄κ³μΈ Order κ° Lazy LoadingμΌλ‘ μ€μ λμ΄ μκΈ° λλ¬Έμ, List<Order> λ₯Ό κ°λ³μ μΌλ‘ κ°μ Έμ€λ©° μ±λ₯ μ ν μ λ°LazyInitializationException λ°μFetchType μ LAZY λμ EAGER λ‘ λ³κ²½DTO λ±μ μ¬μ©ν΄μ μ¬μ μ λΆλ¦¬detach() λ₯Ό μ΄μ©νμ¬ μ κ±°Hibernate.initialize(user.getOrders()); // Lazy Loading κ°μ μ΄κΈ°ν, νΈλμμ
λ²μ λ΄μμ κ°μ λ‘ λ‘λ κ°λ₯
entityManager.detach(user) // μμμ± μ»¨ν
μ€νΈμμ μ κ±°
μ°Έκ³ ) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/