Spring
@EqualsAndHashCode 사용 시 엔티티 간 무한 루프 발생 가능성에 대한 원인과 해결
Albosa2lol
2025. 2. 6. 11:59
무한 루프 발생 원인
JPA 엔티티에서 연관 관계가 있을 때 @EqualsAndHashCode는 모든 필드를 비교하려고 한다.
이때 서로를 참조하고 있는 경우 무한 루프가 발생할 수 있다.
@Entity
@Getter
@EqualsAndHashCode
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "user")
private List<Order> orders;
}
@Entity
@Getter
@EqualsAndHashCode
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
private User user;
}
예시
User user = userRepository.findById(1L).get();
Set<User> userSet = new HashSet<>();
userSet.add(user);
HashSet이 equals()를 호출 → User.equals() 내부에서 Order.equals() 호출 → 다시 User.equals() 호출 → 무한 루프 발생
해결방법
- @EqualsAndHashCode(exclude = "orders") 사용
- 식별자(id)만 비교
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@EqualsAndHashCode.Include
private Long id;
}