728x90
다음과 같은 양방향 관계가 있을 때
@Entity
public class A{
@ManyToOne
private B b;
}
@Entity
public class B{
@OneToMany
private List<A> a = new ArrayList<>();
}
toString 메서드에서 서로를 호출한다면
//A클래스에서
public String toString(){
return "어쩌구: " + b;
}
무한으로 호출하게 되어 StackOverflowError 가 발생하게 된다.
서로 호출하지 않도록 b를 제거하는 방법도 있지만
Lombok 기능을 활용해줄수도 있다.
@ToString(exclude = "b")
public class A{
@ManyToOne
private B b;
}
이렇게 해주거나
public class A{
@ToString.Exclude
@ManyToOne
private B b;
}
이렇게 해주어도 된다.
그런데...!
또 다른 문제가 발생할 수 있었다.
이 Entity들을 사용하여 게시판을 만들었고 html, 타임리프 문법을 통하여 웹에서 보여줄 때 Json화 될 때 또 위와 같은 무한참조 상황이 발생 할 수 있다. 서로의 정보를 계속 요청하여 무한 참조가 발생하는데 이럴 때는 위와 비슷하게 정보 요청되는 상황을 없애거나
JsonIgnoreProperties 라는 어노테이션을 활용할 수 있다.
@OneToMany
@JsonIgnoreProperties({"b"})
private List<A> a = new ArrayList<>();
다음과 같이 해주면 b에 의해서 호출된 a에서는 b를 가져오지 말라는 뜻으로 되어 무한 참조를 막아줄 수 있다.
근데 또 어떻게 정보를 가져올지에 따라 또 다르기 때문에 잘 생각하여 사용해야 한다.!!
728x90
반응형