ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 컴포넌트 스캔
    스프링/스프링 기본이론 2023. 1. 30. 22:58

    컴포넌트 스캔이란 빈을 따로 등록하지 않아도 @Component라는 어노테이션이 붙은 객체들을 스프링 컨테이너가 관리해주는 기능이다.

    @Configuration
    @ComponentScan(
            excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
    )
    public class AutoAppConfig {
    }

    classes = Configuration.class는 AppConfig를 빼주는 용도이다. 보통 설정 정보를 컴포넌트 스캔 대상에서 제외하지 않지만 기존 예제 코드를 유지하기 위해서 이 클래스에서 제외하는 것을 했다.

    코드를 보면 알겠지만 @Bean으로 따로 빈을 등록해주지 않았다.

     

     

     

    - 참고로 스프링 부트의 대표 시작 정보인 @SpringBootApplication안에 @ComponentScan이 들어있다. 스프링부트를 사용할 때에는 @ComponentScan을 따로 해줄 필요가 없다.

     

    @Component도 따로 해줄 필요가 없는데, 왜냐면 @Controller, @Service, @Repository, @Configuration에 이미 들어가 있기 때문이다. @Autowired도 @RequiredArgsConstrucotr라는 롬복에서 지원하는 어노테이션으로 자동 주입이 가능하긴 하다. 그래도 사용하는 기능의 원리는 이해해야하기 때문에 공부는 꼭 필요하다.

     

     

     

    @Component

    @Component
    public class MemoryMemberRepository implements MemberRepository{
        ....
    }
    
    
    @Component
    public class MemberServiceImpl implements MemberService {
        ....
    }
    
    
    @Component
    public class RateDiscountPolicy implements DiscountPolicy {
        ....
    }

    사용하는 구현체들의 선언부에 @Component라는 어노테이션을 붙인다. 하지만 이러한 방식은 스프링 빈에 등록해줄뿐, 의존관계 주입은 해주지 않는다.

     

     

     

    @Autowired

    @Component
    public class MemberServiceImpl implements MemberService {
    
        @Autowired
        public MemberServiceImpl(MemberRepository memberRepository) {
            this.memberRepository = memberRepository;
        }
        ....
    }

    생성자에 @Autowired라는 어노테이션을 넣으면 해당하는 memberRepository의 구현체를 자동으로 의존관계 주입시켜준다.

     

    @Component
    public class OrderServiceImpl implements OrderService{
    
        @Autowired
        public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
            this.memberRepository = memberRepository;
            this.discountPolicy = discountPolicy;
        }
        ....
    }

    OrderServiceImpl에도 @Autowired를 통해서 자동으로 의존관계 주입을 해준다.

Designed by Tistory.