[김영한님 - 스프링의 핵심원리] 컴포넌트 스캔

2022. 10. 2. 23:22Spring

728x90

컴포넌트 스캔

 

지금까지 스프링 빈을 등록할 때는 자바의 코드의 @Bean 어노테이션을 사용해서 설정 정보에 직접 등록할 스프링 빈을 나열했다.

 

등록할 스프링 빈이 적다면 괜찮겠지만, 많으면 상당히 번거롭다.

 

그래서 스프링에서는 @ComponentScan이라는 기능을 제공한다.

@Configuration
@ComponentScan
public class AutoAppConfig {
}

@ComponentScan은 @Component가 붙은 클래스를 스캔해서 자동으로 스프링 빈으로 등록시켜준다.

 

그렇다면 탐색 위치와 기본 스캔 대상은 어떻게 될까??

 

탐색 위치

@ComponentScan에는 basePackages라는 속성이 있는데 이는 탐색할 패키지의 시작 위치를 지정한다.

default값은 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.

 

일반적으로 권장하는 방법은 패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것이다.

 

 

기본 스캔 대상

  • @Component : 컴포넌트 스캔에서 사용
  • @Controller : 스프링 MVC 컨트롤러로 인식
  • @Service : 스프링 비즈니스 로직에서 사용(특별한 처리는 하지 않는데, 개발자들이 핵심 비즈니스 로직이 인지하는 데 도움이 된다.) → transactoin 처리
  • @Repository : 스프링 데이터 접근 계층으로 인식, 데이터 계층의 예외를 스프링 예외로 변환해준다.

 

컴포넌트 스캔 시 주의할 점

스프링 빈은 수동 등록할 수도 있고 자동 등록할 수도 있다.

참고) 수동 등록 방법

@Component(name=”service”)

만약, 수동 등록 빈과 자동 등록 빈이 충돌한다면 ConflictingBeanDefinitionException 예외가 발생한다.(빈의 이름이 같을 때)

따라서, 빈의 이름을 만들 때 주의해야한다.

 

가급적이면 빈을 수동 등록하지말고, 자동 등록으로만 사용하자!

 

여기서 의문?

본래 자바의 코드의 @Bean 어노테이션을 사용해서 설정 정보에 직접 등록할 스프링 빈을 나열할 때는 자바의 코드에서 의존관계를 설정해줬는데 AutoAppConfig 클래스는 비어있다.

 

그래서, 스프링에서는 의존관계를 자동으로 주입하는 @Autowired라는 기능을 제공한다.

 

@Autowired

생성자에 @Autowired를 지정하는 방법을 사용한다.

 

스프링 컨테이너가 @Component를 사용하여 빈을 등록하면 자동으로 생성자가 호출되게 되고, 스프링 컨테이너에서  해당 스프링 빈을 찾아서 주입한다.

 

이때 기본 조회 전략을 타입이 같은 빈을 주입한다.

 

@Component
public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository;

    @Autowired // ac.getBean(MemberRepository.class)의 기능과 같다 + a
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    ...
 }

 

이상입니다.

 

 

이 글은 스프링 핵심원리 - 기본편 (김영한님)의 강의를 바탕으로 정리한 글입니다.

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

728x90