JPA 에서 양방향으로 연결된 엔티티를 JSON 형태로 직렬화 하는 과정에서,
서로의 정보를 계속 순환하며 참조하여 StackOverFlowError
를 발생시키는 현상을 말한다.
객체/데이터를 바이트 형태로 변환하여 네트워크를 통해 송수신할 수 있도록 만드는 것을 말한다.
아래 코드를 보면 PostResponseDto 에서 comments
를 생성자를 통해 초기화할 때,List<Comment>
를 넣어준다.
코드 자체는 문제가 없다고 생각을 했는데,
막상 실행을 해보니 StackOverFlowError
...
처음보는 에러에 당황을 했다.
어디선가 Dto 를 생성하는 방법을 이용해서 진행했다고 했는데,
괜한 오기로
라며 헤딩 -> 실패 -> 해딩 -> 실패...
그림을 통해보면 이와 같다.
Comment
엔티티를 JSON 형태로 직렬화 하는 과정에서, Comment
엔티티가 참조하고 있는 post
엔티티를 조회하게 된다.
또, post
엔티티를 조회하는 과정에서, 참조하고 있는 Comment
엔티티를 조회한다.
위 과정이 끊임없이 반복되며 StackOverFlowError
발생
일반적으로 DTO를 방식을 사용한다고 하더라...
내가 하기 싫었던게 일반적인 방법...
틀에 박히지 말고 유연하게 생각하자는 생각이 들었다.
어떻게 해서든 문제를 다양한 방법으로 고민하는 것은 좋지만,
이거는 절대 안써라고 하는 발상은 나에게 조금 위험하지 않을까...?
Object 를 JSON 형태로 직렬화하기 위해 HttpMessageConverters
에서 jackson Library
활용
jackson
의 직렬화 방식
기본적으로 public
필드만 직렬화를 시도
private
필드를 직렬화하기 위해 getter
선언
아래 Exception 이 발생한다면 getter
선언이 되어있는지 확인해 보자.
No serializer found for class
no properties discovered to create BeanSerializer
@JsonManagedReference
-> 연관관계 주인 반대 Entity에 선언
-> 정상적으로 직렬화 수행
@JsonBackReference
-> 연관관계 주인 Entity에 선언
-> 직렬화를 하지 않음
https://data-make.tistory.com/727