Spring 핵심 원리 기본편 (6) - 컴포넌트 스캔(Component Scan) / @Autowired

김정욱·2021년 2월 17일
4
post-thumbnail

컴포넌트 스캔 & 의존관계 주입 시작

  • 지금까지 스프링 빈(Bean)을 등록할 때 구성파일에 @Bean 을 사용했다
      --> 관리할 빈이 많아지면 관리하기 번거로워 진다
  • 굳이 빈 설정파일을 만들지 않거나, @Bean을 안쓰고 빈 등록을 할 수 있다
      --> @ComponentComponent Scan를 사용하면!
  • 설정파일이 없다면 의존관계는 어떻게 주입할까?
      --> @Autowired를 사용해 자동 의존관계 주입을 한다

컴포넌트 스캔(Component Scan) ?

[ 정의 ]

: @Component를 가진 모든 대상을 가져와서 빈에 등록하기 위해 찾는 과정
  ( 빈 설정파일 + @Bean을 통해 빈을 하나하나 지정할 필요가 없음)


[ 특징 ]

  • 빈 이름 기본 전략 : 가장 앞 문자를 소문자로 바꾼 것이 빈 이름이 된다
    ex) MemberServiceImpl --> memberServiceImpl
  • 빈 이름을 수동으로 지정 : @Component("지정할 이름")
  • 기본적인 컴포넌트 스캔 대상
    • @Component : 컴포넌트 스캔에서 사용
    • @Controller : 스프링 MVC 컨트롤러에서 사용
    • @Service : 스프링 비즈니스 로직에서 사용
    • @Repository : 스프링 데이터 접근 계층에서 사용
    • @Configuration : 스프링 설정 정보에서 사용
  • 컴포넌트 스캔 범위
    • @ComponentScan 어노테이션이 있는 파일의 패키지 아래를 찾는다.
    • basePackages / basePackageClasses로 지정도 가능
    • 권장 방법 : 구성파일에 등록시 프로젝트 최상단에 두기
      (SpringBoot 사용시라면 @SpringBootApplication에 포함되어있어서 자동으로 최상단으로 유지된다)

[ 주의할 점 ]

  • DiscountPolicy라는 인터페이스를 상속받는 RateDiscountpolicyFixDiscountpolicy가 있을 때 둘 중 내가 사용할 것만 빈에 등록해야 하기 때문에 한 곳에만 @Component를 붙여야함!
    --> 아니면 @Qulifier 이나, @Primary를 사용해야 한다!
  • 수동 빈 등록 vs 자동 빈 등록
    : 자동으로 빈을 등록 한 상태에서 수동 등록 파일과 이름이 겹칠 경우에는
    수동 빈 파일이 우선권을 가진다. 하지만, 최근 SpringBoot는 오류를 낸다!

[ 옵션 ]

  • 특정 어노테이션을 포함 / 제외 시킬 수 있음
    • includeFilters : 컴포넌트 스캔 대상으로 추가
    • excludeFilters : 컴포넌트 스캔 대상에서 제외
  • FilterType 옵션
    • ANNOTATION : 기본값, 어노테이션을 인식해 동작
    • ASSIGNABLE_TYPE : 지정한 타입과 자식 타입을 인식해 동작
    • ASPECTJ : AspectJ 패턴 사용
    • REGEX : 정규 표현식
    • CUSTOM : TypeFilter이라는 인터페이스를 구현해서 처리

[ 정리 ]

  • 사실 어노테이션을 건드릴 일은 많지 않음 (존재하는 어노테이션이 충분해서)
  • 가끔 특정 어노테이션을 제외하게 할 수 있음
  • 기본 설정에 최대한 맞추어 사용하는 것이 관례

자동 의존관계 주입(Auto Dependency Injection) ?

[ 정의 ]

의존관계 주입을 스프링 컨테이너에 등록된 빈(Bean)에서 찾아서 설정하는 방법


[ 설명 ]

  • 스프링 빈 설정 파일이 없어진다면 해당 파일에서 해주던 의존관계 주입을 해주는 것이 필요
    --> @Autowired 를 사용하면 된다.
  • 의존성 주입이 필요한 파일의 생성자에서 어노테이션 사용
  • 더욱 더 자세한 내용은 다음 글에서 계속!

[ 원리 ]

1) 스프링 컨테이너가 @Component를 찾아 모두 스프링 빈으로 등록!
2) 의존성이 필요한 부분에서 @Autowired태그가 있다면 등록된 스프링 빈에서 찾아서 의존관계 주입 설정!

profile
Developer & PhotoGrapher

0개의 댓글