์ค๋ ํ ๊ณต๋ถ ๐ง
- ์ฌํ Spring 1์ฃผ์ฐจ ๊ฐ์ ๋ฃ๊ธฐ → ์ด์ ๋ค์๋ ๋ถ๋ถ๋ถํฐ ์ด์ด์ ์๊ฐ
- ์ฌํ Spring 2์ฃผ์ฐจ ๊ฐ์ ๋ฃ๊ธฐ
- ํ ์คํธ ์ฝ๋ ์ด๋ก ์ธ์ ๋ฃ๊ธฐ
- ์ฐ๋ง ๊ธฐ๋ ๋ผ๋์ค ๐คฉ
- TIL ๋ธ๋ก๊ทธ ์์ฑ
์ค๋ ์ป์ ๋ด์ฉ ์ ๋ฆฌ โ๏ธ
์ฌํ Spring ๊ฐ์ ๋ฃ๊ธฐ
- Proxy ๊ฐ์ฒด๋ ์์์ฑ ์ปจํ
์คํธ๋ฅผ ํตํด ๋์์ ๋ฐ์์ผ๋ง ์ค์ Entity์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
- LazyInitializationException → ์ค์ JPA ๊ฐ๋ฐ์์ ๊ฐ์ฅ ๋ง์ด ๋ง์ฃผ์น๋ Exception
- ์์์ฑ ์ ์ด๋ ์ง์ฐ ๋ก๋ฉ, ์ฆ์ ๋ก๋ฉ๊ณผ๋ ์๋ฌด ๊ด๋ จ์ด ์๋ค.
๊ฐ์๋ฅผ ๋ฃ๋ค๊ฐ ๊ถ๊ธํ๋ ์
FetchType.LAZY์ ๊ฐ๋ ์ก๊ธฐ
- FetchType.LAZY: ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์ค์ ๋ก ์ ๊ทผํ ๋ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด๋ค. ๊ด๋ จ๋ Entity๋ฅผ ํธ์ถํ๊ธฐ ์ ๊น์ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ์ง ์๋๋ค.
- FetchType.EAGER: ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด๋ค. Entity๋ฅผ ์กฐํํ๋ฉด ์ฐ๊ด๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ์กฐํํ๋ค.
FetchType.LAZY๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
- ์ฐ๊ด๋ ๋ฐ์ดํฐ๊ฐ ์์ฃผ ์ฌ์ฉ๋์ง ์์ ๋: ์ฐ๊ด๋ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ๋ค๋ฉด, ์ฒ์๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ์๊ณ ํ์ํ ์์ ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ํจ์จ์ ์ด๋ค.
- N+1 ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ค๊ณ Fetch Join์ ์ฌ์ฉํ ๋: FetchType.EAGER๋ฅผ ์ฌ์ฉํ๋ฉด ์ฐ๊ด ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ค๋๋ฐ, ์ด ๊ฒฝ์ฐ์๋ ์ฟผ๋ฆฌ๊ฐ ๋นํจ์จ์ ์ผ๋ก ์ฌ๋ฌ ๋ฒ ์คํ๋ ์ ์๋ค. LAZY๋ก ์ค์ ํ๋ฉด ํ์์ ๋ฐ๋ผ Fetch Join์ ๋ช ์์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์์ ์ฝ๋
Entiy
@Entity
class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// User๋ ์ฌ๋ฌ ๊ฐ์ Orders๋ฅผ ๊ฐ์ง ์ ์์
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Order> orders = new ArrayList<>();
}
@Entity
class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String productName;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
}
- User Entity๋ Order Entity์ 1:N ๊ด๊ณ์ด๋ค.
- orders ํ๋๋ FetchType.LAZY๋ก ์ค์ ๋์ด ์์ด์ User๋ฅผ ์กฐํํ ๋ Order ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ์กฐํํ์ง ์๋๋ค. → ์ฒ์์ ์กฐํํ์ง ์๊ณ Proxy ๊ฐ์ฒด๋ก๋ง ๋จ์์๋ค.
- Order ๋ฐ์ดํฐ๊ฐ ํ์ํ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ถ๊ฐ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ค.
Repository ์ฌ์ฉ ์์
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public void fetchUserOrders(Long userId) {
// 1. User๋ง ์กฐํ (Order๋ ์กฐํํ์ง ์์)
User user = userRepository.findById(userId).orElseThrow(() -> new RuntimeException("User not found"));
System.out.println("User name: " + user.getName()); // "์น์ฐฌ" ์ถ๋ ฅ
// 2. ์ด ์์ ์ LAZY ๋ก๋ฉ์ด ์คํ๋จ (Order ๋ฐ์ดํฐ๊ฐ ํ์ํ๋๊น)
List<Order> orders = user.getOrders();
System.out.println("Orders count: " + orders.size()); // "์น์ฐฌ"์ ์ ์ฒด ์ฃผ๋ฌธ ์ ์ถ๋ ฅ
}
}
- findById( )๋ก User๋ง ์กฐํํ๋ ๊ฒฝ์ฐ Order ๋ฐ์ดํฐ๋ ์กฐํํ์ง ์๋๋ค.
- user.getOrders( )๋ฅผ ํธ์ถํ๋ ์๊ฐ, Order ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ค.
FetchType.LAZY์ ์ฅ์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ์ต์ํํ ์ ์์ด์ ์ฑ๋ฅ ์ต์ ํ์ ๋์์ด ๋๋ค.
- ์ฐ๊ด ๋ฐ์ดํฐ๊ฐ ๋ถํ์ํ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค์ง ์์์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ธ๋ค.
์ฌ์ฉ ์ ์ฃผ์ ์ฌํญ
- LazyInitializationException: LAZY ํ๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์
์ด ์ด๋ ค ์์ด์ผ ํ๋ค.
→ Service Layer์์ ์ฒ๋ฆฌํ๊ฑฐ๋ @Transactional ์ด๋ ธํ ์ด์ ์ ํ์ฉํ๋ค. - ํ์ํ์ง ์์ ๋ฐ์ดํฐ๋ ๋ช ์์ ์ผ๋ก ๊ฐ์ ธ์์ผ ํ๋ค: LAZY๋ก ์ค์ ๋ ํ๋๋ฅผ ์ธ ์ผ์ด ๋ง๋ค๋ฉด, JPQL์์ Fetch Join๋ฅผ ์ฌ์ฉํด์ ํ๊บผ๋ฒ์ ์กฐํํ๋ ๊ฒ์ด ๋ ์ข๋ค.
๊ฒฐ๋ก
- FetchType.LAZY๋ฅผ ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ด๋ จ๋ ๊ฐ๋ ์ธ FetchType.EAGER์ Fetch Join, JPQL์ ๋ํด์๋ ์ ์๊ณ ์์ด์ผ ํ๋ค.
์ค๋ ํ๋ฃจ ์๊ฐ ์ ๋ฆฌ โ๏ธ
์ค๋์ 2024๋
๋ง์ง๋ง๋ ....
์ฌํด๋ ์ ๋
์๊ฐ์ด ์์ฒญ ๋นจ๋ฆฌ ์ง๋๊ฐ ๊ฒ ๊ฐ๋ค.. 2์์ ๋ํ๊ต ์กธ์
์ ํ๊ณ , ๋ค๋ฅธ ๋ถํธ์บ ํ๋ 6๊ฐ์ ์ ๋ ๋ฃ๊ณ , ์ทจ์
์ ์ค๋นํ๋ค๊ฐ ์คํ๋ฅดํ ๋ด๋ฐฐ์บ ์ ํฉ๋ฅํ์ผ๋๊น.. ์์ฐจ๊ฒ ๋ณด๋ธ ๊ฑฐ๊ฒ ์ง??
๋ถ๋ช
๊ณต๋ถ๋ ๊ณ์ ํ๊ณ ์์ง๋ง ์์ ๋น ๊นกํต์ธ ๊ฒ ๊ฐ์ ๋๋์ด ์๊พธ ๋ ๋ค..
ํ๋ฉด ํ ์๋ก ๋ด๊ฐ ์ํ๊ณ ์๋ ๊ฒ ๋ง๋ ๊ฑด๊ฐ.. ์๋ฌธ์ด ๋ค๊ณ ๊ณต๋ถํ๋ ๊ฒ๋ค์ด ๋ด ๋จธ๋ฆฟ์์ ์ ์ ์ฅ๋๊ณ ์๋ ๊ฑด์ง.. ๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค. ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์์ฑํ ์ ์์ง๋ง ์ด๊ฒ ์ ์ด๋ ๊ฒ ์งํ๋๊ณ ์ด๋ค ์๋ฆฌ๋ก ์๋ํ๋ ๊ฒ์ธ์ง ๋ชจ๋ฅด๋ ๋๋...?
๊ทธ๋๋ ์ค๋ ์งํํ๋ ๋ด์ ๋งค๋์ ์ฃผ๊ด ๋ผ๋์ค๋ฅผ ๋ค์ผ๋ฉด์ ํฌ๊ธฐ๋ ํ์ง ๋ง์๋ ์๊ฐ์ด ๊ณ์ ๋ค์๋ค.
์ ๋ถ ์ด์ฌํ ํ๊ณ ๊ณ์๊ณ ๋ฐฐ์๊ฐ๋ ค๋ ์์ง๊ฐ ์์ฒญ๋๋ค๋ ๊ฒ์ ๋๊ผ๋ค. ์ฃผ๋ณ์ ๋์์ ์์ฒญํ๊ณ , ํํฐ๋๊ป ๋์์ ์์ฒญํ๋ ๋ฑ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ํตํด ์ฑ์ฅํ๊ณ ๊ณ์
จ๋ค. ๋ผ๋์ค๋ฅผ ๋ค์ผ๋ฉด์ ํํํด์ง๋ ๋ถ์๊ธฐ ๋๋ถ์ ๋ง์์ด ์์ฒญ ๋ฐ๋ปํด์ก๋ค. ๋ ๋ง์์ ๊ณ ์ณ๋จน๊ฒ ๋์๋ค.
์ง๊ธ์ฒ๋ผ ๊พธ์คํ ์ด์ฌํ ๊ณต๋ถํ๋ ๊ฒ๋ ์์ฒญ ๋๋จํ ๊ฒ์ด๋ค!
ํ๋ฃจ 12์๊ฐ์ฉ ๊ณต๋ถํ๋ฉด์ ์ป์ด๊ฐ๋ ๊ฒ์ด ๋ฌด์กฐ๊ฑด ์๋ค!
๋น์ ๊ณต์๋ก ์์ํด์ ์ง๊ธ๊น์ง ์ฑ์ฅํ ๋ชจ์ต๋ง ๋ด๋ ์ ๋์๊ฐ๊ณ ์๋ ๊ฒ์ด๋ค!
์ ๊ฐ์ ์๊ฐ๋ค์ ํ๋ฉด์ ๋ด์ผ์ด๋ฉด ์ํด๋ก ๋ฐ๋๋ 2025๋
๋ ํ์ดํ
๋์น๊ฒ ์ ์ง๋ด๋ณด์๋ ์๊ฐ์ด ๊ฐ๋ํด์ก๋ค.
ํ์คํ ๋ ๋น์ ๊ณต์์ด๊ณ ์ ๊ณต์๋ค์ ๋ฐ๋ผ์ก์ผ๋ ค๋ฉด ๋ช ๋ฐฐ๋ ๋ ๋ ธ๋ ฅํด์ผ ํ๋ค! ๊ทธ๋ถ๋ค์ 4๋ ๋์ ์์์จ ๊ฒ์ด ์๊ณ ๋๋ ์ฌํด 11์๋ถํฐ ์์๋๊ฐ๊ธฐ ์์ํ์ผ๋๊น! ์ง๊ธ์ฒ๋ผ ๊พธ์คํ๊ฒ ๋ ธ๋ ฅํ๋ค๋ฉด ๋ถ๋ช ์ฌ๊ธฐ์ ๋ ์ฑ์ฅํ๊ณ ๊ณ์ ์ฑ์ฅํ ์ ์๋ค!!
ํ... ์ฐ๋ง์ด๋ผ๊ณ ํผ์ ์๊ฐ์ด ๋ง์์ก์๋ ๊ฒ ๊ฐ๋ค ๐ฅฒ
์๋ฌดํผ ์ฌํด ์ ๋ง๋ฌด๋ฆฌํ์ผ๋๊น ๋ด๋
์๋ ์ด์ ๋์น๊ฒ ๋ณด๋ด๋ณด์!!!
๋ฝ์ดํฐ์ด์ด์ด์ด์ด์!!!!!!!!!!!! ๐ฅ๐ฅ๐ฅ๐ฅ๐ฅ๐ฅ
๋ด์ผ ๊ณํ โฐ
- ์ํด๋๊น ์ฌ์ ๋กญ๊ฒ ๋ณด๋ด๋ ๋์ง ์์๊น...? ๋ ์ ๋๊ฒ ์ง.. ๐
- ์ฌํ Spring 3์ฃผ์ฐจ ๊ฐ์ ๋ฃ๊ธฐ
- ํ ์คํธ ์ฝ๋ ์ด๋ก ๋ นํ๋ณธ ์ฌ๋ผ์จ๋ค๋ฉด ๋ณต์ต
- TIL ๋ธ๋ก๊ทธ ์์ฑ
+ ์ง์ค๋ ฅ์ด ์ข๋ค ์ถ์ผ๋ฉด ๋ ๊ณต๋ถ!
'Today I Learned(TIL) > ์คํ๋ฅดํ ๋ด์ผ๋ฐฐ์์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ TIL ] ์ฃผํน๊ธฐ ์ฌํ_Day 4 (1) | 2025.01.02 |
---|---|
[ TIL ] ์ฃผํน๊ธฐ ์ฌํ_Day 3 (1) | 2025.01.01 |
[ TIL ] ์ฃผํน๊ธฐ ์ฌํ_Day 1 (1) | 2024.12.30 |
๊ธฐ์ด ํ๋ก์ ํธ_Day 5 (0) | 2024.12.26 |
๊ธฐ์ด ํ๋ก์ ํธ_Day 7 (2) | 2024.12.26 |