endsharp / study

1 stars 0 forks source link

[20230101] 컴포넌트 스캔 #10

Open otakijae opened 1 year ago

otakijae commented 1 year ago

Component Scan

탐색 위치와 기본 스캔 대상

Component Scan Filter

LeeeeDain commented 1 year ago

컴포넌트 스캔

@ComponentScan

컴포넌트 스캔 기본 대상

@Autowired

@Autowired vs @Resource

자동 빈 등록 vs 자동 빈 등록 충돌

수동 빈 등록 vs 자동 빈 등록 충돌

jin-ryu commented 1 year ago

컴포넌트 스캔과 의존관계 자동 주입 이해하기

탐색 위치와 기본 스캔 대상

필터

@ComponentScan(
  includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
  excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
)

중복 등록과 충돌

qazyj commented 1 year ago

문제점

해결책

컴포넌트 스캔

@ComponentScan은 이름 그대로 '@Component' 붙은 클래스를 스캔해서 스프링 빈으로 등록

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

@Autowired

스프링에서 의존관계를 자동으로 주입해주는 기능

컴포넌트 스캔을 사용하면 의존관계를 수동으로 주입해줄 수 없기때문에, 컴포넌트 스캔 사용 시 @Autowired는 필수로 사용된다.

컴포넌트 탐색 위치

basePackages, basePackageClasses 모두 디폴트는 @ComponentScan을 설정한 패키지의 모든 하위패키지, 그렇기 때문에 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것이 편리하다. (추가설정 필요 없게)

컴포넌트 스캔 기본 대상

@Component
public @interface Service {

}

컴포넌트 필터

중복 등록과 충돌

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

    'ConflictingBeanDefinitionException' 예외 발생

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

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

2번의 경우 실제 스프링 부트로 실행하면 에러를 발생한다. 별도의 설정을 통해 오버라이딩하는 방식으로 해결할 수 있지만, 이러한 상황을 안만드는 것이 최선.

myeongho2 commented 1 year ago

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

moeun2 commented 1 year ago

컴포넌트 스캔

컴포넌트 스캔과 의존관계 자동 주입 시작하기

@ComponentScan과 @Autowired

탐색 위치와 기본 스캔 대상

탐색 위치 지정 방법

@ComponentScan(
    basePackages = "hello.core",
    basePackagesClasses = "hello.core"
)

컴포넌트 스캔 기본 대상

애노테이션 별 스프링이 지원하는 부가 기능

참고 :

필터

includedFilters / excludeFilters

FilterType 옵션

중복 등록과 충돌

  1. 자동 빈 등록 + 자동 빈 등록 컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데, 그 이름이23333333 같은 경우 스프링은 오류를 발생시킨다(conflictingBeanDefinitionException)
  2. 수동 빈 등록 + 자동 빈 등록 수동 빈 등록과 자동 빈 등록 시, 그 이름이 같은 경우 수동 빈 등록이 우선권을 가진다.(수동 빈이 자동 빈을 오버라이딩 해버린다.)
    • 테스트 코드에서 오류 나지 않는다(우선권을 갖기에)
    • 스프링 부트에서는 오류가 발생하도록 기본 값이 되어 있어 이를 true로 바꿔야지 오류가 해결된다. -> 잡기 어려운 버그가 만들어짐. -> 개발은 항상 명확하게 해야 함!
otakijae commented 1 year ago

스터디 개선방향 #12