DevBoi

[스프링] 컴포넌트 스캔 동작과정 본문

Develop/[Spring]

[스프링] 컴포넌트 스캔 동작과정

HiSmith 2022. 2. 20. 17:53
반응형

컴포넌트 스캔 : 빈으로 등록될 준비가 된 클래스들을 스캔하여, 빈으로 등록해주는 과정이다.

(@Controller, @Service, @Component, @Repository 등을 빈으로 등록해주는 것이다.)

 

우선 ComponentScan이 어디에 사용되고있는지를 보자

우선 기본 SpringbootApplication 어노테이션을 보면, ComponentScan을 사용해서 해당 컴포넌트들을 스캔한다.

이때, 특정 경로를 제외할수도있고 필터에 포함할수도있다.

해당 기본으로 basePackages 하위 패키지의 것들은 다 스캔한다.

하지만 별도로 경로 패턴을 지정하여, 스캔할수도있다.

 

컨트롤러는 Component를 선언한 별도의 스테레오타입의 어노테이션이다.

해당 컴포넌트 스캔의 경로는 자바파일로도, xml파일로도 등록이 가능하다.

 

1. @ComponentScan

스프링 3.1 부터 도입된 개념이고 스캔 위치를 설정하고

어떤 annotation에 대해서 스캔 하지 않을지를 결정하는 Filter 기능을 가지고 있다.

BasePackage와 basePackageClass라는 게 있는데, 하나는 String, 하나는 전달된 class기준으로 스캔지점을 정하는 것이다.

BasePackage같이 String 으로 전달이 되면 typeSafe하지 않기 때문에 비추천한다고 한다.

 

2.@BasePackageClass

@ComponentScan이 붙어있는 Configruation 파일부터 스캔을 한다.

Spring boot에서는 시작 SpringBootApplication의 파일에서 부터 컴포넌트 스캔과 Configuration이 붙어있어서, 해당 파일을 기점으로 컴포넌트를 스캔한다.

 

동작 원리

 

ConfigurationClassParser가 ConfigurationClass를 파싱

ComponentScan 설정 파싱

ComponentAnnotationParser가 스캔하기 위한 설정을 파싱

base-package 혹은 base-package-class(string 혹은 componentscan이 있는 파일위치 대상) 으로 모든 클래스를 로딩

ClassLoader가 로딩한 클래스를 beanDefination 으로 정의한다. (생성할 빈에 대한 정의를 한다.)

정의한대로 빈을 생성한다.

 

컴포넌트 스캔에 대한 동작과정은 좀더 상세하게 해야되겠다

 

반응형