Java/SpringBoot

[SpringBoot] StereoType, @Component과 @Bean 차이점

JoJun's 2021. 12. 30. 16:41
728x90
반응형

이번 포스트에서는 @Bean과 @Component 어노테이션의 차이점을 알아볼 것이다.

@Component로 지정된 클래스들은 모두 스프링에서 Bean으로 등록된다.

@Component 어노테이션은 스프링 컨테이너에서 사용되는 StereoType인데 먼저 StereoType이란 무엇인지 살펴본다.


StereoType이란?

StereoType의 의미는 "고정관념". "정형화된 생각"이라고 한다.

스프링에서는 스프링 컨테이너가 관리 컴포넌트로 식별할 수 있게 해주는 마커 같은 의미를 지닌다.

이전 버전에서는 XML 파일에 Bean들을 모두 명시하여 관리하고 있었다. 하지만 이러한 관리는 XML 파일의 거대화를 막지 못하였다. 그래서 아래의 버전부터 어노테이션이 등장하기 시작했다.

  • Spring 2.0 : @Repository
  • Spring 2.5 : @Component, @Controller, @Service, @Configuration

 

먼저 @Component에 대해 알아보자.


@Component

스프링에서 Bean으로 식별하며 DI(dependency Injection)에 제공하는 기본 어노테이션이다.

Component 등록은 아래와 같다. @Component 어노테이션만 사용하여 등록해주는 경우
Bean객체의 이름은 '클래스 이름의 첫 문자를 소문자'로 바꾼 것이 Bean의 이름이 된다


또는, @Component 어노테이션에 매개변수로 Bean이름을 지정하여 등록할 수도 있다.

@Component
public class TempBean1{}  // Bean Name = "tempBean1"

@Component("tb")
public class TempBean2 {} // Bean Name = "tb"

@Component로 등록된 객체를 주입(Injection) 시키는 방법은 아래와 같다.

ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanConfigClass.class);

TempBean1 t1 = ctx.getBean(TempBean1.class);
TempBean1 t1 = (TempBean1) ctx.getBean("tempBean1");
TempBean1 t1 = ctx.getBean("tempBean1", TempBean1.class);

---------------------------------------------------------------------

public class TempClass {

    @Autowired        //같은 타입의 빈을 자동으로 주입시켜준다.
    private TempBean1 bean1;

    @Autowired
    @Qualifier("tb")        //@Qualifier를 사용하여 Autowired될 빈의 이름을 지정할 수 있다.
    private TempBean2 bean2;
}

그러면 스프링에는 @Bean이라는 어노테이션이 존재하는데 그럼 @Bean과 @Component의 차이점은 무엇일까?

  • @Component는 클래스를 대상으로 사용해주며 기본적으로 클래스 이름에 첫 문자가 소문자로 한 이름이 Bean의 이름이 된다.
  • @Component는 Spring에서 @ComponentScan으로 자동으로 찾을 수 있다.
  • @Bean은 @Configuration으로 선언된 클래스에 정의된 메서드에 사용된다.
  • @Bean이 사용된 메서드가 리턴하는 객체가 Bean객체가 되며 메소드 이름이 된다.

이와 같은 차이점이 있다.!!

728x90
반응형