[SpringBoot] 빈 등록을 위한 @Configuration, @Bean, @Component

smlee·2022년 7월 13일
0

SpringBoot - JDBC

목록 보기
4/8

스프링부트에서 빈 등록을 위한 어노테이션에는 크게 두 종류가 있다. 첫 번째는 @Configuration + @Bean 두 개의 어노테이션을 쌍으로 이루어 사용해서 빈을 등록하는 것이고, 두 번째는 @Component를 사용해서 빈을 등록하는 방법이 있다.

이 포스팅에서는 각각의 방법으로 빈을 등록하는 방법과 차이점을 서술할 예정이다.

🚀 @Configuration - @Bean

만약 Consider defining a bean of type 'org.springframework.mail.javamail.JavaMailSender' in your configuration.와 같은 에러문을 보았을 때, 우리는 JavaMailSender의 configuration 주입을 위해 @Autowired 어노테이션을 달았는데 밑과 같은 에러가 떴다고 생각을 해보자.

이런 에러가 떴을 시 bean을 찾을 수 없으므로 bean을 등록하는 것을 생각할 것이다. 즉, JavaMailSender 객체의 bean을 등록하기 위해서는 어떻게 해야할까?

public	class JavaMailSender{
	// 등록하려는 내용
}

위의 클래스를 스프링 컨테이너를 등록해야한다. 만약 @Configuration@Bean을 사용해서 등록을 하려면 밑과 같이 해야한다.

@Configuration
public	class	MailConfig {
	@Bean
    public	JavaMailSender	javaMailSender()[
    	// 등록하려는 내용
    }
}

위와 같이 등록하려는 클래스를 둘러 싸고 있는 설정 클래스 위에 @Configuration 어노테이션을 추가해주고, @Bean을 등록할 클래스 위에 붙여준다. 이때, 등록할 클래스는 메소드 형태가 된다. @Bean 어노테이션은 메소드를 등록할 때 사용하므로 꼭 메소드 형태 위에 달아주어야 한다. 이때 주의해야할 점은 메소드 이름으로 빈의 이름이 결정된다. 그러므로 빈 이름이 중복되지 않도록 주의해야한다.

스프링 컨테이너는 @Configuration이 붙어있는 클래스를 자동으로 빈으로 등록해주고, 해당 클래스를 파싱해서 @Bean이 있는 메소드를 찾아서 빈을 생성해준다. 이때 주의해야할 점은 @Bean을 사용하는 클래스에는 반드시 @Configuration 어노테이션을 활용해야한다. 즉, @Configuration 어노테이션과 @Bean 어노테이션은 항상 같이 사용해야한다는 것이다. 그 이유는 @Configuration 안에서 @Bean을 사용해야 싱글톤을 보장 받을 수 있으므로 @Bean 어노테이션은 @Configuration과 함께 사용해야한다.

👀 @Bean을 사용하여 수동으로 등록해야하는 경우

  1. 개발자가 직접 제어가 불가능한 라이브러리를 사용할 때
  2. 애플리케이션 전범위적으로 사용되는 클래스를 등록할 때
  3. 다형성을 활용하여 여러 구현체를 등록해주어야 할 때

💒 @Component

위의 @Configuration + @Bean을 사용하여 스프링 컨테이너에 Bean을 등록하는 방법에서 사용했던 예시는 JavaMailSender로 이미 개발된 API를 사용하는 경우였다. 하지만, @Component에서는 위 예시를 사용할 수 없다. 그 이유는 개발자가 직접 컨트롤할 수 있는 클래스@Component 어노테이션을 달아주기 때문이다.

public	class	LeeSoMyoungClass{
	// 등록할 내용
}

만약 위와 같은 클래스를 개발자가 직접 만들어 이를 등록하려고 할 때 Component가 사용된다. 사용법은 간단하다. 등록할 클래스 위에 @Component 어노테이션만 붙이면 되므로

@Component
public	class	LeeSoMyoungClass{
	// 등록할 내용
}

으로 등록을 해주면 된다.

이 방식은 자동 등록 방식이다. 스프링은 컴포넌트 스캔(Component Scan)을 사용해 @Component 어노테이션이 있는 클래스들을 찾아 자동으로 빈 등록하므로 직접 개발한 클래스를 빈으로 편리하게 등록하고자 하는 경우에 사용된다.

스프링은 기본적으로 컴포넌트 스캔을 이용한 자동 빈 등록 방식을 권장한다. 이때, @Component의 하위 어노테이션으로 @Configuration, @Controller, @Service, @Repository 등이 있으며, 대부분의 경우 @Component를 이용한 자동 등록 방식을 사용하는 것이 좋다.

❓ @Bean vs @Component

  • @Bean의 @Target은 메소드이다.
  • @Component의 @Target은 클래스이다.

또한, 개발자가 직접 제어 가능 여부에 따라서도 달라진다.


📚 Reference

  1. @Bean, @Configuration, @Component 어노테이션
  2. [Spring] Spring Bean 설정 방법 - Java Config

1개의 댓글

comment-user-thumbnail
2022년 7월 14일

개발자가 직접 제어할 수 없는 라이브러리를 사용하는 것에 매우 만족합니다.

답글 달기