📍 코드
note와 hashtag, note_hashtag를 모두 저장하는 로직을 구현 중에 오류가 발생했다.
note_hashtag 가 저장되는 시점에, 미리 만들어진(build 된) note를 함께 저장해야 했다.
- 아래 코드와 같이 set 키워드로
note에 note_hashtag를 지정하는 방식을 택했다.
Service
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를 피하라고 하는지 알 것 같다.
- 아니 잘 모르겠다. 추가로 공부를 진행하자🥺
참고 자료