JPA는 Lazy Loading을 사용할 경우 엔티티를 프록시 객체로 감싼다.
Lombok의 @ToString, @EqualsAndHashCode는 모든 필드를 참조하는데, 이때 프록시 필드를 접근하려 하면 예외가 발생하게 된다.
예시
@Entity
@Getter
@ToString
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Order> orders;
}
문제 발생
User user = userRepository.findById(1L).get();
System.out.println(user);
- @ToString이 orders 필드를 호출 → orders는 Lazy 로딩이므로 초기화되지 않은 프록시 객체
- 프록시 필드 접근 시 LazyInitializationException 발생
해결방법
- @ToString(exclude = "orders")로 무한 호출 방지
- DTO를 사용하여 필요한 데이터만 반환 ( 대부분 이렇게 해결하는 편이다 )
@Getter
@ToString(exclude = "orders")
public class User { ... }
'Spring' 카테고리의 다른 글
NullPointerException이란 무엇이며, 어떻게 해결할 수 있나? (0) | 2025.02.12 |
---|---|
@EqualsAndHashCode 사용 시 엔티티 간 무한 루프 발생 가능성에 대한 원인과 해결 (0) | 2025.02.06 |
Lombok과 JPA 충돌 가능성 & 해결 방법 (0) | 2025.02.06 |
Spring 기본 dependency 설정 (0) | 2023.10.12 |
Spring ) SpringBoot로 SpringSecurity 기반의 JWT 토큰 구현하기 (0) | 2023.09.05 |