JPA 양방향 매핑, 순환참조

213kky·2024년 1월 9일

문제


jpa 양방향 매핑시 순환참조가 문제가 발생할 수 있는데, REST API로  Entity를 컨트롤러에서 직접조회하는 경우 다음과 같은 결과를 볼 수 있을 것이다.


해결 방법


순환 참조를 방지하기 위한 방법은 여러 가지가 있다.

  1. @JsonIgnore
    해당 어노테이션을 붙이면 JSON 데이터에 해당 프로퍼티는 null로 들어가게 된다.
    데이터에 아예 포함시키지 않는다.

  2. @JsonManagedReference 와 @JsonBackReference
    부모 클래스(Community entity)의 communityComment 필드에 @JsonManagedReference를, 자식 클래스(communityComment entity)의 Community 필드에 @JsonBackReference를 추가해주면 순환 참조를 막을 수 있다.

  3. @JsonIgnoreProperties
    부모 클래스(Community entity)의 communityComment 필드에 @JsonIgnoreProperties({"Community"}) 를 붙여주면 순환 참조를 막을 수 있다.

  4. DTO 사용
    순환 참조의 주원인은 양방향 매핑이지만, Entity 자체를 response로 리턴하기 때문에 발생하게 된다. Entity 대신 DTO를 만들어 필요한 데이터만 리턴하면 순환 참조 관련 문제는 발생하지 않는다.

  5. 매핑 재설정
    양방향 매핑이 꼭 필요한지 다시 한번 생각해볼 필요가 있다. 만약 양쪽에서 접근할 필요가 없다면 단방향 매핑을 해주는 것이 좋다.


요약

여러가지 해결 방안이 있지만 Entity를 통신에 사용하지 말고 DTO를 사용하는 것을 추천한다고 한다.
Entity를 통신에 사용하게 되면 순환참조 뿐만 아니라 보안적인 문제와 불필요한 필드 노출 문제가 발생되고, Entity 필드의 형식이 변경되는 경우 데이터의 유연한 대응이 힘들어지기 때문이다.

profile
since 2022

0개의 댓글