[인프런] 스프링 핵심원리 기본편-컴포넌트 스캔

경운·2025년 8월 6일
0

스프링 핵심원리

목록 보기
6/7
post-thumbnail

※ 본 게시글은 인프런 스프링 핵심 원리 - 기본편 강의를 바탕으로 작성하였습니다.
강의 내용을 참고하여 개인적으로 정리한 글입니다.


🐣 컴포넌트 스캔과 의존관계 자동 주입

지금까지의 수동 빈 등록

  • @Bean이나 XML을 통해서 직접 스프링 빈을 등록했다
  • 스프링 빈이 수십, 수백개면 하나 하나 등록하기 귀찮고, 반복적으로 해야하기 때문에 누락하는 문제도 발생

컴포넌트 스캔 사용 방법 1(@ComponentScan)

@Configuration //설정 정보
@ComponentScan //이거 붙여주면 됨
public class AutoAppConfig {
}

컴포넌트 스캔 사용 방법 2(@Component)

@Component //애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록
public class MemoryMemberRepository implements MemberRepository {}

@Component
public class RateDiscountPolicy implements DiscountPolicy {}

컴포넌트 스캔 사용 방법 3 - 의존관계 자동 주입(@Component, @Autowired)

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

컴포넌트 스캔과 자동 의존관계 주입 동작 방식
1. @ComponentScan

  • @ComponentScan@Component가 붙은 모든 클래스를 스프링 빈으로 등록
    • 빈 이름 기본 전략 - MemberServiceImplmemberServiceImpl (맨 앞글자만 소문자)
    • 빈 이름 직접 지정 - 하던거 처럼@Component("memberService2") 이런식으로 이름 부여 하면 됨

🐣 탐색 위치와 기본 스캔 대상

탐색할 패키지의 시작 위치 지정

@ComponentScan(
	basePackages = "hello.core",
)
  • basePackages - 탐색할 패키지 위치 지정 / 패키지 포함 하위 패키지 모두 탐색
  • basePackagesClasses - 지정한 클래스의 패키지틑 탐색 시작 위치로 지정
  • 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치
  • 보통 패키지 위치 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것을 추천

스프링 부트의 대표 시작 정보인 @SpringBootApplication를 프로젝트 시작 루트 위치에 두는 것이 관례 / 그 안에 @ComponentScan이 들어 있음

컴포넌트 스캔 기본 대상

  • @Component - 컴포넌트 스캔에서 사용
  • @Controller - 스프링 MVC 컨트롤러에서 사용
  • @Service - 스프링 비즈니스 로직에서 사용, 특별한 처리는 X
  • @Repository - 스프링 데이터 접근 계층에서 사용
  • @Configuration - 스프링 설정 정보로 인식, 스프링 빈이 싱글톤을 유지하도록 해줌

🐣 필터

  • includeFulters → 컴포넌트 스캔 대상을 추가로 지정
  • excludeFulters → 컴포넌트 스캔에서 제외할 대상을 지정

🐣 중복 등록과 충돌

  1. 자동 빈 등록 vs 자동 빈 등록
  • 컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록, 이름이 같으면 스프링은 오류 발생
    • ConflictingbeanDefinitionException 발생
  1. 수동 빈 등록 vs 자동 빈 등록
@Component
public class MemoryMemberRepository implements MemberRepository
@Configuration
@ComponentScan(
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {

    // 수동 빈 등록이 우선권을 가짐
    // 수동 빈이 자동 빈을 오버라이딩
    @Bean(name = "memoryMemberRepository")
    MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

0개의 댓글