동기의 이것저것
article thumbnail
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
반응형
profile

동기의 이것저것

@U_motivation

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!