Spring/스프링 핵심원리 - 기본편

컴포넌트 탐색위치와 스캔 대상

hyun-1200 2022. 3. 26. 18:41

모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸린다. 그래서 꼭 필요한 위치부터 탐색하도록 시작위치를 지정할 수 있다.

  • basePackages: 탐색할 패키지의 시작 위치를 정한다. 이 패키지를 포함해서 하위 패키지를 모두 탐색한다.
    • ex. basePackages = "hello.core" 
  • basePackagesClasses :  지정한 클래스의 패키지를 시작 위치로 지정한다.
  • 디폴트는 @ComponentScan 이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.

 

* 권장 하는 방법

- 설정 정보의 클래스 위치를 프로젝트 최상단에 두고, 패키치 위치를 지정하지 않는 것을 추천한다.

 ex.  아래와 같은 프로젝트 구조인 경우,

  • com.hello
  • com.hello.service
  • com.hello.repository 

-> com.hello : 프로젝트의 시작 루트이므로, 여기에 AppConfig와 같은메인 설정정보를 두고, @ComponenetScan 에노테이션을 붙이고 basePackages 지정은 생략한다. 이렇게 하면, com.hello를 포함한 하위는 모두 자동으로 컴포넌트 스캔의 대상이 된다. 

 

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

 

* 컴포넌트의 스캔 기본 대상 

컴포넌트 스캔은 @Component 뿐만 아니라 아래와 같은 내용에도 추가로 대상에 포함한다.

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

-> 위 에노테이션에서도 Component가 기본으로 들어가있다는 뜻.

 

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

 

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

@Repository 스프링 데이터 접근 계층으로 인식하고데이터 계층의 예외를 스프링 예외로 변환해준다.

@Configuration 앞서 보았듯이 스프링 설정 정보로 인식하고스프링 빈이 싱글톤을 유지하도록 추가처리를 한다@Service 사실 @Service 는 특별한 처리를 하지 않는다대신 개발자들이 핵심 비즈니스 로직이 여기에있겠구나 라고 비즈니스 계층을 인식하는데 도움이 된다.

 

  • useDefaultFilters 옵션은 기본으로 켜져있는데, 이 옵션을 끄면 기본 스캔 대상들이 제외된다. 그냥 이런 옵션이 있구나 정도 알고 넘어가자.

사실 애노테이션에는 상속관계라는 것이 없다. 그래서 이렇게 애노테이션이 특정 애노테이션을 들고 있는 것을 인식할 수 있는 것은 자바 언어가 지원하는 기능은 아니고, 스프링이 지원하는 기능이다.