1. 개념
- 자동화된 빈 등록: 클래스에 어노테이션을 적용하여 Spring 컨테이너에 자동으로 빈(bean)을 등록.
- 어노테이션 기반:
@Component
,@Service
,@Repository
,@Controller
등 어노테이션을 사용하여 자동으로 스프링이 관리하는 객체로 등록.
- 패키지 탐색: 특정 패키지 및 서브패키지에 있는 클래스들을 탐색하여 빈으로 등록.
2. 작동 원리
- 클래스에 어노테이션 적용
@Component
,@Service
,@Repository
,@Controller
등 어노테이션을 클래스에 붙여 해당 클래스가 빈으로 등록되도록 지정.
- 패키지 스캔
@ComponentScan
어노테이션을 사용해 특정 패키지 내 클래스를 스캔하여 빈을 자동으로 등록.
- 스프링 컨테이너 관리
- 스캔된 클래스들은 스프링 컨테이너에 빈(bean)으로 등록되어 의존성 주입(Dependency Injection) 등에 활용.
2. 예시 코드
- 어노테이션 적용
@Service
,@Component
등을 사용하여 클래스에 빈 등록 어노테이션을 붙임.
@Service
public class MyService {
public void execute() {
System.out.println("Service is running...");
}
}
@ComponentScan
사용- 스프링 설정 파일 또는
@Configuration
클래스에서@ComponentScan
을 사용하여 패키지 탐색 범위 지정.
@Configuration
@ComponentScan(basePackages = "com.example.services")
public class AppConfig {
// Spring이 com.example.services 패키지 내 클래스를 스캔하여 빈으로 등록
}
- 자동 빈 등록
@Service
,@Component
어노테이션이 붙은 클래스들은@ComponentScan
에 지정된 패키지 내에서 자동으로 빈으로 등록됨.
3. 주요 어노테이션
@Component
: 일반적인 컴포넌트 클래스에 사용.
@Service
: 서비스 계층 클래스에 사용.
@Repository
: 데이터 접근 계층 클래스에 사용.
@Controller
: 웹 계층 클래스에 사용.
@RestController
: RESTful 웹 서비스에서 사용.
4. 장점
- 자동화: 어노테이션만으로 빈을 등록하므로 코드가 간결하고 설정이 간단.
- 유지보수 용이: 클래스에 어노테이션만 추가하면 Spring이 자동으로 관리하므로 코드 유지보수가 쉬워짐.
- 유연성: 패키지와 클래스를 변경하지 않고 어노테이션을 추가/삭제하는 방식으로 빈 관리가 가능.
5. 단점
- 디버깅 어려움: 자동으로 빈이 등록되기 때문에, 실제로 어떤 빈이 등록되는지 추적이 어려울 수 있음.
- 어노테이션에 의존: 모든 빈을 어노테이션으로 등록해야 하므로, 어노테이션에 의존하게 됨.
6. 컴포넌트 스캔의 예시
1. 기본 설정 예시
@ComponentScan
을 사용하여 패키지 내의 클래스를 자동으로 빈으로 등록하는 예시:
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
// Spring은 com.example 패키지 내의 @Service, @Repository 등 어노테이션을 처리하여 빈으로 등록
}
2. 어노테이션을 이용한 빈 등록
@Service
로 빈을 등록하고, 다른 빈에서 의존성 주입 받는 예시:
@Service
public class MyService {
public String serve() {
return "Service is working!";
}
}
@Component
public class MyController {
@Autowired
private MyService myService;
public void showServiceMessage() {
System.out.println(myService.serve());
}
}
3. 자동 주입 확인
@Autowired
를 통해MyController
에서MyService
빈을 자동으로 주입받는 방식:
@Autowired
private MyService myService;
Share article