/////
Search
🚫

LazyInitializationException κ³Ό SecurityContextHolder

νƒœκ·Έ
Springboot
λͺ©μ°¨

LazyInitializationException

ν˜„μž¬ λ‘œκ·ΈμΈν•œ μœ μ €μ˜ μœ μ € 객체λ₯Ό getLoginUser() 둜 κΊΌλ‚΄μ„œ μ“°λ €κ³  ν–ˆλŠ”λ°β€¦
public class AuthUtil { private final TokenUtil tokenUtil; private final UserRepository userRepository; public Long getLoginUserIndex() { User user = getLoginUser(); Long userId = user.getId(); return userId; } public User getLoginUser() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Object principal = authentication.getPrincipal(); return (User) principal; } }
Java
볡사
LazyInitializationException 이 λ°œμƒ ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μ•„λž˜μ™€ 같이 μƒˆλ‘œμš΄ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όλ‹ˆ ν•΄κ²° λ˜μ—ˆλŠ”λ°μš”β€¦ Β λ„λŒ€μ²΄ μ™œ 그랬던 κ±ΈκΉŒμš”?
public User getLoginUserForLazy() { Long id = getLoginUserIndex(); User user = userRepository.findById(id).get(); return user; }
Java
볡사

Hibernate μ—μ„œμ˜ 지연 λ‘œλ”©κ³Ό μ„Έμ…˜

β€’
지연 λ‘œλ”©μ€ μ—”ν‹°ν‹° λ˜λŠ” μ—”ν‹°ν‹° μ»¬λ ‰μ…˜μ΄ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ¦‰μ‹œ λ‘œλ“œ λ˜μ§€ μ•Šκ³  처음 μš”μ²­ μ‹œ λ‘œλ“œ λ˜λŠ” μ „λž΅μž…λ‹ˆλ‹€.
β€’
μ„Έμ…˜μ€ 본질적으둜 μ—”ν‹°ν‹°κ°€ μ €μž₯되고 κ΄€λ¦¬λ˜λŠ” μ»¨ν…μŠ€νŠΈ λ˜λŠ” λ²„νΌμž…λ‹ˆλ‹€. μ„Έμ…˜μ΄ λ‹«νžŒ 후에 ν•΄λ‹Ή μ„Έμ…˜ λ‚΄μ˜ μ΄ˆκΈ°ν™”(λ‘œλ“œ)λ˜μ§€ μ•Šμ€ μ—”ν‹°ν‹°μ˜ 지연 λ‘œλ“œ 속성에 μ ‘κ·Ό ν•˜λ €κ³  ν•˜λ©΄ LazyInitializationException 이 λ°œμƒν•©λ‹ˆλ‹€.
μ§€μ—°λ‘œλ”©κ³Ό μ„Έμ…˜μ— λŒ€ν•΄ 기본적인 사항을 μ•Œμ•˜λ‹€λ©΄ λ‹€μ‹œ λ‘œμ§μ„ 찬찬히 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
ν˜„μž¬ λ‘œκ·ΈμΈν•œ μœ μ €μ˜ 정보λ₯Ό μ»¨ν…μŠ€νŠΈ ν™€λ”μ—μ„œ 꺼냄 β†’ 이λ₯Ό μ„œλΉ„μŠ€ λ‘œμ§μ—μ„œ μ‚¬μš©ν•˜λ € 함 β†’ LazyInitializationException λ°œμƒ
λŒ€λž΅ 이런 ν”Œλ‘œμš° μΈλ°μš”. μ™œ κ·Έλž¬μ„κΉŒμš”?

μ„Έμ…˜μ˜ λ²”μœ„μ— λŒ€ν•΄ νŒŒμ•…ν•˜κΈ°.

해닡은 이곳에 μžˆμŠ΅λ‹ˆλ‹€. μ„Έμ…˜μ€ μš”μ²­μ˜ μ‹œμž‘μ—μ„œ 열리며, μš”μ²­μ΄ 끝날 λ•Œ λ‹«νž™λ‹ˆλ‹€. μ„œλΉ„μŠ€ 둜직 μ—μ„œ getLoginUser() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ μ‚¬μš©μž 정보λ₯Ό κ°€μ Έμ˜€μ§€λ§Œ, 이 μ •λ³΄λŠ” 이전 Hibernate μ„Έμ…˜ μ—μ„œ λ‘œλ“œ 된 κ²ƒμž…λ‹ˆλ‹€. 이후 Hibernate μ„Έμ…˜μ€ μ’…λ£Œλ˜μ—ˆκΈ° λ•Œλ¬Έμ— μ—°κ΄€λœ 엔티티에 λŒ€ν•œ 지연 λ‘œλ”©μ„ μ‹œλ„ν•  λ•Œ LazyInitializationException 이 λ°œμƒν•©λ‹ˆλ‹€. 즉 κ°€μ Έμ˜¨ 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—°κ΄€λœ 데이터λ₯Ό κ°€μ Έμ˜€λ € ν•  λ•Œ μ„Έμ…˜μ΄ 이미 λ‹«ν˜€ 있기 λ•Œλ¬Έμ— ν•„μš”ν•œ 데이터λ₯Ό κ°€μ Έμ˜¬ 수 μ—†μŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄μ„œλŠ” ν•΄λ‹Ή 객체λ₯Ό λ‹€μ‹œ μ΄ˆκΈ°ν™” ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€.
public User getLoginUserForLazy() { Long id = getLoginUserIndex(); User user = userRepository.findById(id).get(); return user; }
Java
볡사
μœ„μ™€ 같은 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ userRepository.findById(id).get()을 μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ User μ—”ν„°ν‹°λ₯Ό λ‹€μ‹œ κ°€μ Έμ˜΅λ‹ˆλ‹€. λ•Œλ¬Έμ— LazyInitializationException 문제λ₯Ό νšŒν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이둜 인해 지연 λ‘œλ“œλœ 속성에 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€.