te___ho
NO RULES
te___ho
전체 방문자
오늘
어제
  • 분류 전체보기 (92)
    • 주니어의 개발일지 (1)
    • My project (29)
      • High Traffic Lab (5)
      • Nanaland in Jeju (8)
      • Univey (3)
      • inflearn_clone? (13)
    • Spring (19)
    • Network & CS (9)
    • Java (1)
    • Front_End (8)
    • Algorithm (11)
    • ETC (6)
    • Scribble (8)

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
te___ho

NO RULES

Spring

[Spring] @ComponentScan & @Autowired (의존관계 자동 주입)

2022. 7. 26. 05:47

@Component,  @ComponentScan

기존에 스프링 컨테이너에 빈을 등록하는 방법은 AppConfig에 @Bean 어노테이션을 작성하는 것이었다. 만약 등록해야 하는 빈이 수백 개라면? 설정 정보를 수백 개 작성해야 한다. 반복 작업은 실수가 생길 수 있고 하기 싫다 일단. 스프링은 오래 사용된 친절한 기술이므로 당연히 다른 방법이 있다. 빈에 등록하고 싶은 클래스에 @Component 어노테이션을 작성해준다. 그 다음 @Configuration을 작성한 클래스에 @ComponentScan을 작성한다. 끝이다. (?) @ComponentScan이 뜻대로 Component들을 scan하여 컨테이너에 빈으로 등록해준다. 빈에 등록할 때 해당 클래스의 이름을 가져와 빈의 이름으로 등록하는데 이때 첫 글자는 소문자로 변환한다. 

@Component
public class OrderServiceImpl inplements OrderService{
 //blah blah code code
}

  위의 경우는 orderServiceImpl로 빈에 등록된다. 따로 이름을 설정하고 싶으면 @Component("Teho")와 같이 작성하면 된다.

(궁금해서 돌려봤는데 이때는 첫글자도 대문자 그대로 Teho로 등록된다.) 

 

 @ComponentScan에도 몇가지 설정 정보가 있다.

@ComponentScan(
		basePackages = "hello.core"
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class),
		includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class)
)
public class AutoAppConfig {
}

  (AutoAppConfig 안에 코드를 하나도 작성하지 않은 게 보인다.... 간편 단순해졌다.) 

 basePackages : ComponentScan을 할 위치를 설정한다. 해당 설정 값의 경로를 시작으로 해당 하위 파일들을 스캔한다. 안 해두면 쓸데없이 모든 java 파일을 스캔하게 된다. default 값이 존재하는데 @ComponentScan이 적힌 클래스의 패키지가 시작 위치이다. 그래서 관례적으로 프로젝트의 최상단에 configuration 파일을 둔다.  (basePackagesClasses는 지정한 클래스의 패키지를 시작 위치로 설정한다.)

 

 excludeFilters, includeFilters : ComponentScan을 제외하거나 예외적으로 포함하는 설정을 할 수 있다.

(자주 안쓸 것 같으니 필요하면 구글링 해서 사용하고 이런 기능이 있다 정도로 알아 둘 거다 나는..)

 어 근데 이러면 의존관계 주입은 어케하지????

 

 @AutoWired

의존 관계 주입을 자동으로 해준다. 생성자 위에 @Autowired를 작성해주면 된다.

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

 스프링 컨테이너가 알아서 MemberRepository, DiscountPolicy 타입의 빈을 찾아서 주입해준다.

(뒤의 강의를 살짝 봤는데 생성자가 하나일 경우 @Autowired를 작성해주지 않아도 스프링이 알아서 해준다.)

 

 @Bean  vs  @Component

 @Bean(수동 등록) @Component(자동 등록)을 모두 사용해서 같은 이름의 빈이 컨테이너에 등록되면 수동 등록이 우선 순위를 인정받아 적용된다. 이 상황이 의도해서 덮어쓴 경우라면 문제가 없지만 그렇지 않을 경우 오류를 찾기 힘들 수 있다. 그래서 스프링 부트에서는 이 경우를 오류로 받아들여 충돌로 인지한다.

 

 

 

https://inf.run/NPt8

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

728x90
반응형
저작자표시 (새창열림)

'Spring' 카테고리의 다른 글

[Spring] @Qualifier, @Primary & 빈 생명주기 콜백  (3) 2022.08.06
[Spring] 의존관계 자동 주입 방법 & 옵션 처리 & LOMBOK(롬복)  (0) 2022.08.01
[Spring] 싱글톤 컨테이너  (1) 2022.07.23
[Spring] 스프링 컨테이너 & 스프링 빈 조회  (4) 2022.07.20
[Spring] AppConfig  (0) 2022.07.16

    티스토리툴바