컴포넌트 스캔 방식으로 의존 관계 주입하기

woply·2022년 1월 19일
0

TIL(Today I Learn)

목록 보기
18/31

📖 ✏️

  1. TIL 시리즈에 작성된 글은 '매일 매일 학습한 지식 조각을 메모해 놓은 포스팅'입니다. 공유가 아닌 개인적인 학습 내용 기록을 목적으로 작성되었음을 알려드립니다.
  2. 그 외 시리즈에 작성된 공유 목적의 포스팅은 시간이 날 때마다 별도로 작성하고 있습니다. 주로, TIL 시리즈에 작성된 내용에서 특정 주제를 선정하고, 더 깊이 공부한 후 정리하여 작성합니다.

컴포넌트 스캔 방식으로 의존 관계 자동 주입하기

스프링 Bean을 등록하는 방법은 크게 @Bean을 이용하는 방식, XML의 을 이용하는 방식 그리고 컴포넌트 스캔 방식이 있다. 등록해야 할 스프링 빈이 수백개에 이르면 하나하나 수작업으로 등록하는 것이 여간 번거로운 작업이 아닐 수 없다. 누락의 문제도 발생한다.

컴포넌트 스캔 방식은 별도의 설정 정보가 없어도 자동으로 스프링 Bean을 등록할 수 있다. 의존 관계를 자동으로 주입하는 @Autowired 기능도 제공하기 때문에 보다 편리하게 스프링 Bean을 관리할 수 있다.

1. 컴포넌트 스캔 사용 방법

컴포넌트 스캔 방식은 @ComponentScan을 사용한다. 컴포넌트 스캔을 사용하려면 먼저 @ComponentScan 을 설정 정보에 붙여줘야 한다. 컴포넌트 스캔은 이름 그대로 @Component 애노테이션이 붙은 클래스를 스캔하여 스프링 Bean으로 등록한다. Bean 등록을 희망하는 클래스에 @Component를 붙여주면 된다.

의존 관계 주입은 @Autowired를 사용한다. Bean으로 등록하는 클래스의 생성자에 @Autowired를 붙여주면, 스프링 컨테이너가 파라미터 타입에 해당하는 구현체를 등록된 Bean에서 찾는다. 그리고 의존 관계 주입이 자동으로 이루어진다.

컴포넌트 스캔 방식을 적용한 예시 코드

  • MemoryMemberRepository @Component 추가
@Component 
public class MemoryMemberRepository implements MemberRepository {}
  • RateDiscountPolicy @Component 추가
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
  • MemberServiceImpl @Component, @Autowired 추가
@Component
public class MemberServiceImpl implements MemberService{
    private final MemberRepository memberRepository;
    @Autowired // 마치 ac.getBean(MemberRepository.class)와 같이 해당 타입으로 조회되는 Bean을 찾아서 등록한다.
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

아래와 같이 컴포넌트 스캔 방식의 설정 정보 파일(AutoAppConfig.class)을 통해 스프링 컨테이너를 생성하는 테스트를 진행해 보면, 로그에서 싱글톤 Bean 등록에 대한 내용과 @Autowired를 이용하여 의존 관계 주입이 완료되었다는 내용을 확인할 수 있다.

public class AutoAppConfigTest {

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

        MemberService memberService = ac.getBean(MemberService.class);
        assertThat(memberService).isInstanceOf(MemberService.class);
    }
}

로그를 살펴보면 컴포넌트 스캔이 잘 동작하는 것을 확인할 수 있다.


2. 컴포넌트 스캔 방식의 동작 원리

컴포넌트 스캔과 자동 의존관계 주입이 어떻게 동작하는지 그림으로 알아보자.

2-1. @ComponentScan

@ComponentScan@Component가 붙은 모든 클래스를 스프링 Bean으로 등록한다. 이때, 스프링 Bean의 기본 이름은 클래스명을 사용한다. 단, 맨 앞글자만 소문자를 사용한다. 만약 스프링 Bean의 이름을 직접 지정하고 싶다면 @Component("사용할 이름")와 같이 지정할 수 있다.

2-2. @Autowired 의존 관계 자동 주입

생성자에 @Autowired를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 Bean을 찾아서 주입한ek. 이때, 기본 조회 전략은 타입이 같은 빈을 찾는 방식을 사용한다. getBean(클래스이름.class)와 동일한 방식이라고 볼 수 있다.

생성자에 파라미터가 많아도 문제 없이 찾아서 자동으로 주입을 도와준다.


요약

  • 컴포넌트 스캔 방식은 @ComponentScan@Component가 붙은 모든 클래스를 스프링 Bean으로 등록한다.
  • 의존 관계 주입은 @Autowired를 이용한다. 생성자에 @Autowired를 붙이면 파라미터에 해당하는 타입을 스프링 Bean에서 찾아서 등록한다.
  • 컴포넌트 스캔 방식으로 Bean에 등록될 때는 기본적으로 메서드 이름이 사용된다. 단, 맨 앞글자만 소문자로 변경하여 이름을 저장한다. 만약 이름을 변경하고 싶다면 @Component("원하는 이름")을 이용하여 별도 지정할 수 있다.
profile
7년간 마케터로 일했고, 현재는 헤렌에서 백엔드 개발자로 일하고 있습니다. 고객 가치를 설계하는 개발자를 지향하며, 개발, 독서, 글쓰기를 좋아합니다. 업이 심오한 놀이이길 바라는 덕업일치 주의자입니다.

0개의 댓글