💡 개요
수동으로 만든 객체는 DI가 되지 않는다.
오늘 처음 알았다. 반성하자.
🛠️ 수동으로 만든 객체
내가 이 사실을 알게 된 것은 SecurityConfig에 JwtFilter을 적용할 때 알게 되었다.
@Component
public class JwtFilter extends OncePerRequestFilter {
@Autowired
private JwtResolver jwtResolver;
@Autowired
private JwtProvider jwtProvider;
@Autowired
private UserDetailsService userDetailsService;
...
}
보다시피 JwtFilter에서 사용되는 의존성이 주입된 객체를 사용할 때 DI가 주입되지 않는 에러가 발생한다.
여기서 든 나의 생각은 ‘@Component 를 붙였으니 Spring이 관리하는 빈은 맞는데, 왜 의존성 주입이 안되는거지??’ 였다.
이와 관련된 내용을 찾아보니까 JwtFilter는 아마도 Spring Security 필터 체인에서 직접 등록한 new JwtFilter() 식의 객체이기 때문이라는 것이다.
이런 식으로 수동으로 생성한 객체(new Filter())는 스프링 컨테이너가 관리하지 않기 때문에 자동으로 DI를 하지 않는다.
그렇기 때문에 아래와 같이 직접 넣어줘야 한다.
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
private final JwtResolver jwtResolver;
private final JwtProvider jwtProvider;
private final UserDetailsService userDetailsService;
...
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
...
.addFilterBefore(new JwtFilter(jwtResolver, jwtProvider, userDetailsService), UsernamePasswordAuthenticationFilter.class) ;
...
}
}
@Component
@RequiredArgsConstructor
public class JwtFilter extends OncePerRequestFilter {
private final JwtResolver jwtResolver;
private final JwtProvider jwtProvider;
private final UserDetailsService userDetailsService;
...
}
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.06.09 - 격리 수준 (0) | 2025.06.09 |
---|---|
[개발 일기] 2025.06.08 - 갑자기 ID가 커진다 (0) | 2025.06.08 |
[개발 일기] 2025.06.06 - FilterChainProxy (0) | 2025.06.06 |
[개발 일기] 2025.06.05 - 새로운 패키지 구조 (0) | 2025.06.05 |
[개발 일기] 2025.06.04 - H2는 Point 타입을 사용할 수 없다!! (1) | 2025.06.04 |