V2 ConcreteProxyController 빈 중복 에러 (SpringBoot V3)
안녕하세요, 답변 감사드립니다. 하지만 뭔가 명확한 답변을 못받아 다시 질문 드립니다.. 일단 제가 생각한 빈이 중복된 이유는 다음과 같습니다.@RestController가 붙어있는 클래스가 먼저 빈으로 등록@Configuration 내부에 @Bean으로 등록하려는 빈이 이미 1번에서 등록이 되어 중복 등록에 대한 오류가 생긴 것 입니다.스프링부트 버전 3 이상에서는 인터페이스에 @RestController를 붙여줘야만 컨트롤러로 인식하여 구현체가 구현했을 때 엔드포인트 매핑이 된다는 것입니다.현재 강의에서는 인터페이스 기반 프록시를 구현중이라 어쩔수 없이 컨트롤러 코드에 @RestController를 붙여야 하는 상황인데.. @RestController를 제거하면 URLMapping이 정상적으로 이루어지지 않습니다.. 이럴 때에는 어떻게 하면 좋을지 궁금합니다. 아래 코드 첨부드립니다.@RequiredArgsConstructor @RestController public class OrderControllerV2 { private final OrderServiceV2 orderService; @GetMapping("/v2/request") public String request(String itemId) { orderService.orderItem(itemId); return "ok"; } @GetMapping("/v2/no-log") public String nolog() { return "ok"; } }public class OrderControllerConcreteProxy extends OrderControllerV2 { private final OrderControllerV2 target; private final LogTrace logTrace; public OrderControllerConcreteProxy(OrderControllerV2 target, LogTrace logTrace) { super(null); this.target = target; this.logTrace = logTrace; } @Override public String request(String itemId) { TraceStatus status = null; try { status = logTrace.begin(this.getClass().getSimpleName() + ".save()"); String response = target.request(itemId); logTrace.end(status); return response; } catch (Exception e) { logTrace.exception(status, e); throw e; } } @Override public String nolog() { TraceStatus status = null; try { status = logTrace.begin(this.getClass().getSimpleName() + ".save()"); String response = target.nolog(); logTrace.end(status); return response; } catch (Exception e) { logTrace.exception(status, e); throw e; } } }@Configuration public class ConcreteProxyConfig { @Bean public OrderRepositoryV2 orderRepositoryV2(LogTrace logTrace) { OrderRepositoryV2 orderRepositoryV2 = new OrderRepositoryV2(); return new OrderRepositoryConcreteProxy(orderRepositoryV2, logTrace); } @Bean public OrderServiceV2 orderServiceV2(LogTrace logTrace) { OrderServiceV2 orderServiceV2 = new OrderServiceV2(orderRepositoryV2(logTrace)); return new OrderServiceConcreteProxy(orderServiceV2, logTrace); } @Bean public OrderControllerV2 orderControllerV2(LogTrace logTrace) { OrderControllerV2 orderControllerV2 = new OrderControllerV2(orderServiceV2(logTrace)); return new OrderControllerConcreteProxy(orderControllerV2, logTrace); } }@Import(ConcreteProxyConfig.class) @SpringBootApplication(scanBasePackages = {"me.iseunghan.hello.proxy.app.v2"}) public class ProxyApplication { public static void main(String[] args) { SpringApplication.run(ProxyApplication.class, args); } @Bean public LogTrace logTrace() { return new ThreadLocalLogTrace(); } }패키지 구조(사진)