1. 컴포넌트 스캔이란?
컴포넌트 스캔(Component Scan)은 스프링이 애플리케이션 클래스 경로에서 특정 어노테이션이 붙은 클래스를 찾아 스프링 빈으로 등록하는 과정이다.
이 과정에서 자동으로 의존성 주입(DI)을 처리하여 개발자가 일일이 빈을 등록하지 않아도 된다.
2. 빈 등록 방식
- 자동 등록:
- @ComponentScan과 함께, 다음 어노테이션으로 클래스를 스프링 빈으로 등록한다.
- @Component
- @Controller
- @Service
- @Repository
- 클래스 경로를 탐색하여 스프링 컨테이너가 빈으로 등록할 수 있는 객체를 자동으로 생성한다.
- @ComponentScan과 함께, 다음 어노테이션으로 클래스를 스프링 빈으로 등록한다.
- 수동 등록:
- @Configuration과 @Bean을 사용하여 명시적으로 빈을 등록한다.
- 주로 외부 라이브러리처럼 개발자가 직접 빈으로 등록해야 하는 경우에 사용된다.
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
3. 스프링의 주요 개념 정리
- 빈(Bean):
- 스프링 컨테이너에서 관리하는 객체를 의미한다.
- 빈은 외부에서 가져다 쓰는 방식으로 사용되며, 재사용성을 높인다.
- 컴포넌트:
- @Component를 통해 지정된 클래스는 빈으로 자동 등록된다.
- @Controller, @Service, @Repository도 @Component의 확장 개념이다.
- 메인 클래스:
- 스프링 애플리케이션의 시작점이다.
- 여기서 자동 설정, 스프링 빈 읽기, 생성이 모두 이루어진다.
4. 싱글톤과 DI 주의점
- 싱글톤으로 관리되면 안 되는 경우:
- 상태를 가지는 객체는 싱글톤으로 관리되면 안 된다.
예를 들어, HTTP 요청마다 새로운 상태를 가져야 하는 경우 Prototype Scope를 사용해야 한다. - 이런 경우, 스프링 컨테이너가 빈을 관리하면 부작용이 발생할 수 있다.
- 상태를 가지는 객체는 싱글톤으로 관리되면 안 된다.
- 의존성 주입(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 |
|---|