본문 바로가기

Server Development/Exception

Lombok @ToString - StackOverflow Error

 

 

 

Lombok을 통해 @ToString을 사용할 때 뿐만아니라 다른 애너테이션을 사용할 때, 자주 StackOverFlow가 발생한다.

원인, 해결방법 순으로 블로그를 정리하고자 한다.

 

원인 : java.lang.StackOverflowError, Handler dispatch failed: java.lang.StackOverflowError

 

 

 

원인

JPA 연관관계 매핑 후, toString()을 사용하게 되면 발생을 한다.

예를 들어, 조인이 되어있는 3가지의 테이블이 있다고 가정하자.

이러한 경우 3가지의 테이블은 서로 양방향 관계인데, 서로 다른 엔터티가 서로 toString을 무한으로 호출하면서 StackOverFlow가 발생하는 것이다.

 

자세한 예로 Member - Store - Order 해당 테이블이 서로 조인관계라고 가정할 때,

Member에서 ToString 호출시 Store도 호출되고 Store의 ToString은 Member의 ToString도 다시 호출하므로 무한으로 반복이 되는 것이다.

 

 

해결 방법

exclude 사용

- 아래처럼 작성해 호출시 해당 필드를 호출하지 않게 함으로써 오류를 막는다.

- 3가지 테이블 존재시 두 부모테이블을 아래와 같이 설정하고 마지막 자식테이블을 ToString으로 호출시 한번에 모두 확인 가능하되 스택오버 플로우 방지를 막을 수 있다.

@ToString(exclude = "Store")