본문 바로가기

전지적라온시점

Spring 의존성 주입(DI)과 컴포넌트 스캔 완벽 가이드 본문

Development/Spring

Spring 의존성 주입(DI)과 컴포넌트 스캔 완벽 가이드

최라온 2025. 5. 14. 16:11
728x90
반응형
SMALL

Spring 의존성 주입(DI)과 컴포넌트 스캔 완벽 가이드

Spring의 핵심 개념 중 하나는 의존성 주입(DI, Dependency Injection)입니다. 객체 간의 결합도를 낮추고 테스트 가능성과 재사용성을 높이기 위해 사용됩니다. 이 글에서는 DI의 개념과 방법, 그리고 자동으로 빈을 등록해주는 컴포넌트 스캔(Component Scan)에 대해 설명합니다.

1. 의존성 주입(DI)이란?

DI는 객체가 직접 의존 객체를 생성하지 않고, 외부에서 전달받는 방식입니다. Spring은 IoC 컨테이너가 의존성을 자동으로 주입해줍니다.

2. DI의 주입 방식

  • 생성자 주입 (권장)
  • 필드 주입 (테스트 불리)
  • Setter 주입 (옵셔널 의존성에 적합)

예: 생성자 주입

@Component
public class OrderService {

    private final ProductRepository productRepository;

    @Autowired
    public OrderService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }
}
  

3. @Autowired

Spring이 의존 객체를 자동으로 주입하도록 지시하는 어노테이션입니다. 생성자, 필드, 메서드에 사용할 수 있습니다.

4. @Component와 컴포넌트 스캔

@Component는 해당 클래스를 스프링 컨테이너가 관리하는 빈(Bean)으로 등록합니다. @ComponentScan이 설정된 패키지 내의 모든 @Component 클래스를 자동으로 등록합니다.

컴포넌트 스캔 어노테이션

  • @Component: 일반 컴포넌트
  • @Service: 서비스 계층
  • @Repository: DAO/DB 계층
  • @Controller: 웹 계층

예: @Component 스캔

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

@SpringBootApplication은 기본적으로 @ComponentScan을 포함하고 있어, 같은 패키지 이하 클래스는 자동 등록됩니다.

5. 수동 빈 등록 vs 자동 빈 등록

  • 자동 등록: @Component 기반
  • 수동 등록: @Configuration + @Bean으로 직접 등록
@Configuration
public class AppConfig {
    @Bean
    public ProductRepository productRepository() {
        return new ProductRepository();
    }
}
  

6. 주의할 점

  • 생성자 주입을 기본으로 사용
  • 필드 주입은 테스트 어려움 → 지양
  • 컴포넌트 스캔은 패키지 위치 중요: 최상단에 선언
  • 빈 중복 시 @Primary 또는 @Qualifier 사용

7. 결론

의존성 주입은 객체 간 결합도를 줄이고 유연한 설계를 가능하게 해줍니다. 스프링의 컴포넌트 스캔과 DI 방식을 잘 이해하면 코드의 생산성과 유지보수성이 크게 향상됩니다.

728x90
반응형
LIST