Side-project : 예외기록(1)

우진·2023년 5월 20일
1
post-thumbnail

이게 머임 ㅜ

Failure while trying to resolve exception [org.springframework.http.converter.HttpMessageNotWritableException]
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError)] with root cause
java.lang.StackOverflowError: null
  • 현재 상황 :
    글 수정하는데 오류 발생. 편집 화면에서 넘어가지 않고 멈춤. DB확인해보니 수정된 내용 반영됨.

  • 콘솔 예외처리 내용 :

  • ChatGPT에 상담함 :

    -> 뭐라는지 잘 몰겠음.. 대충 내부적으로 오류가 발생하면 HttpServletResponse에서 sendError()로 응답을 작성해 보내는데, 그전에 이미 응답이 커밋돼서 메시지를 못 보낸다는 오류인듯.
    -> 또 스택 오버플로우는 왜 일어나는 ㅇㄴ;


(1) 📁 Could not write JSON: Infinite recursion

  • 인터넷 서치함 :

-> Jackson? 직렬화? \(´◓Д◔)/ Entity나 dto 문제인건가??
-> Entity간 양방향 참조를 쓰고 있긴하다... 체킹체킹,,

@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "user_m_tb")
public class User {

	...

    //post와 양방향 관계 설정
    @OneToMany(mappedBy = "user")
    private List<Post> posts = new ArrayList<>();

    //reply와 양방향 관계 설정
    @OneToMany(mappedBy = "user")
    private List<Reply> replies = new ArrayList<>();
    
}

오... 일단 메이저한 오류의 원인은 찾은 것같다. 컨트롤러에서 ResponseEntity<> 형태로 안에 객체 데이터를 넣어 보내는데, @ResponseBody로 Jason 변환을 하며 순환참조가 일어난 것 같다.
⬇ ⬇ ⬇ 너무 잘 설명해준 포스팅이라 참고!!
https://k3068.tistory.com/32


  • 해결 방법 :
    @JsonIdentityInfo 어노테이션을 사용해 Jason 변환시, @Id를 바탕으로 중복된 아이디를 가진 객체는 Jason으로 변환시키지 않도록 했다.
@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "userCode")
public class User {

...

    //post와 양방향 관계 설정
    @OneToMany(mappedBy = "user")
    private List<Post> posts = new ArrayList<>();

    //reply와 양방향 관계 설정
    @OneToMany(mappedBy = "user")
    private List<Reply> replies = new ArrayList<>();

}

이런식으로 모든 엔티티에 추가 完 !


(2) 📁 Cannot call sendError() after the response has been committed

메이저한 버그를 수정했더니 오류가 일어나지 않아 두 번 확인하지는 못했다. 진짜 무슨 오류였던 거임?

이건 추후 다시 알아봐야할 거같다.

profile
백 개발을 시작한 응애개발자

0개의 댓글