Stack과 partStack은 oneToMany, ManyToOne 양방향 연관 관계를 맺고 있었다. 때문에 사용자 정보를 가져올 때 getMyStacks()만 호출했는데도 partStack 데이터까지 읽어왔다. 전혀 필요 없는 데이터고 요청도 하지 않았는데 말이다.
더 큰 문제는 User가 UserPart를 호출하고 UserPart가 또 User를 호출하면서 무한 루프에 빠진 상황이었다.
그렇다. jackson의 처리 방식 때문이다.
나는 getXXX를 통해 특정 테이블의 정보만 얻어오고 싶었는데 그 테이블에 매핑된 객체에서 다른 테이블의 객체를 참조하고 있었다.
@XXToMany는 기본 fetch 방식이 LAZY이기 때문에 많은 연관된 데이터를 읽어오도록 요청하지 않고 단지 프록시 객체를 받아온다. 이게 예상했던 플로우다.
하지만 jackson이 이 프록시 객체를 구체적으로 알아내고자 Many 관계를 가진 테이블에 sql문을 날리도록 요청한다. 그래서 예상과 달리 원하지 않는 테이블의 정보까지 가져온 것이다. 심지어 무한루프에 빠졌다.
그러므로 api controller에서 필요로 하는 데이터와 만들어놓은 entity를 잘 보고 프록시 객체를 받아오겠다 싶은 부분은 @JsonIgnore를 처리해야 한다.
'프로젝트 > 크루트' 카테고리의 다른 글
CascadeType.REMOVE와 orpahnRemoval=True (0) | 2022.02.21 |
---|---|
@Entity 적용한 클래스에 getter가 없으면 jackson이 파싱을 못 하셔 (0) | 2022.02.21 |
cors 빠져나가기 (0) | 2022.02.17 |
.nuxt 하위 파일을 변경하지 마세요 (0) | 2022.02.11 |
처음 테스트 코드를 작성하며 겪었던 문제들 (0) | 2022.02.10 |