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 |
---|