스프링/스프링 핵심 원리 - 고급편

26. 컨트롤러 인터페이스 및 수동 빈 등록

sdafdq 2024. 1. 19. 11:44

흐름 상 조금 뜬금없기는 하다.

 

@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})

이렇게 하면 여러 개 등록 가능.