CS 잡지식
스프링 Bean의 등록 방법
JIN_YOUNG _KIM
2023. 2. 22. 21:35
1. 스프링 빈으로 등록할 클래스가 인터페이스의 구현체 인 경우
-> 구현체 [클래스]에 @Controller, @Service, @Repository 등의 애노테이션을 붙여서 [자동]으로 빈 등록
-> or @Configuration 애노테이션을 이용하여 [수동]으로 빈 등록
2. 스프링 빈으로 등록할 클래스가 인터페이스의 구현체가 아닌 경우
-> 1과 같은 방법으로 수동/자동으로 등록!
3. 인터페이스의 존재 유무와 상관없이, @component 스캔으로 자동 등록
-> @Compoenent, @Controller, @Service, @Repository 등을 이용하여 [자동] 등록 시, 주의 사항이 있다.
( scanBasePackeg 옵션과 Import 애노테이션을 사용하여, 수동 등록과 자동 등록을 혼합하여 사용도 가능!)
예를 들어, 아래와 같이 컨트롤러의 [인터페이스]를 만들어, 그 구현체를 빈으로 등록을 하는 경우를 살펴 보자!!
@RequestMapping // 스프링은 @Controller or @RequestMapping 둘 중 하나가 있어야만 컨트롤러로 인식!
// 참고로, @RequestMapping을 이용해서 [자동]으로 빈 등록은 불가!
// @RequestMapping 안에는 @Component가 없다.
// 단, 수동으로 등록시에는 문제x.
@ResponseBody
// 인터페이스임에 주의!!!
public interface OrderControllerV1 {
@GetMapping("/v1/request")
String request(@RequestParam("itemId") String itemId);
@GetMapping("/v1/no-log")
String noLog();
}
// Controller 인터페이스의 구현체(or 클래스)
public class OrderServiceV1Impl implements OrderServiceV1{
private final OrderRepositoryV1 repository;
public OrderServiceV1Impl(OrderRepositoryV1 repository) {
this.repository = repository;
}
@Override
public void orderItem(String itemId) {
repository.save(itemId);
}
}
@Configuration
public class AppV1Config {
// Controller를 [수동]으로 등록시키지 않음.
// Controller로 [인터페이스]에 @RequestMapping이 있으므로, [자동]으로 빈 등록이 될 것이로
// 기대가 된다.
// 하지만, 결과적으로 Controller는 인식되지 않아, 빈 등록이 되지 않는다.
@Bean
public OrderServiceV1 orderServiceV1(){
return new OrderServiceV1Impl(orderRepositoryV1());
}
@Bean
public OrderRepositoryV1 orderRepositoryV1() {
return new OrderRepositoryV1Impl();
}
}
스프링은 [클래스 or 객체]에 붙어 있는@Component, @Controller, @Service, @Repository 등의
애노테이션을 보고 Bean으로 컨테이너에 [자동] 등록을 한다.
컨트롤러 [인터페이스]에 @RequestMapping 애노테이션이 있다고 해도 스프링이 [자동]으로 빈 등록을
해 주지 않는다.
고로, @Configuaration 애노테이션을 이용하여, 컨트롤러도 [수동]으로 빈 등록을 해줘야 한다.
@Configuration
public class AppV1Config {
// 컨트롤러 객체를 [수동]으로 등록을 함!
@Bean
public OrderControllerV1 orderControllerV1(){
return new OrderControllerV1Impl(orderServiceV1());
}
@Bean
public OrderServiceV1 orderServiceV1(){
return new OrderServiceV1Impl(orderRepositoryV1());
}
@Bean
public OrderRepositoryV1 orderRepositoryV1() {
return new OrderRepositoryV1Impl();
}
}