본문 바로가기

SPRING/Spring

[스프링| 스프링 핵심 원리 | 기본편 | 컴포넌트 스캔]컴포넌트 스캔과 의존관께 자동 주입 시작하기

@Configuration
// 이 어노테이션은 현재 클래스가 스프링 설정 정보를 제공하는 구성 클래스임을 나타낸다.

@ComponentScan(
    // @ComponentScan 어노테이션은 스프링에게 이 패키지와 하위 패키지에서 @Component 어노테이션이 붙은 모든 클래스를 찾아 스프링 빈으로 등록하도록 지시한다.
    excludeFilters = @ComponentScan.Filter(
        // excludeFilters 속성은 특정 조건에 해당하는 컴포넌트를 스캔 대상에서 제외시키는 필터를 설정한다.
        type = FilterType.ANNOTATION, 
        // FilterType.ANNOTATION은 어노테이션 타입의 필터를 의미하며, 어노테이션이 붙은 클래스를 포함시키거나 제외시키는 기준으로 사용된다.
        classes = Configuration.class
        // classes 속성에 지정된 Configuration.class는 @Configuration 어노테이션이 붙은 설정 클래스를 컴포넌트 스캔 대상에서 제외시키는 역할을 한다.
    )
)
public class AutoAppConfig {

}

@ComponentScan

@ComponentScan 어노테이션은 스프링 프레임워크에서 매우 중요한 역할을 한다. 이 어노테이션은 스프링이 클래스패스에서 @Component가 붙은 클래스들을 찾아 스프링 어플리케이션 컨텍스트에 빈(Bean)으로 등록하도록 지시한다. @Component 어노테이션은 @Repository, @Service, @Controller 등과 같은 다른 스테레오타입 어노테이션을 포함한다.

기능:

  • 자동 스캔: 지정된 패키지 및 그 하위 패키지에서 @Component 어노테이션과 그 파생 어노테이션들을 찾아 빈으로 등록한다.
  • 필터 기능: 필요에 따라 특정 클래스를 스캔 대상에서 포함시키거나 제외시킬 수 있다. 예를 들어, @Configuration 클래스를 스캔 대상에서 제외시키는 것 등이 가능하다.

@Autowired

@Autowired 어노테이션은 스프링의 의존성 주입(Dependency Injection) 기능을 활용하여, 선언된 모든 필드, 생성자, 메소드에 자동으로 해당 타입의 빈을 주입한다. 이는 스프링이 관리하는 빈 간의 의존성을 자동으로 연결해주는 역할을 한다.

기능:

  • 필드 주입: 필드에 직접 @Autowired를 붙여 해당 타입의 빈을 자동으로 주입받을 수 있다.
  • 생성자 주입: 생성자에 @Autowired를 붙이면 생성자의 파라미터에 해당하는 빈을 자동으로 주입받는다. 스프링 4.3 이후로는 생성자가 하나뿐인 경우 @Autowired를 생략할 수 있다.
  • 메소드 주입: 메소드에 @Autowired를 붙여 해당 메소드의 파라미터에 필요한 빈을 주입받을 수 있다.
public class AutoAppConfigTest {
    // AutoAppConfigTest 클래스 정의: 스프링 컨텍스트와 관련된 테스트를 수행하기 위한 클래스

    @Test
    // @Test 어노테이션은 JUnit에서 제공하는 어노테이션으로, 이 메서드가 테스트 메서드임을 나타낸다.

    void basicScan() {
        // basicScan 테스트 메서드 이름: AutoAppConfig 설정을 사용하여 컴포넌트 스캔 기능을 테스트한다.

        ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
        // ApplicationContext 인스턴스 생성: AnnotationConfigApplicationContext는 @Configuration이 붙은 클래스(AutoAppConfig)를 설정 정보로 사용하여 스프링 컨테이너를 초기화한다.

        MemberService memberService = ac.getBean(MemberService.class);
        // MemberService 타입의 빈을 스프링 컨텍스트에서 가져온다. 이는 AutoAppConfig를 통해 자동으로 등록된 빈이어야 한다.

        assertThat(memberService).isInstanceOf(MemberService.class);
        // assertThat과 isInstanceOf를 사용하여 memberService 인스턴스가 MemberService 타입의 인스턴스인지 확인한다. 이는 테스트의 검증 부분으로, 구성이 올바르게 되었는지 확인한다.
    }
}