SpringSecurity에서 passwordEncoder를 사용하여 configureGlobal과 AccountService에서 주입받아 사용할때, 순환참조 및 bean 생성 오류가 발생하였다.
아래와 같이 PasswordEncoder를 static 붙여서 해결 왜 static을 붙이면 해결할 수 있었지만, 왜 해결할 수 있었는지, 순환참조는 왜 발생한 것인지 자세하게 살펴보기 위하여 탐구한 내용을 기록한다.
일단 오류로그는 오류가 발생한 지점부터 순차적으로 로그를 기록하므로, 위에 기록된 오류 부터 탐색해 보았다.
첫번째 오류
Error creating bean with name 'accountController': Unsatisfied dependency expressed through field 'accountService': Error creating bean with name 'accountService': Unsatisfied dependency expressed through field 'passwordEncoder': Error creating bean with name 'webSecurityConfig': Requested bean is currently in creation: Is there an unresolvable circular reference or an asynchronous initialization dependency?
두번째 오류
Error creating bean with name 'accountService': Unsatisfied dependency expressed through field 'passwordEncoder': Error creating bean with name 'webSecurityConfig': Requested bean is currently in creation: Is there an unresolvable circular reference or an asynchronous initialization dependency?
세번째 오류
Error creating bean with name 'webSecurityConfig': Requested bean is currently in creation: Is there an unresolvable circular reference or an asynchronous initialization dependency?
위 오류 기록으로 부터 두가지 오류 유발 요소를 정리할 수 있었는데,
1. AccountController에서 passwordEncoder를 주입받을때 무엇인가 문제가 발생하였다.
2. passwordEncoder가 위치한 WebSecurityConfig 클래스에서도 bean 오류가 발생하였고, 현재 필요한 bean은 생성중이다.
이 흐름을 구체화해보았다.
먼저 AccountService에서 passwordEncoder를 주입받고자 하였으나
passwordEncoder가 위치한 WebSecurity에서 생성하지 못한 passwordEncoder bean을 주입받아 사용하고자 하므로 오류가 발생, 이에 따라 WebSecurity에서도 bean오류가 발생하고 있다.
일단 passwordEncoder에 static을 추가하여 bean을 먼저 생성할 수 있도록 조치하였으나, 사실 필드변수 독자적인 조치를 할 경우 관리적인 차원, 환경 구성의 일관성을 해칠 수 있기에 더 확실하고 (정확히는 필드 변수를 건드리지 않는 방향의) 견고한 방향성을 더 고민해 볼 필요가 있겠다.
일단 @Lazy, 이 방법은 WebSercurityConfig가 아닌 다른 클래스에서 ComponentScan 을 하는 등의 방법이 있다고 하는데 더 공부할 필요가 있을 것 같다.
이 부분은 추가 공부 후에 기록할 예정이다.
유사한 오류 발생 - https://okky.kr/questions/1239554, https://zhfvkq.tistory.com/29
순환 참조(WebSecuirty, configureGlobal 관련 유사한 오류) - https://stackoverflow.com/questions/40695893/spring-security-circular-bean-dependency
@Lazy - https://www.baeldung.com/circular-dependencies-in-spring