[Spring] 컴포넌트 스캔(Component Scan)
Updated:
1. 개요
스프링은 자바 코드나 XML을 통해 빈을 직접 등록하지 않더라도 컴포넌트 스캔을 이용하여 빈을 자동으로 찾아서 등록해준다. 이번에는 컴포넌트 스캔(Component Scan)에 대해 알아보도록 하자.
2. 컴포넌트 스캔
@ComponentScan Annotation을 사용하면 @Component Annotation이 붙은 클래스를 찾아 자동으로 빈으로 등록해준다. 빈 등록 시 맨 앞글자를 소문자로 바꾼 클래스 이름이 빈의 이름이 된다.
[AutoAppConfig.java]
1
2
3
4
5
@Configuration
@ComponentScan
public class AutoAppConfig {
}
[MemoryMemberRepository.java]
1
2
3
4
@Component
public class MemoryMemberRepository implements MemberRepository {
}
Line 1 : @Component Annotation을 추가하여 컴포넌트 스캔의 대상으로 등록
[RateDiscountPolicy.java]
1
2
3
4
@Component
public class RateDiscountPolicy implements DiscountPolicy {
}
Line 1 : @Component Annotation을 추가하여 컴포넌트 스캔의 대상으로 등록
[MemberServiceImpl.java]
1
2
3
4
5
6
7
8
9
10
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
Line 1 : @Component Annotation을 추가하여 컴포넌트 스캔의 대상으로 등록
Line 6 : @Autowired Annotation을 통해 의존관계 주입
[OrderServiceImpl.java]
1
2
3
4
5
6
7
8
9
10
11
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
Line 1 : @Component Annotation을 추가하여 컴포넌트 스캔의 대상으로 등록
Line 7 : @Autowired Annotation을 통해 의존관계 주입
[AutoAppConfigTest.java]
1
2
3
4
5
6
7
8
9
public class AutoAppConfigTest {
@Test
void basicScan() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
MemberService memberService = ac.getBean(MemberService.class);
assertThat(memberService).isInstanceOf(MemberService.class);
}
}
[실행결과]
3. 탐색 위치 지정
1
@ComponentScan(basePackages = "hello.core")
-
basePackages : 컴포넌트 스캔을 수행할 패키지 시작 위치 지정
-
basePackageClasses : 지정한 클래스의 패키지를 탐색 시작 위치로 지정
시작 위치를 지정하지 않으면 @ComponentScan Annotation이 붙은 클래스의 패키지가 시작 위치로 지정
4. 컴포넌트 스캔 대상
@Component Annotation 뿐만 아니라 @Controller, @Service, @Repository, @Configuration도 내부에 @Component를 가지고 있기 때문에 컴포넌트 스캔의 대상이 된다. 이들은 컴포넌트 스캔 외에도 부가 기능을 가지고 있다.
4-1. @Component
@Component Annotation은 기본적으로 컴포넌트 스캔의 대상
4-2. @Controller
@Controller Annotation은 스프링 MVC 컨트롤러에서 사용
4-3. @Repository
@Repository Annotation은 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환
4-4. @Configuration
@Configuration Annotation은 스프링 설정정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 함
4-5. @Service
@Service Annotation은 스프링 비즈니스 로직에 사용하고, 특별한 처리는 하지 않음
Leave a comment