본문 바로가기
Frameworks/Springboot

[Springboot] 컴포넌트 스캔과 의존관계 자동주입 정리

by 젊은오리 2022. 7. 25.
728x90

[김영한님의 스프링 핵심 원리-기본편을 학습 후 정리한 내용입니다.]

지금까지의 강의에서는 빈을 등록하고, 의존관계를 주입할 때 @Bean 어노테이션을 붙여서 스프링컨테이너에 알려주었다. 하지만 예제가 아닌 실무에서는 등록해야 할 빈이 정말 많아지기 때문에, 설정정보가 없어도 스프링 빈을 등록하는 컴포넌트스캔이라는 기능을 사용한다.

 

@ComponentScan을 사용하면 어떻게 되나?

@ComponentScan을 붙이면 같은 패키지 내의 @Component가 명시된 클래스들을 자동으로 빈에 등록해준다. (@Configuration이 컴포넌트스캔의 대상이 된 이유도 소스코드에 @Component이 명시되어 있기 때문이다.) 게다가 이제는 아래 코드와 같이 우리가 사전에 정의했던 Appconfig설정정보를 사용하지 않기 때문에 같은 @Component클래스 내에서 @Autowired를 사용해서 의존관계 주입을 해결한다. 

 

이제 이해하기 쉽게 그림으로 다시 정리해보자.

@ComponentScan은 기본적으로 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다. 빈 이름은 클래스명을 사용하지만 맨 앞글자만 소문자를 사용하는 것을 볼 수 있다. 이름을 정하고 싶다면 @Component("아무이름")이런식으로 정해주면 된다.

 

생성자에 @Autowired를 지정하면, 스프링 컨테이너가 자동으로 해당하는 스프링 빈을 찾아서 주입해준다. (생성자에 파라미터가 많아도 다 찾아서 주입해준다.)

 

컴포넌트 스캔 대상?

컴포넌트스캔은 @Component뿐만 아니라 다양한 annotation에 대해서 스캔 대상에 포함한다. 

  • @Component - 컴포넌트 스캔에서 사용
  • @Controller - 스프링 MVC 컨트롤러에서 사용
  • @Service - 스프링 비즈니스 로직에서 사용
  • @Repository - 스프링 데이터 접근 계층에서 사용
  • @Configuration - 스프링 설정 정보에서 사용

실제로, @Controller, @Service등이 붙어있는 클래스의 내부 소스코드를 보면 @Component가 붙어있는 것을 볼 수 있다.

728x90

댓글