컴포넌트 스캔
이전에 까지는 스프링 빈을 등록할때 @Bean을 코드에 작성하여 진행하였다.
이렇게 등록하는 것을 수동으로 하나하나씩 하기때문에, 수동 빈 등록이라고 부른다. 누가봐도 귀찮은 과정이기 때문에, 자동적으로 빈을 등록하는 과정에 대해서 알아 보자.
💻 @Component & @ComponentScan
@Component 어노테이션을 쓰면 이 어노테이션이 붙은 클래스가 스프링 빈의 등록대상이 된다.
사용방법은 간단하게 스프링 빈으로 등록을 원하는 클래스 상단에 해당 어노테이션을 붙여주면 된다.
@Component
public class MemomryMemberRepository implements MemberRepository()
@ComponentScan 어노테이션을 붙여주면, 이름 그대로 @Component 어노테이션이 붙은 클래스들을 스캔해서 스프링 빈으로 등록해준다. 또한, @Component를 포함하고 있는 @Repository,@Service,@Controller등 도 추가로 컴포넌트 스캔의 기본 대상이 된다.
@ComponentScan
public class AppConfig{
}
이전, @Configuration+@Bean을 통해 빈으로 등록했을 때와는 다르게, AppConfig에는 어떠한 클래스에 대한 정보도 들어가 있지가 않다. 그렇다면 의존관계는 어떻게 주입하는 것일까?
💻 @Autowired
이전의 코드에서는 AppConfig에서,의존관계를 주입해주었다. 그러나 이번 컴포넌트와 컴포넌트 스캔을 이용한 빈 등록에서는 AppConfig클래스에 어떠한 다른 클래스에 대한 정보도 들어가 있지 않기 때문에 의존관계 주입이 어렵다.
따라서, 개발자는 @Autowired를 이용하여 의존관계를 주입해줘야 한다.
@Component
public class MemberServiceImpl implements MemberService{
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
}
컴포넌트로 등록하려는 클래스의 생성자에 @Autowired를 붙이면 의존관계를 자동으로 주입해준다.
또한, 해당 코드에서는 하나의 의존관계를 주입한것이지만, 여러개도 된다!
컴포넌트 스캔을 하는 순서를 보면 @ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다. 그러고 스프링 빈으로 등록된 클래스들의 @Autowired로 지정된 생성자를 보고, 의존관게를 자동으로 주입해준다.
💻 @Component vs @bean
스프링 빈을 등록하는 방법을 2개를 알아보았다.
첫번째는 수동 빈등록으로, @Configuration과 @bean을 이용한 방법이다.
두번째는 자동 빈등록으로, @ComponentScan과 @Component를 이용하고 @Autowired로 의존관계를 주입해주는 방법이다.
두개 다 스프링 컨테이너에 스프링 빈을 등록하는 방법이다.
그러나 차이가 있다. 그 차이에 대해서 알아보자.
먼저, @Component로 생성되는 빈의 의존성은 @Autowired 어노테이션이 붙어있는 것을 보고, 스프링 컨테이너가 직접 객체에 의존성을 주입해준다. 코드 상에서 @Component는 스프링 빈으로 등록하고 싶은 클래스에 붙여주면 된다.
@Bean으로 생성하는 빈의 의존성은 스프링 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한번에 처리된다. 생성자 안에 존재하는 의존관계에 따라서 의존성이 주입되어진다. 코드 상에서 @Bean은 의존관계가 주입되어져 있는 인스턴스 생성 메소드 위에 @Bean을 선언한다
@component를 사용한 자동 빈 등록은 개발자가 직접 생성한 클래스에 사용될 수 있고 @bean은 직접생성한 클래스, 외부 라이브러리 둘다 사용이 가능한데, 직접 생성한 클래스에 사용할거면 @component가 훨씬 편하므로 주로 외부 라이브러리에 ioc 주입 해줄때 사용하는것이다.
개인이 공부하기 위해 작성한 포스트이므로, 틀린 부분이 있으면 말해주세요!