메인 프로젝트에서 커뮤니티 그룹 생성, 가입, 상세의 댓글 기능 API 를 담당하게 되었는데 JPA 를 사용하여 entity간의
mapping, Controller, Service 까지 다 구현하고나서 앱을 실행시켜보니 stackoverflow 오류가 떴고
구글링 해보니 순환 참조 오류였다.
단반향 관계였으면 생기지 않을 오류였겠지만, 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번을 이용하여 순환 참조 오류를 해결 하게 되었고 제일 권유되는 방법인 것 같다.
이 오류를 해결하면서 느낀점은 오류를 해결하는 방법은 생각보다 다양하고 상황에 맞게 적용시켜 해결해야한다는걸 느꼈다.
'오류 정리들' 카테고리의 다른 글
org.springframework.web.context.ContextLoaderListener 에러 (0) | 2023.08.10 |
---|---|
STS4 UTF16에러, lombok 라이브러리 추가후 log 에러 (0) | 2023.08.10 |
스프링부트(Spring Boot) profile 분리중 만난 에러 (0) | 2023.05.12 |
스프링부트로 todolist 만들면서 오류, 수정한 것들 정리 (0) | 2023.02.09 |