๐ค ๋ฌธ์ ์ํฉ
JPA์์ ์ํฐํฐ ๊ฐ ์ฐ๊ด ๊ด๊ณ๋ฅผ Lazy Loading
์ผ๋ก ์ค์ ํ์ ๋, ์ด ์ํฐํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฉ์๋์ @Transactional
์ด๋
ธํ
์ด์
์ด ์๋ค๋ฉด LazyInitializationException์ด ๋ฐ์ํ ์ ์๋ค.
์์ ์ฝ๋๋ก ๋ณด์๋ฉด
@Entity
public class User {
@Id
private Long id;
@OneToMany(fetch = FetchType.LAZY)
private List<Order> orders;
}
public class UserService {
public void processUserOrders(Long userId) {
User user = userRepository.findById(userId).orElseThrow();
user.getOrders().forEach(order -> {
// ์ฃผ๋ฌธ ์ฒ๋ฆฌ ๋ก์ง
});
}
}
์ด ๊ฒฝ์ฐ, processUserOrders
๋ฉ์๋์์ user.getOrders()
๋ฅผ ํธ์ถํ ๋ LazyInitializationException์ด ๋ฐ์ํ ์ ์๋ค.
๐๏ธ ๋์ ์๊ฐ
์ค์ ์ฌ์ฉํ๋ ์์ ์์ ์์์ฑ ์ปจํ
์คํธ๊ฐ ์ด๋ฏธ ๋ซํ์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํ๋ค. -> ๊ทธ๋์ ์ง์ฐ ๋ก๋ฉ์ ์ํํ ์ ์๋ค!
์ด ๋ฌธ์ ๋ ํธ๋์ญ์
๋ฒ์์ ์์์ฑ ์ปจํ
์คํธ์ ์๋ช
์ฃผ๊ธฐ๊ฐ ์ผ์นํ์ง ์์ ๋ฐ์ํ๋ค.@Transactional
์ด๋
ธํ
์ด์
์ด ์์ผ๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ ํ ์ฆ์ ์์์ฑ ์ปจํ
์คํธ๊ฐ ๋ซํ๊ฒ ๋์ด ์ง์ฐ ๋ก๋ฉ์ ์ํํ ์ ์๊ฒ ๋๋ค!!
๐ซ ํด๊ฒฐ ๋ฐฉ์
1.@Transactional
์ถ๊ฐ : ๊ฐ์ฅ ๊ฐ๋จํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํด๋น ๋ฉ์๋์ @Transactional
์ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ์๋ ์คํ ๋์ ์์์ฑ ์ปจํ
์คํธ๊ฐ ์ ์ง๋์ด ์ง์ฐ ๋ก๋ฉ์ด ๊ฐ๋ฅํด์ง๋ค.
@Transactional
public void processUserOrders(Long userId) {
// ๊ธฐ์กด ์ฝ๋
}
2.Fetch Join
์ฌ์ฉ: JPQL์ด๋ Criteria API๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์ฐ๊ด ์ํฐํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ฉํ ์ ์๋ค.
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u JOIN FETCH u.orders WHERE u.id = :userId")
Optional<User> findByIdWithOrders(@Param("userId") Long userId);
}
3.DTO
์ฌ์ฉ: ํ์ํ ๋ฐ์ดํฐ๋ง DTO๋ก ์กฐํํ์ฌ ์ฌ์ฉํ๋ค.(Projection) ์ด ๋ฐฉ๋ฒ์ ๋ถํ์ํ ๋ฐ์ดํฐ ๋ก๋ฉ์ ๋ฐฉ์งํ ์ ์๋ค.
4.Open Session In View (OSIV)
ํจํด ์ฌ์ฉ: ์ด ๋ฐฉ๋ฒ์ ์์์ฑ ์ปจํ
์คํธ๋ฅผ ๋ทฐ ๋ ๋๋ง๊น์ง ์ ์งํ์ง๋ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์
์ ์ค๋ ์ ์งํ๋ ๋จ์ ์ด ์์ด ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํ๋ค.
5.ํ๋ก์
์ด๊ธฐํ: ํธ๋์ญ์
๋ด์์ ์ฐ๊ด ์ํฐํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ด๊ธฐํํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
@Transactional(readOnly = true)
public void processUserOrders(Long userId) {
User user = userRepository.findById(userId).orElseThrow();
Hibernate.initialize(user.getOrders());
// ์ดํ ๋ก์ง
}
'JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA/DDD ๊ด์ ์์์ ์ง์ ์ฐธ์กฐ/๊ฐ์ ์ฐธ์กฐ (1) | 2024.10.11 |
---|---|
Spring Data JPA์์ Fetch Join๊ณผ CountQuery๋ฅผ ์ฌ์ฉํ ํ์ด์ง ์ต์ ํ (2) | 2023.07.18 |
์์์ฑ ์ปจํ ์คํธ๋? (0) | 2023.02.03 |