GET 요청이 POST로 변환되는 이유와 OpenFeign 해결책

나는 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 누락 시 경고 메시지 추가로 개발자 오류 예방