이 포스팅은 인프런에 있는 김영한 강사님의 스프링 핵심 원리 강의를 들으며 개인 공부를 한 것입니다.
소스코드는 제가 직접 작성하였습니다. (참고 : 깃허브주소)
✅ 컴포넌트 스캔과 의존관계 자동 주입하기
- 등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다
- 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다
- 기존 코드에 AppConfig 클래스에 설정 정보를 작성 및 의존성 주입을 해주었다
- 의존관계도 자동으로 주입하는 @Autowired 라는 기능도 제공한다
변경된 AppConfig
컴포넌트 스캔
- @ComponentScan을 설정정보에 붙여준다
- 기존의 AppConfig와 다르게 @Bean으로 등록한 클래스가 하나도 없다
- AppConfig에 등록된 빈의 각 클래스가 컴포넌트 스캔의 대상이 되도록 @Component 애노테이션을 붙여줘야한다
- SmsServiceImpl, CustServiceImpl, SmsFilterImpl, MemoryCustRepository, MemorySmsRepository 가 해당된다
- 빈 이름 기본 전략 : SmsServiceImpl 클래스 -> smsServiceImpl
- 빈 이름 직접 지정 : @Component("smsServcie")
변경된 SmsServiceImpl.java
의존관계 자동 주입
- 이전에 AppConfig에서는 @Bean으로 직접 설정 정보를 작성했고, 의존관계도 직접 명시했다. 이제는 이런 설정 정보 자체가 없기 때문에, 의존관계 주입도 클래스 안에서 직접 해결해야 한다.
- 이때 SmsServiceImpl, CustServiceImpl, SmsFilterImpl 생성자가 있는 클래스는 생성자위에 @Autowired 를 추가한다
- 생성자에 @Autowired를 지정하면 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다
- 이때 기본 조회 전략은 타입이 같은 빈을 찾아서 주입한다.
- 생성자에 파라미터가 많아도 다 찾아서 자동으로 주입한다.
✅ 탐색 위치와 기본 스캔 대상
- 모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸린다 그래서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지정할 수 있다
- @ComponentScan(basePackages = "com.jisutudy")
- 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다
- 권장하는 방법 : 패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것이다
- 프로젝트 메인 설정 정보는 프로젝트를 대표하는 정보이기 때문에 프로젝트 시작 루트 위치에 두는것이 좋다
- @SpringBootApplication를 프로젝트 시작 루트 위치에 두는 것이 관례이다
- 이 설정안에 @ComponentScan이 들어있다
✅ 필터
- includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다
- excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정한다
'Spring' 카테고리의 다른 글
| 컨트롤러 메서드에서 매개변수 이름을 명시하지 않아서 발생한 IllegalArgumentException (0) | 2025.01.28 |
|---|---|
| 6. 의존관계 자동주입 (0) | 2025.01.28 |
| 4. 싱글톤 컨테이너 (0) | 2025.01.28 |
| 3. 스프링으로 전환하기 (0) | 2024.11.02 |
| 2. OCP, DIP 위반 해결방법 (0) | 2024.11.02 |