흐름 상 조금 뜬금없기는 하다.
@RequestMapping
@ResponseBody
public interface OrderControllerV1 {
@GetMapping("/v1/request")
String request(@RequestParam("itemId") String itemId);
@GetMapping("/v1/no-log")
String noLog();
}
이게 인터페이스다.
보면 에노테이션까지 들어간다.
들어가야 한다고 한다.
컨트롤러는 @Controller 또는 @RequestMapping 둘 중 하나만 있으면 컨트롤러로 인식 한다.
단, @RequestMapping은 @Component가 안 붙어있어서 컴포넌트 스캔 대상이 아님.
보면 @GetMapping, @RequestParam 등 컨트롤러에 필요한 에노테이션은 들어가는 느낌이다.
근데 사실 컨트롤러를 인터페이스로 쓰는 경우는 없다.
다음 설정이다.
Service는 그냥 repository 호출, Repository는 그냥 1초 있다가 return 하는, 간단한 구조이다.
@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();
}
}
수동 설정 클래스 이고,
@Import(AppV1Config.class)
@SpringBootApplication(scanBasePackages = "hello.proxy.app") //주의
public class ProxyApplication {
public static void main(String[] args) {
SpringApplication.run(ProxyApplication.class, args);
}
}
이렇게 @Import로 설정 클래스를 등록할 수 있다.
위 처럼 그냥 빈 등록용 클래스로 만든거나, 아니면 실제 default 말고 따로 커스텀해서 설정한 걸 등록할 수 있다.
참고로 근데, @Configuration도 컴포넌트 스캔 대상이다.
그래서 보면
저거는 바꿔가면서 끼울려고
app 내부만 컴포넌트 스캔 대상으로 해 놨다.
@Import({AppV1Config.class, AppV2Config.class})
이렇게 하면 여러 개 등록 가능.
'스프링 > 스프링 핵심 원리 - 고급편' 카테고리의 다른 글
28. 프록시 패턴과 데코레이션 패턴 (0) | 2024.01.19 |
---|---|
27. 프록시, 데코레이션 패턴 예제 틀 및 요구사항 (0) | 2024.01.19 |
25. 템플릿 콜백 패턴 적용 (0) | 2024.01.17 |
24. 템플릿 콜백 패턴 (0) | 2024.01.17 |
23. 전략 패턴 인자로 받기 (0) | 2024.01.17 |