🖍 Error : Cannot call sendError() after the response has been committed -

java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
		at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:472) ~[tomcat-embed-core-9.0.65.jar:9.0.65]
		at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:129) ~[tomcat-embed-core-9.0.65.jar:4.0.FR]
		at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:129) ~[tomcat-embed-core-9.0.65.jar:4.0.FR]
		at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:129) ~[tomcat-embed-core-9.0.65.jar:4.0.FR]
		at org.springframework.security.web.util.OnCommittedResponseWrapper.sendError(OnCommittedResponseWrapper.java:116) ~[spring-security-web-5.7.3.jar:5.7.3]
		...

Member 객체를 활용하여 내 그룹들을 조회하는 API를 구현하는 과정에서 발생한 오류이다. TeamMember라는 Entity에서 TeamMember를 조회하는 데에 문제가 생긴 것이었다.

Member

@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Member {

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

    @Column(nullable = false)
    private String username;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private String nickname;

    @OneToMany(mappedBy = "member")
    private List<PersonalSchedule> personalScheduleList;

    @OneToMany(mappedBy = "member")
    private List<TeamMember> teamMemberSet;
}

Team

@Entity(name = "team")
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Team {

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

    @Column(nullable = false)
    private String name;

    @OneToMany(mappedBy = "team", fetch = FetchType.LAZY)
    private List<TeamSchedule> teamScheduleList;

    @OneToMany(mappedBy = "team", fetch = FetchType.LAZY)
    private List<TeamMember> teamMemberList;

    public void updateName(String name) {
        this.name = name;
    }
}

TeamMember

@Entity
@Getter
@Builder
@IdClass(TeamMemberId.class)
@NoArgsConstructor
@AllArgsConstructor
public class TeamMember {

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="team_id")
    private Team team;

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="member_id")
    private Member member;

    @Enumerated(EnumType.STRING)
    private TeamRole teamRole;
}

해당 오류는 Java에 JSON 타입 변환 과정 중 일어나는 오류라고 한다.

테이블과 테이블이 연관관계에 있으며 이를 mode.addAttribute 메소드를 통해 데이터를 Front로 보낼 때 Json으로 변환하는 과정 중에 무한으로 참조가 순환되어 일어나는 오류라고.

이는 해당 연관관계 매핑 부분에 @JsonIgnore를 붙여 순환참조관계를 막아 간단히 해결할 수 있다.