Spring/Spring-detail

@Bean 과 @Component 비교

YoonJong 2022. 10. 24. 08:06
728x90

스프링 MVC 에서 사용하는 @Controller , @Service , @Repository 등 빈으로 등록하는 방법을 계속 써왔으나,

스프링시큐리티를 공부하면서 @Configuration 과 @Bean , @Component를 사용하면서 어떤 상황에 구분해 사용해야 하나 궁금했다.

 

미리 알아보면 아래와 같다.

Bean Component
메소드에 적용 클래스에 적용
개발자가 컨트롤이 불가능한 외부 라이브러리 사용시 개발자가 직접 컨트롤이 가능한 내부 클래스에 사용
클래스 자체를 빈으로 등록하고 싶을 때 @Configuration 안에서 @Bean으로 등록한 메서드만 유연하게 등록하고 싶을 때 

스프링은 개발의 제어권이 스프링 컨테이너(Ioc 컨테이너)에 있다.

제어권이 개발자가 아닌 스프링에 있는것을 IoC(제어의 역전) 이라고 부른다

 

스프링이 개발자 대신 객체를 제어하기 위해서는 객체가 Bean 으로 등록되어 있어야 한다.

 

어노테이션을 통해 간단히 등록할 수 있다

 

많이 사용하는 스프링 MVC @Controller , @Service, @Repository 에는 자동적으로 @Component 가 붙어있는 것을 확인할 수 있다.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {

 

설정 정보를 담당하는 configuration 에서는 @Bean 과 @Component 를 사용해 스프링 컨테이너에 bean 으로 등록할 수 있다.


@Bean 사용예제

메소드 레벨에서 선언하며, 반환되는 객체를 개발자가 수동으로 빈으로 등록할 때 사용한다.

@Configuration
@EnableJpaAuditing
public class JpaConfig {

    @Bean
    public AuditorAware<String> auditorAware() {
        return new AuditorAwareImpl();
    }
}

 

@Component 사용 예제

클래스 레벨에서 선언하며, 스프링이 런타임시에 컴포넌트 스캔을 하여 자동으로 빈을 찾고 등록하는 어노테이션이다.

해당 클래스를 정의했으니, bean으로 등록해달라는 어노테이션이라고 생각하면 된다.

@Slf4j
@Component
public class JwtTokenProvider {

    private final Key key;
    ...

 

 

 

참고

https://youngjinmo.github.io/2021/06/bean-component/

https://jojoldu.tistory.com/27

https://www.blog.ecsimsw.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88?category=879374

728x90