JPA

[JPA] JSON 직렬화 순환참조, JSON 무한출력, JSON 와르르

2024. 10. 22. 19:48
목차
  1. 1. 문제
  2. 2. 문제 원인
  3. 3. 문제 해결

1. 문제

어제 급하게 Spring Boot로 백엔드를 만들다가 위와 같은 상황을 마주쳤다. JSON 와르르,,,

DTO를 만들어서 객체를 담아야 하는데 시간이 촉박해서 그냥 Entity를 직접 사용하다 보니 예기치 못한 상황이 발생했다.

 

2. 문제 원인

public class ProductEntity extends BaseEntity {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "category_id")
    private CategoryEntity category;
}

public class CategoryEntity {
    @OneToMany(mappedBy = "category", fetch = FetchType.LAZY)
    @JsonManagedReference
    private List<ProductEntity> products = new ArrayList<>();
}

Product 제품이 Category를 참조하고 있어 위와 같이 Entity를 작성 했다. Product : Category = N : 1 관계이다. DTO를 사용하지 않고 Entity를 직접 사용해서 Product제품을 불러온다고 가정하면,

 

1. private CategoryEntity category; 에서 Category 가져옴

2. private List<ProductEntity> products = new ArrayList<>(); 에서 Product 리스트를 불러옴

3. private CategoryEntity category; 에서 Category 가져옴

4. private List products = new ArrayList<>(); 에서 Product 리스트를 불러옴

 

,,,, 무한 반복이고 더이상 출력될 수 없어서 사실상 에러이다.

 

그림으로 비유하자면 위와 같다. 서로가 서로를 가리키고 있기 때문에 이 관계를 끊어줘야 한다.

 

3. 문제 해결

public class ProductDTO {
    private int id;
    // ... 생략
    private CategoryDTO category;
}

public class CategoryDTO {
    private int id;
    private String category1;
    private String category2;
    private String category3;
}

DTO를 만들면 사실상 해결된다. 에너테이션으로 @JsonIgnore, @JsonManagedReference, @JsonBackReference 사용하라고 알려주는데 그냥 DTO 사용할거 그냥 만들면 된다. 위 방법으로 시도하다가 결국 울며 겨자먹기로 DTO를 만들었다. 그 시간에 DTO 만들었으면 문제가 빨리 해결됬을거 같았다,,,

 

 

[결론] : DTO를 꼭 사용할 것. 모르면 외워. Entity로 직접 객체 가져오지 말것 + JPA 깊게 공부할 것

'JPA' 카테고리의 다른 글

[JSON] JSON의 Boolean 값을 Java DTO로 매핑하는 방법 및 문제 발생 케이스(24/12/03 수정)  (0) 2024.12.02
  1. 1. 문제
  2. 2. 문제 원인
  3. 3. 문제 해결
'JPA' 카테고리의 다른 글
  • [JSON] JSON의 Boolean 값을 Java DTO로 매핑하는 방법 및 문제 발생 케이스(24/12/03 수정)
돌맹이떼굴떼굴
돌맹이떼굴떼굴
돌맹이떼굴떼굴
떼굴떼굴개발자
돌맹이떼굴떼굴
전체
오늘
어제
  • 분류 전체보기 (137)
    • C언어 (6)
      • 홍정모 C언어 (6)
    • 자바 (1)
      • 자바의 정석 Ch.7 객체지향 프로그래밍 II (22)
      • 이것이 자바다 (1)
    • 스프링의 정석 (38)
      • Ch. 02 Spring MVC (34)
      • Ch. 03 Spring DI와 AOP (1)
      • spring error (2)
    • JavaScript (7)
    • HTML&CSS (2)
      • 제대로 파는 HTML CSS - by 얄코 (1)
    • React.js, 스프링 부트, AWS로 배우는 .. (12)
    • BACKJOON, 백준 (7)
    • 프로그래머스 (1)
    • Error (10)
      • Java (5)
    • Spring (5)
    • JPA (2)
    • Vue (1)
    • Git (5)
    • Linux (0)
    • HTML (1)
    • DB (3)
    • Web (2)
    • 잡다 (1)
    • 개발 프로젝트 (2)
    • doom (1)
    • 취업 (3)
    • Network (0)
    • 재테크 (2)
    • 일상 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 보령약국
  • 갈더마
  • 비맥스메타
  • 비전공
  • 비맥스
  • 종로5가약국
  • 고보습로션
  • 세타필세라마이드로션
  • 취업연계
  • 향기부각로션
  • 아로나민골드
  • 애크논크림
  • 온유약국
  • kosa혜화
  • 비맥스메타정
  • 향기지속로션
  • 세타필로션
  • 비맥스가격
  • 비전공개발자
  • KOSA

최근 댓글

최근 글

hELLO · Designed By 정상우.
돌맹이떼굴떼굴
[JPA] JSON 직렬화 순환참조, JSON 무한출력, JSON 와르르
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.