JPA 무한 순환참조 - StackOverflowError 오류

devdo·2023년 2월 7일
0

JPA

목록 보기
10/13

JPA 순환참조란?

JPA 를 사용하면서 Team -> Member 와 같이 OneToMany -> ManyToOne 과 같은 양방향으로 연결된 엔티티를 JSON 형태로 직렬화 하는 과정에서,서로의 정보를 계속 순환하며 참조하여 StackOverFlowError를 발생시키는 현상을 말한다.

참고) 직렬화
객체/데이터를 바이트 형태로 변환하여 네트워크를 통해 송수신할 수 있도록 만드는 것을 말한다.


무심코 Lombok 을 사용하며 Data를 사용하거나 ToStringHashcode&equals어노테이션을 사용하면서 발생하기도 한다.

ToString 이나 HashCode&Equals 에서 양 객체가 서로의 프로퍼티를 계속해서 참조하면서 무한 순환참조가 발생한다.

즉, 가급적이면 Entity 에서 @Data, 그냥 @ToString 등의 어노테이션 사용을 지양하자


JPA 순환참조 해결방법

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 처리를 해주면 된다.



참고

profile
배운 것을 기록합니다.

0개의 댓글