Free Lines Arrow
본문 바로가기
Spring/spring 기초 스터디

[Spring] ComponentScan1 - 기초

by skahn1215 2021. 5. 8.
728x90
반응형

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는 특별한 처리를 하지 않는다. 대신 개발자들이 핵심 비즈니스 로직이 여기에
있겠구나 라고 비즈니스 계층을 인식하는데 도움이 된다.

 

 

 

모든 내용과 출처는 스프링 핵심원리 기본편을 공부후 작성했습니다.

 

참고: 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/lecture/55368?mm=close

 

스프링 핵심 원리 - 기본편 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

728x90
반응형

댓글