-
JPA 순환 참조 해결SOLUX-우리만 앱 2021. 8. 8. 17:05
다대일 양방향 관계를 구현할 때 무한 순환 참조가 발생했다.
@ManyToOne @JoinColumn(name = "Club_Id") private Club club;
Notice에서 위와 같이 ManyToOne으로 club을 매핑하고,
@OneToMany (mappedBy = "club") private List<Notice> notices = new ArrayList<Notice>();
Club에서 위와 같이 oneToMany로 notice를 조회할 수 있도록 했다.
이렇게 한 후 notice를 조회하면 아래처럼 notice를 통해 club을 참조하고, club을 통해 notice를 참조하고, 이 과정을 무한 반복하게 된다.
{ "id": 1, "title": "djjl", "content": "de33e", "author": null, "club": { "id": 1, "name": "dljff", "generation": 3, "info": null, "clubCode": "dliejl;adlj", "notices": [ { "createdDate": "2021-08-08T16:50:03.039556", "modifiedDate": "2021-08-08T16:50:03.039556", "id": 1, "title": "djjl", "content": "de33e", "author": null, "club": { "id": 1, "name": "dljff", "generation": 3, "info": null, "clubCode": "dliejl;adlj", "notices": [ { "createdDate": "2021-08-08T16:50:03.039556", "modifiedDate": "2021-08-08T16:50:03.039556", "id": 1, "title": "djjl", "content": "de33e", "author": null, "club": { "id": 1, "name": "dljff", "generation": 3, "info": null, "clubCode": "dliejl;adlj", ...
이 문제를 해결하는 방법은 2가지가 있다.
1. @JsonIgnore
2. @JsonBackReference, @JsonManagedReference
1. @JsonIgnore은 이름에서 보이듯이 아예 json으로 보여주지 않는 방법이다.
@JsonIgnore @ManyToOne @JoinColumn(name = "Club_Id") private Club club;
예를 들어 이렇게 작성하면 notice를 조회할 때 club에 대한 내용은 보여주지 않는 것이다.
2. @JsonBackReference는 직렬화되지 않도록 하는 것이고, @JsonManagedReference는 정상적으로 직렬화되도록 하는 것이다.
@JsonBackReference @ManyToOne @JoinColumn(name = "Club_Id") private Club club;
즉, notice는 위와 같이 jsonBackReference로 설정하고,
@JsonManagedReference @OneToMany (mappedBy = "club") private List<Notice> notices = new ArrayList<Notice>();
club은 @JsonManagedReference로 설정하면
{ "id": 1, "title": "djjl", "content": "de33e", "author": null, "club": { "id": 1, "name": "dljff", "generation": 3, "info": null, "clubCode": "dliejl;adlj", "notices": [ { "createdDate": "2021-08-08T17:00:54.62225", "modifiedDate": "2021-08-08T17:00:54.62225", "id": 1, "title": "djjl", "content": "de33e", "author": null } ], "posts": [], "receipts": [] }, "createdDate": "2021-08-08T17:00:54.62225", "modifiedDate": "2021-08-08T17:00:54.62225" }
이와 같이 무한 참조를 하지 않는 결과를 볼 수 있다.
'SOLUX-우리만 앱' 카테고리의 다른 글
안드로이드 화면 새로고침 (0) 2021.08.19 aws EC2 서버 접속 (0) 2021.08.12 Postman Unsupported Media Type 에러 (0) 2021.08.06 #2 ERD (0) 2021.07.13 #1 조별 일지 기록 페이지 (0) 2021.07.05