[Spring/SpringBoot] JPA관련 응답오류- Cannot call sendError() after the response has been committed

pintegral·2022년 10월 11일
0

Spring/Spring Boot

목록 보기
5/8
post-thumbnail

문제원인


프로젝트 초기에는 Event 테이블과 Board 테이블을 일대일 연관관계로 설계만 해놓고 양방향으로 매핑해주지는 않았다. 즉 Board 테이블에서는 Event 테이블을 호출할 가능성을 두었지만, Event 테이블에서 Board 테이블을 호출할 가능성은 두지 않은 단방향 일대일 매핑관계로 프로젝트를 설계했다.

그런데 기능을 추가하면서 Event 테이블에서 Board테이블을 호출해야 했고,

  @OneToOne(mappedBy = "event", fetch = FetchType.LAZY)
  private Board board;

이 매핑관계 코드를 주석처리했다가 주석처리를 해제해줬다. 그렇게 하니 프론트에서 ajax로 Event,Board 테이블과 통신할 때 저런 오류가 뜬 것이다. 엔티티 호출할 때 양방향 매핑관계 때문에 n+1으로 리턴됐기 때문이었다.

해결방법


검색해보니 이 오류에는 여러가지 원인과 해결방안들이 있었다.
그 중 본인 프로젝트에서 적용한 방법은 @JsonIgnore 어노테이션을 붙여 프론트로 JSON 포맷의 데이터를 보낼 때 양방향 매핑으로 인해 생기는 순환참조 문제를 해결해주는 것이었다.

적용 코드


@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Event {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "event_id")
    private Long id;

    private Integer categoryId;

    @Column(length = 100)
    private String name;

...
    @JsonIgnore // here!
    @OneToOne(mappedBy = "event", fetch = FetchType.LAZY)
    private Board board;

...
profile
문제를 끝까지 해결하려는 집념의 개발자

0개의 댓글