ComponentScan 를 왜 사용할까?
이번 주제는 Component 와 의존성 주입이다.
자동 주입이라고 생각하면 편할것 같다.
@ComponentScan
AutoAppConfig 클래스를 만들었다.
package hello.core;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
// 설정 어노테이션지정
@Configuration
// 자동으로 스캔하여 bean에 등록
// filter를 이용하여 제외 가능
// 해당 필터는 이전에 만들어둔 AppConfig에 있는 Configration을 제외시킨다.
// 그렇지 않으면 충돌 발생함
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}
@ComponentScan 붙여주었다
코드를 보면 Bean을 등록해주는 부분이 따로 없다.
Scan이라는 단어를 잘 보자.
클래스들을 Scan해서 @Component로 지정한 클래스를 알아서 등록해준다.
또한 위처럼 Filter를 걸어서 원하는 부분을 제외 시킬수도 있다.
클래스에서 사용방법
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
@Autowired
위의 예제에서 @Component를 붙였다 그럼 해당 클래스를 빈에 등록을 하게 된다.
그렇다면 의존성 주입은 어떻게 해줄까?
@Autowired로 해주면 된다. 간편하다.
등록된 Bean이름
Component를 이용할때는
빈이름을 잘 봐야한다.
등록될때 는 클래스의 이름을 쓰지만 앞글자는 소문자로 한다.
직접 이름을 등록해줄때는 아래와 같이 적어주어야한다.
@Component("memberService2")
Test
package hello.core.scan;
import hello.core.AutoAppConfig;
import hello.core.member.MemberService;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class AutoAppConfigTest {
@Test
void basicScan() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
MemberService memberService = ac.getBean(MemberService.class);
Assertions.assertThat(memberService).isInstanceOf(MemberService.class);
}
}
ComponentScan의 탐색위치
ComponentScan에는 다음과 같은 설정을 지정해줄수있다.
@ComponentScan(
basePackages = "hello.core",
}
그렇게 되면 hello.core 위치를 시작으로 하위 까지 스캔한다.
지정하지 않으면?
지정하지 않게 되면 deafult 값으로 현재 자신의 패키지를 시작으로 스캔을 한다.
ComponentScan의 대상
ComponentScan은 어떤 걸 scan 할까?
다음과 같은 어노테이션을 스캔을 한다
- @Component: 컴포넌트 스캔에서 사용
- @Controlller: 스프링 MVC 컨트롤러에서 사용
- @Service: 스프링 비즈니스 로직에서 사용
- @Repository: 스프링 데이터 접근 계층에서 사용
- @Configuration: 스프링 설정 정보에서 사용
ComponentScan의 부가기능
컴포넌트 스캔의 용도 뿐만 아니라 다음 애노테이션이 있으면 스프링은 부가 기능을 수행한다.
@Controller: 스프링 MVC 컨트롤러로 인식
@Repository: 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환해준다.
@Configuration: 앞서 보았듯이 스프링 설정 정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 추가 처
리를 한다.
@Service: 사실 @Service는 특별한 처리를 하지 않는다. 대신 개발자들이 핵심 비즈니스 로직이 여기에
있겠구나 라고 비즈니스 계층을 인식하는데 도움이 된다.
모든 내용과 출처는 스프링 핵심원리 기본편을 공부후 작성했습니다.
'Spring > spring 기초 스터디' 카테고리의 다른 글
[Spring] 의존성 주입방법 1 (0) | 2021.05.15 |
---|---|
[Spring] ComponentScan2 - Annotation만들기 (0) | 2021.05.08 |
[Spring] Configuration과 Singleton (0) | 2021.05.05 |
[Spring] 웹 애플리케이션과 싱글톤2 (0) | 2021.05.05 |
[Spring] 웹 애플리케이션과 싱글톤1 (0) | 2021.05.05 |
댓글