인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

스프링 핵심 원리 - 고급편

구체 클래스 기반 프록시 - 적용

RequestMapping 설정이 안됩니다

작성

·

2.1K

·

수정됨

0

 


구체 클래스 기반 프록시를 강의와 동일하게 적용해 보았습니다. target에 RequestMapping을 설정했으나 실제로 적용이 되지 않았습니다. (혹시 몰라 proxy에도 설정했었지만 적용되지 않았습니다.)

디버깅 해보면 /v2/request가 없는 거까진 확인했습니다.

답변 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

혹시 Spring Boot 버전이 3.0 이상이실까요? 만약 맞다면 버전 다운그레이드 해보시면 좋을 것 같습니다.

https://github.com/spring-projects/spring-framework/commit/3600644ed1776dce35c4a42d74799a90b90e359e

위의 커밋 보시면 isHandler 메서드에서 더이상 RequestMapping을 핸들러로 인식하지 않기 때문에 위와같은 문제가 발생합니다

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기