[JPA] ErrorReport : 일대다 양방향 Response Error

Hyebin Lee·2022년 4월 8일
0

JPA TIL

목록 보기
6/7
post-custom-banner

오류 내용 : Cannot call sendError() after the response has been committed


일대다 양방향 매핑에서 다음과 같은 오류가 나면서 뭔가 코드상으로 무한루프를 도는 에러가 생겼다.

PostMan으로 찍어봤는데 이런식으로 무한정으로 post가 이루어짐 ㅠㅠ

원인

@PostMapping("api/scrap/{userId}/{articlePK}")
    public ScrapArticle scrapArticle(@PathVariable("userId") String userId,
                                     @PathVariable("articlePK") Long articlePK) {
        return scrapArticleService.scrapArticle(userId, articlePK);
    }

양방향 연관관계 매핑을 맺고 있는 Entity를 response( api 의 return 값)으로 주게 될 경우 이런 문제가 생긴다. (여태까지는 이런문제가 없었던게 항상 DTO로 감싸서 response 줘서 문제가 없었다.. 이번에는 기능 테스트 먼저 해보려고 하다보니 이런 오류가 ㅠㅠ)

ManyToOne, OneToMany 양방향 관계에서 ScrapArticle 엔티티를 조회할때
스프링에서 JSON변환을 담당하는 Jackson 라이브러리를 이용해 Entity 객체를 그대로 JSON 문자열으로 변환시키게 되는데
ScrapArticle 객체의 member 필드가 ScrapArticle 엔티티를 참조하고, Member 객체의 scrapArticle 필드가 Member 엔티티를 참조 하고 이를 변환 시키는 과정에서 같은 데이터가 반복적으로 출력이 되는 무한 루프가 발생하는 순환 참조 문제이다.

해결방안

@JsonManagedReference

양방향 관계에서 정방향(자식->부모) 참조할 변수에 어노테이션을 추가하면 직렬화에 포함된다
일대다 양방향 관계에서 즉, @ManyToOne 어노테이션이 붙은 필드 부분에 해당 어노테이션을 추가로 붙여주면 된다.

@JsonBackReference

양방향 관계에서 역방향(부모->자식) 참조로 어노테이션을 추가하면 직렬화에서 제외된다
일대다 양방향 관계에서 즉, @OneToMany 어노테이션이 붙은 필드 부분에 해당 어노테이션을 추가로 붙여주면 된다.

🌟DTO를 response로 활용하자

사실 가장 좋은 방법은 항상 API 의 response로는 DTO만 줄 것,,, Entity 자체를 주는 것은 문제가 참 많다

post-custom-banner

0개의 댓글