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;
}