티스토리 뷰

컴포넌트 스캔과 의존관계 자동 주입 

이전까지 스프링 빈을 등록하려 했다 - @Bean을 통해 설정 정보에 직접 등록

 

스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 @ComponentScan 기능을 제공한다.

컴포넌트 스캔은 @Component이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다.

+) @Configuration이 붙은 설정 정보도 자동 등록이 됨, 충돌을 조심하자

@Component가 붙은 클래스를 스프링 빈에 저장하는 모습

단, 스프링 빈 이름은 클래스 이름의 첫 문자를 소문자로 변경하여 사용한다. ( AddPrice -> addPrice )

 

또한, 의존관계를 자동으로 주입해주는 @Autowired 기능도 제공한다.

@Autowired가 붙은 메서드를 통해 의존관계를 주입하는 모습

디폴트는 스프링 컨테이너가 타입이 같은 빈을 찾아서 주입한다.

 

 

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

컴포넌트 스캔의 대상을 직접 설정할 수 있다. 

basePackages("패키지 이름") 을 통해 시작 위치를 정할 수 있다. 대상은 패키지의 하위 폴더들이다.

 

지정하지 않는다면? @Component가 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다

--> 설정 정보 클래스를 프로젝트의 최상단에 두는 것을 권장

+) 스프링 부트의 시작 정보인 @SpringBootApplication은 시작 루트 위에 둔다. 위의 이유 때문에

 

컴포넌트 스캔의 스캔 대상은 @Component 만 있는 것이 아니다.

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

  @Service - 스프링 비즈니스 로직에서 사용

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

  @Configuration - 스프링 설정 정보 인식, 스프링 빈 싱글톤 유지 처리

이 애노테이션들은 @Component를 상속받은 것이 아닌, 스프링이 이 관계를 지원해주는 것이다.

 

 

필터

컴포넌트 스캔에 추가, 제외할 대상을 지정하는 명령어

  includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다.

  excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정한다.

필터를 통해 애노테이션 타입을 적용한 클래스들을 스캔에 추가, 제외하는 코드

 

 

중복 등록과 충돌

컴포넌트 스캔을 통해 같은 빈 이름이 등록된다면?

자동으로 등록되는 경우 스프링이 오류를 발생시킨다. -> ConflictingBeanDefinitionException 예외 발생

수동 빈 등록과 자동 빈 등록되는 경우에는? -> 수동 빈이 우선권을 가진다 ( 수동 빈이 자동 빈을 오버라이딩 )

 

하지만 두 등록 방법을 혼용하다 오류가 발생하면 잡기 어려운 버그가 생긴다고 함..

이를 위해 스프링 부트에서는 두 등록이 충동하면 오류를 발생하도록 기본 값을 수정 했다고 한다.

 

 

 

 

 

본 포스팅은 인프런 강의 김영한님의

[ 스프링 핵심 원리 - 기본편 ] 을 수강하며 작성한 내용입니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31