[JPA Error] Handler dispatch failed: java.lang.StackOverflowError: with root cause

ohahsis·2024년 5월 17일

문제-분석-해결

목록 보기
4/5

📍 코드

  • notehashtag, note_hashtag를 모두 저장하는 로직을 구현 중에 오류가 발생했다.
  • note_hashtag 가 저장되는 시점에, 미리 만들어진(build 된) note를 함께 저장해야 했다.
  • 아래 코드와 같이 set 키워드로 notenote_hashtag를 지정하는 방식을 택했다.

Service

// 기타 request 요소들에 대해 build된 note

note.setNoteHashtags(savedNoteHashtags);

📍 Error

메시지

  • Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.StackOverflowError] with root cause
  • hashCode

분석

  • 문제가 되는 클래스의 라인들은, 모두 노트와 노트_해시태그 각각의 @Data 어노테이션 중에서도 @EqualsAndHashcode 부분이었음. (앞에서 설정한 set 으로 인해?) 무한순환참조 오류가 생긴 것으로 추정된다.

📍 해결

  • 일단 note는 그대로 두고, note_hashtag 엔터티의 @Data 대신 @Getter 로 바꿨다.
  • 이후 정상적으로 작동하였다.
  • 원인의 이유를 원론적으로 요약하자면, 엔터티의 경우 이미 PK를 이용해서 동일성을 검증하기 충분하기 때문에 @EqualsAndHashCode를 사용할 이유가 크게 없다. 괜히 사용했다 이렇게 오류에 빠지기 십상이다.
  • 내 프로젝트 내에서 이 이유를 적용했을 때, note@Data를 그대로 뒀는데도 정상 작동하는지 아직 이해하지 못한 것 같다. 문제가 되는 것 중 하나만 제거하면 되는 걸까..?
  • 다만 왜 하이버네이트를 이용할 때 롬복 애너테이션을 활용할 경우 @EqualsAndHashCode를 피하라고 하는지 알 것 같다.
  • 아니 잘 모르겠다. 추가로 공부를 진행하자🥺

참고 자료

profile
백엔드 개발자입니다.

0개의 댓글