트러블슈팅

[JPA] ERR_INCOMPLETE_CHUNKED_ENCODING 에러

pyogowoon 2023. 1. 13. 12:15

 

원인 : 무한 참조로 인한 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에서 막아주면 된다.