개발노트

8. [Spring Boot] @ManyToOne 무한재귀 호출 문제 해결하기 본문

서버 개발/Spring Boot

8. [Spring Boot] @ManyToOne 무한재귀 호출 문제 해결하기

mroh1226 2024. 4. 30. 15:05
반응형

Infinite recursion (무한 재귀) 

무한 재귀, 이 오류는 객체 간에 서로 참조가 발생하여 끊임없이 서로를 호출하고 있기 때문에 발생합니다.

가장 흔한 이유는 Hibernate의 엔티티에 양방향 참조가 있을 때 발생합니다. 예를 들어, 두 개의 엔티티가 서로를 참조하고 있고 이 참조가 순환적으로 연결되어 있으면 무한 재귀가 발생할 수 있습니다.

이 문제를 해결하려면 다음과 같은 방법을 고려해 보세요:

  1. @JsonIgnore 애너테이션 사용: 엔티티 클래스의 일부 필드에 @JsonIgnore 애너테이션을 사용하여 해당 필드가 직렬화되지 않도록 만듭니다. 이 방법은 무한 재귀를 방지하는데 유용합니다.
    @JsonIgnore private MixType mixType;
  2. @JsonManagedReference 및 @JsonBackReference 사용: 양방향 참조 관계에서는 **@JsonManagedReference**와 **@JsonBackReference**를 사용하여 직렬화 시 참조 관계를 관리할 수 있습니다. **@JsonManagedReference**는 부모 엔티티의 직렬화를 관리하고, **@JsonBackReference**는 자식 엔티티의 직렬화를 관리합니다. @JsonManagedReference private MixType mixType;
  3. DTO 사용: 엔티티 대신 DTO(Data Transfer Object)를 사용하여 필요한 데이터만 직렬화할 수 있습니다. 이 방법은 데이터 전송에 효율적이고 안전합니다.

문제 발생

 

에러메세지

2024-04-30T14:58:16.484+09:00  WARN 1168 --- [api-server] [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Ignoring exception, response committed already: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError)
2024-04-30T14:58:16.484+09:00  WARN 1168 --- [api-server] [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError)]

 


해결방법:
@JsonIgnore 추가로 해결하기

@JsonIgnore 사용: 엔티티 클래스의 양방향 관계 중 하나의 방향을 직렬화에서 제외시키는 방법입니다. 주로 부모 엔티티에서 자식 엔티티를 제외할 때 사용합니다.

 

@ManyToOne 쪽에 추가

 

@JsonIgnore 추가
해결된 모습

 

반응형
Comments