[Basic-6] 컴포넌트 스캔과 자동 의존관계 주입

2025. 12. 30. 13:09·Spring/Core

스프링 빈이 수십, 수백 개로 늘어나면 일일이 @Bean을 통해 설정 정보에 등록하는 과정이 번거로워진다. 이는 설정 정보의 비대화와 누락 문제로 이어진다. 스프링은 이러한 문제를 해결하기 위해 설정 정보 없이도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔(Component Scan) 기능을 제공한다.


1. 컴포넌트 스캔과 @Autowired

컴포넌트 스캔을 사용하면 빈 등록뿐만 아니라 의존관계 주입까지 자동화할 수 있다.

1.1. @ComponentScan

설정 클래스에 @ComponentScan 어노테이션을 붙여준다. 기존의 AppConfig와 달리 내부에는 @Bean으로 등록된 클래스가 하나도 존재하지 않는다.

@Configuration
@ComponentScan(
    excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}
  • excludeFilters를 사용하면 스캔 대상에서 제외할 항목을 지정할 수 있다. 예제에서는 기존 수동 설정 정보와의 충돌을 막기 위해 @Configuration이 붙은 클래스를 제외하였다.

1.2. @Component와 @Autowired

 컴포넌트 스캔의 대상이 될 클래스에는 @Component를 붙여준다. 또한, 생성자에 @Autowired를 지정하여 스프링이 자동으로 해당 빈을 찾아 주입하도록 설정한다.

@Component
public class MemberServiceImpl implements MemberService {
    private final MemberRepository memberRepository;

    @Autowired // 의존관계 자동 주입
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

2. 동작 원리

2.1. @ComponentScan의 동작

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

  • 빈 이름 기본 전략: 클래스명을 사용하되, 맨 앞 글자만 소문자로 변경한다.
    • (예: MemberServiceImpl → memberServiceImpl)
  • 빈 이름 직접 지정: @Component("memberService2")와 같이 이름을 직접 부여할 수 있다.

2.2. @Autowired의 동작

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

  • 기본 조회 전략은 타입이 같은 빈을 찾는 것이다. 이는 getBean(MemberRepository.class)와 동일한 방식으로 동작한다고 이해할 수 있다.

3. 탐색 위치와 기본 스캔 대상

3.1. 탐색 위치 지정

모든 자바 클래스를 스캔하면 시간이 오래 걸리므로 시작 위치를 지정할 수 있다.

  • basePackages: 탐색할 패키지의 시작 위치를 지정하며, 하위 패키지를 모두 포함한다.
  • 권장 방법: 패키지 위치를 별도로 지정하지 않고, 설정 정보 클래스를 프로젝트 최상단 루트에 두는 것이다. 최근 스프링 부트도 이 방식을 기본으로 채택하고 있다.

3.2. 컴포넌트 스캔 기본 대상

@Component 외에도 다음 어노테이션들은 컴포넌트 스캔의 대상에 포함되며, 스프링은 각각에 대해 부가 기능을 수행한다.

  • @Controller: 스프링 MVC 컨트롤러로 인식한다.
  • @Service: 특별한 처리는 없으나, 비즈니스 로직이 위치함을 명시하는 역할을 한다.
  • @Repository: 스프링 데이터 접근 계층으로 인식하며, 데이터 계층의 예외를 스프링 예외로 변환해준다.
  • @Configuration: 스프링 설정 정보로 인식하며, 싱글톤 유지를 위한 추가 처리를 수행한다.

4. 중복 등록과 충돌

컴포넌트 스캔에서 같은 빈 이름이 등록될 경우 다음과 같이 처리된다.

  1. 자동 빈 등록 vs 자동 빈 등록: 컴포넌트 스캔에 의해 중복된 이름이 등록되면 ConflictingBeanDefinitionException 예외가 발생한다.
  2. 수동 빈 등록 vs 자동 빈 등록: 과거 스프링에서는 수동 빈 등록이 우선권을 가졌으나(오버라이딩), 이는 잡기 어려운 버그의 원인이 되었다. 따라서 최근 스프링 부트에서는 수동 빈과 자동 빈이 충돌하면 오류가 발생하도록 기본 설정이 변경되었다.

결론: 자동화의 가치

 컴포넌트 스캔을 통해 개발자는 인프라 설정에 대한 부담을 덜고 비즈니스 로직 구현에 더 집중할 수 있게 되었다. 다음 장에서는 자동 주입 시 발생할 수 있는 여러 상황(빈이 2개 이상인 경우 등)에 대한 구체적인 해결 전략을 살펴본다.

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

[Basic-8] 빈 생명주기 콜백과 빈 스코프의 활용  (0) 2025.12.30
[Basic-7] 의존관계 자동 주입의 전략과 빈 충돌 해결  (0) 2025.12.30
[Basic-5] 싱글톤 컨테이너와 CGLIB의 동작 원리  (0) 2025.12.30
[Basic-4] 스프링 컨테이너의 생성과 빈 관리 메커니즘  (0) 2025.12.30
[Basic-3] 관심사의 분리와 의존관계 주입(DI)  (0) 2025.12.30
'Spring/Core' 카테고리의 다른 글
  • [Basic-8] 빈 생명주기 콜백과 빈 스코프의 활용
  • [Basic-7] 의존관계 자동 주입의 전략과 빈 충돌 해결
  • [Basic-5] 싱글톤 컨테이너와 CGLIB의 동작 원리
  • [Basic-4] 스프링 컨테이너의 생성과 빈 관리 메커니즘
h6bro
h6bro
백엔드 개발자의 기술 블로그
  • h6bro
    Jun's Tech Blog
    h6bro
  • 전체
    오늘
    어제
    • 분류 전체보기 (250) N
      • Java (18)
        • Core (9)
        • Design Pattern (9)
      • Spring (80)
        • Core (24)
        • MVC (6)
        • DB (10)
        • JPA (26)
        • Monitoring (3)
        • Security (11)
        • WebSocket (0)
      • Database (33)
        • Redis (15)
        • MySQL (18)
      • MSA (25) N
        • MSA 기본 (11)
        • MSA 아키텍처 (14) N
      • Kafka (30) N
        • Core (18) N
        • Connect (12)
      • ElasticSearch (11)
        • Search (11)
        • Logging (0)
      • Test (4)
        • k6 (4)
      • Docker (9)
      • CI&CD (10)
        • GitHub Actions (6)
        • ArgoCD (4)
      • Kubernetes (18)
        • Core (12)
        • Ops (6)
      • Cloud Engineering (4)
        • AWS Infrastructure (3)
        • AWS EKS (1)
        • Terraform (0)
      • Project (8)
        • LinkFolio (1)
        • Secondhand Market (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Cloud Engineering 포스팅 정리
  • 인기 글

  • 태그

    ㅈ
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
h6bro
[Basic-6] 컴포넌트 스캔과 자동 의존관계 주입
상단으로

티스토리툴바