@Bean, @Component

calis_ws·2023년 12월 28일
0

@Bean과 @Component은 각각 언제 사용되고 어떤 차이점을 가지는지?

@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 + ConfigurationComponent 모두 스프링의 IoC 컨테이너의 객체로 관리되며 어플리케이션 전역적으로 의존성 주입에 활용될 수 있다.

Bean 만 사용한다면 의존성 주입에 활용이 안됨

차이점

1. 선언 위치

@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();
    }
}

2. 사용 방법

@Bean은 외부 라이브러리가 제공하는 객체를 사용할 때 활용한다.

@Component는 내부에서 직접 접근 가능한 클래스를 사용할 때 활용한다.

위 코드에서 @Component 를 쓸 수 있는 이유는 PasswordEncoder 라는 class를 내가 직접 만들었기 때문이다. 
프레임워크 또는 외부 라이브러리에 있는 코드는 사용자가 수정할 권한이 없기 때문에 직접 @Component 를 추가할 수 없다. 
그러므로 라이브러리의 코드를 Bean으로 등록하고 싶다면 @Bean 을 사용해야 한다.

3. Bean 이름

@Bean에서는 메소드의 이름이 Bean의 이름으로 사용된다.

@Component에서는 클래스의 이름이 Bean의 이름으로 사용된다.

4. 활용

@Bean은 메소드 단위로 세밀한 제어가 가능하며, 의존성 주입 등을 직접 설정할 수 있다.

@Component는 간편하게 클래스를 Bean으로 등록하며, 일반적인 컴포넌트의 경우 자동으로 의존성 주입이 이루어진다.


정리

  • Bean : 메소드에 사용, 개발자가 컨트롤이 불가능한 외부 라이브러리 사용시 사용

  • Component : 클래스에 사용, 개발자가 직접 컨트롤이 가능한 내부 클래스에 사용

일반적으로 설정 파일에서 명시적으로 Bean을 정의해야 할 때는 @Bean을 사용하고, 그 외에는 @Component나 그와 유사한 어노테이션을 사용하는 것이 편리하다.

profile
반갑습니다람지

0개의 댓글