이슈 정리
주문 관리 api를 만드는 중 등록 된 주문을 조회할 때 json이 거의 무한 반복으로 나왔다.
테이블 관계 때문에 쓴 @ManytoMany, @OneToMany 같은 관계 때문인가라고 고민해 보았다.
{
"products": [
{
"id": 1,
"name": "치즈버거",
"description": "패티, 치즈",
"price": "4000원",
"stock": 9,
"createdDate": "2022-02-25T00:00:00",
"modifiedDate": "2022-02-25T00:00:00"
},
{
"id": 2,
"name": "빅맥",
"description": "시그니쳐 버거",
"price": "6000원",
"stock": 10,
"createdDate": "2022-02-25T00:00:00",
"modifiedDate": "2022-02-25T00:00:00"
}
],
"totalPrice": "10,000",
"user": {
"id": 1,
"username": "hong123",
"name": "홍길동",
"password": "qwerQ1234!",
"phoneNumber": "01012341234",
"orders": [
{
"id": 1,
"totalPrice": "10,000",
"user": {
"id": 1,
"username": "hong123",
"name": "홍길동",
"password": "qwerQ1234!",
"phoneNumber": "01012341234",
"orders": [
{
"id": 1,
"totalPrice": "10,000",
"user": {
"id": 1,
"username": "hong123",
"name": "홍길동",
"password": "qwerQ1234!",
"phoneNumber": "01012341234",
"orders": [
{
"id": 1,
"totalPrice": "10,000",
"user": {
"id": 1,
"username": "hong123",
"name": "홍길동",
"password": "qwerQ1234!",
"phoneNumber": "01012341234",
"orders": [
{
"id": 1,
"totalPrice": "10,000",
"user": {
"id": 1,
"username": "hong123",
"name": "홍길동",
"password": "qwerQ1234!",
"phoneNumber": "01012341234",
"orders": [
{
"id": 1,
"totalPrice": "10,000",
"user": {
"id": 1,
"username": "hong123",
"name": "홍길동",
"password": "qwerQ1234!",
"phoneNumber": "01012341234",
"orders": [
{
"id": 1,
"totalPrice": "10,000",
"user": {
"id": 1,
"username": "hong123",
"name": "홍길동",
"password": "qwerQ1234!",
"phoneNumber": "01012341234",
"orders": [
{
"id": 1,
"totalPrice": "10,000",
"user": {
"id": 1,
"username": "hong123",
"name": "홍길동",
"password": "qwerQ1234!",
"phoneNumber": "01012341234",
"orders": [
{
"id": 1,
"totalPrice": "10,000",
"user": {
해결방법
ManyToOne, OneToMany 양방향 관계에서 Member 엔티티를 조회할때
스프링에서 JSON변환을 담당하는 Jackson 라이브러리를 이용해 Entity 객체를 그대로 JSON 문자열으로 변환시키게 되는데 Member 객체의 team 필드가 Team 엔티티를 참조하고, Team 객체의 members 필드가 Member 엔티티를 참조 하고 이를 변환 시키는 과정에서 같은 데이터가 반복적으로 출력이 되는 무한 루프가 발생하는 순환 참조 문제
위 블로그에서 발견했는데 무한 루프가 발생하는 문제가 맞았다.
블로그에서 나오는 @JsonManagedReference, @JsonBackReference를 추가하고 다시 돌려본 결과 이번에는 아래같은 다른 에러가 발생했다.
Failed to evaluate Jackson deserialization for type
[[simple type, 경로]]
: com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
Cannot handle managed/back reference 'defaultReference':
back reference type
(경로)
not compatible with managed type
(경로)
그래서 블로그에서 말한 두번째 방법인 Dto로 값을 전달하는 방법도 시도해 보았지만 3개의 테이블이 묶여있는 상황에서 똑같은 문제가 발생했다.
다른 해결방안을 찾아보았다. 또 다른 블로그에서는 좀 더 간다한 방법이 있었는데 @JsonIgnore라는 애너테이션을 묶여있는 테이블에 달아주니까 해결되었다.
https://thalals.tistory.com/227
'TIL' 카테고리의 다른 글
[React]컴포넌트로 반복 작업 줄이기!! (0) | 2022.03.30 |
---|---|
ES6 find(), findIndex() 사용법을 알아보자! (1) | 2022.03.30 |
ES6 Map, Filter, Reduce 기능을 알아보자 (0) | 2022.03.30 |
(온더스팟) - 1. 개발 환경 구축(프로젝트 생성) (0) | 2022.01.10 |
<JAVASCRIPT> 마우스 이벤트를 이용한 움직이는 DIV 만들기 (0) | 2021.03.08 |