프로젝트/크루트

jpa 사용 시 양방향 연관 관계에 모두 @JsonIgnore 처리

발전생 2022. 2. 18. 14:46

Stack과 partStack은 oneToMany, ManyToOne 양방향 연관 관계를 맺고 있었다. 때문에 사용자 정보를 가져올 때 getMyStacks()만 호출했는데도 partStack 데이터까지 읽어왔다. 전혀 필요 없는 데이터고 요청도 하지 않았는데 말이다.

더 큰 문제는 User가 UserPart를 호출하고 UserPart가 또 User를 호출하면서 무한 루프에 빠진 상황이었다.

 

그렇다. jackson의 처리 방식 때문이다.

나는 getXXX를 통해 특정 테이블의 정보만 얻어오고 싶었는데 그 테이블에 매핑된 객체에서 다른 테이블의 객체를 참조하고 있었다.

@XXToMany는 기본 fetch 방식이 LAZY이기 때문에 많은 연관된 데이터를 읽어오도록 요청하지 않고 단지 프록시 객체를 받아온다. 이게 예상했던 플로우다. 

하지만 jackson이 이 프록시 객체를 구체적으로 알아내고자 Many 관계를 가진 테이블에 sql문을 날리도록 요청한다. 그래서 예상과 달리 원하지 않는 테이블의 정보까지 가져온 것이다. 심지어 무한루프에 빠졌다. 

 

그러므로 api controller에서 필요로 하는 데이터와 만들어놓은 entity를 잘 보고 프록시 객체를 받아오겠다 싶은 부분은 @JsonIgnore를 처리해야 한다.