[Spring] 빈 순환 참조 오류
빈 순환 참조 오류
프로젝트 넘겨받고 리팩토링하는 와중에 오류가 떴다.
빈 순환 참조 오류다.
기존 @Autowired 필드 인젝션 방식에서는 드러나지 않던 문제가 생성자 주입으로 바꾸면서 드러난 거다.
사실 문제가 생겼다기보다는 원래부터 있던 문제가 드러난 거라 고민을 좀 해봐야 함…
빈들 중에 뭐가 문제인지는 코드 보면서 곰곰이 생각해봐야 한다. 알려주지 않음.
추측상 원인은 PasswordEncoder다.
다른 친구한테 SecurityConfig에서 순환참조오류 떴다고 하자마자 혹시 PasswordEncode있냐고 물어보더라 있음 어케 알았지 그게 문제임
SecurityConfig에서 PasswordEncoder를 @Bean으로 등록하는데, SecurityConfig에서는 CustomUserDetailsService를 끌어오고 있고, CustomUserDetailsService에서는 UserService를 끌어온다. 그런데 UserService를 빈으로 등록하기 위해서는 PasswordEncoder를 주입받아야 한다.
SecurityConfig가 Bean으로 등록되기 전에 주입받아야 하는 의존성이 등록되려면 SecurityConfig가 빈으로 등록되어 있어야 하는 상태임…
이거 대체 어케 돌던 코드인지 모르겠음 에러 안 떴나?
보편적인 빈 순환 참조 오류의 해결 방식은 두 가지다.
- 제거할 수 있는 의존성을 제거하거나 @Inject나 @Lazy를 걸어서 인젝션 시점을 늦추는 방법
- 설계를 다시 하는 방법
쉬운 건 그냥 UserService에 @Lazy 걸어놓는 방식인데 찝찝해서 싫음 어쩔 수 없다 얘 쓰자
일반적으로는 두 번째 방법이 권장되지만 어떻게 재설계해야하는지 딱 감이 오질 않는다.
친구는 아예 spring security를 없애고 직접 구현하는 방식도 제안하던데 대강 설계를 해봐도 구현 부담이 너무 크다.
결국 재설계를… 설계를 다시 해야 한다는 뜻인데…
토이플젝이라 얽힌 의존성이 많지 않아서 나중에 설계 수정해도 되는 문제라 오늘까지 고민해보고 안 되면 일단 @Lazy 걸어둬야겠다
setter injection 잘 쓰면 될 것 같은데
->
이런저런 이유가 있어서 Security 버리고 가기로 함
쌩으로 구현하면서 해당 오류를 신경 쓸 필요가 없어짐