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();
    }

}