Backend/Spring

Component Scan

HJ39 2024. 1. 9. 00:52

의존 관계 자동 주입

  • 설정정보가 없어도 자동으로 스프링 빈을 등록해 준다.
  • @Autowired 기능도 제공해 준다.

 

사용방법

□ Config파일에 @ComponentScan Annotation 붙이기

@Configuration
@ComponentScan
public class AutoAppConfig {

}

 

 

□ 스프링 빈에 등록할 클래스들에 @Component Annotation을 붙인다.

@Component
public class MemoryMemberRepository implements MemberRepository {}

 

@Component
public class RateDiscountPolicy implements DiscountPolicy {}

 

@Component
 public class MemberServiceImpl implements MemberService {
     private final MemberRepository memberRepository;
     
     @Autowired
     public MemberServiceImpl(MemberRepository memberRepository) {
         this.memberRepository = memberRepository;
     }
}

생성자에 @Autowired Annotation을 붙이면 자동으로 객체를 주입시켜 준다.

 

 

작동 순서

@ComponentScan

  • @ComponentScan@Component가 붙은 모든 클래스를 스프링 빈으로 등록한다.

 

@Autowired 의존관계 자동 주입

  • 생성자에 @Autowired를 지정하면 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.

 

탐색 위치와 기본 스캔 대상

모든 자바 클래스들을 스캔하면 너무 오래 걸린다. 따라서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지정할 수 있다.

@ComponentScan(
         basePackages = "hello.core",
}
  • package를 "hello.core"로 시작위치를 정할 수 있다. 해당 패키지 하위 패키지를 모두 탐색한다.
  • 지정하지 않은 경우 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
  • 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것을 권장한다.

 

컴포넌트 스캔 대상

종류 설명
@Component - 컴포넌트 스캔에서 사용
@Controller - 스프링 MVC 컨트롤러에서 사용
@Service - 스프링 비즈니스 로직에서 사용
@Repository - 스프링 데이터 접근 계층에서 사용
- 데이터 계층의 예외를 스프링 예외로 변환
@Configuration - 스프링 설정 정보에서 사용
- 스프링 빈이 싱글톤을 유지하도록 추가 처리

 

 

중복 등록과 충돌

□ 자동 빈 등록 vs 자동 빈 등록

  • 컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데, 이름이 같은 경우 스프링은 오류를 발생시킨다.
    • ConflictingBeanDefinitionException 예외 발생

 

□ 수동 빈 등록 vs 자동 빈 등록

  • 수동 빈 등록이 우선권을 가지고 자동 빈을 오버라이딩 해버린다.
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true`

충돌이 나는 경우 이와 같은 에러를 스프링에서 발생시킨다.

하지만 spring.main.allow-bean-definition-overriding=true 다음과 같이 설정하는 경우 오버라이딩 된다.

 

# 참고한 자료

  • 인프런 김영한 님 강의

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

Singleton Container  (0) 2024.01.09
Container와 Bean  (0) 2024.01.08
객체지향원칙 5가지  (0) 2024.01.04
스프링 핵심 원리 이해 1, 2  (0) 2024.01.04