컴포넌트 스캔
여태까지 배운대로 방법으로는 스프링빈을 등록할때 자바코드의 @Bean이나 XML의 <bean>을 통하여 설정 정보에 직접 등록한 스프링빈을 나열했다.
하지만 이 스프링빈이 수십,수백개가 되면 일일이 등록하는데 번거로워진다.
그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다.
@ComponentScan은 @Component가 붙은 모든 클래스를 스프링빈으로 등록한다.
스프링빈의 기본이름은 클래스명을 사용하되 맨 앞글자만 소문자로 사용
기본 : MemberServiceImpl 클래스 ->memberServiceImpl
빈이름 커스텀시 : @Component("{원하는 Bean이름}")
이전 까지는 AppConfig.class(외부클래스를 통해 의존관계를 주입하는 메소드들을 직접 작성하고 @Bean, @Configuration 등록)를 통해 의존관계를 주입을 해주었지만
@Component어노테이션 사용시 의존관계주입이되는 클래스들을 정의 할수 없어서 @Autowired어노테이션을 통해 의존관계 주입을 해준다.
@Autowried의 의존관계 자동주입
@Component
public class MemberServiceImpl implements MemberService{
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
생성자에 Autowried지정시, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.
기본 조회전략은 타입이 같은 빈을 찾아서 주입한다!(MemberRepository). <- 해당 타입과 동일한 구현체들까지 알아서 주입 됨
탐색 위치와 기본 스캔 대상
@Configuration
//AppConfig.Class를 제외하기 위해 excludeFilters 추가 (Configuration어노테이션 붙은것들은 컴포넌트대상에서 모두 제외)
@ComponentScan(
basePackages="hello.core.member",
excludeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION, classes = Configuration.class))
public class AutoAppConfig {
}
basePackages: 탐색할 패키지의 시작 위치를 지정. (하위까지 모두 탐색한다.) 복수도 가능!
basePackageClass: 지정한 클래스의 패키지를 탐색 시작(상위레벨로 지정)
만약 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
권장방법
패키지 위치 저장하지않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것. 최근 스프링부트도 이 방법을 기본으로 제공한다.
예를들면
com.hello
com.hello.service
com.hello.repository
로 패키지가 구성되어있을시 com.hello -> 프로젝트의 루트가 되는 패키지. 이곳에 AppConfig 같은 메인 설정정보를 두고 @ComponentScan 어노테이션을 붙이고, basePackages지정옵션은 생략하는 것이다.
이렇게 하면 com.hello를 포함한 하위의 패키지들은 모두 자동으로 컴포넌트스캔의 대상이 된다.
참고로 스프링부트를 사용하면 스프링부트의 대표 시작 정보인 @SpringBootApplication을 이 프로젝트 시작 루트 위치에 두는 것이 관례이며 이 설정안에 @ComponentScan이 들어있다
컴포넌트 스캔 기본 대상
컴포넌트스캔은 @Component뿐 아니라 다음의 어노테이션들도 탐색한다. (해당 어노테이션들의 내부를 살펴보면 @Component가 포함되어 있음!!)
@Component: 컴포넌트 스캔에서 사용
@Controller: 스프링 MVC에서 Controller
@Service: 스프링 비즈니스 로직
@Repository: 스프링 데이터 접근 계층에서 사용
@Configuration: 스프링 설정 정보에서 사용
추가적으로 @ComponentScan은 컴포넌트 스캔의 용도 뿐아니라 다음 애노테이션이 있으면 스프링은 부가 기능을 수행한다
@Controller: 스프링 MVC컨트롤러로 인식!
@Repostiroy: 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환해 줌.
@Configuration: 스프링 설정 정보로 인식, 스프링빈이 싱글톤을 유지하도록 추가 처리해 줌.
@Service: 특별한 처리르 하지않는다. 다만 개발자들이 핵심 비즈니스 로직, 비즈니스 계층을 파악하는데 도움.
'BackEnd > 스프링 핵심 원리' 카테고리의 다른 글
[스프링 핵심 원리] - 의존관계 자동주입 (0) | 2024.06.01 |
---|---|
[스프링 핵심 원리] - 컴포넌트스캔 - 중복등록과 충돌 (0) | 2024.06.01 |
[스프링 핵심 원리] - @Configuration (0) | 2024.04.23 |
[스프링 핵심 원리] - 싱글톤 방식의 주의점 (0) | 2024.03.06 |
[스프링 핵심원리] - 스프링 컨테이너 빈 (0) | 2024.02.21 |