IT 족집게/개발

[Spring Error] Cannot call sendError() after the response has been committed

머니킹입니다 2022. 4. 23. 03:03

스프링으로 프로젝트를 개발하던 중 해당 오류가 나왔다. 해당 오류는 JAVA에 Json 타입 변환 과정 중 일어난 오류이다. 이는 테이블과 테이블이 연관 관계에 있으며 이를 mode.addAttribute 메소드를 통해 데이터를 Front로 보낼때 Json으로 변환 과정중에 무한으로 참조가 순환되어 일어나는 오류로 간단히 해결할 수 있다.

 

문제

@Entity
@Getter
@Setter
public class ProfileBlockTemplate {
	......

    @JsonIgnore
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "MEMBER_ID")
    Member member;

    @JsonIgnore
    @OneToMany(mappedBy = "profileBlockTemplate")
    private List<ProfileTemplateComponent> profileTemplateComponents;

    .......
}

 

@Getter @Setter
@Slf4j
@Entity
public class Member {

	.......

    @JsonIgnore
    @OneToMany(mappedBy ="member")
    List<ProfileBlockTemplate> profileBlockTemplates;

    public Member() {

    }
    
    ......
}

 

아마 JPA 순환 반복이 Member에서 일어난 듯 하다. Member에는 하위 연관 관계가 당연히 추가로 있으며 이 때문에 참조에 참조를 반복하다가 JSON이 오류가 난 듯 싶다. Spring은 Front로 데이터를 보낼 때 Json으로 보내야하는 상황이면 Jackson을 통해 Json 형태로 변환하는데 순환구조일 경우 에러가 떠버린다.

 

위의 코드처럼 해당 연관관계 매핑 부분에 @JsonIgnore을 붙여주면 순환 참조 관계를 막을 수 있다