[JPA] ERR_INCOMPLETE_CHUNKED_ENCODING 에러
원인 : 무한 참조로 인한 StackOverflow 에러
해결 : @JsonIgnoreProperties 어노테이션 추가로 해당 컬럼 참조 막음
* 해당 오류는 광범위한 오류로서 JS에서 경로 설정 문제 등으로 발생할수 있음.
스크롤 페이징에서 생긴 오류이다.
작동 잘 하던 스크롤 페이징에 다른 로직을 추가하다가 오류가 발생하였는데,
최초 스크롤 페이징 시에만 ERR_INCOMPLETE_CHUNKED_ENCODING 가 뜨고
스크롤 페이징이 작동되지 않는 상황이다.
불완전한 청크 인코딩 에러 = 즉 어딘가 코드가 잘못되었다는 뜻인데,
인텔리제이에서도 딱히 원인을 알려주지않는 상황.
java.lang.StackOverflowError: null
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:789) ~[jackson-databind-2.13.4.2.jar:2.13.4.2]
알고보니
**** 원래 있었던 Image 도메인 ****
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class Image {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String caption;
private String postImageUrl;
@JsonIgnoreProperties({"images"})
@JoinColumn(name="userId") //foreign 키
@ManyToOne
private User user;
// -----------------------------해당 부분 오류--------------------------------- //
@OneToMany(mappedBy="image")
private List<Likes> likes;
private LocalDateTime createDate;
@Transient
private boolean likeState;
@PrePersist
public void createDate() {
this.createDate = LocalDateTime.now();
}
}
새로운 로직 구현을 위해 Domain - Likes을 만들었고 그 Likes를 Join하기 위해
Domain - Image 에 만든 조인컬럼 llikes가 문제였던 것
**** 새로 만든 Likes 도메인 ****
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
@Table(
uniqueConstraints ={
@UniqueConstraint(name="likes_uk",
columnNames = {"imageId","userId"}
)
}
)
public class Likes {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@JoinColumn(name="imageId")
@ManyToOne
private Image image;
@JoinColumn(name="userId")
@ManyToOne
private User user;
private LocalDateTime createDate;
@PrePersist
public void createDate(){
this.createDate = LocalDateTime.now();
}
}
이 부분에서 Join 처리 된 image 컬럼을 참조하고 참조하면서 타고 들어간 Image -> Likes -> Image -> Likes ......
이렇게 무한 참조가 일어난 것이고 그렇기 떄문에 StackOverflow 에러가 뜬것이다.
해당 코드를
**** 수정된 Image 도메인 ****
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class Image {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String caption;
private String postImageUrl;
@JsonIgnoreProperties({"images"})
@JoinColumn(name="userId") //foreign 키
@ManyToOne
private User user;
// -----------------------------@JsonIgnoreProperties 추가--------------------------------- //
@JsonIgnoreProperties({"image"})
@OneToMany(mappedBy="image")
private List<Likes> likes;
private LocalDateTime createDate;
@Transient
private boolean likeState;
@PrePersist
public void createDate() {
this.createDate = LocalDateTime.now();
}
}
@JsonIgnoreProperties{("문제되는 컬럼")} 어노테이션을 추가해서 디버깅을 완료하였다.
여기서 {("문제되는 컬럼")}은 나의 경우 Likes 안의 image 컬럼이기 때문에 image안에 있는 Likes에서 막아주면 된다.