[Spring] 컴포넌트 스캔

ggamang·2023년 3월 29일
0

JAVA&Spring

목록 보기
16/27

컴포넌트 스캔과 의존관계 자동 주입 시작하기

등록해야할 스프링 빈이 많아지면 누락 등의 문제가 발생

⇒ 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능 제공

⇒ 의존관계도 자동으로 주입하는 @Autowired 기능도 제공

컴포넌트 스캔 사용 방법

  • @ComponentScan을 설정정보에 붙여준다
  • 각 클래스가 컴포넌트 스캔의 대상이 되도록 @Component를 붙인다
  • 자동 의존관계 주입은 생성자 위에 @Autowired를 붙여준다

컴포넌트 스캔 동작 방법

  1. @ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다

    스프링 빈 기본 이름: 클래스명(단, 맨 앞 소문자)

  2. 생성자에 @Autowired 지정하면, 스프링 컨테이너가 자동으로 해당 빈을 찾아서 주입한다

탐색 위치와 기본 스캔 대상

탐색 위치

관례) 설정 정보 클래스의 위치를 프로젝트 최상단에 두고, 패키지 위치는 별도로 지정하지 않는다.

→ 컴포넌트 스캔 탐색 위치를 별도로 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다

기본 스캔 대상

  • @Component: 컴포넌트 스캔에서 사용
  • @Controller: 스프링 MVC 컨트롤러에서 사용
  • @Service: 비즈니스 로직에서 사용
  • @Repository: 데이터 접근 계층에서 사용 → 데이터 계층의 예외를 스프링 예외로 변환
  • @Configuration: 설정 정보에서 사용 → 스프링 빈이 싱글톤 유지하도록 추가

⇒ 모든 애노테이션에 @Component를 포함하고 있음

필터

  • includeFilters: 컴포넌트 스캔 대상 지정
  • excludeFilters: 컴포넌트 스캔 제외 대상 지정

FilterType 옵션

  • ANNOTATION: 기본값, 애노테이션 인식
  • ASSIGNABLE_TYPE: 지정한 타입과 자식타입 인식
  • ASPECTJ: AspectJ 패턴
  • REGEX: 정규표현식
  • CUSTOM: TypeFilter 인터페이스 구현해서 처리

중복 등록과 충돌

컴포넌트 스캔에서 같은 빈 이름을 등록할 경우

  1. 자동 빈 등록 vs 자동 빈 등록

    ConflictingBeanDefinitionException 발생

  2. 수동 빈 등록 vs 자동 빈 등록

    수동 빈이 자동 빈을 오버라이딩 해버린다 ⇒ 수동 빈 등록이 우선권 가짐

    최근 스프링부트(CoreApplication 실행)에서는 수동 빈과 자동 빈 충돌 시 오류 발생하도록 기본 값 변경함

0개의 댓글