본문 바로가기

spring/DI

컴포넌트 스캔과 의존성 자동 주입

1. 컴포넌트 스캔이란?

컴포넌트 스캔(Component Scan)은 스프링이 애플리케이션 클래스 경로에서 특정 어노테이션이 붙은 클래스를 찾아 스프링 빈으로 등록하는 과정이다.
이 과정에서 자동으로 의존성 주입(DI)을 처리하여 개발자가 일일이 빈을 등록하지 않아도 된다.

 

2. 빈 등록 방식

  1. 자동 등록:
    • @ComponentScan과 함께, 다음 어노테이션으로 클래스를 스프링 빈으로 등록한다.
      • @Component
      • @Controller
      • @Service
      • @Repository
    • 클래스 경로를 탐색하여 스프링 컨테이너가 빈으로 등록할 수 있는 객체를 자동으로 생성한다.
  2. 수동 등록:
    • @Configuration과 @Bean을 사용하여 명시적으로 빈을 등록한다.
    • 주로 외부 라이브러리처럼 개발자가 직접 빈으로 등록해야 하는 경우에 사용된다.
@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

 

 

3. 스프링의 주요 개념 정리

  1. 빈(Bean):
    • 스프링 컨테이너에서 관리하는 객체를 의미한다.
    • 빈은 외부에서 가져다 쓰는 방식으로 사용되며, 재사용성을 높인다.
  2. 컴포넌트:
    • @Component를 통해 지정된 클래스는 빈으로 자동 등록된다.
    • @Controller, @Service, @Repository도 @Component의 확장 개념이다.
  3. 메인 클래스:
    • 스프링 애플리케이션의 시작점이다.
    • 여기서 자동 설정, 스프링 빈 읽기, 생성이 모두 이루어진다.

 

4. 싱글톤과 DI 주의점

  1. 싱글톤으로 관리되면 안 되는 경우:
    • 상태를 가지는 객체는 싱글톤으로 관리되면 안 된다.
      예를 들어, HTTP 요청마다 새로운 상태를 가져야 하는 경우 Prototype Scope를 사용해야 한다.
    • 이런 경우, 스프링 컨테이너가 빈을 관리하면 부작용이 발생할 수 있다.
  2. 의존성 주입(DI):
    • 스프링 컨테이너는 생성된 빈 간의 의존 관계를 자동으로 연결한다.
    • 주로 @Autowired, 생성자 주입, 또는 메서드 주입 방식을 사용한다.

 

5. 어노테이션을 사용하는 이유

  • 코드 가독성 향상:
    어노테이션을 사용하면 코드가 더 간결하고 직관적이 된다.
    예를 들어, @Service를 붙이면 해당 클래스가 서비스 계층임을 쉽게 알 수 있다.
  • 다른 곳에서 재사용:
    특정 동작을 공통적으로 처리하려면 어노테이션으로 설정을 묶어 재사용성을 높인다.
    예: @ControllerAdvice로 전역 에러 처리를 설정.

 

6. 예제 코드

자동 등록 방식

@Component
public class MyService {
    public String getServiceName() {
        return "MyService";
    }
}

수동 등록 방식

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyService();
    }
}

의존성 주입

@Service
public class MyController {
    private final MyService myService;

    @Autowired
    public MyController(MyService myService) {
        this.myService = myService;
    }

    public void execute() {
        System.out.println(myService.getServiceName());
    }
}

정리

  • 스프링은 컴포넌트 스캔DI를 통해 객체 생성 및 관리의 복잡성을 줄이고 코드의 재사용성을 높인다.
  • 자동 등록과 수동 등록은 각각의 용도에 따라 선택하여 사용한다.
  • 어노테이션은 개발 편의성과 유지보수를 위해 필수적인 요소이다.
    스프링의 핵심은 이러한 구조를 활용해 코드를 간결하고 효율적으로 작성하는 데 있다.

'spring > DI' 카테고리의 다른 글

@Autowired  (0) 2024.06.10