Java/JPA with Error
[해결 방법] java.lang.StackOverflowError: null
HJ0216
2023. 6. 18. 21:06
🟦 기본 환경: 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 호출
→ 무한 반복
참고 자료