본문 바로가기
Programming Language/Spring

[Spring] @Bean vs @Component

by happy coding! 2022. 9. 28.
반응형

@Bean과 @Component 차이

안녕하세요. 이번 시간에는 빈과 컴포넌트의 차이에 대해 알아보겠습니다.

먼저 스프링은 개발의 제어권이 스프링 컨테이너(IoC 컨테이너)에 있습니다. 그래서 이를 IoC (Inversion Of Control), 제어의 역전이라고 합니다. 스프링이 개발자 대신 객체를 제어하기 위해 객체들이 빈(Bean)으로 등록되어 있어야 합니다.

과거에는 객체를 빈으로 등록하기 위해 XML로 지정했어야 하는데 요즘은 애노테이션으로 간단하게 등록할 수 있습니다.

 

@Bean

@Bean은 메서드 레벨에서 선언하며, 반환되는 객체(인스턴스)를 개발자가 수동으로 빈으로 등록하는 애노테이션 입니다.

@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl();
    }
}

 

@Component

@Component는 클래스 레벨에서 선언함으로써 스프링이 런타임 시에 컴포넌트 스캔을 하여 자동으로 빈을 찾고 등록하는 애노테이션 입니다.

@Component
public class Utility {
    // ...
}

 

@Bean과 @Component 차이

그렇다면 @Bean과 @Component에는 어떤 차이점이 있을까요?

@Bean의 경우 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용합니다.

 

예를 들어 Spring Security에서 제공하는 PasswordEncoder는 Spring Security 개발자에 의해 만들어진 클래스(라이브러리)이기 때문에 따로 수정하는 것은 힘듭니다. 그리고 PasswordEncoder를 사용하기 위해서는 스프링에 Bean으로 등록해야 하는데 이때 @Bean 애노테이션을 이용해서 등록할 수 있습니다.

 

@Bean을 이용한 빈 등록 방법은 다음과 같습니다.

 

@Bean
public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }

 

위처럼 해당 클래스의 객체를 반환하는 메서드를 만들고 메서드에 @Bean을 선언하여 등록합니다.

반대로 개발자들이 직접 컨트롤이 가능한 Class 들의 경우에는 @Component를 사용합니다. 개발자가 직접 컨트롤 할 수 있는 클래스는 개발자가 만든 클래스를 의미하며, 컨트롤러 등에서 사용하는 클래스를 의미 합니다.

 

@Component
@RequiredArgsConstructor
public class CustomAuthManager implements AuthenticationManager {

}

 

@Configuration, @Controller, @Service, @Repository 등의 애노테이션들은 @Component 애노테이션을 포함하고 있습니다.

 

@Bean, @Component 애노테이션 비교

 

@Bean의 @Target은 METHOD로 되어 있습니다.

 

 

@Component의 Target은 Type으로 지정되어 클래스, 인터페이스, 열거형에 붙일 수 있습니다. 즉 객체 단위에 해당 애노테이션을 붙인다고 보면 됩니다.

 

다시 정리를 해보면 아래와 같습니다.

Bean Component
메서드에 사용 클래스에 사용
수동 빈 등록 자동 빈 등록
개발자가 컨트롤이 불가능한 외부 라이브러리 사용시 사용 개발자가 직접 컨트롤이 가능한 내부 클래스에 사용

 

References

https://jojoldu.tistory.com/27
https://youngjinmo.github.io/2021/06/bean-component/

반응형

댓글