본문 바로가기
개발/에러 뿌시기

[Spring/JPA] Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: could not initialize proxy 에러 해결

by 똥먹는낙타 2023. 4. 25.
728x90
반응형

🚨 문제 발생

  • Show 엔티티와 ShowSchedule 엔티티를 생성하고, @ManyToOne 으로 ShowScheduleShow를 연결해주었는데, @GetMapping으로 ShowSchedule 리스트를 받아오려고 할 때 500에러 발생
  • beanstalk 에러 로그를 자세히 보니 아래와 같은 오류 발생
2023-04-25 00:45:10.162  WARN 1 --- [nio-5000-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: could not initialize proxy [Musicalendar.musicalendarproject.domain.Show#1] - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy [Musicalendar.musicalendarproject.domain.Show#1] - no Session (through reference chain: java.util.ArrayList[0]->Musicalendar.musicalendarproject.domain.ShowSchedule["show"]->Musicalendar.musicalendarproject.domain.Show$HibernateProxy$H9GDk6si["title"])]
  • ShowSchedule 엔티티에서 Show 엔티티와 매핑은 아래와 같이 해두었음
    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
    @JoinColumn(name="show_id")
    @JsonManagedReference
    private Show show;

 

💡 문제 해결

  • 자세히 읽어보니까 proxy 관련 문제 같았음
  • 나는 fetch 전략을 LAZY로 해두었었는데, 생각해보니 ShowSchedule이 호출될 때, 얘와 연관된 Show<지연로딩>에 의해서 proxy 객체로 저장이 된다. 그렇기 때문에 이를 가져오려고 할 때, 영속성 컨텍스트에 저장이 되어있지 않아서 못 가져오는 것이라고 판단했음
  • fetch 전략을 LAZY(지연로딩)에서 EAGER(즉시로딩)로 바꾸어주니까 리스트 값이 잘 나온다!
    @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}) // 즉시로딩으로 수정
    @JoinColumn(name="show_id")
    @JsonManagedReference
    private Show show;

 

 

728x90
반응형

댓글