ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring][Kotlin]컴포넌트 스캔
    Spring 2022. 5. 19. 00:44

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

    스프링은 설정 정보 없이도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다.

     + 의존관계 자동으로 주입하는 @Autowired 기능도 제공한다.

     

     

    컴포넌트 스캔

    @ComponentScan을 설정정보에 붙여주면 된다.

    컴포넌트 스캔은 @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다.

     

    Autowired 의존관계 자동 주입

    이전에는 설정정보 클래스에서 @Bean으로 직접 설정 정보를 작성했고 의존관계도 명시했다.

    하지만 컴포넌트 스캔을 사용하면 이런 설정 정보 자체가 없기 때문에 의존관계 주입도 @Autowired를 통해서 해주어야한다.

    @Autowired를 사용하면 생성자에서 여러 의존관계도 한번에 주입받을 수 있다.

     

    @Autowired 테스트 시 싱글톤 빈의 인스턴스 인식한 로그와 Autowired한 내용도 나오는데, 빈 이름 규칙은 다음과 같다.

    • 스프링 빈의 이름은 클래스 명에서 맨 앞글자를 소문자로 바꾼 것
    • 빈 이름 직접 지정 : @Component("이름")

    생성자에 파라미터가 많아도 @Component 붙은 클랫 다 찾아서 자동으로 주입한다.

     

    탐색 위치와 기본 스캔 대상

    탐색 할 패키지의 시작 위치 지정

    모든 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸린다.

    따라서 꼭 필요한 위치에서부터 탐색하도록 위치를 지정할 수 있다.

    basePackages : 탐색할 패키지의 시작 위치를 지정한다. 이 패키지를 포함해서 하위 패키지를 모두 탐색한다.

    basePackageClasses : 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다.

     

     

    컴포넌트 스캔 기본 대상

    컴포넌트 스캔은 @Component뿐만 아니라 다음 내용도 추가로 대상에 포함된다.

    • @Component : 컴포넌트 스캔에 사용
    • @Controller : 스프링 MVC 컨트롤러에서 사용
    • @Service : 스프링 비즈니스 로직에서 사용
    • @Repository : 스프링 데이터 접근 계층에서 사용
    • @Configuration : 스프링 설정 정보에서 사용

     

    해당 애노테이션으로 가보면 안에 @Component 붙어있다.
    하지만 사실 Annotation에는 상속관계라는게 없다.
    애노테이션이 특정 애노테이션을 들고 있다는 것은 자바 언어가 인식하는 것은 아니고 스프링이 지원하는 기능이다.

     

    컴포넌트 스캔의 용도 뿐만 아니라 다음 애노테이션이 있으면 스프링은 부가 기능을 수행한다.

    • @Controller : 스프링 MVC 컨트롤러로 인식
    • @Repository : 스프링 데이터 접근 계층으로 인식, 데이터 계층의 예외를 스프링 예외로 변환해줌
    • @Configuration : 스프링 설정 정보로 안식하고 스프링 빈이 싱글톤을 유지하도록 추가 처리함
    • @Service : 특변한 처리하지 않지만 개발자들이 핵심 비즈니스 로직 계측 인식하는 데 도움을 줌

    필터

    includeFilters : 컴포넌트 스캔 대상 추가 지정

    excludeFilters : 컴포넌트 스캔에서 제외할 대상 지정

     

    자체 애노테이션 만들어서 적용 대상 지정할 수 있다.

     

    FilterType 옵션

    • ANNOTATION : 디폴트. 애노테이션을 인식해서 동작
      ex) org.example.xxAnnotation
    • ASSIGNABLE_TYPE : 지정한 타입과 자식 타입을 인색해서 동작한다.
      ex) org.example.xxClass
    • REGEX : 정규 표현식
      ex)org\.example\.Default.*

    등...

    (잘 사용하는 일이 없다)

     

     

    중복 등록과 충돌

    Q. 컴포넌트 스캔에서 같은 빈 이름으로 등록하면 어떻게 될까?

    1. 자동 빈 등록 vs 자동 빈 등록
    2. 자동 빈 등록 vs 수동 빈 등록

    자동 빈 등록 vs 자동 빈 등록

    스프링에 의해 ConflictBeanDefinitionException 예외가 발생한다.

     

    자동 빈 등록 vs 수동 빈 등록

    수동 빈 등록이 우선권을 가진다.

    수동빈이 자동빈을 오버라이딩 해버리고 스프링이 오버라이딩 했다고 로그를 남겼다.

    이것으로 인해 여러 설정들이 꼬려 버그가 많이 만들어졌다.
    그래서 최근 스프링부트에서는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본 값을 바꾸었다.

     

     

     

     

     

     

     

    [출처]

    스프링 핵심 원리 - 기본편

    https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

     

    스프링 핵심 원리 - 기본편 - 인프런 | 강의

    스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

    www.inflearn.com

     

Designed by Tistory.