컴포넌트 스캔 시, 탐색 위치를 지정하는 방법

woply·2022년 1월 19일
0

TIL(Today I Learn)

목록 보기
19/31

📖 ✏️

  1. TIL 시리즈에 작성된 글은 '매일 매일 학습한 지식 조각을 메모해 놓은 포스팅'입니다. 공유가 아닌 개인적인 학습 내용 기록을 목적으로 작성되었음을 알려드립니다.
  2. 그 외 시리즈에 작성된 공유 목적의 포스팅은 시간이 날 때마다 별도로 작성하고 있습니다. 주로, TIL 시리즈에 작성된 내용에서 특정 주제를 선정하고, 더 깊이 공부한 후 정리하여 작성합니다.

컴포넌트 스캔 시, 탐색 위치를 지정하는 방법

컴포넌트 스캔 방식으로 스프링 Bean을 등록할 때, 모든 자바 클래스를 다 컴포넌트 스캔하는 것은 비효율적이다. 애플리케이션 개발에 필요한 위치부터 탐색하도록 시작 위치를 지정하는 것이 좋다. 탐색할 패키지의 시작 위치를 지정할 때는 @ComponentScan안에 basePackages를 사용한다. 아래와 같이 여러 시작 위치를 지정할 수도 있다.

@ComponentScan( 
          basePackages = "hello.core.member" // 하나의 탐색 위치만 지정하는 경우
          basePackages = {"hello.core", "hello.service"} // 둘 이상의 탐색 위치를 지정하는 경우
          basePackageClasses = AutoAppConfig.class // 해당 클래스가 속한 패키지를 탐색 위치로 지정한다.
} 

참고

  • basePackageClasses: 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다.
  • 탐색 위치를 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.

권장하는 탐색 위치 지정 방법

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

예를 들어서 아래와 같이 프로젝트 구조가 나눠져 있다면, 프로젝트 시작 루트인 com.helloAppConfig.class 같은 메인 설정 정보를 위치 시킨다. 그리고 @ComponentScan 애노테이션을 붙인다. basePackages 지정은 생략한다.

com.hello 
com.hello.serivce 
com.hello.repository 

이렇게 되면, @ComponentScan이 붙은 AppConfig.class가 위치하고 있는 패키지가 탐색 시작 위치가 된다. AppConfig.class가 프로젝트 시작 루트인 com.hello에 위치하므로, com.hello을 포함한 하위 패키지가 모두 컴포넌트 스캔의 대상이 된다. 한편, 프로젝트 메인 설정 정보는 프로젝트를 대표하는 정보이기 때문에 프로젝트 시작 루트 위치에 두는 것이 바람직하다.

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


컴포넌트 스캔의 기본 대상

컴포넌트 스캔은 @Component 뿐만 아니라 아래 애노테이션도 스캔 대상에 포함한다.

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

해당 클래스의 소스 코드를 보면 @Component 를 포함하고 있다.

    @Component
    public @interface Controller {
    }

    @Component
    public @interface Service {
    }

    @Component
    public @interface Configuration {
    }

참고
애노테이션에는 상속관계가 없다. 애노테이션이 특정 애노테이션을 포함하는 방식은 자바 언어가 지원하는 기능이 아니다. 스프링이 지원하는 기능이다.

참고
위 애노테이션은 컴포넌트 스캔의 용도 뿐만 아니라 아래와 같은 부가 기능을 수행한다.

  • @Controller : 스프링 MVC 컨트롤러로 인식
  • @Repository : 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환
  • @Configuration : 스프링 설정 정보로 인식하고, 스프링 Bean이 싱글톤을 유지하도록 추가 처리
    -@Service : 특별한 기능은 없다. 하지만 개발자들이 핵심 비즈니스 로직이 위치한 클래스로 인식하는데 도움을 준다.
profile
7년간 마케터로 일했고, 현재는 헤렌에서 백엔드 개발자로 일하고 있습니다. 고객 가치를 설계하는 개발자를 지향하며, 개발, 독서, 글쓰기를 좋아합니다. 업이 심오한 놀이이길 바라는 덕업일치 주의자입니다.

0개의 댓글