티스토리 뷰

배경

스프링 커뮤니티에서 필드 주입보다는 생성자 주입을 권장하기 때문에 생성자 주입을 아무런 생각없이 쓰고 있었다. 그런데 오늘 jwt 토이 프로젝트를 하다가 순환 참조가 발생해서 해당 내용을 기록한다.

 

문제

   jwtRequestFilter defined in file [xx\IdeaProjects\study\simple_shopping_mall\out\production\classes\com\ssmallgiant\simple_shopping_mall\filter\JwtRequestFilter.class]
┌─────┐
|  memberService defined in file [xx\IdeaProjects\study\simple_shopping_mall\out\production\classes\com\ssmallgiant\simple_shopping_mall\service\MemberService.class]
↑     ↓
|  securityConfig defined in file [xx\IdeaProjects\study\simple_shopping_mall\out\production\classes\com\ssmallgiant\simple_shopping_mall\config\SecurityConfig.class]
└─────┘

위와 같은 순환참조 에러가 발생해서 코드를 다시 보니, jwtRequestFilter와 securityConfig 에서 memberService를 사용하는데, memberService에서는 또 securityConfig에 정의한 passwordEncoder를 사용해서 생성자 주입이 순환참조가 되고 있었다.

 

해결

jwtRequestFilter와 securityConfig의 생성자에서 memberService 파라미터 앞에 @Lazy를 붙여 해결했다. 이 어노테이션은 빈 초기화 시점에는 프록시를 주입하고, 처음 실행될 때 진짜 객체를 주입한다고 한다.

 

ps. memberService에 어노테이션을 붙인 이유는, 이 클래스가 온전히 빈이 된 시점에서 다른 곳에 주입이 되야 한다고 생각해 가장 사이드 이펙트가 적을 것으로 예상되는 빈에 작업한 것.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함