๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BackEnd๐ŸŒฑ/Spring

๋‚˜๋Š” GET์œผ๋กœ ๋ณด๋ƒˆ๋Š”๋ฐ ์™œ POST๋กœ ๊ฐˆ๊นŒ? (feat. OpenFeign ๊ธฐ์—ฌ)

by dkswnkk 2025. 5. 26.

๊ฐœ์š”

์ตœ๊ทผ OpenFeign์„ ์‚ฌ์šฉํ•  ๋•Œ ์ด์ƒํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ๋‹ค. 

@FeignClient(name = "test-client")
public interface TestClient {

    @GetMapping("/test")
    String getData(String query);
}

์œ„์™€ ๊ฐ™์ด ์ •์˜๋œ OpenFeignํด๋ผ์ด์–ธํŠธ๋ฅผ ํ†ตํ•ด A ์„œ๋ฒ„์—์„œ B ์„œ๋ฒ„์˜ API๋ฅผ ํ˜ธ์ถœํ–ˆ๋Š”๋ฐ, 405 Method Not Allowed ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๋ถ„๋ช… B ์„œ๋ฒ„์—๋Š” ํ•ด๋‹น API๊ฐ€ GET ๋ฉ”์„œ๋“œ๋กœ ์ •ํ™•ํžˆ ์ •์˜๋˜์–ด ์žˆ๋Š”๋ฐ๋„ ๋ง์ด๋‹ค.

@Slf4j
public class FeignLoggingInterceptorConfig {

    @Bean
    public RequestInterceptor requestLoggingInterceptor() {
        return template -> log.info("[Feign Request] method={}, url={}, query={}, body={}",
                                    template.method(), template.url(), template.queryLine(), (template.body() != null) ? new String(template.body()) : "null");
    }
}
A ์„œ๋ฒ„ ๋กœ๊ทธ: c.k.n.i.r.FeignLoggingInterceptorConfig  : [Feign Request] method=GET, url=/test, query=, body=test

๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด A์„œ๋ฒ„์— ์œ„์™€ ๊ฐ™์ด ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋„๋ก ์„ค์ •ํ•˜๊ณ  ํ™•์ธํ–ˆ์„ ๋•Œ๋„ ๋ถ„๋ช… A์„œ๋ฒ„์—์„œ๋Š” GET ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทผ๋ฐ ๊ทธ๋Ÿฐ๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ  B ์„œ๋ฒ„์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด POST๋กœ ์ „๋‹ฌ๋ฐ›์•˜๋‹ค๋Š” ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋๋‹ค.

B ์„œ๋ฒ„ ๋กœ๊ทธ: DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' is not supported]

์ฆ‰ A ์„œ๋ฒ„์—์„œ๋Š” GET ์š”์ฒญ์„ ๋ณด๋ƒˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์‹ค์ œ B ์„œ๋ฒ„์—์„œ๋Š” POST ์š”์ฒญ์ด ๋“ค์–ด์˜จ ๊ฒƒ์ด๋‹ค. ๋„๋Œ€์ฒด ์ด๊ฒŒ ๋ฌด์Šจ ์ผ์ผ๊นŒ?

 

 

์›์ธ

์‚ฌ์‹ค ๋ˆˆ์ฐ๋ฏธ๊ฐ€ ์ข‹๋‹ค๋ฉด A ์„œ๋ฒ„์˜ ๋กœ๊ทธ๋ฅผ ๋ณด๊ณ  ๋ฌธ์ œ์˜ ๋‹จ์„œ๋ฅผ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ธด ํ•˜๋‹ค. ์œ„ A ์„œ๋ฒ„์˜ ๋กœ๊ทธ๋ฅผ ๋‹ค์‹œ ๋ณด๋ฉด ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ(query)์— ๊ฐ’์ด ํฌํ•จ๋˜์ง€ ์•Š๊ณ  HTTP body์— ๊ฐ’์ด ๋‹ด๊ฒจ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

@FeignClient(name = "test-client")
public interface TestClient {

    /**
     * @RequestParam ์—†์Œ — ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์ฝ”๋“œ
     */
    @GetMapping("/test")
    String getData(String query);

    /**
     * @RequestParam ์žˆ์Œ — ์ •์ƒ ๋™์ž‘
     */
    @GetMapping("/test")
    String getData(@RequestParam String query);
}

๊ฐœ๋ฐœ์ž์˜ ์˜๋„๋Š” GET /test?query=value์ฒ˜๋Ÿผ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „์†กํ•˜๋ ค๋˜ ๊ฒƒ์ด์—ˆ์ง€๋งŒ, OpenFeign์€ GET์ธ๋ฐ '@RequestParam, @PathVariable, @SpringQueryMap.. ๋“ฑ'๊ณผ ๊ฐ™์€ HTTP ๋ฐ”์ธ๋”ฉ ์–ด๋…ธํ…Œ์ด์…˜์ด ์ง€์ •๋˜์ง€ ์•Š์•„ ์‹ค์ œ๋กœ ์ „์†กํ•  ๋•Œ ์ „๋‹ฌ ๊ฐ’์„ ๋ณธ๋ฌธ(body)์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  POST๋กœ ๋ณ€ํ™˜ํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค.

์‚ฌ์‹ค ๋” ์ •ํ™•ํžˆ๋Š” Feign์ด ์ง์ ‘ HTTP ๋ฉ”์„œ๋“œ๋ฅผ POST๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  Feign์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Java์˜ ํ‘œ์ค€ HTTP ํด๋ผ์ด์–ธํŠธ(HttpURLConnection)๊ฐ€ ๋ฐ”๊พผ ๊ฒƒ์ด๋‹ค.

 

 

๊ทธ๋ ‡๋‹ค๋ฉด HttpURLConnection์€ ์™œ GET์„ POST๋กœ ๋ฐ”๊พธ๋Š”๊ฐ€?

HTTP ํ‘œ์ค€(RFC 7231)์— ๋”ฐ๋ฅด๋ฉด GET ์š”์ฒญ์ด body๋ฅผ ๊ฐ€์ง€๋ฉด ์ผ๋ถ€ ๊ตฌํ˜„์ฒด๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

https://datatracker.ietf.org/doc/html/rfc7231#section-4.3.1%5D%5B1

๊ทธ๋ ‡๊ธฐ์— ์‚ฌ์šฉ์ž๊ฐ€ GET์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋ฉด์„œ '@RequestParam, @PathVariable, @SpringQueryMap.. ๋“ฑ' HTTP ๋ฐ”์ธ๋”ฉ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด HttpURLConnection์€ "์•„, body๋ฅผ ์“ฐ๊ฒ ๋‹ค๋Š” ๊ฑฐ๊ตฌ๋‚˜"๋ผ๊ณ  ํ•ด์„์„ ํ•ด๋ฒ„๋ฆฌ๊ณ  RFC 7231 ๊ทœ์น™์— ๋”ฐ๋ผ GET์— Body๊ฐ€ ๋“ค์–ด์™”๊ธฐ ๋•Œ๋ฌธ์— HttpURLConnection๋Š” 'ํ˜ธํ™˜์„ฑ ์œ ์ง€ ์ฐจ์›์—์„œ' ์ž๋™์œผ๋กœ POST๋กœ ๋ฐ”๊พธ๋Š” ์šฐํšŒ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

https://github.com/JetBrains/jdk8u_jdk/blob/master/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java#L1326

๋ช…์‹œ์ ์ธ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๋Œ€์‹  ์•”๋ฌต์ ์œผ๋กœ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ”๊พธ์–ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ณ„์† ๋™์ž‘ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๋ ˆ๊ฑฐ์‹œ ํ˜ธํ™˜ ๋กœ์ง์ธ ๊ฒƒ์ด๋‹ค.

์ฃผ์„์—๋„ ์“ฐ์—ฌ์žˆ์ง€๋งŒ 'Backward compatibility(ํ•˜์œ„ ํ˜ธํ™˜์„ฑ, ๋˜๋Š” ํ•˜์œ„ ํ˜ธํ™˜)'๋Š” ์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ์ด๋‚˜ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์ด์ „ ๋ฒ„์ „์—์„œ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ๋ฐ์ดํ„ฐ์™€๋„ ํ˜ธํ™˜๋˜๋Š” ์„ฑ์งˆ์„ ๋งํ•œ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด HTTP ๋ช…์„ธ๋ฅผ ์—„๊ฒฉํžˆ ๋”ฐ๋ฅด์ง€ ์•Š์•˜๊ณ  GET ์š”์ฒญ์—๋„ body๋ฅผ ๋ถ™์ด๋ ค๋Š” ์‹œ๋„๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ์ด๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ ๊นจ์งˆ ์ˆ˜ ์žˆ์–ด์„œ HttpURLConnection์—์„œ๋Š” ์กฐ์šฉํžˆ POST๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ 'ํ˜ธํ™˜์„ฑ ์œ ์ง€'๋ฅผ ์„ ํƒํ•œ ๊ฒƒ์ด๋‹ค.

HttpURLConnection๋Š” ๊ทธ๋ ‡๋‹ค๋Š” ๊ฑฐ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด Feign์ด ์‚ฌ์šฉํ•˜๋Š” HTTP ํด๋ผ์ด์–ธํŠธ๋ฅผ HttpClient๋Œ€์‹  ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์ธ Apcache HTTP Client 5๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Apache Client๋Š” GET ์š”์ฒญ์— body๊ฐ€ ์žˆ์–ด๋„ ๋‚ด๋ถ€์ ์œผ๋กœ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ GET ๋ฐฉ์‹์œผ๋กœ ๊ณ„์† ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.(OpenFeign/feign #issues/832)

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-hc5</artifactId>
</dependency>

๋‹ค๋งŒ ํ˜„์—…์—์„œ HTTP Client๋ฅผ ๋ฐ”๊ฟ” ์“ฐ๋Š” ๊ฒƒ์€ ์–ด๋–ค ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ๊ฐ€ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, GET์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์ž˜ ๋ถ™์—ฌ์คฌ๋Š”์ง€ ๊ผญ ํ™•์ธํ•˜์ž.

 

 

OpenFeign ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ

 s.n.www.protocol.http.HttpURLConnection  : sun.net.www.MessageHeader@68c984c97 pairs: {POST /test HTTP/1.1: null}{Content-Type: text/plain;charset=UTF-8}{Accept: */*}{User-Agent: Java/17.0.14}{Host: localhost:8090}{Connection: keep-alive}{Content-Length: 4}

์‚ฌ์‹ค ๋กœ๊น… ๋ ˆ๋ฒจ์„ DEBUG๋กœ ์„ค์ •ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์€ A ์„œ๋ฒ„์—์„œ HttpURLConnection์ด GET์„ POST๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์˜ ๋กœ๊ทธ๊ฐ€ ์ž๋™์œผ๋กœ ์ถœ๋ ฅ๋˜๊ธด ํ•œ๋‹ค. ๋‹ค๋งŒ.. ํ˜„์‹ค์ ์œผ๋กœ DEBUG ๋ ˆ๋ฒจ์€ ๋„ˆ๋ฌด ๋งŽ์€ ๋ถˆํ•„์š”ํ•œ ๋กœ๊ทธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ ํŒ€์€ ์ผ๋ฐ˜์ ์œผ๋กœ Spring์˜ ๋กœ๊น… ๋ ˆ๋ฒจ์„ INFO๋กœ ์„ค์ •ํ•ด ๋‘๊ณ  ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ , ๊ทธ๋ ‡๋‹ค ๋ณด๋‹ˆ ์ด์ฒ˜๋Ÿผ ์ค‘์š”ํ•œ ํžŒํŠธ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋กœ๊ทธ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Ÿฐ ๋กœ๊ทธ๊ฐ€ ์ž๋™์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š”์ง€ ๋ชฐ๋ผ ์ง์ ‘ OpenFeign ์ „์šฉ RequestInterceptor๋ฅผ ๊ตฌํ˜„ํ•ด INFO ์ˆ˜์ค€์œผ๋กœ ๋กœ๊ทธ๋ฅผ ์ฐ์—ˆ๋˜ ๊ฒƒ์ด์—ˆ๊ณ , Feign ๋ ˆ๋ฒจ์—์„œ๋Š” ์—ฌ์ „ํžˆ GET ์š”์ฒญ์œผ๋กœ๋งŒ ์ถœ๋ ฅ๋˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ด์—ˆ๋‹ค.

๊ทธ๋‚˜๋งˆ ๋‚˜๋Š” ์š”์ฒญ์„ ๋ฐ›๋Š” B ์„œ๋ฒ„๋„ ์ง์ ‘ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— B์„œ๋ฒ„์˜ ๋กœ๊ทธ๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ๋น ๋ฅด๊ฒŒ ์›์ธ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๊ถŒํ•œ์ด ์—†๋Š” ์™ธ๋ถ€ ์„œ๋ฒ„๋‚˜ ํƒ€์‚ฌ API์— ์š”์ฒญ์„ ๋ณด๋ƒˆ๋˜ ์ƒํ™ฉ์ด๋ผ๋ฉด, ์ด๋Ÿฌํ•œ ์›์ธ ๋ชจ๋ฅผ 405 ์˜ค๋ฅ˜๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ํ›จ์”ฌ ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ—ˆ๋น„ํ–ˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฑด GET ์š”์ฒญ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ HTTP ๋ฐ”์ธ๋”ฉ ์–ด๋…ธํ…Œ์ด์…˜(@RequestParam, @PathVariable ๋“ฑ)์„ ์ •ํ™•ํžˆ ๋ถ™์—ฌ์คฌ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ๊ฐœ๋ฐœํ•˜๋‹ค๋ณด๋ฉด... ์˜ฅ์— ํ‹ฐ์ฒ˜๋Ÿผ ๊ผญ ํ•œ ๋ฒˆ์”ฉ ๋ณ„๊ฑฐ ์—†๋Š” ์ด๋Ÿฐ ๊ฒƒ๋“ค์ด ์•ˆ ๋ณด์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ•œ ๋ฒˆ์”ฉ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์• ์ดˆ์— "GET ์š”์ฒญ์ธ๋ฐ ํŒŒ๋ผ๋ฏธํ„ฐ์— HTTP ๋ฐ”์ธ๋”ฉ ์–ด๋…ธํ…Œ์ด์…˜์ด ์—†๋‹ค๋ฉด ๊ฒฝ๊ณ  ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•ด ์ฃผ๋ฉด ์•ˆ ๋ ๊นŒ?"๋ผ๋Š” ์ƒ๊ฐ์„ ํ–ˆ๊ณ  ์ด ์ƒ๊ฐ์„ ๋ฐ”ํƒ•์œผ๋กœ OpenFeign/feign Issue#2872์— ๊ด€๋ จ ๋‚ด์šฉ์„ ์˜ฌ๋ ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง์ ‘ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋ณด๊ธฐ ์œ„ํ•ด OpenFeign์˜ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋‹ค๊ฐ€ ํ•ต์‹ฌ ํฌ์ธํŠธ๊ฐ€ SpringMvcContract.java์˜ parseAndValidateMetadata() ๋ฉ”์„œ๋“œ๋ผ๋Š” ๊ฒƒ์„ ํŒŒ์•…ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” OpenFeign์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ค‘์š”ํ•œ ๋กœ์ง์ธ๋ฐ Spring MVC์˜ ์–ด๋…ธํ…Œ์ด์…˜๋“ค(@RequestMapping, @GetMapping, @RequestParam, @PathVariable ๋“ฑ)์„ ๊ธฐ๋ฐ˜์œผ๋กœ FeignClient ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ๋“ค์„ ๋ถ„์„ํ•˜๊ณ  HTTP ์š”์ฒญ ์ •๋ณด๋กœ ๋งคํ•‘ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. 

๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ๋œป๋ฐ–์˜ ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ ๋‚ด๊ฐ€ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ–ˆ๋˜ SpringMvcContract.java๋Š” OpenFeign์˜ feign-core์— ์žˆ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ spring-cloud/spring-cloud-openfeign ํ”„๋กœ์ ํŠธ์— ์†ํ•ด ์žˆ์—ˆ๋‹ค. ์•Œ์•„๋ณด๋‹ˆ๊นŒ ๋‘˜์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

  • OpenFeign/feign: Feign์˜ ํ•ต์‹ฌ(core) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ”„๋ ˆ์ž„์›Œํฌ์— ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณต
  • spring-cloud/spring-cloud-openfeign: Feign์„ Spring ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋Œ‘ํ„ฐ, Spring MVC ์Šคํƒ€์ผ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด ์คŒ

์‹ค์ œ๋กœ ์šฐ๋ฆฌ ํŒ€์€ spring-cloud-openfeign์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ , ์ฃผ๋ณ€ ๋‹ค๋ฅธ ํšŒ์‚ฌ์˜ ์ง€์ธ๋“ค์—๊ฒŒ๋„ ๋ฌผ์–ด๋ณด๋‹ˆ ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋Œ€๋ถ€๋ถ„ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉ ์ค‘์ด์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด์Šˆ๋ฅผ OpenFeign core๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์ ์šฉ ๋Œ€์ƒ์ธ spring-cloud-openfeign/Issues #1191์— ๋‹ค์‹œ ์˜ฌ๋ ธ๊ณ , ์ตœ์ข…์ ์œผ๋กœ๋Š” PR #1194๋ฅผ ํ†ตํ•ด ๊ธฐ์—ฌํ–ˆ๋‹ค.

๋ฆด๋ฆฌ์ฆˆ๊ฐ€ ๋ฐฐํฌ๋œ๋‹ค๋ฉด ์ด์ œ๋Š” GET ๋ฉ”์„œ๋“œ์— HTTP ๋ฐ”์ธ๋”ฉ ์–ด๋…ธํ…Œ์ด์…˜์ด ๋น ์ง„ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…ํ™•ํ•œ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์‰ฝ๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

[OpenFeign Warning] Feign method 'public abstract Response com.example.Client.getSomething(java.lang.String)' is declared as GET with parameters, but none of the parameters are annotated (e.g. @RequestParam, @RequestHeader, @PathVariable, etc). This may result in fallback to POST at runtime. Consider explicitly annotating parameters.

 

 

spring-cloud-openfeign์€ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ์ด๋‹ค.

https://spring.io/blog/2022/12/16/spring-cloud-2022-0-0-codename-kilburn-has-been-released#spring-cloud-openfeign-feature-complete-announcement

๊ทธ๋ฆฌ๊ณ  ๋˜ ์ถ”๊ฐ€๋กœ ์•Œ๊ฒŒ ๋œ ์ ์ด ์žˆ๋Š”๋ฐ spring-cloud-openfeign์€ Spring์ด ์ž์ฒด์ ์œผ๋กœ HTTP ํด๋ผ์ด์–ธํŠธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ฒŒ ๋จ์— ๋”ฐ๋ผ 2022.0.0 ๋ฒ„์ „๋ถ€ํ„ฐ ์œ ์ง€๋ณด์ˆ˜ ๋ชจ๋“œ์— ๋“ค์–ด๊ฐ”๊ณ  ์‹ ๊ทœ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์€ ๋” ์ด์ƒ ์ง„ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ํ˜„์žฌ๋Š” ํฌ๋ฆฌํ‹ฐ์ปฌ ๋ฒ„๊ทธ ์ˆ˜์ •์ด๋‚˜ ์•ˆ์ •์„ฑ ์œ ์ง€ ๋ชฉ์ ์˜ PR๋งŒ ์ˆ˜์šฉํ•˜๊ณ  ๋” ์ด์ƒ ํ™œ๋ฐœํ•œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋‚˜ ๊ฐœ์„ ์€ ์ง„ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•˜๋‹ˆ ์•Œ์•„๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋Œ“๊ธ€