@Bean
어노테이션
@Bean
어노테이션은 주로@Configuration
어노테이션이 부여된 클래스에서 메소드 단위로 Bean을 정의할 때 사용된다.
설정 파일에서 명시적으로 Bean을 정의하고자 할 때 유용하게 사용된다.
메소드 단위로 Bean을 정의하며, 해당 메소드의 반환 타입이 Bean의 타입이 된다.
메소드의 이름은 Bean의 이름으로 사용된다.
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
@Component
어노테이션
@Component
어노테이션은 주로 일반적인 컴포넌트 클래스에 부여되어 Spring 컨테이너에 Bean으로 등록될 때 사용된다.
@Service, @Repository, @Controller
등과 함께 사용되기도 한다.
클래스에 직접 부여하여 해당 클래스를 Spring 컨테이너에 Bean으로 등록한다.
클래스의 이름 (첫 글자는 소문자) 이 Bean의 이름으로 사용된다.
@Component
public class MyComponent {
// 클래스 내용 생략
}
Bean + Configuration
과 Component
모두 스프링의 IoC 컨테이너의 객체로 관리되며 어플리케이션 전역적으로 의존성 주입에 활용될 수 있다.
Bean 만 사용한다면 의존성 주입에 활용이 안됨
@Bean
은 주로 @Configuration
어노테이션이 부여된 클래스 내에서 메소드로 Bean을 정의한다.
@Component
는 클래스에 직접 부여하여 해당 클래스 자체를 Bean으로 등록한다.
@Component // class level
public class PasswordEncoder {
public String encode(String seed) {
return new BCryptPasswordEncoder().encode(seed);
}
public boolean matches(String seed, String password) {
return new BCryptPasswordEncoder().matches(seed, password);
}
}
패스워드 암호화를 위해 Bcrypt를 사용하는 모듈을 Component로 제공한다.
만약 Component 위치에 Bean 을 사용한다면 IDE가 오류를 표시하는데
그 이유는 Target이 METHOD만 지정하기 때문인 것을 볼 수 있다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean // method level
public PasswordEncoder getPasswordEncoder() {
return new BCryptPasswordEncoder();
}
}
@Bean
은 외부 라이브러리가 제공하는 객체를 사용할 때 활용한다.
@Component
는 내부에서 직접 접근 가능한 클래스를 사용할 때 활용한다.
위 코드에서 @Component 를 쓸 수 있는 이유는 PasswordEncoder 라는 class를 내가 직접 만들었기 때문이다.
프레임워크 또는 외부 라이브러리에 있는 코드는 사용자가 수정할 권한이 없기 때문에 직접 @Component 를 추가할 수 없다.
그러므로 라이브러리의 코드를 Bean으로 등록하고 싶다면 @Bean 을 사용해야 한다.
@Bean
에서는 메소드의 이름이 Bean의 이름으로 사용된다.
@Component
에서는 클래스의 이름이 Bean의 이름으로 사용된다.
@Bean
은 메소드 단위로 세밀한 제어가 가능하며, 의존성 주입 등을 직접 설정할 수 있다.
@Component
는 간편하게 클래스를 Bean으로 등록하며, 일반적인 컴포넌트의 경우 자동으로 의존성 주입이 이루어진다.
Bean : 메소드에 사용, 개발자가 컨트롤이 불가능한 외부 라이브러리 사용시 사용
Component : 클래스에 사용, 개발자가 직접 컨트롤이 가능한 내부 클래스에 사용
일반적으로 설정 파일에서 명시적으로 Bean을 정의해야 할 때는 @Bean
을 사용하고, 그 외에는 @Component
나 그와 유사한 어노테이션을 사용하는 것이 편리하다.