문제상황
서버도 잘 돌아가고 아무 무리없이 진행하던 중에 갑자기 팀원 한병이 UX를 해보던 중에 버그가 있다고 하였다.
아까까지만해도 잘되고 있던 로그인에서 갑자기 콘솔에서
🧨Failed to load resource: net::ERR_HTTP2_PROTOCOL_ERROR
에러가 뜬다고 하여 나도 급하게 접속을 해보니 같은 에러가 나타났다
서버로그를 확인해보니
🧨java.lang.StackOverflowError: null
검색을 해보니 Lombok 사용으로 인한 순환참조에러라고 한다. (toString)?
그런데 에러로그를 더 내려보고나서야 제대로된 원인을 찾을 수 있었다.
🧨Infinite recusion (StackOverflowError) : ..
아주 친절하게도 무한 참조 / 무한 재귀 라고 알려주고 있다..
해결방법
Entity를 Json으로 변환 시 즉, Entity ro Json Serilaize 할 때 일어나는 문제이다.
Entity를 Json으로 변환하면서 , 연관된 객체를 다시 Json으로 변환하고 다시 연관된 객체를 변환하고... 무한으로 반복되면서 StackOverflow Error를 뱉는 것이다.
무한 참조에러를 해결하는 방법은 여러가지가 있는데 일단 알고있었던 @JsonIgnore를 추가하여 해결하였다.
👉 서버를 빨리 정상화 시키는 것이 우선이었기에 다른 것은 찾아 보지 못하고 일단 이 방식으로 하였다. 추후 좀더 좋은 방법으로 수정해야 겠다
👉@JsonIgnore은 Json화 과정에서 아예 배제시키는 것이기 때문에 지양한다고 한다.
@JsonManagedReference
- 무한 참조를 방어하기 위한 어노테이션이다 . 부모 클래스에 @JsonManagedReference를 추가해주고
@JsonBackReference
- 자식클래스에 @JsonBackReference를 추가해주면 된다.
- 참고한 블로그