본문 바로가기

오류 정리들

JPA 순환참조

메인 프로젝트에서 커뮤니티 그룹 생성, 가입, 상세의 댓글 기능 API 를 담당하게 되었는데 JPA 를 사용하여 entity간의

mapping, Controller, Service 까지 다 구현하고나서 앱을 실행시켜보니 stackoverflow 오류가 떴고
구글링 해보니 순환 참조 오류였다.

 

Group과 MemberGroup, Comment ERD

단반향 관계였으면 생기지 않을 오류였겠지만, 1:N, N:1로 양방향으로 mapping이 되었기 때문에 서로 참조가 가능해진 상태였고 그상태에서 JSON으로 직렬화를 하려하니 오류가 발생했다 .

 

해결할 방법을 찾아보니

1. JPA속성인 FetchType.LAZY를 사용해서 지연로딩을 구현하여 연관된 entity를 프록시로 조회하도록 한다.

2. @JsonManagedReference, @JsonBackReference, @JsonIgnore와 같은 Jackson 라이브러리에서 제공하는 어노테이션을 사용하여 순환 참조 제거

 @JsonIgnore: 양방향 관계를 가지고 있는 두 entity 중 하나의 entity의 참조 필드에 직렬화를 제외시키는 방법이다. 해당  어노테이션이 선언된 필드는 직렬화 대상에서 제외된다. 

 @JsonBackReference: 직렬화가 되지 않도록 막아준다, 관계의 주인 entity에 선언하면 된다.

 @JsonManagedReference: 직렬화가 되도록 해준다, 관계의 주인이 아닌 entity에 선언하면 된다.

3. DTO를 사용해 다른 entity 정보를 포함하지 않도록 필요한 정보만을 포함시키기

4. Mapping 재설정

 

이 중 3번을 이용하여 순환 참조 오류를 해결 하게 되었고 제일 권유되는 방법인 것 같다. 

이 오류를 해결하면서 느낀점은 오류를 해결하는 방법은 생각보다 다양하고 상황에 맞게 적용시켜 해결해야한다는걸 느꼈다.