[Spring] 06-1. @ComponentScan

지찬우·2023년 1월 10일
0

Spring

목록 보기
19/27
post-thumbnail

이 시리즈는 인프런 강의(김영한 님의 ‘스프링 핵심 원리 - 기본편’)로 공부하며 혼자 기록하고, 사람들과도 공유할 수 있도록 작성하는 글이다. 최대한 추가적인 정보는 공식 홈페이지, 문서를 보며 얻을 예정이다.
(개인적인 생각과 이해가 들어가 있기 때문에 저의 ‘무식함’이 있을 수 있습니다😜 혹시라도 이 글을 보게 되시는 분이 계시다면 잘못된 부분 댓글로 많이 알려주시면 너무 감사하겠습니다!!)

GitHub Repository : https://github.com/jcw1031/spring-core-study


그동안 스프링 빈을 등록할 때 자바 코드의 @Bean이나 XML의 <bean>을 사용하여, 직접 등록할 빈을 구성 정보에 나열했다. 하지만 만약 등록해야 할 스프링 빈이 수백 개가 넘어가면, 하나하나 직접 등록하기 힘들고 설정 정 보의 크기도 커지며 개발자의 실수로 누락되는 문제가 발생할 수 있다. (무엇보다 반복이 너무 많다!)

스프링은 구성 정보 없이 자동으로 스프링 빈을 등록해 주는 ‘컴포넌트 스캔’이라는 기능을 제공한다. 또한 의존관계를 자동으로 주입하는 @Autowired도 있다.


컴포넌트 스캔과 의존관계 자동 주입

직접 코드로 작성해 보자.

AppConfig는 놔두고, 새로 컴포넌트 스캔 기능을 할 AutoAppConfig를 생성한다.


@Configuration 어노테이션을 통해 구성 정보로 설정하고, @ComponentScan 어노테이션도 추가한다. @ComponentScan@Componen 어노테이션이 붙은 클래스를 찾아, 모두 자동으로 스프링 빈으로 등록한다.

컴포넌트 스캔의 스캔 범위에 대해 이 전에 글을 쓴 적이 있다. @ComponentScan의 스캔 범위를 참고하자.


근데 우리가 전에 만들었던 AppConfig에도 @Configuration 어노테이션이 포함되어 있다. @Configuration 어노테이션의 코드를 보면 @Component 어노테이션이 붙어있다. 이 말은, AppConfig도 컴포넌트 스캔의 스캔 대상이 되어 빈으로 등록된다는 의미이다. 따라서 필터를 사용해 AppConfig는 스캔 되지 않도록 설정해야 한다.

클래스나 메서드에 커서를 두고 아래 단축키를 사용하면 클래스 또는 메서드의 정의로 이동할 수 있다.
MacOS : + B
Windows : Ctrl + B


@ComponentScanexcludeFilters를 사용해 제외할 대상을 설정할 수 있다. 필터에 대해서는 많이 중요한 내용은 아닌 것 같아 나중에 따로 글을 쓸까 한다.

@Configuration 어노테이션이 붙은 클래스는 제외한다는 의미이다.


그리고 빈으로 등록할 클래스들에 모두 @Component 어노테이션을 추가한다. 컴포넌트 스캔의 대상이 되는 것이다. 그리고 생성자 위에 @Autowired 어노테이션을 사용하면, 타입이 맞는 빈을 찾아서 자동으로 주입해 준다.

@Autowired에 대해서는 뒤에서 자세히 학습한다.

  • MemberServiceImpl
  • OrderServiceImpl
  • MemoryMemberRepository
  • RateDiscountPolicy

자동 빈 등록 테스트 🧪

test 패키지의 core 패키지 내에, scan 패키지를 생성해서 그 안에 AutoAppConfigTest 클래스를 생성하고, 간단하게 스프링 컨테이너를 생성하여 MemberService를 조회하는 테스트 코드를 작성했다.

스프링 컨테이너를 생성할 때 AppConfig가 아닌, AutoAppConfig를 사용했다는 점을 주의하자‼️


실행한 후에 로그를 보게 되면, Creating shared instance of singleton bean ~라고 하며 우리가 필요한 객체들이 싱글톤 빈으로 잘 등록되었고, Autowiring by type from bean name ~ via constructor to bean named ~이라며 생성자를 통해 타입별로 자동으로 주입됨을 확인할 수 있다.


동작 과정 ⚙️

@ComponentScan@Component가 붙은 클래스들을 스프링 빈으로 등록한다. 스프링 빈의 이름은 기본으로 클래스의 맨 앞 글자를 소문자로 하여 설정된다.

@Component(”{이름}”)으로 이름을 직접 설정할 수 있다.


@Autowired를 생성자에 지정하면, 스프링 컨테이너가 자동으로 타입이 맞는 스프링 빈을 찾아 주입한다.


이번엔 구성 정보를 직접 작성하는 것이 아닌, @ComponentScan@Autowired를 사용해 자동으로 스프링 빈을 등록하고, 의존관계를 알아서 주입하도록 하는 방법을 알아보았다. 이 전에 작성한 AppConfig와 비교해 보면 확실히 편리해진 것 같다. 다음 시간에는 빈이 중복으로 등록되었을 때 어떻게 충돌을 처리하는지 알아보자.

profile
좋은 개발자가 되자.

0개의 댓글