Spring

@Component란?

자바지기 2022. 11. 13. 17:32
반응형

@Component

Component scan은 스프링이 직접 클래스를 검색해서 빈으로 등록하는 기능이다.

클래스에 @Component를 붙이면 스캔의 대상이된다.

@Component가 제공해주는 기능

다음의 코드들을 통해 학습을 진행해보자.

@Component("zzz")
public class MemberDao implements Dao {
}

MemberDao 상단에 @Component("zzz") 를 작성했다.

 

AppCtx에는 @Component 가 붙은 클래스를 스캔하는 역할의 @ComponentScan을 붙여주었다.

@Configuration
@ComponentScan(basePackages = {"com.example.springtest.spring5_chapter5"})
public class AppCtx {
}

 

위처럼 설정을 진행하고 main 코드를 실행해보았다.

public class Main {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(AppCtx.class);
        MemberDao memberDao = ctx.getBean("zzz", MemberDao.class);

        System.out.println(memberDao);
    }
}

 

MemberDao memberDao = ctx.getBean("zzz", MemberDao.class); 가 정상적으로 실행됨으로 2가지를 확인할 수 있었다.

  1. @Component가 붙은 클래스는 @ComponentScan의 대상이 되고, 빈 등록이 된다.
  2. @Component 애노테이션에 값을 주면 그 값을 Bean의 이름으로 사용한다.

추가적으로 @Component 애노테이션에 값을 주지않으면 클래스 이름의 첫 글자를 소문자로 바꾼 이름을 Bean 이름으로 사용한다.

 

실제 코드에서 “zzz” 라는 이름으로 Bean 등록된 것을 확인해보았다.

 

@ComponentScan이란?

  1. @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 Bean으로 등록한다.
  2. basePackages 는 스캔 대상 패키지 목록을 지정한다.
  3. 스캔에서 제외할 대상을 지정할 수 있다.

AppCtx를 다음처럼 변경해보았다.

@Configuration
@ComponentScan(basePackages = {"com.example.springtest.spring5_chapter5"},
        excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MemberDao.class))
public class AppCtx {
}

excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MemberDao.class))를 추가하여 MemberDao를 scan하지 않도록 변경하였다.

 

다시 Main을 실행하였고, 결과로 다음과 같은 Exception이 발생하였다.

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'zzz' available

스캔에서 제외하기전에는 조회가 되었던 zzz 이름의 Bean이 조회되지 않았다.

excludeFilters 를 추가했기때문에 이런 결과를 얻을 수 있었다.

반응형