JPA 를 사용하면서 Team -> Member 와 같이 OneToMany -> ManyToOne 과 같은 양방향으로 연결된 엔티티를 JSON 형태로 직렬화 하는 과정에서,서로의 정보를 계속 순환하며 참조하여 StackOverFlowError를 발생시키는 현상을 말한다.
✅참고) 직렬화
객체/데이터를 바이트 형태로 변환하여 네트워크를 통해 송수신할 수 있도록 만드는 것을 말한다.
무심코 Lombok 을 사용하며 Data
를 사용하거나 ToString
및 Hashcode&equals
어노테이션을 사용하면서 발생하기도 한다.
ToString 이나 HashCode&Equals 에서 양 객체가 서로의 프로퍼티를 계속해서 참조하면서 무한 순환참조가 발생한다.
즉, 가급적이면 Entity 에서 @Data, 그냥 @ToString 등의 어노테이션 사용을 지양하자
0) Entity 대신 DTO를 반환
1) @JsonIgnore
: JSON 직렬화 과정에서 해당 어노테이션이 선언된 필드는 직렬화 대상에서 제외
2) ToString Override
: @ToString(exclude= {"연관된 필드", "..."})
...
@ToString(exclude = "team")
public class Team {
@Id
@GeneratedValue
private Long id;
private String teamName;
@OneToMany(mappedBy = "user")
private Set<User> users;
}
Entity 대신 Dto로 Json으로 직렬화
Dto로 받고 싶지 않으면 Entity 내에서 ToString(exclude = ) 처리
또는 @JsonIgnore 처리를 해주면 된다.