@Component의 주요 특징
- 기본 기능
- 해당 클래스 자체를 Spring의 빈(Bean)으로 등록
- Spring이 자동적으로 해당 클래스의 인스턴스를 생성하고 관리
- 특수화된 @Component 어노테이션들
- @Controller : 웹 컨트롤러 전용
- @Service : 비즈니스 로직 전용
- @Repository : 데이터 접근 계층용
- 주요 장점
- 의존성 주입(DI) 자동화
- 컴포넌트 스캔을 통한 자동 감지
- 코드 구조화 및 관리 용이
@Component 와 @Configuration + @Bean 차이
- 등록 방식
- @Component는
클래스 자체가 빈으로 등록
- @Bean은 메소드가 리턴하는
인스턴스가 빈으로 등록
- 주요 차이점
- @Component
- 개발자가 직접 작성한 클래스를 빈으로 등록할 때 사용
- 단순히 클래스를 빈으로 등록하는 경우
- 스프링 컨테이너가 직접 관리
- @Configuration/@Bean 보다 가벼움 (프록시 생성 X)
- @Configuration/@Bean
- 외부 라이브러리 클래스를 빈으로 등록할 때
- 빈 생성 시 추가적인 설정이 필요한 경우
- 조건에 따라 다른 빈을 생성해야 하는 경우
- CGLIB 프록시를 통해 관리(프록시를 생성하므로 약간의 오버헤드 발생)
- 유연성
- @Component는 비교적 단순하고 직접적
- @Configuration/@Bean은 더 복잡하지만 유연한 설정 가능
- 결론
- 단순한 빈 등록은 @Component를(독립적인 컴포넌트), 복잡한 설정이 필요한 경우는 @Configuration/@Bean(다른 의존이 공존)을 사용하는 것이 일반적
@ComponentScan
- basePackages 속성값
- 스캔 대상 패키지 목록을 지정
- 해당 패키지와 그 하위 패키지에 속한 클래스를 스캔 대상으로 설정.
- 스캔 대상 중 @Component 어노테이션이 붙은 클래스의 객체를 생성해서 빈으로 등록
스캔 대상에서 제외하거나 포함하기
excludeFilters 속성을 사용하면 스캔할 때 특정 대상을 자동 등록 대상에서 제외할 수 있다.
@Filter 어노테이션과 같이 활용 되며 type 값을 지정해야한다.
- FilterType.REGEX : 정규표현식을 사용해서 제외 대상 지정
- FilterType.ASPECTJ : AspectJ 패턴을 사용해서 대상을 지정
- 위 패턴을 사용하려면 의존성 추가해줘야함 (aspectjweaver)
- FilterType.ANNOTATION : 특정 어노테이션을 붙인 타입을 컴포넌트 대상에서 제외할 수도 있다.
- FilterType.ASSIGNABLE_TYPE : 특정 타입이나 그 하위 타입을 컴포넌트 스캔 대상에서 제외
기본 스캔 대상
-
@Component
-
@Controller
-
@Service
-
@Repository
-
@Aspect → 책에서는 이렇게 나와있는데, Claude는 기본 스캔 대상이 아니라고 한다. 한번 찾아봐야 함.
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Aspect {
String value() default "";
}
-
@Configuration
Springboot 환경시 주의할 점
@SpringBootApplication
기본적으로는 이 패키지와 하위 패키지만 스캔
@SpringBootApplication(scanBasePackages = "com.sample")
참고
책 - 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문
Claude.ai