Home 컴포넌트 스캔과 의존관계 주입
Post
Cancel

컴포넌트 스캔과 의존관계 주입

컴포넌트 스캔(Component Scan)

이번 포스팅에서는 스프링의 컴포넌트 스캔에 대해 알아보려한다. 이전에 우리는 오브젝트 팩토리를 직접 만들고 이를 설정정보로 사용하는 애플리케이션 컨텍스트도 만들어보았다.

그런데 실무에서는 예제와 달리 등록해서 사용해야할 빈이 수십, 수백개가 될 수도 있다. 이럴경우 설정정보가 커지고 누락하는 등의 문제가 발생될 수 있다.

스프링에서는 설정 정보가 없어도 자동으로 스프링 빈을 등록해주는 기능을 제공하는데 이를 컴포넌트 스캔이라 한다. 또한 이렇게 등록된 빈의 의존관계를 자동으로 주입해주는 Autowired라는 기능도 제공한다.

1
2
3
4
@Configuration
@ComponentScan
public class AutoAppConfig {
}
1
2
3
4
5
6
7
8
@Component
public class MemberService {
    private MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

@ComponentScan 어노테이션을 사용하면 @Component를 가진 모든 대상을 가져와 자동으로 빈으로 등록해준다.

컴포넌트 스캔 범위

스캔범위는 @ComponentScan 어노테이션이 있는 파일의 패키지부터 하위 패키지를 탐색한다. 일반적으로는 @ComponentScan을 사용하는 클래스를 프로젝트 최상단에 위치 시킨다.

(basePackages나 basePackageClasses를 지정할 수도 있다.)

1
2
3
4
@Configuration
@ComponentScan(basePackages = "com.xxx.xxx", basePackageClasses = "com.xxx.xxx.AutoAppConfig.class")
public class AutoAppConfig {
}

(SpringBoot 사용 시 @SpringBootApplication 어노테이션에 @ComponentScan이 포함되어 있다.)

의존관계 주입

컴포넌트 스캔을 통해 자동으로 빈을 등록해 보았다. 이제 이전처럼 빈팩토리를 수동으로 만들지 않아도 스프링이 자동으로 빈을 등록하고 관리해준다.

그런데 기존에 수동으로 빈 팩토리를 만들때는 이름이나 타입정보를 알고 있기 때문에 getBean()을 통해 빈을 가져올 수 있었다. 하지만 지금은 AutoAppConfig에 어떠한 정보도 작성되지 않았기 때문에 빈을 가져오기 위한 이름이나 타입정보를 확인할 수 없다.

이 경우에 사용하는 것이 @Autowired이다. 이 어노테이션이 붙어 있으면 스프링이 자동으로 빈을 주입해준다.

1
2
3
4
5
6
7
8
9
@Component
public class MemberService {
    private MemberRepository memberRepository;

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

위의 코드처럼 @Autowired를 붙이면 MemberRepository 타입을 확인하고 스프링이 자동으로 빈을 주입해준다.

참고

This post is licensed under CC BY 4.0 by the author.

싱글톤 레지스트리

다양한 의존관계 주입

Comments powered by Disqus.