나는 GET으로 보냈는데 왜 POST로 갈까? (feat. OpenFeign 기여)
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
OpenFeign 사용자, HTTP 메서드 동작 원리 이해 필요자
(난이도: 중간 - HTTP/REST 개념과 Feign 클라이언트 사용 경험이 필요)
핵심 요약
- GET 요청에 파라미터 바인딩 어노테이션(@RequestParam 등)이 누락되면
HttpURLConnection
이 GET을 POST로 변환 @RequestParam
을 명시해야 GET 요청에 파라미터가 올바르게 포함되어 전달feign-hc5
라이브러리 사용 시 HttpURLConnection 대신 Apache HttpClient 5를 사용해 GET 방식 유지 가능
섹션별 세부 요약
###1. 문제 발생 현상
- A 서버에서
@GetMapping("/test") String getData(String query);
호출 시 B 서버에서 405 Method Not Allowed 오류 발생 - A 서버 로그:
method=GET, body=test
- B 서버 로그:
Request method 'POST' is not supported
- GET 요청이 실제 POST로 전달됨
###2. 문제 원인 분석
@RequestParam
누락 시HttpURLConnection
이 GET 요청에 body를 포함하려 하면 RFC 7231 호환성 유지 위해 POST로 자동 전환- SpringMvcContract.java의
parseAndValidateMetadata()
메서드에서 HTTP 메서드와 파라미터 어노테이션 매핑 처리 - OpenFeign은 Spring MVC 어노테이션을 기반으로 요청 매핑
###3. 대안 및 해결책
@RequestParam
어노테이션 추가하여 GET 요청에 파라미터 포함feign-hc5
라이브러리로HttpURLConnection
대체 (Apache HttpClient 5 사용)- Spring Cloud OpenFeign에서
@RequestParam
누락 시 경고 메시지 추가 (PR #1194 기여)
###4. 추가 고려사항
- Spring Cloud OpenFeign 2022.0.0 이후 유지보수 모드, 신규 기능 개발 중단
- DEBUG 레벨 로깅 활성화 시 HttpURLConnection의 POST 변환 로그 확인 가능
결론
- GET 메서드 사용 시
@RequestParam
등 HTTP 바인딩 어노테이션 반드시 명시 feign-hc5
라이브러리 사용 시 HttpURLConnection의 POST 변환 우회 가능- Spring Cloud OpenFeign에서
@RequestParam
누락 시 경고 메시지 추가로 개발자 오류 예방