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은 스프링 비즈니스 로직에 사용하고, 특별한 처리는 하지 않음

Updated:

Leave a comment