본문 바로가기
Java/JPA with Error

[해결 방법] java.lang.StackOverflowError: null

by HJ0216 2023. 6. 18.

🟦 기본 환경: IDE: IntelliJ, Language: Java

 

 

SpringBoot의 MainApplication에서 다음 Source Code를 실행할 경우,

1
2
3
4
5
6
7
@GetMapping("/")
    public List<Item> list() {
        List<Item> items = itemStoryService.itemList();
        System.out.println(items)
        return items;
    }
 
 
 

🚨 다음과 같은 Error 발생

java.lang.StackOverflowError: null

 

 

발생 원인

@Data: 클래스의 Getter, Setter, equals(), hashCode(), toString() 등의 메서드를 자동으로 생성

클래스 내의 모든 필드를 포함한 문자열을 생성하기 위해 각 필드의 toString() 메서드를 호출

→ 클래스 내에 상호참조되는 관계가 있을 경우, 한 객체의 toString() 메서드에서 다른 객체의 toString() 메서드를 호출

→ 그 객체에서 다시 처음의 객체의 toString() 메서드를 호출(상호 참조 관계이므로)

→ 무한한 재귀 호출로 이어져 StackOverflowError가 발생

 

 

해결 방법

1. Entity의 @Data를 @Getter, @Setter로 수정

2. @ToString(exclude = "재 호출하는 entity 이름") 옵션 추가

 

 

정리

println() → valueOf() → toString() 호출

EntityA의 모든 필드에 대해 문자열화를 위해 필드로 선언된 EntityB의 toString 호출

→ EntityB의 toString()는 EntityB의 모든 필드에 대해 문자열화를 위해 필드로 선언된 EntityA의 toString 호출

→ 무한 반복

 

 

 

참고 자료

 

20. [JPA] lombok 사용 시 주의사항

엔티티 클래스에 lombok을 사용하면 StackOverflowError 오류가 발생할 수 있다. 다음과 같은 엔티티 연관 관계가 있다고 하자.12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535

lng1982.tistory.com