이번 시간에는 컴포넌트 스캔과 의존관계 자동주입에 대해서 알아보았다.
지금까지 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 <bean> 을 통해서 설정 정보에 직접 빈을 등록했다.
하지만, 등록해야할 빈 객채가 수백개가 된다면? 굉장히 번거로운 일이 될 것이다.
그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공한다.
또한, 의존관계도 자동으로 주입하는 @Autowired 기능을 제공한다.
컴포넌트 스캔과 의존관계 자동주입에 대해서 알아보기 위해 클래스를 생성한다.
@ComponentScan 은 @Component 애노테이션이 붙은 클래스를 찾아서 스프링 빈으로 등록을 해주는 역할을 한다.
excludeFilters는 ComponentScan을 실행하면서 스프링 빈으로 등록하지 않을 것을 지정해준다.
이미 작성해둔 다른 Configuration 클래스가 있기 때문에, 그 Configuration.class를 빼기 위해서 작성해준다.
보통 실무에서는 스캔대상에서 제외를 잘하지는 않지만, 기존에 작성했던 예제를 살리기 위함~~
스프링 빈으로 등록해서 사용할 클래스들 (리포지토리, 서비스 구현체)을 찾아서 @Component 애노테이션을 추가해준다.
하지만 이렇게 Component를 추가해서 빈으로 등록을 하게 되면, 의존관계는 어떻게 주입을 하는가?
이전의 AppConfig를 보면, @Bean으로 직접 설정 정보를 작성하고,
memberRepository를 직접 명시를 해서 의존관계를 주입할 수 있었다.
이제는 이런 설정 정보 자체가 없기 때문에, 의존관계 주입도 이 클래스 안에서 해결을 해야 한다.
AutoAppConfig에 아무것도 없는 지금은??
방법은 Autowired를 생성자에 추가해서 의존관계를 주입할 수 있다.
위의 예시에서 Autowired를 추가하게 되면, 스프링이 MemberRepository 타입에 맞는 것(MemoryMemberRepository)을
찾아와서 자동으로 의존관계를 주입해준다.
마치 ac.getBean(MemberRepository.class) 와 작동하는 것이 비슷하다고 볼 수 있다.
OrderServiceImpl에도 Autowired를 추가해준다.
이렇게 @Autowired를 사용하면 생성자에서 MemberRepository와 DiscountPolicy 같이,
여러 의존관계도 한번에 주입받을 수 있다.
테스트 코드를 작성하기 위해 클래스를 생성해준다.
AutoAppConfig 타입을 받아와서 ac객체를 생성해서 memberService를 조회하고, memberService를 검증한다.
테스트를 정상적으로 통과했다.
로그를 자세히 보면 ClassPath Scanner가 뜨면서 component 스캔이 정상적으로 작동하면서
클래스 파일 위치를 스캔하는 것을 확인할 수 있다.
그리고 싱글톤 빈이 생성이 된 것을 확인할 수 있다.
또한 어떤 constructor를 통해서 어떻게 Autowired가 되었는지 정보도 확인할 수 있다.
ComponentScan의 작동 원리에 대해서 알아보자.
@ComponentScan이 되어있으면, 스프링 컨테이너가 클래스를 다 뒤져서 @Component가 달린 클래스를 전부 스프링 빈 객체로 등록을 한다.
이때, 스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자를 사용한다.
예를 들면, MemberServiceImpl 클래스는 memberServiceImpl이 된다.
이름을 직접 부여할 수도 있는데 지정하고 싶으면 @Component("memberService2") 이런식으로 하면 된다.
콘솔에 로그를 보면 빈 이름이 memberService2로 만들어 진 것을 볼 수 있다.
하지만 특별한 경우를 제외하고는, 기본값을 쓰기를 권장!
다시 Autowired 의존 관계 자동주입으로 돌아와서!
MemberServiceImpl 생성자에 Autowired를 추가했다.
MemberServiceImpl을 생성하면서 스프링이 컨테이너에 있는 MemberRepository와 같은 타입의 빈 객체를 찾는다.
그래서 자식 타입의 memoryMemberRepository를 찾아서 주입을 해준다.
생성자에 파라미터가 많더라도 자동으로 찾아서 다 주입해준다~!
'개발자 공부 - 인프런 온라인 강의 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
[섹션 7. 의존관계 자동 주입] 다양한 의존관계 주입 방법 (feat. 생성자 주입, 수정자 주입(setter 주입)..) / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.06.11 |
---|---|
[섹션 6. 컴포넌트 스캔] 중복 등록과 충돌 / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.06.06 |
[섹션 6. 컴포넌트 스캔] 필터 / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.05.28 |
[섹션 6. 컴포넌트 스캔] 탐색 위치와 기본 스캔 대상 (+ Component 역할) / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.05.27 |
[섹션 5. 싱글톤 컨테이너] @Configuration과 바이트코드 조작의 마법 / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.05.01 |
[섹션 5. 싱글톤 컨테이너] @Configuration과 싱글톤 / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.04.23 |
[섹션 5. 싱글톤 컨테이너] 싱글톤 방식의 주의점 / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.04.23 |
[섹션 5. 싱글톤 컨테이너] 싱글톤 컨테이너 / 인프런 김영한 스프링 핵심 원리 기본편 (0) | 2023.04.22 |
댓글