개발/java

[Spring 기본] 5. 컴포넌트 스캔

ebang 2024. 1. 6. 23:05
반응형

컴포넌트 스캔과 의존관계 자동 주입

  • 컴포넌트 스캔
    1. Configuration 클래스에 @ComponentScan 어노테이션을 붙인다.
    2. 스프링 빈으로 등록할 객체들을 @Component 어노테이션을 붙인다.
      • 그러면 컨테이너에 빈으로 등록이 된다.
    3. 이전에는 직접 new MemberServiceImpl(memberRepository()) 같은 식으로 의존관계가 주입이 가능했는데, 지금은 불가능해졌다.
  • 자동의존관계 주입
    • 클래스의 생성자에 @Autowired 어노테이션을 붙이면 스프링 빈 중 해당 파라미터 타입에 해당하는 빈이 자동으로 의존관계 주입이 된다.
      • applicationContext.getBean(MemberRepository.class) 의 결과를 주입한다고 보면 된다.
      • 타입이 여러 개인 경우는 추후 설명
  • 컴포넌트 스캔 탐색 범위와 시작 위치
  • 시작위치 : 기본적으로는 @ComponentScan 이 붙은 파일 부터 시작
    • basePackages : {“파일경로”, “파일경로2”, … }, 를 통해 별도 지정 가능
  • 컴포턴트 스캔 범위 + 제공 기능
    • @Component
    • @Configuration : 구성 정보 설정 및 싱글톤으로 관리하는 처리
    • @Service : 개발자가 비즈니스 로직이 수행되는 부분이라고 인식
    • @Controller : MVC 패턴의 controller로 인식하여 추가 처리
    • @Repository : 데이터 접근 계층으로, 데이터베이스 오류를 스프링 오류로 변환
    • 모두 내부적으로 @Component 를 갖고 있음.
      • 어노테이션을 상속구조로 인식하는 것은 java 기능이 아니라 스프링이 제공하는 기능.
  • Component 스캔 필터
    • includeFilters, excludeFilters = @Filter(type, classes)
    • 직접 만든 어노테이션으로 적용 가능하다.
      1. @Target(ElementType.TYPE): 이 어노테이션을 어떤 종류의 요소에 적용할 수 있는지를 지정한다. ElementType.TYPE은 클래스, 인터페이스, 열거형 등 타입과 관련된 요소에 이 어노테이션을 적용할 수 있음을 의미한다.
      2. @Retention(RetentionPolicy.RUNTIME): 이 어노테이션을 어느 시점까지 유지할 것인지를 지정한다.RetentionPolicy.RUNTIME은 런타임 시에 이 어노테이션 정보를 유지하도록 지정한 것이며, 이는 리플렉션을 사용하여 런타임 중에 이 어노테이션 정보를 읽을 수 있게 한다.
      3. @Documented: 이 어노테이션을 자동으로 문서화할 것인지 여부를 나타낸다. 이 어노테이션을 사용한 코드를 자동 문서 생성 도구가 포함시킬지 여부를 결정한다.
    • FilterType 옵션
    • FilterType은 5가지 옵션이 있다.
      • ANNOTATION: 기본값, 애노테이션을 인식해서 동작한다.
        ex) org.example.SomeAnnotation
      • ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작한다.
        ex) org.example.SomeClass
      • ASPECTJ: AspectJ 패턴 사용
        ex) org.example..*Service+
      • REGEX: 정규 표현식
        ex) org\.example\.Default.*
      • CUSTOM: TypeFilter 이라는 인터페이스를 구현해서 처리
        ex) org.example.MyTypeFilter
  • 중복 등록과 충돌
  • 빈 이름이 중복될 때 어떤 일이 벌어지는가?
    • 자동 주입하는 빈 vs 자동 주입하는 빈
      ConfilctingBeanDefinitionException 발생
    • 수동 주입하는 빈 vs 자동 주입하는 빈
      • 수동 주입하는 빈이 Overwrite
      • 현재 스프링이 지원하는 것은 일단 충돌나게 하는 기본 옵션.
        • allow-bean-definition-overriding = false
반응형