[221022] 순환참조란 무엇인가?

Younseo·2022년 10월 22일
0

TIL Study

목록 보기
2/27

순환참조 😭

오늘 팀 프로젝트를 진행하는데 post - comment, mypage - comment 간의 순환참조 문제가 발생하여 오류를 해결하는데 아주 골머리를 앓았다. 그래서 순환참조란 무엇인지, 어떻게 해결하면 좋을지 작성해보려고 한다.

1. JPA 순환참조 문제란 무엇인가?

JPA 순환참조
JPA 순환참조는 OneToMany, ManyToOne, ManyToMany 관계에서 일어날 수 있다.
JPA ORM으로 개발하다보면 양방향 참조가 필요한 경우가 꽤나 많아 지는데, 이런 양방향 관계를 가진 객체를 직렬화 하려고 할 때, 무한 참조가 되어 StackOverFlow가 발생된다.

2.해결방법

(1) Entity로 반환하지 않고, DTO를 사용하기
(2) @JsonIgnore Json으로 직렬화 할 속성에서 무시하기
(3) toString Override 하여 재정의하기
(4) @JsonManagedReference @JsonBackReference 어노테이션으로 직렬화 방향을 설정하기
(5) @JsonIdentityInfo를 통해 순환참조 될 대상의 식별키로 구분해 순환참조 되지 않게 하기

오늘 발생한 문제를 해결하기 위해 @JsonIgnore을 우선적으로 사용해 보았으나, 양 방향 모두 서로의 값을 리턴해야 하는 상황이었어서 사용할 수 없음을 확인했다.
그래서 (1)의 DTO를 사용해서 순환참조를 제거하였다.

3. Bean 순환참조

A클래스가 B클래스의 Bean을 주입받고, B클래스가 A클래스의 Bean을 주입받는 상황으로 서로 순환되어 참조할 경우 발생한다.
A클래스에 Bean을 만드는 과정에서 B의 Bean을 필요로 하는데 없으니까 우선 B로 넘어가서 B의 Bean을 생성하려는데 또 A클래스를 의존하고 있어 A클래스의 Bean을 먼저 생성하려 한다.
위의 상황이 반복되면서 무한 반복에 빠지게 된다.

Reference

양방향 Entity 무한재귀 문제해결

순환참조 문제란?

0개의 댓글