컴포넌트 스캔

한윤재·2024년 4월 10일

컴포넌트 스캔


컴포넌트 - @Component 어노테이션 및 하위 어노테이션이 붙은 클래스

컴포넌트 스캔 - 스프링 빈으로 등록될 컴포넌트 클래스를 검색하는 행위

ApplicationContext - 스프링 빈 컨테이너

자동 빈 등록


스프링은 @Configuration 클래스를 통한 수동 빈 등록, @Component 클래스를 검색 및 생성하는 자동 빈 등록을 지원한다.

사용법


빈 등록

클래스 선언 위에 알맞는 어노테이션을 붙인다.

필요한 객체는 @Autowired 를 통해 전달받을 수 있다.

검색 범위 지정

@Component 를 통한 자동 빈 등록을 위해서는 검색범위를 지정해주어야 한다.

스프링 MVC - 스프링 부트를 사용하지 않은 - 의 경우 ApplicationContext가 생성될 때 사용할 자바 설정 클래스를 직접 지정한다. 따라서 해당 설정 클래스에 @ComponentScan 를 붙인다.

@ComponentScan(basePackage = "com.fundly")

베이스 패키지로 지정된 경로부터 모든 하위 패키지를 탐색해 @Component 클래스를 찾아 빈으로 등록한다.

베이스패키지 옵션을 제거하면 해당 자바 설정 클래스가 위치한 패키지부터 그 하위 패키지를 검색해 빈을 등록한다.

  • 스프링 MVC 예시

  • 스프링 부트 예시

    @SpringBootApplication 어노테이션에는 @ComponentScan 어노테이션 설정이 포함된다.
    또한 @ComponentScan 어노테이션에 basePackages 옵션이 없기 때문에 @SpringBootApplication 이 붙은 클래스가 포함된 패키지로 부터 그 하위 패키지를 검색해 빈을 등록한다.

스프링 부트는 설정클래스 없이 ApplicationContext를 생성 하는가?

@SpringBootApplication 이 붙은 클래스 자체를 ApplicationContext를 생성하기 위한 자바 설정클래스로 활용한다.


메서드의 인자로 @SpringBootApplication 클래스의 클래스 객체를 전달하고있다.

이때 메서드 안에서 ApplicationContext 생성 및 초기화가 일어나며, 이때 @SpringBootApplication(@ComponentScan 포함) 클래스를 ApplicationContext가 사용할 설정 클래스로 전달하는 과정이 일어난다.

SpringApplication.run() 메서드의 반환 타입이 ConfigurableApplicationContext 이다. 메서드의 인자로 전달 된 클래스의 정보 - 컴포넌트 스캔 범위 등 - 를 활용해서 ApplicationContext를 생성하고 빈을 등록하는 과정들이 일어나게 된다.

결론

@SpringBootApplication 클래스의 탐색 범위 안에 있는 컴포넌트를 검색하고 이 정보를 통해 ApplicationContext 를 만든다.

다양한 컴포넌트 어노테이션


  • @Component
  • @Controller
  • @RestController
  • @Service
  • @Repository
  • @Configuration

스프링은 위의 어노테이션을 찾아 빈으로 등록한다.

각 객체의 역할에 맞는 어노테이션을 붙여 빈으로 생성할 수 있다.

부가기능이 존재하는 어노테이션

  • @Controller - 클래스 내부에서 @GetMapping 과 같이 url에 매핑하기 위한 어노테이션을 사용할 수 있다.
  • @RestController - @ResponseBody 어노테이션이 각 메서드 선언부에 붙은 효과를 준다.

    @ResponseBody - 컨트롤러 메서드의 반환값을 브라우저로 전송한다.

  • @Repository - DB에서 발생하는 예외를 스프링이 만든 예외로 변환한다.

    스프링 예외 추상화 - DB 제품별로 다른 예외들을 공통으로 처리하기 위한 추상화 된 예외를 제공한다.

  • @Configuration - 빈 등록 메서드가 싱글톤 패턴으로 작동하도록 돕는다.

    자바 설정파일과 싱글톤 관련.
    https://velog.io/@mulgoms2/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%B1%EA%B8%80%ED%86%A4-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88

빈의 중복 등록


수동 VS 자동 = 수동 WIN

@Component 스캔을 통한 자동 등록시 중복 되는 경우 예외가 발생한다.

@Component와 자바 설정클래스의 수동 등록 된 빈이 충돌하는 경우에 수동 등록 빈이 등록된다. 스프링 부트에서는 이 경우에 오류가 발생한다.

0개의 댓글