윤개발

스프링의 컴포넌트 스캔 본문

백엔드/스프링

스프링의 컴포넌트 스캔

DEV_SJ 2021. 5. 10. 17:43

 

 

실무에서 @Bean어노테이션을 붙여 등록하는 과정을 반복하다 보면 빈을 등록하는 과정을 누락할수도 있다.

따라서 컴포넌트 스캔을 이용하여 빈을 등록하고 등록된 빈을 자동주입한다.

 

 

@ComponentScan

기존과 다르게 클래스 내부에 @Bean으로 등록한 클래스가 없고 @Component 애노테이션이 붙은 클래스를 스캔한다.

또한 Component내의 의존관계 주입은 @Autowired를 사용하여 타입에 맞는 의존관계를 자동으로 주입해준다.

 

 

탐색 위치와 기본 스캔 대상

basePackages로 탐색할 패키지를 지정하여 스캔할 수 있으며 설정하지 않으면 라이브러리등 모든 자바 소스를 다 스캔하기 떄문에 시간이 오래걸린다. default는 ComponentScan이 붙은 설정정보 클래스의 패키지가 시작 위치가 된다.

 

* 권장 방법 *

설정정보 클래스의 위치를 프로젝트 최상단에 두는 것이다. 그러면 하위 패키지가 모두 스캔의 대상이 된다.

@SpringBootApplication 어노테이션 자체에 ComponentScan이 있기때문에 해당 패키지를 모두 스캔한다.

따라서 boot에서는 ComponentScan을 쓸 일이 많이없다.

 

 

컴포넌트 스캔 기본대상

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

@Controller : MVC 컨트롤러에서 사용 및 인식

@Service : 비지니스 로직에서 사용, 특별한 기능이 있지는 않고 개발자들에게 인식

@Repository : 데이터 접근 계층에서 사용, 데이터 계층의 예외를 스프링 예외로 변환해준다.

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

 

기본적으로 모두 어노테이션 내부에 @Component를 가지고 있다.

 

 

중복 등록과 충돌

 

  • 자동 빈 등록 vs 자동 빈 등록
    • 중복된 이름의 빈이 있다면 스프링이 오류를 발생시킨다.
  • 수동 빈 등록 vs 자동 빈 등록
    • 수동 등록빈이 우선권을 가진다.
    • 수동빈이 자동 빈을 오버라이딩 했지만 이런 경우에는 개발자가 의도하지 않게 설정이 꼬이게 되고 애매한 버그가 생겨 잡기가 힘들어진다.
    • 그래서 최근 스프링부트에서는 충돌이 나면 오류가 발생하도록 기본값을 변경하였다.

 

 

 

 

 

 

 

 

 

 

 

Comments