컴포넌트 스캔 정리

seungho choi·2022년 5월 31일
0
post-thumbnail

이 글은 인프런 영한님 스프링 핵심 원리 - 기본편을 보고 모르는 내용을 정리한 글 입니다.

컴포넌트 스캔할 기본 패키지 지정

@ComponentScanbasePackapges 를 탐색할 패키지의 시작 위치들을 지정할 수 있다.

basePackageClasses 를 이용하면 지정한 클래스의 패키지를 탐색 시작 위치가 된다.

AutoAppConfig로 지정했으니 hello.corespring 안에 있는 모든 패키지를 탐색해 컴포넌트 스캔을 한다.

만약 지정하지 않으면 @ComponentScan 이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다

영한님이 권장하는 방법은 패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것을 권장하고 스프링 부트에 지정되어 있는@SpringBootApplication 도 내부에 @ComponentScan이 설정되어 있고 프로젝트 시작 루트 위치에 두는 것이 관례라고 한다.

필터

includeFilters 를 사용하면 스캔할 컴포넌트를 지정한다. 위의 코드를 보면 어노테이션의 타입인 MyIncludeComponent 타입의 클래스만 스프링 빈에 등록된다.

반대로 excludeFilters 를 사용하면 MyExcludeComon ent는 스프링 빈에 등록 되지 않는다.

FilterType 의 옵션값은 기본적으로 Annotion 이므로 생략해도 무방하다.

자세한 필터 타입의 옵션들이 있는데 어노테이션 말고는 잘 사용하지 않는다고 하고 중요하다고 판단하지 않아 생략한다.

영한님 왈 최근 스프링 부트는 기본적으로 컴포넌트 스캔을 제공하는데 옵션을 변경하면서 사용하기 보다는 스프링 부트의 기본 설정을 최대한 맞추어 사용하는 것을 권장한다고 하신다.

중복 등록과 충돌

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

컴포넌트 스캔을 이용한 자동 빈 등록은 관례에 따라 등록 하기 때문에 클래스의 이름을 같게 만들거나 따로 컴포넌트의 이름을 똑같이 변경하지 않는 충돌이 일어날이 없는데

만약 수동 빈 등록과 자동 빈 등록에서 빈 이름이 충돌되면 어떻게 될까?

MemoeryMemberRepository 라는 클래스가 @Component 어노테이션이 붙여져 있어서 컴포넌트 스캔 대상이라고 과정 하자

그러면 관례에 따라memoeryMemberRepository 라는 빈이 생성될 것이다.

그런데 수동으로 memoeryMemberRepository 라는 빈도 설정 하면?

이럴 경우 수동 빈 등록이 우선 등록이 된다. 의도적으로 이런 결과를 기대했다면 자동보다 수동이 우선권을 가지고 있는게 좋다. 하지만 이런 결과를 기대하기 보다는 여러 설정이 꼬여서 이런 결과가 만들어지는 경우가 대부분이다.

그래서 최근 스프링 부트 기본 설정에는 수동 빈 과 자동 빈 등록이 출동이 나면

이런 로그와 함께 수동빈을 오버라이딩을 설정을 변경하라는 로그가 뜬다.

0개의 댓글