예제 프로젝트 V1

다양한 상황에서 프록시 사용법을 익히기 위해 3가지 상황으로 예제를 만들것임.

  1. 인터페이스 + 구현 클래스 + 빈 수동 등록
  2. 구현클래스 + 빈 수동 등록
  3. 컴포넌트 스캔으로 스프링 빈 자동 등록

v1 인터페이스 + 구현클래스

컨트롤러까지 인터페이스로 만들어서 저번처럼 예제를 만들었음.

여기서 하나 짤막상식. 스프링에서는 @Controller 말고도 @ReqeustMapping 애너테이션으로도 스프링 컨트롤러로 인식할 수 있다. 그리고 이 애너테이션들은 인터페이스에 달아줘도 된다.

RequestMapping
@ResponseBody
public interface OrderControllerV1 {

    @GetMapping("/v1/request")
    String request(@RequestParam("itemId") String itemId);

    @GetMapping("/v1/no-log")
    String noLog();
}

빈으로 수동등록하자.

@Configuration
public class AppV1Config {

    @Bean
    public OrderControllerV1 orderControllerV1(){
        return new OrderControllerV1Impl(orderServiceV1());
    }

    @Bean
    public OrderServiceV1 orderServiceV1() {
        return new OrderServiceImpl(orderRepositoryV1());
    }

    @Bean
    public OrderRepositoryV1 orderRepositoryV1(){
        return new OrderRepositoryV1Impl();
    }
}

그리고 configuration을 임포트해서 사용한다.

@Import(AppV1Config.class)
@SpringBootApplication(scanBasePackages = "hello.proxy.app") //주의
public class ProxyApplication {

	public static void main(String[] args) {
		SpringApplication.run(ProxyApplication.class, args);
	}

}

이렇게 @Import() 하고 실행하면 컨피그가 적용된다.

@Import는 사실 별건 아니고 그냥 스프링 비능로 등록하는 애너테이션이다. 보통 위처럼 설정 파일을 등록할 때 사용함. 하지만 설정파일아니어도 그냥 스프링 빈으로 등록할때도 사용 가능.

그냥 @Configuration해도 빈으로 등록되는데 굳이 @Import 한이유는 아래의 이유때문에 config가 컴포넌트 스캔이 되지 않았기 때문임.