스프링 컨트롤러와 서비스를 분기 처리하고 시스템을 기동했는데 아래와 같은 로그 발생

***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

┌─────┐
|  securityConfig defined in file [C:\Users\ehdgu\IdeaProjects\slack_practice\target\classes\com\slack\slack\appConfig\SecurityConfig.class]
↑     ↓
|  jwtTokenProvider defined in file [C:\Users\ehdgu\IdeaProjects\slack_practice\target\classes\com\slack\slack\appConfig\security\JwtTokenProvider.class]
↑     ↓
|  userService defined in file [C:\Users\ehdgu\IdeaProjects\slack_practice\target\classes\com\slack\slack\domain\user\UserService.class]
└─────┘



Process finished with exit code 0

SecurityConfig, JwtTokenProvider, UserService 클래스간에 순환 참조 문제가 발생하고 있는 것.

스프링 프레임워크에서 서비스를 기동할 때 이름에 해당하는 빈을 의존성 주입해주는데,

두개의 클래스에서 생성자를 통해 서로 주입받으려고 할 때, 순환 참조 문제가 발생

즉, SecurityConfig 의 의존성을 해결하려고 보니 JwtTokenProvider란 이름의 빈이 필요했고,

그래서 JwtTokenProvider 을 빈으로 만드려고 보니, UserService 가 필요했는데

다시 UserService 을 빈으로 만드려고 보니 SecurityConfig을 필요로 하는 문제인 것이다.

이를 해결하는 방법은 크게 두가지가 있다.

  1. 의존성 주입을 하는 시기를 늦추는 방법
  1. 스프링 빈 간의 의존성 관계 구조를 바꾸는 방법

가장 이상적인 것은 2번 방법으로 해결하는 것이다.

1번은

@Autowired와 @RequiredArgsConstructor 또는 @Lazy 사용해서, 의존성 주입하는 시기를 메소드를 호출하는 시기로 늦추는 방법이다.