컴포넌트 스캔

이영섭·2024년 11월 18일

@Component의 주요 특징

  1. 기본 기능
    1. 해당 클래스 자체를 Spring의 빈(Bean)으로 등록
    2. Spring이 자동적으로 해당 클래스의 인스턴스를 생성하고 관리
  2. 특수화된 @Component 어노테이션들
    1. @Controller : 웹 컨트롤러 전용
    2. @Service : 비즈니스 로직 전용
    3. @Repository : 데이터 접근 계층용
  3. 주요 장점
    1. 의존성 주입(DI) 자동화
    2. 컴포넌트 스캔을 통한 자동 감지
    3. 코드 구조화 및 관리 용이

@Component 와 @Configuration + @Bean 차이

  1. 등록 방식
    1. @Component는 클래스 자체가 빈으로 등록
    2. @Bean은 메소드가 리턴하는 인스턴스가 빈으로 등록
  2. 주요 차이점
    1. @Component
      1. 개발자가 직접 작성한 클래스를 빈으로 등록할 때 사용
      2. 단순히 클래스를 빈으로 등록하는 경우
      3. 스프링 컨테이너가 직접 관리
      4. @Configuration/@Bean 보다 가벼움 (프록시 생성 X)
    2. @Configuration/@Bean
      1. 외부 라이브러리 클래스를 빈으로 등록할 때
      2. 빈 생성 시 추가적인 설정이 필요한 경우
      3. 조건에 따라 다른 빈을 생성해야 하는 경우
      4. CGLIB 프록시를 통해 관리(프록시를 생성하므로 약간의 오버헤드 발생)
  3. 유연성
    1. @Component는 비교적 단순하고 직접적
    2. @Configuration/@Bean은 더 복잡하지만 유연한 설정 가능
  4. 결론
    • 단순한 빈 등록은 @Component를(독립적인 컴포넌트), 복잡한 설정이 필요한 경우는 @Configuration/@Bean(다른 의존이 공존)을 사용하는 것이 일반적

@ComponentScan

  1. basePackages 속성값
    • 스캔 대상 패키지 목록을 지정
    • 해당 패키지와 그 하위 패키지에 속한 클래스를 스캔 대상으로 설정.
    • 스캔 대상 중 @Component 어노테이션이 붙은 클래스의 객체를 생성해서 빈으로 등록

스캔 대상에서 제외하거나 포함하기

excludeFilters 속성을 사용하면 스캔할 때 특정 대상을 자동 등록 대상에서 제외할 수 있다.

@Filter 어노테이션과 같이 활용 되며 type 값을 지정해야한다.

  1. FilterType.REGEX : 정규표현식을 사용해서 제외 대상 지정
  2. FilterType.ASPECTJ : AspectJ 패턴을 사용해서 대상을 지정
    1. 위 패턴을 사용하려면 의존성 추가해줘야함 (aspectjweaver)
  3. FilterType.ANNOTATION : 특정 어노테이션을 붙인 타입을 컴포넌트 대상에서 제외할 수도 있다.
  4. FilterType.ASSIGNABLE_TYPE : 특정 타입이나 그 하위 타입을 컴포넌트 스캔 대상에서 제외

기본 스캔 대상

  1. @Component

  2. @Controller

  3. @Service

  4. @Repository

  5. @Aspect책에서는 이렇게 나와있는데, Claude는 기본 스캔 대상이 아니라고 한다. 한번 찾아봐야 함.

    // @Component 어노테이션이 없으므로 기본 스캔 대상은 아닌듯하다.
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE})
    public @interface Aspect {
        String value() default "";
    }
  6. @Configuration


Springboot 환경시 주의할 점

@SpringBootApplication

기본적으로는 이 패키지와 하위 패키지만 스캔

@SpringBootApplication(scanBasePackages = "com.sample")


참고

책 - 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문
Claude.ai

profile
성장과 발전에는 열려있고, 안주와 정체에는 닫혀있는 개발자 이영섭입니다.

0개의 댓글