본문 바로가기
Back-End/Spring Boot

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

by 달의 조각 2022. 3. 19.
이 글은 김영한 님의 스프링 핵심 원리 - 기본편을 수강하며 정리한 글입니다.

 

 

컴포넌트 스캔

@ComponentScan

 

  설정 정보가 없어도 @Component가 붙은 모든 클래스를 자동으로 스프링 빈으로 등록한다.

@Configuration
@ComponentScan
public class AutoAppConfig {
	
    // 의존관계는 @Autowired를 사용하여 주입한다
    // 구현체인 MemoryMemberRepository, RateDiscountPolicy, ... 클래스에 @Component를 붙인다
}

 

🌳 필터

  • includeFilters: 컴포넌트 스캔 대상을 추가로 지정
  • excludeFilters: 컴포넌트 스캔에서 제외할 대상을 지정
더보기
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyIncludeComponent {

}

 

 

MyIncludeComponent 애너테이션이 붙은 클래스는 포함하고, MyExcludeComponent 애너테이션이 붙은 클래스는 제외하도록 한다.

@Configuration
@ComponentScan(
        includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
        excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
)
static class ComponentFilterAppConfig {
}

 


 

의존관계 자동 주입

@Autowired

 

@ComponentScan을 사용하면 의존관계 주입을 명시해 줄 방법이 없기 때문에 @Autowired와 짝꿍이다.

  의존관계 주입이 필요한 곳의 생성자에 @Autowired를 지정하면, 스프링 컨테이너가 스프링 빈 저장소에서 타입(인터페이스)에 맞는 해당 스프링 빈(구현체)을 찾아서 자동으로 주입한다.

@Component
public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository;
    
    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}
더보기

🌳 탐색할 패키지의 시작 위치 지정

@ComponentScan(
	basePackages = "hello.core"
}
  1. basePackages: 시작 위치, 이 패키지를 포함해서 하위 패키지를 모두 탐색한다.
  2. basePackageClasses: 지정한 클래스를 포함한 패키지를 탐색 시작 위치로 지정한다.
  3. 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.

스프링 부트의 대표 시작 정보인 @SpringBootApplication 안에 @ComponentScan이 들어있다. 스프링 부트를 사용하면 컴포넌트 스캔을 해 주기 때문에 @ComponentScan을 사용할 필요가 없다.

 

🌳 컴포넌트 스캔 기본 대상

애노테이션 컴포넌트 스캔 용도 부가 기능
@Component 컴포넌트 스캔에서 사용  
@Controlller 스프링 MVC 컨트롤러에서 사용 스프링 MVC 컨트롤러로 인식
@Service 스프링 비즈니스 로직에서 사용 특별한 처리 X
개발자들이 '핵심 비즈니스 로직이 여기에 있겠구나'
비즈니스 계층을 인식하는 데 도움
@Repository 스프링 데이터 접근 계층에서 사용 스프링 데이터 접근 계층으로 인식하고,
데이터 계층의 예외를 스프링 예외로 변환
@Configuration 스프링 설정 정보에서 사용 스프링 설정 정보로 인식하고,
스프링 빈이 싱글톤을 유지하도록 추가 처리

댓글