본문 바로가기
[ Development ]/[ Back-end ] Spring 기본

[Spring 스프링 기본] 컴포넌트 스캔

by dev charlotte 2023. 12. 5.

컴포넌트 스캔(Component Scan)

설정 정보(AppConfig.class) 없이 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공

스프링 빈 등록 ->직접 자바 코드로 등록하는 방법, 컴포넌트 스캔과 자동의존관계를 설정하는 @Autowired 사용 방법

@ComponentScan은 탐색 위치에 @Component가 붙은 모든 클래스를 스프링 빈으로 등록

기본적으로 빈 이름은 맨 앞글자를 소문자로 변경해서 사용하고 어노테이션 뒤에 ("문자열")을 사용해 직접 설정할 수도 있음

 

탐색범위(basePackages)

필요한 위치부터 탐색할 수 있도록 탐색 시작 위치를 지정할 수 있음

basePackages : 탐색 시작 위치 지정, 해당 패키지부터 하위까지

basePackagesClasses : 클래스가 속한 패키지를 탐색 시작 위치로 지정

특별한 지정이 없으면 @ComponentScan 어노테이션이 있는 설정 정보 클래스의 패키지가 시작점

설정 정보 클래스의 위치가 프로젝트 최상단에 있고 패키지 위치는 지정하지 않으면 속도는 느리더라도 편함

 

스프링 부트 사용시  @SpringBootApplication 어노테이션을 프로젝트 시작 루트에 두는데 여기에는 @ComponentScan 어노테이션이 포함

 

컴포넌트 스캔의 기본 대상

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

@Controller & @RestController : 스프링 MVC 및 REST 전용 컨트롤러에서 사용

@Service : 스프링 비즈니스 로직에 사용. 특별한 처리는 하지 않고, 비즈니스 계층을 인식하는데 도움

@Repository : 스프링 데이터 접근 계층에서 사용. 스프링 데이터 접근 계층으로 인식. 데이터 계층의 예외를 스프링 예외로 변환.

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

@Controller, @Service, @Repository는 @Component 어노테이션을 포함 

 

필터(Filter)  

필터 타입 옵션

ANNOTATION : 기본값으로 어노테이션으로 인식해서 동작

SSIGNABLE_TYPE : 지정한 타입과 자식 타입을 인식해서 동작

ASPECTJ : AspectJ 패턴을 사용

REGEX : 정규표현식을 나타냄

CUSTOM : TypeFilter라는 인터페이스를 구현해서 처리

 

컴포넌트 스캔의 중복 등록과 충돌

자동 / 수동 빈 등록과 빈 등록의 충돌

자동인 경우 -> 이미 같은 이름의 스프링 빈이 있으면 ConflictingBeanDefinitionException 예외 발생

수동인 경우 -> 수동과 자동 중 수동 등록이 우선순위. 자동 등록 빈을 오버라이딩

 

--> 스프링 부트에서는 수동 - 자동 중복 등록인 경우 충돌 오류를 발생시켜 중복 등록 방지함