나는 GET으로 보냈는데 왜 POST로 갈까? (feat. OpenFeign 기여)
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
Spring 프레임워크와 OpenFeign을 사용하는 개발자, HTTP 요청/응답 메커니즘 이해가 필요한 중급 이상 개발자
핵심 요약
- GET 요청에
@RequestParam
등 HTTP 바인딩 어노테이션이 누락되면 OpenFeign은 내부적으로HttpURLConnection
을 통해 POST로 요청 전환 HttpURLConnection
은 GET 요청에 Body가 포함되면 RFC 7231 호환성 유지 차원에서 자동으로 POST로 메서드 변경- Apache HttpClient 5 사용 시 GET 메서드 유지 가능, 또는
@RequestParam
추가로 문제 해결
섹션별 세부 요약
1. 문제 현상
- A 서버에서
@GetMapping
을 사용한 FeignClient로 B 서버 API 호출 시 405 Method Not Allowed 발생 - A 서버 로그는 GET 요청으로 기록되지만, B 서버는 POST 요청으로 처리
- 요청 Body에 파라미터가 포함되었음
2. 원인 분석
@RequestParam
등 바인딩 어노테이션이 누락된 GET 메서드는 OpenFeign의 내부 HTTP 클라이언트(HttpURLConnection)가 Body를 처리하지 못해 POST로 자동 전환HttpURLConnection
은 GET 요청에 Body가 포함되면 RFC 7231 호환성을 위해 POST로 메서드 변경- Feign 자체는 메서드 변경하지 않고, Java 표준 클라이언트의 동작에 의존
3. 해결 방안
- GET 요청에
@RequestParam
또는@PathVariable
등 HTTP 바인딩 어노테이션 추가 - Apache HttpClient 5 사용 시 GET 메서드 유지 가능 (의존성 추가 필요)
- OpenFeign의
spring-cloud-openfeign
라이브러리에 경고 로그 기능 추가 (Issue #1191, PR #1194 기여)
4. 추가 고려사항
- Spring Cloud OpenFeign 2022.0.0 이후로는 신규 기능 개발 중단 (크리티컬 버그 수정만 진행)
- DEBUG 로그 수준에서 HttpURLConnection의 POST 전환 로그 확인 가능
결론
- GET 요청 시 반드시
@RequestParam
,@PathVariable
등 HTTP 바인딩 어노테이션을 명시해야 함 HttpURLConnection
대신 Apache HttpClient 5 사용 시 메서드 변경 방지 가능- OpenFeign의
spring-cloud-openfeign
라이브러리에 경고 로그 기능 추가로 개발자 오류 예방 가능