스프링 핵심 원리 - 기본편 # Section 6

2024. 7. 2. 22:53Spring/스프링 핵심 원리 - 기본편

반응형

 

❓ 컴포넌트 스캔

설정 코드

 @Configuration
 @ComponentScan(
        excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = 
Configuration.class))
 public class AutoAppConfig {
 }

 

사용 할 때

// @Component 어노테이션으로 등록 가능
@Component
public class MemoryMemberRepository implements MemberRepository {}
 
@Component
public class RateDiscountPolicy implements DiscountPolicy {}

 

컴포넌트 스캔과 자동 의존관계 주입이 동작하는 원리

  •  @ComponentScan 은 @Component 가 붙은 모든 클래스를 스프링 빈으로 등록함

  • 생성자에 @AutoWired 를 지정하면, 스프링 컨테이너가 자동으로 해당 스플이 빈을 찾아서 주입함
  • 기본 전략은 타입이 같은 빈을 찾아서 주입

❓ 탐색 위치와 기본 스캔 대상

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

@ComponentScan(
	basePackages = "hello.core",
)
  • basePackages : 탐색할 패키지의 시작 위치 지정, 해당 패키지 포함 하위 전체를 스캔함
    • basePackages = {"hllo.core", "hello.service"} 처럼 여러개 지정 가능
  • basePackageClasses : 지정한 클래스의 패키지를 탐색 시작 위치로 지정
  • 지정 하지 않으면 @ComponentScan 이 붙은 설정 정보 패키지가 시작 위치

컴포넌트 스캔 대상

  • @Components : 컴포넌트 스캔에 사용
  • @Controller : 스프링 MVC 컨트롤러에서 사용
    • 스프링 MVC 컨트롤러로 인식
  • @Service : 스프링 비즈니스 로직에서 사용
    • 특별한 처리를 하지 않음, 핵심 비즈니스 로직이 여기에 있겠구나 라고 인식하는데 도움을 줌
  • @Repository : 스프링 데이터 접근 계층에서 사용
    • 데이터 계층의 예외를 스프링 예외로 변환해준다
  • @configuration : 스프링 설정 정보에서 사용

❓ 필터

  • includeFilters : 컴포넌트 스캔 대상을 추가로 지정
  • excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정

❓ 중복 등록과 충돌

자동 빈 등록 vs 자동 빈 등록

  • 컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데, 그 이름이 같은 경우 스프링은 오류를 발생
    • ConflictingBeanDefinitionException 예외 발생

수동 빈 등록 vs 자동 빈 등록

  • 수동 빈 등록이 우선권을 가짐
  • 수동 빈이 자동 빈을 오버라이딩 해버린다

 

강의 출처

김영한의 스프링 로드맵 - 스프링 핵심원리 기본편

 

반응형