Published 2022. 1. 14. 08:30
반응형

@ComponentScan이란


  • @Component가 붙은 클래스를 모두 빈으로 등록하도록 해주는 어노테이션이다.
  • @Autowired가 붙은 Target에 자동으로 등록된 빈을 타입으로 조회하여 의존 관계 주입을 해주는 어노테이션이다.

먼저 수동으로 빈을 등록하는 방법을 간단히 알고 넘어가자.


아래와 같이 AppConfig라는 클래스에 @Configuration을 붙이고 @Bean을 사용해서 하나하나 모두
설정을 해주고 new AnnotationConfigApplicationContext(AppConfig.class)로 스프링 빈으로 등록을 하게 된다.

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    @Bean
    public DiscountPolicy discountPolicy() {
//        return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }
}

// 아래는 스프링 컨테이너에 등록된 객체를 사용하는 코드이다.
public class MemberApp {

    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = ac.getBean("memberService", MemberService.class);

        Member member = new Member(1L, "memberA", Grade.VIP);
        memberService.join(member);

        Member findMember = memberService.findMember(1L);
        System.out.println("member = " + member.getName());
        System.out.println("findMember = " + findMember.getName());
    }
}

하지만 이렇게 하는 것은 불편한 요소가 있다.

  • 빈 설정용 클래스 관리를 해야 한다.
  • 그렇게 때문에 빼 먹을 수 있다.
  • 의존 관계 주입도 직접 해주어야 한다.

그래서 스프링에는 @Conmponet와 @ComponentScan이 있다.

@ComponentScan 사용 하도록 변경 해보자.


  • @ComponentScan을 사용하면 위와 같은 과정을 생략할 수 있게 된다.
  • @ComponentScan은 @Component가 붙은 클래스를 모두 스프링 빈으로 등록을 해준다.
    즉, AppConfig에서 @Bean을 등록하는 행위를 해줄 필요가 없는 것이다.
  • @Configuration에도 내부적으로 @Component가 있다.

아래와 같이 AppConfig대신 자동 등록을 해주는 용도로 AutoAppConfig를 만들었다.

@Configuration
@ComponentScan
public class AutoAppConfig {
}

AppConfig에서 등록하기 위해 했던 @Bean을 직접 해당 클래스에 @Component를 붙인다.
AppConfig에서 의존관계 주입을 직접 해주었는데 @ComponentScan을 사용하면 @Autowired를 사용하면
자동으로 등록된 빈에서 타입으로 조회를 하여 자동 주입을 해준다.

@Component
public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository;

    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

테스트 해보기

class AutoAppConfigTest {

    @Test
    void basicScan() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);

        MemberService memberService = ac.getBean(MemberService.class);
        assertThat(memberService).isInstanceOf(MemberService.class);
    }
}
반응형
복사했습니다!