_NB: ๋์ faraday_middleware
์ํ๋์ง ์๋ ค์ฃผ์ธ์. ๋ฏธ๋ค์จ์ด๊ฐ 2๊ฐ๋ ๋ค์ด์์ด์ ์ด๋์ ๋ฃ์ด์ผ ํ ์ง ๋ชฐ๋์ด์._
์ฐ๊ฒฐ์ ์์ฑํ ๋ (๋ฌธ์ํ๋ ๋๋ก) ๋ฏธ๋ค์จ์ด๊ฐ ์ ์ธ๋ ์์๋๋ก ์คํ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ฒญ์ด ์คํจํ๊ณ :json
ํ์ฑ โโ๋ฏธ๋ค์จ์ด ๋ค์์ :retry
๋ฏธ๋ค์จ์ด๋ฅผ ๋ก๋ํ๋ฉด :retry
๋ฏธ๋ค์จ์ด์ :retry_if
๋ฒ์์์ env.body
๊ฐ ํ์ฑ๋์ง ์์ต๋๋ค. :retry_if
๋ธ๋ก:
JSON
-decoded ๋ฉ์์ง์์ :retry_if
๋ธ๋ก์ ์คํํด์ผ ํฉ๋๋ค. ์์ฒญ์ด ์ฑ๊ณตํ๋ฉด JSON ๋ฌธ์๊ฐ ๋งค์ฐ ์ปค์ง ์ ์๊ณ ๋์์ retry_if
, ์์ ํ ๋ถํ์ํด ๋ณด์
๋๋ค.
<strong i="23">@_client</strong> ||= Faraday.new(url: ROOT_URL) do |f|
f.options[:timeout] = 10
f.headers['Content-Type'] = 'application/json'
f.use :instrumentation, name: INSTRUMENTATION_EVENT_NAME
f.response :json, content_type: /\bjson$/
f.request :retry, FARADAY_RETRY_OPTIONS
end
์ฐธ๊ณ : ๋ธ๋ก ๋ด๋ถ์ f.instance_variable_get :@handlers
์ธ์ํ๋ฉด ์ ์ธํ ์์๋๋ก ๋ฏธ๋ค์จ์ด๊ฐ ํ์๋ฉ๋๋ค.
์์ฒญ์ด ์คํจํ๊ณ :retry
๋ฏธ๋ค์จ์ด์ :retry_if
๋ธ๋ก์์ ์ด๋ฌํ ํํ์์ ํ๊ฐํ๋ฉด ๋ค์ ์ถ๋ ฅ์ด ํ์๋ฉ๋๋ค.
(byebug) environment.response.to_hash.without(:url)
{:status=>405, :body=>"{\"message\": \"The method is not allowed for the requested URL.\"}\n", :response_headers=>{"date"=>"Fri, 23 Apr 2021 18:17:16 GMT", "content-type"=>"application/json", "content-length"=>"64", "connection"=>"keep-alive", "server"=>"gunicorn", "allow"=>"HEAD, OPTIONS, GET"}}
(byebug) environment.response.body
"{\"message\": \"The method is not allowed for the requested URL.\"}\n"
(byebug) environment.response.body.class
String
๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑ ๋ฏธ๋ค์จ์ด๋ ๋จผ์ ์คํ์ ๊ฑฐ๋ถํฉ๋๋ค.
JSON์ด ์ ๊ตฌ์ฑ๋์ด ์๊ณ ์๋ต์ Content-Type
ํค๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์ด ์์ด์ ๋นํฉ์ค๋ฝ์ต๋๋ค.
๋ด ์ ์ผํ ์ถ์ธก์ #response
๋ฏธ๋ค์จ์ด๊ฐ ํญ์ #request
๋ฏธ๋ค์จ์ด๋ณด๋ค ๋จผ์ ์คํ๋์ง๋ง ์ด ๊ฒฝ์ฐ retry
๊ฐ #request
๋ฏธ๋ค์จ์ด๋ ์๋ชป๋ ๋ช
์นญ์
๋๋ค. ์๋ต์ด ๋ฐํ๋ ํ ์์์ ์ผ๋ก ํ๊ฐ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ ๋ฐ์ดํธ: ๋ง ๊ทธ๋๋ก ์ฐ๊ฒฐ ๊ตฌ์ฑ ๋ธ๋ก์์ ๋ ๋ฏธ๋ค์จ์ด์ ์์๋ฅผ ๋ค์ง์๊ณ ("์ด๊ฒ์ด ์๋ํ ์ ์์ต๋๋ค"๋ผ๊ณ ์๊ฐํ๋ฉด์) ์ด์ ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค. ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ํ ๋ชจ๋ฅด๊ณ ์ฌ์ ํ ๋ฒ๊ทธ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์(๋๋ ์ ์ด๋ ๋ ์ ๋ฌธ์ํ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์) ์ด๊ฒ์ ๋จ๊ฒจ๋ก๋๋ค.
์๋
ํ์ธ์ @mvastola๋ , ์ง๊ธ ๊ฒช๊ณ
์ฒ์์๋ ๋จธ๋ฆฌ๋ฅผ ๊ตด๋ฆฌ๊ธฐ๊ฐ ์ด๋ ต๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋ฏธ๋ค์จ์ด ์คํ์ ํน์ฑ์ด ๋ ์คํ๊ณผ ์ ์ฌํ๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ค์จ์ด๋ ์๋ต์ ์ํด ์ญ์์ผ๋ก ํธ๋๋ฒ์ค๋ฉ๋๋ค.
์ฐ๋ฆฌ ์น ์ฌ์ดํธ ์๋ ์ดํดํ๊ธฐ ์ฝ๋๋ก ์ด๊ฒ์ ๋ณด์ฌ์ฃผ๋ ๊ทธ๋ฆผ์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋น์ ์ ์ด๋ฏธ ์ณ์ ์ผ์ํ์ต๋๋ค ๐! :json
๋ฏธ๋ค์จ์ด๋ฅผ :retry
์ดํ๋ก ์ด๋ํ๋ฉด ์๋ต์ด ๋จผ์ ์ฒ๋ฆฌ๋๋๋ก ํ์ฉํ๊ณ :retry
๋ฏธ๋ค์จ์ด๋ ๊ตฌ๋ฌธ ๋ถ์๋ ์๋ต ๋ณธ๋ฌธ์ ์ฐพ์ต๋๋ค.
์ง๊ธ ์ข ๋ฃํ์ง๋ง ์ถ๊ฐ ์ง๋ฌธ์ด ์์ผ๋ฉด ์ธ์ ๋ ์ง ๋ฌธ์ํด ์ฃผ์ธ์.
๋น ๋ฅด๊ณ ์น์ ํ๊ณ ์์ธํ๊ฒ ์ค๋ช ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ดํดํ๊ธฐ ์ด๋ ต์ง๋ ์์ง๋ง ์ฌ๊ธฐ์์๋ ์ฝ๊ฐ ์ง๊ด์ ์ด์ง ์์ต๋๋ค. ํจ๊ณผ์ ์ผ๋ก ์ค์ผ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค.
๋๋ ๋น์ ์ด ๋งํฌํ ๋ฌธ์๋ฅผ ์ค์ ๋ก ๋ณด์๊ณ , ๋ด๊ฐ ํด์ผ ํ ์ผ์ ์๊ณ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. (๋๋ ๊ทธ๋ฆผ๊ณผ "๊ฐ์ฅ ์์ชฝ์ ์๋" ๋ฏธ๋ค์จ์ด์ ๋ํ ๋ด์ฉ์ ๋ณด์์ง๋ง ๊ทธ๊ฒ์ด ์์๋ฅผ ๋ฐ๋๋ก ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค๊ณ ์ค์ ๋ก ์ฒ๋ฆฌํ์ง๋ ์์์ต๋๋ค.)
ํ์๋ ์ด๋ฏธ์ง๋ ๋ฏธ๋ค์จ์ด์ ๋ด๋ถ์ ๊ด๋ จํ์ฌ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง๋ง ๊ตฌ์ฑ ๋ธ๋ก์ ์์๊ฐ ์คํ ์์์ ๋ฏธ์น๋ ์ํฅ์ ์๊ฐ์ ์ผ๋ก ํ์ํ์ฌ ์ด๋ฅผ ๋ณด์ํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๊ทธ ์ธ์๋ ์ง๊ด์ ์ด์ง ์๊ฒ ๋ง๋๋ ์ด ๊ตฌํ์ ์ธ๋ถ ์ฌํญ์ด ๋ง์ด ์์ต๋๋ค.
faraday
์๋ ๋ฏธ๋ค์จ์ด๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํ ์ธ ๊ฐ์ง ๋ค๋ฅธ ๊ธฐ๋ฅ์ด ์์ผ๋ฉฐ ์ํธ ๊ตํํ ์ ์์ต๋๋ค. ๊ฐ ๋ฏธ๋ค์จ์ด๋ ๊ทธ ์ค ํ๋๋ง ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ๋ง์น ์๋ก ๋
๋ฆฝ์ ์ธ 3๊ฐ์ ์๋ก ๋ค๋ฅธ ๋ฏธ๋ค์จ์ด ์คํ(๋๋ ์์ ์ง์ )์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํฉ๋๋ค.
๋ฏธ๋ค์จ์ด์ ์ด ์ธ ๊ฐ์ง ๋ค๋ฅธ ์ด๋ฆ/๊ทธ๋ฃน์ด ํ๋ ์ผ์ ๋งค์ฐ ๋ถ๋ถ๋ช ํ์ง๋ง ๋๋ถ๋ถ์ ๋ฏธ๋ค์จ์ด๋ ์์ฒญ->์๋ต ๊ฒฝ๋ก์ ์์ชฝ ๋์์ ์คํ๋์ง _์๊ธฐ_ ๋๋ฌธ์ ์ฌ์ฉ์๋ "์์ฒญ" ์์ ์ด ํญ์ "์๋ต"๋ณด๋ค ๋จผ์ ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ๊ด๋ จ๋ ๊ฒ๋ค.
๋ฏธ๋ค์จ์ด๋ฅผ ์ถ๊ฐํ๋ rack ํค์๋ use
๋ ํจ๋ฌ๋ฐ์ด์์ ์์ฒญ๊ณผ ์๋ต์ ๋ชจ๋ ๊ฐ์ธ๋ ๋ฏธ๋ค์จ์ด์ธ ๋ฏธ๋ค์จ์ด์๋ง ์ ์ฉ๋ฉ๋๋ค.
์ด์จ๋ ์ด ๋ฌธ์ ์ ๋ํด API๋ฅผ ์กฐ์ ํ ์ ์๋ ๊ฒฝ์ฐ ๋ช ๊ฐ์ง ์์ด๋์ด๋ฅผ ์๊ฐํด ๋ณผ ์ ์์ด ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์ด๋ ๋๋ ์ง๊ธ ์ด๊ฒ์ ์ป์ต๋๋ค. ์ฌ๊ธฐ์์ ๊ฐ์ ํผ๋์ ๊ฒช๊ณ ์๋ ๋ค๋ฅธ ์ฌ์ฉ์๋ฅผ ์ฝ๊ฒ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์์ด ๋ง์ํ๋ ๊ฒ์ ๋๋ค.
@mvastola ๊ฐ์ฌ
๊ทธ๋ฆฌ๊ณ ๊ณต์ ํ๊ฒ ๋งํด์, ๋๋ ์ด๊ฒ์ ๋ํด ์ฒ์ ๋ฃ๋ ๊ฒ์ด ์๋๋๋ค.
๋ฌธ์ํ์ ๊ดํด์๋ ์ฐ๋ฆฌ๊ฐ ์์ง ๋ฉ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ ์ ์ํ ๊ธฐ์ฌ๋ ๋งค์ฐ ํ์ํฉ๋๋ค(์ค์ ๋ก ์ด์ ๋ํ ๋งค์ฐ ์ต๊ทผ ํ ๋ก ์ค๋ ๋ ๊ฐ ์์ต๋๋ค!).
๊ตฌ์ฑ์ ๋ํ ์์ ๋ ๋งค์ฐ ์ ํจํฉ๋๋ค. request
, response
๋ฐ use
๋ฉ์๋ ํผ๋์ด ์ฌ๋ฌ ๋ฒ ๋ฐ์ํ์ฌ ์ค์ ๋ก use
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋จ์ํ ์ญ์ ํ๋ ๊ฒ์ ๊ณ ๋ คํ๊ณ ๋ฏธ๋ค์จ์ด์ ๋จ๊ฒจ๋๊ณ ์์ฒญ/์๋ต์ ์กฐ์ํ ํญ๋ชฉ/์๊ธฐ๋ฅผ ๋ฌธ์ํํฉ๋๋ค.
๋ฐ๋ผ์ ์์ง๊น์ง๋ PR์ ํตํด ํด๋น API๋ฅผ ๋ณ๊ฒฝํ์ง ๋ง ๊ฒ์ ์ ์ํ์ง๋ง ํ ๋ก ์ ํตํด ์ด ์ฃผ์ ์ ๋ํ ์ปค๋ฎค๋ํฐ์ ์๊ฒฌ์ ๋ค์ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ํ์ธ์ @mvastola๋ , ์ง๊ธ ๊ฒช๊ณ
์ฒ์์๋ ๋จธ๋ฆฌ๋ฅผ ๊ตด๋ฆฌ๊ธฐ๊ฐ ์ด๋ ต๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋ฏธ๋ค์จ์ด ์คํ์ ํน์ฑ์ด ๋ ์คํ๊ณผ ์ ์ฌํ๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ค์จ์ด๋ ์๋ต์ ์ํด ์ญ์์ผ๋ก ํธ๋๋ฒ์ค๋ฉ๋๋ค.
์ฐ๋ฆฌ ์น ์ฌ์ดํธ ์๋ ์ดํดํ๊ธฐ ์ฝ๋๋ก ์ด๊ฒ์ ๋ณด์ฌ์ฃผ๋ ๊ทธ๋ฆผ์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋น์ ์ ์ด๋ฏธ ์ณ์ ์ผ์ํ์ต๋๋ค ๐!
:json
๋ฏธ๋ค์จ์ด๋ฅผ:retry
์ดํ๋ก ์ด๋ํ๋ฉด ์๋ต์ด ๋จผ์ ์ฒ๋ฆฌ๋๋๋ก ํ์ฉํ๊ณ:retry
๋ฏธ๋ค์จ์ด๋ ๊ตฌ๋ฌธ ๋ถ์๋ ์๋ต ๋ณธ๋ฌธ์ ์ฐพ์ต๋๋ค.์ง๊ธ ์ข ๋ฃํ์ง๋ง ์ถ๊ฐ ์ง๋ฌธ์ด ์์ผ๋ฉด ์ธ์ ๋ ์ง ๋ฌธ์ํด ์ฃผ์ธ์.