티스토리 뷰

Framework/Spring

[Spring] Component Scan

DUCKBAE's 2022. 8. 24. 21:39

Component Scan은 @Component 가 붙은 모든 클래스를 스프링 빈으로 등록해준다.

스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자로 사용한다.

* 빈 이름을 @Component("myComponent") 이런식으로 직접 지정할수가 있다.

 

내 프로젝트 구조는 다음과 같다.

  • com.my
  • com.my.service
  • com.my.repository

 

컴포넌트 스캔 사용하기

1. 빈으로 등록할 클래스 설정

MemberServiceImpl 파일은 com.my.service 패키지에 위치한다.

@Component
public class MemberServiceImpl implements MemberService {

}

 

2. 컴포넌트 스캔 클래스 설정

AppConfig 파일은 com.my 패키지에 위치한다.

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

}

 

3. MemberServiceImpl이 빈으로 등록되었는지 확인

@Test
void scan() {
    ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
    MemberService memberService = ac.getBean(MemberService.class);
    assertThat(memberService).isInstanceOf(MemberService.class);
}
    
//log
00:04:18.985 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'memberServiceImpl'

 

그럼 수동으로 컴포넌트 스캔을 구성하지 않을 때 스프링부트는 어떻게 내가 만든 클래스를 빈으로 등록해주는 걸까?

스프링 부트 프로젝트를 생성할 때 프로젝트 최상단에 아래와 같이 파일이 생성된 걸 볼 수 있다.

* 프로젝트명에 따라 클래스명 접두사가 달라질 수 있다. 내 프로젝트 명은 my로 설정하였기 때문에 MyApplication.java 이다.

@SpringBootApplication
public class MyApplication {

	public static void main(String[] args) {
		SpringApplication.run(MyApplication.class, args);
	}

}

해당 클래스에 @SpringBootApplication 이 설정되어 있다.

 

@SpringBootApplication 파일을 열어보게 되면 아래와 같이 설정되어 있음을 확인할 수 있다.

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}

@ComponetScan 이 설정되어 있으며, 이는 @Component 가 설정되어 있는 클래스를 찾아 전부 빈으로 등록해준다.

* MyApplication은 프로젝트의 최상단에 위치한다. 따라서 해당 위치로부터 시작되는 하위 클래스를 전부 탐색한다.

 

컴포넌트 스캔 기본 대상

  • @Component : 컴포넌트 스캔에서 사용
  • @Controller : 스프링 MVC 컨트롤러에서 사용
  • @Service : 스프링 비즈니스 로직에서 사용
  • @Repository : 스프링 데이터 접근 계층에서 사용
  • @Configuration : 스프링 설정 정보에서 사용
//controller 어노테이션
@Component
public @interface Controller {
}

//sevice 어노테이션
@Component
public @interface Service {
}

//repository 어노테이션
@Component
public @interface Repository {
}

//configuration 어노테이션
@Component
public @interface Configuration {
}

 

 

참고

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

'Framework > Spring' 카테고리의 다른 글

[Spring] HTTP 통신 도구  (0) 2022.10.19
[Spring] 데이터 유효성 검증  (0) 2022.10.04
[Spring] Singleton Container  (0) 2022.08.22
[Spring] Container  (0) 2022.08.17
[JPA] 영속성  (0) 2022.08.09
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함