221101 TIL JPA 양방향 연관관계 Infinite recursion문제

오늘은 어제 학습한 @ManyToOne과 @OneToMany를 활용해서 Entity들을 설계한 대로 객체를 매핑을 하는 작업을 했다.

 

기존의 모델들을 변경하고 새로만들고 하다 보니까 작성했던 테스트 코드나 프론트엔드에서 값을 전달해주는 방식, 테스트 코드 등 모든 게 바뀌어야 했다. 그래서 오늘 리팩터링 하는데만 스토리 포인트 5를 사용해버렸다..


모델 설계를 초반에 하고 했어야 했는데 생각없이 첫 주차에 게시글 보기와 작성하는 기능을 만든다고 임시방편으로 만들었던 모델이 오늘 모델들을 다시 설계한 대로 바꾸면서 발생한 문제들을 해결하는 것과 변경해야 하는 코드들이 너무 많아 고통으로 돌아왔다.

작업설계의 중요성..

 

@JsonManagedReference @JsonBackReferenc

@ManyToOne과 @OneToMany어노테이션으로 양방향으로 연관관계를 설정 했더니 Infinite recursion 문제가 발생했다. 서로가 서로를 참조를 하면서 무한으로 참조하면서 발생한 문제였다.

무한 참조 문제를 @JsonManagedReference @JsonBackReference 두 어노테이션을 추가해줌으로써 해결해줄 수 있었다.

@JsonManagedReference -> 참조의 정방향 부분을 관리하고 이 어노테이션을 추가한 필드는 직렬화되는 필드이다.
@JsonBackReference -> 참조의 역방향 부분을 관리하고 이 어노테이션을 추가한 필드는 직렬화되지 않는다

 

직렬화란

  • 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 것을 의미한다.

 

 

Infinite recursion이 발생한 문제의 코드인데 @OneToMany, @ManyToOne으로 서로 양방향 관계를 맺고 있기 때문이다.

서로 참조하는 과정을 살펴보면 아래와 같다.

Post의 필드중 User 객체를 직렬화 한다 --> User 객체의 필드 중에는 List <Post>가 존재한다. --> 다시 Post를 직렬화 한다. 그러면 또 Post에 User가 존재해 직렬화 하는 무한 루프에 빠지게 된다.

 

이 user와 post의 양방향 관계에서 User에 @JsonBackReference어노테이션을 추가해줌으로써 직렬화에서 user객체를 제외시켰다.

Post객체를 직렬화 할때 user를 직렬화에서 제외시켰기 때문에 무한 참조 문제에서 벗어날 수 있었다.