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

2022. 11. 1. 23:07·성장이야기/TIL

오늘은 어제 학습한 @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를 직렬화에서 제외시켰기 때문에 무한 참조 문제에서 벗어날 수 있었다.

 

 

'성장이야기 > TIL' 카테고리의 다른 글

221103 TIL [Spring boot + React]실시간 채팅 기능 구현하기 - 1  (0) 2022.11.03
221102 TIL JPA n + 1문제란  (0) 2022.11.02
221031 TIL @OneToMany, @ManyToOne (feat. mappedby)  (0) 2022.10.31
221030 TIL Spring Boot AWS S3 연동해서 파일 업로드 하기 (S3 Bucket 생성부터 연동까지)  (0) 2022.10.30
221029 TIL 게시판 조회수 기능 구현하기  (0) 2022.10.29
'성장이야기/TIL' 카테고리의 다른 글
  • 221103 TIL [Spring boot + React]실시간 채팅 기능 구현하기 - 1
  • 221102 TIL JPA n + 1문제란
  • 221031 TIL @OneToMany, @ManyToOne (feat. mappedby)
  • 221030 TIL Spring Boot AWS S3 연동해서 파일 업로드 하기 (S3 Bucket 생성부터 연동까지)
seungjjun
seungjjun
  • seungjjun
    개발이야기
    seungjjun
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 성장이야기
        • TIL
        • 주간회고
      • Java
        • Spring
        • Spring Security
      • 트러블슈팅
      • Kafka
      • OS
      • Network
      • 메가테라
      • Database
      • Algorithm
      • Git
      • HTML
      • CSS
      • 독서
      • 컴퓨터 이해하기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Til
    항해99
    개발일지
    메가테라
    redis
    항해플러스
    이커머스 프로젝트
    메가테라 주간회고
    주간회고
    graphQL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
seungjjun
221101 TIL JPA 양방향 연관관계 Infinite recursion문제
상단으로

티스토리툴바