Spring Security 를 학습하던 중 PasswordEncoder 인터페이스를 구현하고 @Bean 객체로 등록하는 과정이 잘 이해가 되지 않아 과정을 분석하고 정리한 내용을 작성해 보았다.
@Configuration class PasswordEncoderConfig { @Bean fun passwordEncoder(): PasswordEncoder{ // 필요한 Service 에 주입하면 됨 return BCryptPasswordEncoder() // 암호와 인코딩 기술 } }
스프링에서는 어떤 객체를 사용할 때 마다 생성하지 않고, @Bean으로 스프링 컨테이너 라는 곳에 등록되어 있는 객체들을 불러와 사용한다. -> SingleTon 방식
그러기 위해 우리가 필요한 객체를 등록해야 하는데 그 방법 중 @Configuration 으로 @Bean 을 정의해주는 방법이 있다.
PasswordEncoderConfig 라는 클래스를 생성하여 PasswordEncoder 타입의 Bean을 등록하려고 하는데, 클래스명은 알기 쉽게 작성한 것으로 Bean 과는 직접적 영향은 없다.
@Bean 어노테이션이 붙은 메서드는 스프링컨테이너에 의해 호출되고, 그 반환값이 Bean에 등록된다. 위 코드에선 BCryptPasswordEncoder() 이 반환되고 있다.
BCryptPasswordEncoder()가 PasswordEncoder 타입으로 반환될 수 있는 이유는 BCryptPasswordEncoder 클래스가 PasswordEncoder 를 implements(자바에서의 상속 표현) 하고 있는 하위 클래스이기 때문이다. ( 즉, PasswordEncoder 로 업스케일링 된 것 )