스프링부트에서 빈 등록을 위한 어노테이션에는 크게 두 종류가 있다. 첫 번째는 @Configuration + @Bean
두 개의 어노테이션을 쌍으로 이루어 사용해서 빈을 등록하는 것이고, 두 번째는 @Component
를 사용해서 빈을 등록하는 방법이 있다.
이 포스팅에서는 각각의 방법으로 빈을 등록하는 방법과 차이점을 서술할 예정이다.
만약 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과 함께 사용해야한다.
직접 제어가 불가능
한 라이브러리를 사용할 때전범위적
으로 사용되는 클래스를 등록할 때다형성
을 활용하여 여러 구현체를 등록해주어야 할 때위의 @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
의 @Target은 메소드이다.@Component
의 @Target은 클래스이다.또한, 개발자가 직접 제어 가능 여부에 따라서도 달라진다.
개발자가 직접 제어할 수 없는 라이브러리를 사용하는 것에 매우 만족합니다.