본문 바로가기
BackEnd/스프링 핵심 원리

[스프링 핵심 원리] - 컴포넌트 스캔- 탐색위치와 기본 스캔 대상

by telecaster0 2024. 6. 1.

 

컴포넌트 스캔

여태까지 배운대로 방법으로는 스프링빈을 등록할때 자바코드의 @Bean이나 XML의 <bean>을 통하여 설정 정보에 직접 등록한 스프링빈을 나열했다.

하지만 이 스프링빈이 수십,수백개가 되면 일일이 등록하는데 번거로워진다.

 

그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다.

 

 

@ComponentScan은  @Component가 붙은 모든 클래스를 스프링빈으로 등록한다.

스프링빈의 기본이름은 클래스명을 사용하되 맨 앞글자만 소문자로 사용

 

기본 : MemberServiceImpl 클래스 ->memberServiceImpl

빈이름 커스텀시 : @Component("{원하는 Bean이름}") 

 

이전 까지는 AppConfig.class(외부클래스를 통해 의존관계를 주입하는 메소드들을 직접 작성하고 @Bean, @Configuration 등록)를 통해 의존관계를 주입을 해주었지만

@Component어노테이션 사용시 의존관계주입이되는 클래스들을 정의 할수 없어서 @Autowired어노테이션을 통해 의존관계 주입을 해준다.

 

 

@Autowried의 의존관계 자동주입

@Component
public class MemberServiceImpl implements MemberService{

    private final MemberRepository memberRepository;

    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

 

생성자에 Autowried지정시, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.

기본 조회전략은 타입이 같은 빈을 찾아서 주입한다!(MemberRepository).  <- 해당 타입과 동일한 구현체들까지 알아서 주입 됨

 

 

탐색 위치와 기본 스캔 대상

 

@Configuration
//AppConfig.Class를 제외하기 위해 excludeFilters 추가 (Configuration어노테이션 붙은것들은 컴포넌트대상에서 모두 제외)
@ComponentScan(
        basePackages="hello.core.member",
        excludeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION, classes = Configuration.class))
public class AutoAppConfig {
}

 

basePackages: 탐색할 패키지의 시작 위치를 지정. (하위까지 모두 탐색한다.) 복수도 가능!

basePackageClass:  지정한 클래스의 패키지를 탐색 시작(상위레벨로 지정)

만약 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.

 

권장방법

패키지 위치 저장하지않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것. 최근 스프링부트도 이 방법을 기본으로 제공한다.

예를들면 

 

com.hello

com.hello.service

com.hello.repository

 

로 패키지가 구성되어있을시 com.hello -> 프로젝트의 루트가 되는 패키지. 이곳에 AppConfig 같은 메인 설정정보를 두고 @ComponentScan 어노테이션을 붙이고, basePackages지정옵션은 생략하는 것이다.

 

이렇게 하면 com.hello를 포함한 하위의 패키지들은 모두 자동으로 컴포넌트스캔의 대상이 된다.

 

참고로 스프링부트를 사용하면 스프링부트의 대표 시작 정보인 @SpringBootApplication을 이 프로젝트 시작 루트 위치에 두는 것이 관례이며 이 설정안에 @ComponentScan이 들어있다

 

 

컴포넌트 스캔 기본 대상

컴포넌트스캔은 @Component뿐 아니라 다음의 어노테이션들도 탐색한다. (해당 어노테이션들의 내부를 살펴보면 @Component가 포함되어 있음!!)

@Component: 컴포넌트 스캔에서 사용

@Controller: 스프링 MVC에서 Controller

@Service: 스프링 비즈니스 로직

@Repository: 스프링 데이터 접근 계층에서 사용

@Configuration: 스프링 설정 정보에서 사용

 

추가적으로 @ComponentScan은 컴포넌트 스캔의 용도 뿐아니라 다음 애노테이션이 있으면 스프링은 부가 기능을 수행한다

 

@Controller: 스프링 MVC컨트롤러로 인식!

@Repostiroy: 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환해 줌.

@Configuration: 스프링 설정 정보로 인식, 스프링빈이 싱글톤을 유지하도록 추가 처리해 줌.

@Service: 특별한 처리르 하지않는다. 다만 개발자들이 핵심 비즈니스 로직, 비즈니스 계층을 파악하는데 도움.