본문 바로가기
Backend - Java Spring/Spring Core

[SpringCore 핵심원리] 컴포넌트스캔

by VictorMeredith 2024. 2. 17.

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

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

- @ComponentScan 은 @Component가 붙은 애들을 자동으로 빈에 등록한다.

- @Component 애너테이션을 이제 붙여주면 스프링 빈에 자동으로 등록된다.

- 그럼 DI는 어떻게하나 ? 원래는 AppConfig에서 하나씩 의존관계를 주입해주었지만, 이제는 

- 생성자 위에 @Autowired 기능을 이용하면 클래스의 인터페이스에 맞는 의존성을 알아서 주입해준다. (여러 의존관계도 한번에 된당)

이렇게

 

- 알아서 등록하는 스프링 빈의 기본 이름은 클래스명을 사용하면서, 카멜케이스로 변경 (직접 지정도 가능)

- 기본 조회 전략은 타입이 같은 빈을 찾아서 주입한다.

 

2. Component 스캔의 탐색 위치와 대상

- @ComponentScan(여기에) basePackages를 정할 수 있다. (스캔의 대상)

- 스캔대상을 지정하지 않으면 @ComponentScan을 붙인 패키지의 프로젝트를 다 뒤짐

- 그냥 최상단에다가 두셈. 스프링부트도 이렇게 해줌 (부트 쓰면 어차피 쓸일이 없겠다)

 

3. @ComponentScan 의 Filter

- 커스텀 애너테이션을 붙여서 컴포넌트스캔의 대상의 필터를 만들 수 있다.

- 5가지 옵션이 있다.

- excludeFilters 를 간혹 사용할 때가 있다.

 

4. 중복 빈 등록의 충돌

- 빈 이름이 중복된다면 ? 

- 자동 빈 등록 vs 자동 빈 등록 : ConfilctingBeanDefinitionException 예외 발생

- 수동 빈 등록 vs 자동 빈 등록 : 수동 빈이 자동 빈을 Overriding 한다. (log까지 친절하게 해준다.)

- 현실은 여러 설정들이 꼬여서 이런 결과가 만들어지는 경우가 대부분임.

- 잡기 어려운 버그가 만들어진다.

- 그래서 스프링 부트에서는 충돌나면 오류 발생하도록 되어있음.

스프링부트가 기본값으로 오류를 내도록 해줌

- application.properties 에서 Overriding 할 수 있도록 설정을 변경할 수 있다.

 

- 항상 코드를 조금 더 쓰더라도 애매한 추상화보다는 명확한 코드가 좋다는 것을 명심하자.

댓글