[Spring] Relying upon circular references is discouraged and they are prohibited by default.

min.c00·2023년 5월 29일
0

이번 글에서는 졸업작품 프로젝트를 개발하면서 발생한 문제 중 순환참조 에 대해 정리해보려고 합니다. 어플리케이션 실행 중 다음과 같은 에러를 만났습니다.

Relying upon circular references is discouraged and they are prohibited by default.

해석하자면 다음과 같다. "순환 참조에 의존하는 것은 권장되지 않으며 기본적으로 금지됩니다."

❓순환 참조는 무엇이며 왜 금지하는 것일까??

순환 참조(Cirular Reference)

Spring 프레임워크는 DI(의존성 주입)을 사용하여 객체 간의 관계를 관리합니다.

객체 간의 의존성을 설정할 때, 스프링은 자동으로 주입할 객체를 찾아서 연결해 줍니다.

그런데!! 순환참조가 존재할 겨우 스프링은 어떤 객체를 먼저 주입해야하는지 판단하기 어렵기 때문에 런타임 시 순환 참조 예외가 발생하는 것입니다.

❗순환참조는 객체 주입의 우선순위 파악을 어렵게 하기 때문에 금지된다는 것을 알 수 있습니다.

제 상황은 다음과 같습니다.

  • customUserDetailService
  • userService
  • mentorService
  • webSecurityConfig

customUserDetailsService는 userService를 그리고 돌고 돌아 webSecurityConfig는 customUserDetailService를 주입받고 있기 때문에 객체 주입의 우선순위 파악이 어렵다고 문제의 원인을 파악할 수 있었습니다.

순환참조 문제는 어떻게 해결하는가?

여러가지 방법이 있지만 가장 좋은 방법은 재설계하는 것입니다. 귀찮은 작업일 수 있지만 객체지향에서 순환참조는 매우 좋지 않은 형태 입니다.

그 이유는 다음과 같습니다.

  1. 순환참조는 객체간의 의존성을 혼란스럽게 만들어 어떤 객체가 먼저 생성되어야 하는지 어떤 객체가 실제로 필요한지 어려울 있어 코드의 의도를 이해하고 유지보수를 어렵게 만든다.

  2. 순환참조가 존재하면 메모리 누수와 성능 문제가 발생할 수 있다. 순환참조된 객체들이 더 이상 필요하지 않은데도 가비지 컬렉터가 회수하지 못하고 유지될 수 있기 때문에 메모리 사용량이 계속해서 증가하고 어플리케이션의 성능이 저하될 수 있다.

  3. 순환 참조는 객체 간의 결합도를 높이고 응집도를 낮출 수 있다. 이는 객체 지향 설계원칙중 하나인 단일 책임 원칙을 위배하는 결과를 가져올 수 있습니다.

따라서 단방향 의존성을 가지도록 객체간 의존관계를 다시 설계함으로써 문제를 해결했다.

0개의 댓글