자바 bean 순환 참조 문제
스프링 컨트롤러와 서비스를 분기 처리하고 시스템을 기동했는데 아래와 같은 로그 발생
***************************
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을 필요로 하는 문제인 것이다.
이를 해결하는 방법은 크게 두가지가 있다.
- 의존성 주입을 하는 시기를 늦추는 방법
- 스프링 빈 간의 의존성 관계 구조를 바꾸는 방법
가장 이상적인 것은 2번 방법으로 해결하는 것이다.
1번은
@Autowired와 @RequiredArgsConstructor 또는 @Lazy 사용해서, 의존성 주입하는 시기를 메소드를 호출하는 시기로 늦추는 방법이다.
'개발 > JAVA' 카테고리의 다른 글
Spring(Boot) 에서 JPA EntityManager 를 얻어오는 방법 - Java (0) | 2021.07.21 |
---|---|
DTO, Entity 간 필드 값 복사하기 (Object 필드 값 복사) - Java (0) | 2021.07.21 |
좋은 주석을 다는 법 - Java (0) | 2021.05.24 |
POST, GET Method 요청을 받는 DTO, Setter가 필요할까? (0) | 2021.05.24 |
List<Integer> to int[] (Integer List to int Array) 변환 방법 (0) | 2021.05.07 |
댓글
이 글 공유하기
다른 글
-
Spring(Boot) 에서 JPA EntityManager 를 얻어오는 방법 - Java
Spring(Boot) 에서 JPA EntityManager 를 얻어오는 방법 - Java
2021.07.21 -
DTO, Entity 간 필드 값 복사하기 (Object 필드 값 복사) - Java
DTO, Entity 간 필드 값 복사하기 (Object 필드 값 복사) - Java
2021.07.21 -
좋은 주석을 다는 법 - Java
좋은 주석을 다는 법 - Java
2021.05.24 -
POST, GET Method 요청을 받는 DTO, Setter가 필요할까?
POST, GET Method 요청을 받는 DTO, Setter가 필요할까?
2021.05.24
Uploaded by Notion2Tistory v1.1.0