작성
·
2K
·
수정됨
답변 2
5
안녕하세요. 스프님^^ 오래 기다리셨습니다
이 문제는 스프링 부트 3.0(스프링 프레임워크6.0) 부터 발생하는 문제입니다. 참고로 이 문제는 프록시와는 무관합니다.
다음 부분을 메뉴얼에 업데이트 해두겠습니다^^
### 스프링 부트 3.0 변경 사항
스프링 부트 3.0 이상이라면 지금까지 작성한 코드에서 2가지를 변경해야 한다.
스프링 부트 3.0(스프링 프레임워크 6.0)부터는 클래스 레벨에 @RequestMapping
이 있어도 스프링 컨트롤러로 인식하지 않는다. 오직 @Controller
가 있어야 스프링 컨트롤러로 인식한다. 참고로 @RestController
는 해당 애노테이션 내부에 @Controller
를 포함하고 있으므로 인식 된다.
따라서 다음과 같이 변경해야 한다.
스프링 부트 3.0 미만
@RequestMapping //스프링은 @Controller 또는 @RequestMapping 이 있어야 스프링 컨트롤러로 인식
@ResponseBody
public interface OrderControllerV1 {}
스프링 부트 3.0 이상
@RestController //스프링은 @Controller, @RestController가 있어야 스프링 컨트롤러로 인식
public interface OrderControllerV1 {}
참고로 이후에 학습할 OrderControllerV2
도 다음과 같이 @RestController
를 사용해야 한다. (바로 다음장에 설명한다.)
@RestController
public class OrderControllerV2 {}
추가로 ProxyApplication
도 다음과 같이 변경하자.
ProxyApplication - 스프링 부트 3.0 미만
@Import(AppV1Config.class)
@SpringBootApplication(scanBasePackages = "hello.proxy.app") //주의
public class ProxyApplication {}
ProxyApplication - 스프링 부트 3.0 이상
@Import(AppV1Config.class)
@SpringBootApplication(scanBasePackages = "hello.proxy.app.v3") //주의
public class ProxyApplication {}
scanBasePackages
부분에서 마지막에 v3가 붙었다. hello.proxy.app
-> hello.proxy.app.v3
이렇게 하는 이유는 스프링 부트 3.0부터는 @Controller
, @RestController
를 사용했는데, 이렇게 하면 내부에 @Component
를 가지고 있어서 컴포넌트 스캔의 대상이 된다. 지금 처럼 컴포넌트 스캔도 되고, 빈도 수동으로 직접 등록하게 되면 스프링 컨테이너에 등록시 충돌 오류가 발생한다. 이후에 학습할 hello.proxy.app.v3
는 빈을 직접 등록하지 않고 컴포넌트 스캔을 사용하기 때문에 괜찮다.
1
https://github.com/spring-projects/spring-framework/commit/3600644ed1776dce35c4a42d74799a90b90e359e
위의 커밋 보시면 isHandler 메서드에서 더이상 RequestMapping을 핸들러로 인식하지 않기 때문에 위와같은 문제가 발생합니다
버전 바꿔보니까 해결됐습니다. 감사합니다! 혹시 어떤 이유로 3.0에선 이러한 문제가 발생하시는지 아시나요?