"์ ์ง ๊ด๋ฆฌ ๋ชจ๋"๋ก ๋ค์ด๊ฐ๋ ์์ฒญ ๋ฐํ ์ดํ(์์ธํ ๋ด์ฉ์ #3142 ์ฐธ์กฐ) ์ฌ์ฉํ ๋์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชฉ๋ก์ ์์งํ๊ณ ์ถ์ต๋๋ค. ์๋์ ๋๊ธ์ ๋ฌ์์ฃผ์๋ฉด ์ด ํ๋ฅผ ์ ๋ฐ์ดํธํ๊ฒ ์ต๋๋ค. ์ข์ ๋์ ๋ชฉ๋ก์ด ์์ ๋ ์ด๋ฅผ ์ถ๊ฐ ์ ๋ณด์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
ํน๋ณํ ์์๊ฐ ์๊ณ ๋์ฐํ ์ ๋๋ก ๋ถ์์ ํฉ๋๋ค.
ํจํค์ง ์ด๋ฆ | ๋ฒ๋ค ํฌ๊ธฐ | API ์คํ์ผ | ์์ฝ
------------ | -------------- | -------------- | --------------
๋
ธ๋ ๊ฐ์ ธ์ค๊ธฐ | 0.4kb | ์ฝ์ / ์คํธ๋ฆผ | window.fetch๋ฅผ Node.js๋ก ๊ฐ์ ธ์ค๋ ๊ฒฝ๋ ๋ชจ๋
๊ตฌ๋ถ๋ฌ์ง | 1kb | fp / ์ฝ์ / ์คํธ๋ฆผ | ๊ธฐ๋ฅ์ HTTP ํด๋ผ์ด์ธํธ w/ async/await
์ป์๋ค | 48.4kb | ์ฝ์ / ์คํธ๋ฆผ | ๋จ์ํ๋ HTTP ์์ฒญ
๊ฐ์ ธ์ค๊ธฐ ๋ฐ์ | 442kb | ์ฝ์ / ์คํธ๋ฆผ | make-fetch-happen์ HTTP ์บ์ ์ง์, ์์ฒญ ํ๋ง, ํ๋ก์, ์ฌ์๋ ๋ฑ์ ํฌํจํ์ฌ node-fetch๊ฐ ํฌํจํ์ง ์์ ์ถ๊ฐ ๊ธฐ๋ฅ์ผ๋ก node-fetch-npm์ ๋ํํ๋ Node.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค!
์ก์์ค์ค | 11.9kb | ์ฝ์ / ์คํธ๋ฆผ | ๋ธ๋ผ์ฐ์ ๋ฐ node.js๋ฅผ ์ํ Promise ๊ธฐ๋ฐ HTTP ํด๋ผ์ด์ธํธ
์ธํ์น | 1kb | ์ฝ์ / ์คํธ๋ฆผ | ์์ 500b ํ์น "๊ฑฐ์ ํด๋ฆฌํ"
์ํผ ์์ด์ ํธ | 18kb | ์ฒด์ธ / ์ฝ์ | ์์ ํ๋ก๊ทธ๋ ์๋ธ ํด๋ผ์ด์ธํธ ์ธก HTTP ์์ฒญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๋์ผํ API๋ฅผ ์ฌ์ฉํ๋ Node.js ๋ชจ๋์ ๋ง์ ๊ณ ๊ธ HTTP ํด๋ผ์ด์ธํธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์์-json-http | 22kb | ์ฝ์ | JSON ํ์ด๋ก๋ GET ๋ฐ POST๋ฅผ ์ํ ๋ฏธ๋๋ฉ๋ฆฌ์คํธ HTTP ํด๋ผ์ด์ธํธ
๋ฐ๋ | 164kb | ์ฒด์ธ / ์ฝ์ | Nodelands์์ ๊ฐ์ฅ ๊ฐ๊ฒฐํ๊ณ ๋ฉ์ง HTTP ํด๋ผ์ด์ธํธ
URLlib | 816kb | ์ฝ๋ฐฑ / ์ฝ์ | ๊ธฐ๋ณธ ๋ฐ ๋ค์ด์ ์คํธ ์ธ์ฆ, ๋ฆฌ๋๋ ์
, ์ฟ ํค ๋ฑ ๋ณต์กํ ์ธ๊ณ์์ URL(๋๋ถ๋ถ HTTP)์ ์ฌ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋๋๋ก node.js๋ ํ๋ ํ๋ก ํธ์๋์ ์ง์คํ๋ ์ฌ๋์ผ๋ก์, axios๋ ์ ๊ฐ ๊ฐ๋ณธ ๊ณณ์
๋๋ค.
Facebook์ Easy API๋ ๋ธ๋ผ์ฐ์ ์ ๋
ธ๋์์ ์๋ํฉ๋๊น? ์๋ฃ
@mikeal ๊ณผ์ ์ต๊ทผ ํ ๋ก ์ ๋ฐ๋ฅด๋ฉด Bent๊ฐ ์๋ํ์ต๋๋ค. ํ๋์ request๋ฅผ ์ฌ์ฉํด ์จ Node.js ๊ฐ๋ฐ์๋ก์, ๋ฒคํธ๋ ํ์คํ ์ฌ์ด ์ ํ์ด์์ต๋๋ค - ์ ๊ทน ์ถ์ฒํฉ๋๋ค ๐
๊ธ์, ๋ด ์์ ์ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ๊ธฐ์์ ํ๋ณดํ๋ ๊ฒ์ ์ผ์ข ์ ์๋ชป๋ ๋๋์ด ๋ค์ง๋ง ๊ทธ๊ฒ์ด ๋ฌธ์ ์ ๋ชฉํ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์์ต๋๋ค. request-compose ๋ ์ฝ์, ์คํธ๋ฆผ ๋ฐ ๋ง์ ๋ค๋ฅธ ์ ์ฉํ ์ต์ ์ ๋๋ถ๋ถ ์์ฒญ์์ ์ฐพ์ ์ต์ ๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
๋๋ ๋ํ ๊ทธ๊ฒ์ ๊ดํ ๊ธฐ์ฌ ๋ฅผ ์ผ์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์์ด๋์ด๋ ๋ชจ๋ ์ฌ๋์ด ์์ ์ ํ์์ ๋ง๊ฒ ํน๋ณํ ์กฐ์ ๋ ์์ ์ HTTP ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌ์ฑํ๋๋ก ๊ถ์ฅ๋๋ค๋ ๊ฒ์ ๋๋ค.
๋ฒ๋ค ํฌ๊ธฐ์ ๊ดํด์๋ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ด ํด๋ผ์ด์ธํธ๋ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ๋๋ก ์ค๊ณ๋์ง ์์์ง๋ง ๊ฝค ์์์ผ ํฉ๋๋ค.
ํ ์ด๋ธ์ ๋ค์ ์ด์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด ์์น๋ฅผ ๋๋ํ ๋๊ณ ๋ณด๋ฉด ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋งค์ฃผ ์์ฒ ๊ฐ์ ๋ณ๊ณผ ์๋ฐฑ๋ง ๊ฐ์ ๋ค์ด๋ก๋๋ฅผ ๊ธฐ๋กํ์ง๋ง ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ฐฑ ๊ฐ์ ๋ฌํฉ๋๋ค.
๋ด 2์ผํธ, ๋ฌด์ํ๊ณ ๋์ด๊ฐ๋ ๋ฉ๋๋ค. ๋๊ธ์ ์์ ํ๊ฑฐ๋ ์ด์๋ฅผ ์ ๊ธฐํ ํ์๊ฐ ์์ต๋๋ค.
@csantanapr ๋์ํฉ๋๋ค. ๊ธฐ๋ฅ ์ธํธ๋ ๋น๊ตํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ํ๋ก์ ์ง์, ์บ์ ์ง์, ์ธ์ฆ ๊ธฐ๋ฅ ๋ฑ. ์์ฒญ์ ํน์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ๊ณณ์์ ์ฐพ์์ผ ํ๋ ๊ฒฝ์ฐ ์ด์ ๋ํด ์ด์ผ๊ธฐํ ์ข์ ์๊ฐ์ด ๋ ๊ฒ์ ๋๋ค.
axios
๋ ํนํ ํ๋ก ํธ ์๋์์ ๋ด ํฌํ๋ฅผ ์ป์ต๋๋ค.
์ดํด๋ณผ ๊ฐ์น: ky
(ํ๋ก ํธ์๋) ๋ฐ ky-universal
(๋ํ)
์ฌ๊ธฐ Axios ์ฌ์ฉ์์ ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ํ์ด ๋ธ๋ผ์ฐ์ ๋๋ nodejs(์๋ฒ ๋๋ ์๋ฒ๋ฆฌ์ค์์ ์คํ)์ ๊ฐ์ ํ๊ฒฝ์ ๊ด๊ณ์์ด ๋์ผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋งค์ฐ ์ ๊ด๋ฆฌ๋์ด ์์ผ๋ฉฐ ๋ชจ๋ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ข์ํฉ๋๋ค.
$ got
readme์์ got
, request
, node-fetch
, axios
, superagent
๋ฅผ ์ ๋น๊ตํ์ต๋๋ค. : https://github.com/sindresorhus/got#comparison
(๋ถ์ ํํ ๋ด์ฉ์ด ์์ผ๋ฉด PR ํ์ํฉ๋๋ค. ์ต๋ํ ์ค๋ฆฝ์ ์ผ๋ก ์ ์งํ๋ ค๊ณ ๋
ธ๋ ฅํ์ต๋๋ค.)
Got์๋ request
์์ ์ด๋ํ๊ธฐ ์ํ ๋ง์ด๊ทธ๋ ์ด์
๊ฐ์ด๋๋ ์์ต๋๋ค. https://github.com/sindresorhus/got/blob/master/migration-guides.md
๋๋ฅผ ์ํด, ๋๋ fetch api ์ฃผ์์ ๋ํผ๋ฅผ ๋ง๋๋ ๊ฒฝํฅ์ด ์์ผ๋ฏ๋ก node-fetch๊ฐ ๋์ goto์
๋๋ค. ๋ถ์ ์ ์ธ ์ธก๋ฉด์๋ ๋ถ๊ตฌํ๊ณ ์ผ๋ฐ์ ์ผ๋ก ๋
ธ๋์ global.fetch
์ ๋ก๋ํ๋ฏ๋ก ๋ธ๋ผ์ฐ์ ์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ํญ์ ์ฌ์ฉํ ์ ์๋ค๊ณ ๋ฏฟ์ ์ ์์ต๋๋ค(์ด์ ๋ธ๋ผ์ฐ์ ์ ๊ฒฝ์ฐ ํด๋ฆฌํ์ ํตํด). isomorphic-fetch
๋
ธ๋์ ๋ํ node-fetch์ ๋ธ๋ผ์ฐ์ ์์ fetch polyfill(๋๋ ์ด๋ฏธ ์ฌ์ฉ ๊ฐ๋ฅํ fetch)์ ๋๋ฌ์ผ ๋ํผ๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๋ ๊ฑฐ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ์ญ์ ์ฌ์ฉํ๊ณ ๋
ธ๋์์ ์ฌ์ฉํ ์ ์ญ์ ์ค์ ํฉ๋๋ค.
Hey, Wreck(https://www.npmjs.com/package/wreck)๋ ๋ด๊ฐ ์ฌ์ฉํ๋
ํด๋ผ์ด์ธํธ์์ ๊ฐ์ ธ์ค๊ธฐ API๋ฅผ ๋ชจ๋ฐฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. axios, superagent ๋ฑ๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ค ์์ฒญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ ์๋ ๋ ๋์ ์์ค์ ์ถ์ํ์ ๋๋ค. ์ ์์ค ์์ฒญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์ฒดํ์ผ๋ก ๋ฒ์ฉ js ๊ฐ๋ฐ์ ์ํด ํด๋ผ์ด์ธํธ์์ ์ ์์ค์ ์์ํ๋ ๊ฒ์ ๋ฏธ๋ฌ๋งํ๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. axios ๋ฐ superagent์ ๊ฐ์ Lib๋ ๊ทธ ์์ ์ค์ค๋ก๋ฅผ ๋ค์ ๊ตฌํํ ์ ์์ผ๋ฉฐ ์ฌ์ฉ์๋ ๊ณ์ ์ฌ์ฉํ ์ ์์ง๋ง ์ด๋ฌํ ๋ชฉ์ ์ ์ํ ๊ธฐ์ด๋ก ๊ฐ์ฃผ๋์ด์๋ ์ ๋ฉ๋๋ค.
@Velveeta ๊ฐ์ axios ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ดํด๋ณด์๋๋ฐ "์ ์์ค ํ์ค ์์ฒญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ"๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค๋ ์ฆ๊ฑฐ๊ฐ ์์ต๋๋ค. ์ด๋ป๊ฒ ์ด๋ฐ ๊ฒฐ๋ก ์ ๋ด๋ฆฌ๊ฒ ๋์๋์ง ๋ง์ํด ์ฃผ์ญ์์ค.
@sindresorhus ์ ๋น๊ต๋ ์์ ๋ด ๋ชฉ๋ก๋ณด๋ค ํจ์ฌ ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. https://github.com/sindresorhus/got#comparison
node-fetch/isomorphic-fetch
๋ ๋๋ถ๋ถ์ ํด๋ผ์ด์ธํธ์ ์ ํฉํ ๋ฎ์ ์์ค์ ๋น๋ฉ ๋ธ๋ก์
๋๋ค. ๊ฐ์ ธ์ค๊ธฐ ๊ธฐ๋ฐ ์์ฒญ ์ฌ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
๋๋ ์ธ์ ๊ฐ ๋ ๋ฉ์ง API๋ก ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ํฌ์ฅํ ๊ฒ์ ๋๋ค. ๊ธ์์, ๊ทธ๊ฒ์ ๋จ์ง ์ ํธ๋์ ๋ฌธ์ ์ผ ๋ฟ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ๋ธ๋ผ์ฐ์ ์ ์ฌ์ค์์ ํ์ค์ด๊ธฐ ๋๋ฌธ์ fetch API๊ฐ ํ๋ฅญํ๋ค๊ณ ์์ํ๋ ๊ฒ์ ์๋ชป๋ ๊ฒ์ ๋๋ค. ๋๋ ์์ชฝ์ ๋ํ์ ๊ฐ๋ ๊ฒ์ด ์์์ด ์ ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๊ทธ๊ฒ์ด ๋ ์ข์์ง์ง๋ ์์ต๋๋ค.
@mikeal ์ด ์ง์ ๋ง๋ r2 ๊ฐ ์์ต๋๋ค. request
์ ์์ ํ๊ณ์๋ฅผ ์๋ฏธํฉ๋๋ค. Promise API๊ฐ ์์ผ๋ฉฐ 16kb๋ก ์์ถ๋์ด ์์ต๋๋ค.
Axios๋ ๋ธ๋ผ์ฐ์ ์์ ์ ๋๋ก ์๋ํ ์ ์์ง๋ง Node.js์์๋ ๊ทธ๋ ์ง ์์์ต๋๋ค. ๋ํ ๋ ์ด์ ํ๋ฐํ ์ ์ง๋๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@kreig303 ์ ๋ axios์ ๋ด๋ถ๋ฅผ ๋ค์ฌ๋ค๋ณด์ง ์์์ ์ ๋ชฐ๋์ต๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ ์์ฒญ ๋ชจ๋์ ๋ํ ์๋ฃจ์ ์ด๊ธฐ ๋๋ฌธ์ ํ์ฌ ์ผ๋ฐ XHR์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฐ๋จํ ๋งํด์ axios๋ ๊ธฐ๋ฅ์ด ์๋นํ ํ๋ถํ๊ณ ์์ฒญ์ ๋์ฒดํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๋ชจ๋์ ๋ํด ์กฐ๊ธ ๋ ๊ธฐ๋ณธ์ ์ธ ๊ฒ์ ๊ณ ๋ คํ๊ณ ์ํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ฅ์ด ๋ ํ๋ถํ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ทธ ์์ ๋น๋ํ๋๋ก ํด์ผ ํฉ๋๋ค. ๋๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋์์ ์ผ๊ด๋ API๋ฅผ ๊ฐ์ง ๋ชฉ์ ์ผ๋ก ํนํ XHR์ ๋ ผ๋ฆฌ์ ๊ณ์น์์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ธ์ค๊ธฐ API๋ฅผ ๋ฏธ๋ฌ๋งํ๋ ๊ฒ์ ์ ํํ์ต๋๋ค. ๋ ๋์ API ๋ํผ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ํํ๊ณ ์ต์ ์ API๋ก ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฆด๋ฆฌ์คํ ์ ์๋ ๊ธฐํ๊ฐ ๋ง์ด ์์ง๋ง, ๊ฐ๋ฅํ ๋ชจ๋ ๊ณณ์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๊ธฐ๋ฅ ๋ฐ API ํจ๋ฆฌํฐ๋ฅผ ์ํด ์ต์ ์ ๋คํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์์ฒญํ ๋ฌธ์ ์ค ํ๋๋ ๊ธฐ๋ฅ์ด ๋๋ฌด ๋ง๊ณ ๋ ธ์ถ ์ํ๊ฐ ๋๋ฌด ๋ง๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ์ง์ด ๋ด๋ถ๋ก ๊ฐ์ฃผ๋๋ ํญ๋ชฉ๋ ์์ต๋๋ค. ๋ง์ ๊ธฐ๋ฅ์ด ์๋ค๋ ๊ฒ์ ์ ์ฃผ์ด์ ์ถ๋ณต์ ๋๋ค. ๊ทธ๋งํผ ์ธ๊ธฐ๊ฐ ๋ง๊ณ ์ฒ์์ด๋ผ์ ๋คํ์ด๋ค. ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊นจ๋ํ๊ณ ๊ฐ๋จํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์์ ํ๊ธฐ์ ํฅ๋ฏธ์ง์งํ ์ํ๋ก ์ ์งํ๊ธฐ ์ํ ์์ฒญ๋ ์์ ์ง์์ ์ธ ๋ ธ๋ ฅ ์์ด๋ ํ๋ก์ ํธ๊ฐ ๊ฒฐ๊ตญ ์ฃฝ๊ธฐ ๋๋ฌธ์ ์ ์ฃผ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์์ฒญ์ ๋ฌธ์ ๊ฐ ์๋๋ผ ํญ์ ์์ ์ ๋ ์ด์ด์์ ๋ญ๊ฐ๋ฅผ ๊บผ๋ด๊ณ ๋์ ๋ค๋ฅธ ์ด๋๊ฐ์ ๋ด์ ์๋์ ๋ฃ๊ณ ์ถ์ดํ๋ ์ฌ์ฉ์ ์์ ์ ๊ด์ ์ ๋๋ค.
๋ญ, axios๋ ๊ฐ์ ๋ฏฟ์์ ๊ฐ์ง๊ณ ์๋ ๊ฒ ๊ฐ์๋ฐ..
๋ฐ๋ผ์ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๋์ ํ ์ ์๋ ๊ฒ์ ๋ฐํด๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๋ ๋ฐ ์ต์ํ์ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ด๊ณ , ๋น๋ฉดํ ๊ฐ ๊ฐ๋ณ ์์ ์ ํตํด ์๊ฐํ๊ณ ์ด๋ค ๋ฐํด๊ฐ ๊ฐ์ฅ ์ ํฉํ์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค.
@ofrobots ๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ฝ๊ฐ์ ์ ํ์ ์คํฌ๋ฆฐ์ท์
๋๋ค. ์ฌ๊ธฐ ๋ด ๊ฒ:
FWIW ๋ฐฑ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉํ๋์ง ๊ธฐ์ต๋์ง ์์ผ๋ฏ๋ก ๊ทํ์ ์ฃผ์ฅ์ ํ์ธํ ์ ์๋ ์์น์ ์์ต๋๋ค.
@Velveeta ๋๋ ๋น์ ์ด ์ด๊ฒ์ ๊ฐ์ง๊ณ ์ด๋๋ก ๊ฐ๊ณ ์๋์ง ์์ง๋ง, meta-libs๊ฐ ๊ฐ ๊ธธ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
Frontend์์ ๋ด ํฌํ๋ axios
์
๋๋ค. ์๊ณ ์์ ์ ์ด๋ฉฐ ์์ธก ๊ฐ๋ฅํฉ๋๋ค.
์ ๋ ๊ฐ์ธ์ ์ผ๋ก FE ๋ฐ BE ํ๋ก์ ํธ ๋ชจ๋์ wretch ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฃผ๋ก API๊ฐ ์ ๋ง ์ง๊ด์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ฐ์ ธ์ค๊ธฐ์ ๋ํ ๋ํผ - ๋ ธ๋ ๊ฐ์ ธ์ค๊ธฐ์๋ ์ ์๋ํฉ๋๋ค.
fetch
API ์์ axios
๊ฐ์ ๊ฒฝํ์ ์ํ๋ ์ฌ๋๋ค์ ์ํด gaxios
๊ฐ ์์ต๋๋ค. Google์ ๊ฐ๋ฐ์๊ฐ ๊ตฌ์ถํ์ผ๋ฉฐ ํ์ฌ Google API์ Node.js ํด๋ผ์ด์ธํธ์ ๋ชจ๋ HTTP ์ํธ ์์ฉ์ ์ง์ํ๋ฏ๋ก ์ ํฌ ํ
์คํธ๋ฅผ ๊ฑฐ์ณ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ ๊ฒ์ด ์์ ํด ๋ณด์
๋๋ค!
(๐ @JustinBeckwith์์)
Hey, Wreck(https://www.npmjs.com/package/wreck)๋ ๋ด๊ฐ ์ฌ์ฉํ๋
๋ํ hapijs ํ๋ ์์ํฌ์ ๊ธฐ๋ณธ http ํด๋ผ์ด์ธํธ์ด๊ธฐ๋ ํฉ๋๋ค. ๊ตฌํ์ ๋ถํ ํ๊ธฐ์ ๋งค์ฐ ๊นจ๋ํฉ๋๋ค.
@mikeal ์ด ์ง์ ๋ง๋ r2 ๊ฐ ์์ต๋๋ค.
request
์ ์์ ํ๊ณ์๋ฅผ ์๋ฏธํฉ๋๋ค. Promise API๊ฐ ์์ผ๋ฉฐ 16kb๋ก ์์ถ๋์ด ์์ต๋๋ค.
ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ์ง๋์ง ์์ต๋๋ค. ๋น์ทํ API๋ฅผ ์ํ๋ค๋ฉด ky
๋ฅผ ์ถ์ฒํฉ๋๋ค. $ got
์ ๊ฐ์ ์ฌ๋๋ค์ด ์ ์ง ๊ด๋ฆฌํ๋ ~1kb ์ถ์ ๋ฐ gzip ํ์ผ์
๋๋ค.
Axios๋ ๋ธ๋ผ์ฐ์ ์์ ์ ๋๋ก ์๋ํ ์ ์์ง๋ง Node.js์์๋ ๊ทธ๋ ์ง ์์์ต๋๋ค. ๋ํ ๋ ์ด์ ํ๋ฐํ ์ ์ง๋๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ ๋ Node์์ axios๋ฅผ ๋งค์ฐ ๋ง์กฑ์ค๋ฝ๊ฒ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ฃผ๋ก ๋๋ค์์ ์ฃผ๋ก ๊ธฐ๋ฅ์ด ํ๋ถํ์ง๋ง ๋ฏธ์น ์ข ์์ฑ ์ฒด์ธ์ด ์ ๊ณต๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. @ofrobots Node์์ ์ฌ์ฉํ ๊ฒฝํ์ ๋ฌด์์ ๋๊น?
๋ ธ๋ js๋ฅผ ๋๋๋ก ์ํํ๋ ํ๋ก ํธ์๋์ ์ง์คํ๋ ์ฌ๋์ผ๋ก์ ๊ณต๋ฆฌ๋ ์ ๊ฐ ๊ฐ๋ณธ ๊ณณ์ ๋๋ค. Facebook์ Easy API๋ ๋ธ๋ผ์ฐ์ ์ ๋ ธ๋์์ ์๋ํฉ๋๊น? ์๋ฃ
ํ์ด์ค๋ถ์ธ์ค ๋ชฐ๋์ด? ํ์ง๋ง ์, ์ด๊ฒ์ ๋ชจ๋ API ์ก์ธ์ค๋ฅผ ์ํ ๋ด goto ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ tinkoff-request https://github.com/TinkoffCreditSystems/tinkoff-request๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ํ, ๋ธ๋ผ์ฐ์ ๋ฐ ์๋ฒ์์ ์๋ํ๋ฉฐ ํ๋ฌ๊ทธ์ธ ๊ฐ๋ ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ๋ฌ ์ ํ์ ๋ณตํฉ ์บ์ฑ์ ๋์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์ด์ก์ต๋๋ค.
Microsoft ์ typed-rest-client ๋ฅผ ์ฌ์ฉํ ์ฌ๋์ด ์์ต๋๊น? TypeScript๋ก ์์ฑ๋ ์ ๊ด๋ฆฌ๋ ํจํค์ง์ฒ๋ผ ๋ณด์ ๋๋ค(์ ์๊ฒ๋ ํฐ ์ฅ์ ์ ๋๋ค).
์ฌ๊ธฐ์๋ wreck
( hapi
์ํ๊ณ์์)๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค.
๋๋ ์ต๊ทผ์ https://github.com/grantila/fetch-h2 ๋ฅผ ํฐ ์ฑ๊ณต์ผ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
ํ์ฌ ์๋ ค์ง ํธํ ๊ฐ๋ฅํ ๊ต์ฒดํ์ด ์์ต๋๊น? KOA์ ํตํฉ๋์ด ์คํธ๋ฆผ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ๋ฌธ์ ์ ์์ ๋ถ๋ถ์์ ์ธ๊ธํ๋ฏ์ด ์ ๋ bent
๋ผ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
ํ๋์ bent
๋ ๋ธ๋ผ์ฐ์ ์์ ์๋ํ๋๋ก ์ค๊ณ๋์ง ์์์ต๋๋ค. ์ด์ API๊ฐ ๊ฝค ์์ ์ ์ด๊ธฐ ๋๋ฌธ์ fetch
์์ ๋ธ๋ผ์ฐ์ ๋ฒ์ ์ ์์ฑํ๋ ๋ฐ ์๊ฐ์ ๋ณด๋์ต๋๋ค. Node.js ๋ฒ์ ์ ๋ธ๋ผ์ฐ์ ํํ๋ ๋์ , ๋ธ๋ผ์ฐ์ ๋ฒ์ ์ package.json์ ์์ฒด ์ง์
์ ์
๋๋ค.
์ด์ bent
์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์๋๋ฉฐ ์๋นํ ์ข์ต๋๋ค.
๋ฉ์ง๋ค์ @mikeal
@csantanapr ๊ฐ์ฌํฉ๋๋ค! :)
axios๋ ๋ ธ๋ ์๋น์ค๋ฅผ ์ถฉ๋์ํฌ ์ ์์ต๋๋ค: https://github.com/axios/axios/issues/1804
์ ์๊ฒ ๊ฐ์ฅ ํฐ ๊ด์ฌ์ฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ ํ์๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์์ ์ด ํธ๋ฆฌํ ํ ์ธํฐํ์ด์ค๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง ์๊ดํ์ง ์์ต๋๋ค. ๋๋ ๋ํ ์๋ฒ ์ธก์ ํฌ๊ธฐ์ ์ง๋์น๊ฒ ๊ด์ฌ์ ๋์ง ์์ง๋ง ์์ชฝ ๋์์ ๋์ผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ์ค์ํฉ๋๋ค.
ํธ์ง: Yeeeaaaah๋ ์ ํํ ๋ด๊ฐ ๋น์ ์ ๋น๋ํ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
ํธ์ง 2: node-libcurl
์ดํด๋ณด๊ฒ ์ต๋๋ค.
@joedski ya, ํ๋ก์ ํญ๋ชฉ์ ์์ฒญ ์ธ๋ถ์์ ๋๋ฆฌ ์ง์๋์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ TBH, ๊ทธ ์ผ์ ํ๊ณ ๊ทธ๊ฒ์ ์ง์ํ๋ ๋ฐ ๊ฑธ๋ฆฐ ์์ ์ ์์ ๊ณ ๋ คํ ๋ ์ ๋ฅผ ํฌํจํ์ฌ ์๋ฌด๋ ๊ทธ๊ฒ์ ํ๊ณ ์ถ์ดํ์ง ์๋๋ค๋ ์ฌ์ค์ด ๋๋์ง ์์ต๋๋ค. ๋ค์ ๊ตฌ๋ถ๋ ค ๐คท๐ฝโโ๏ธ
๋ง์ง๋ง์ผ๋ก nodejs์์ ์์ฒญ์ ๋ง๋ค๊ธฐ ์ํด node-libcurl
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ์ต๋๋ค. ๋งค์ฐ ์ฑ์ํ๊ณ ์๋
๊ฐ ์์ฐ ํ
์คํธ๋ฅผ ๊ฑฐ์น ๊ธฐ๋ณธ ์ปฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ชจ๋ ์ข
๋ฅ์ ํ๋ก์, ๋ฆฌ๋๋ ์
๊ณผ ์๋ฒฝํ๊ฒ ์๋ํ๋ฉฐ ์ฝ์ ๋ฐ ์คํธ๋ฆผ ์ธํฐํ์ด์ค๊ฐ ์์ต๋๋ค.
์กฐ๊ทธ๋งํ ์์ฒญ (>1mio ์ฃผ๊ฐ ๋ค์ด๋ก๋)
์์ฒญ์ ๋ํ ๋๋กญ์ธ ๊ต์ฒด์ด์ง๋ง ํจ์ฌ ๋ ์๊ณ ์ต์
๋ ์ ์ต๋๋ค. ํ๋ ์๋์์ node-fetch
๋ฅผ ์ฌ์ฉํฉ๋๋ค. request
์ ์ฌ์ฉํ ์์น์ ํ๋๋ค.
node-fetch
๊ฐ ์๋ชป ๋ณด๊ณ ๋๊ณ "๋ธ๋ผ์ฐ์ " ๋ฒ์ ๋ง ๋ณด๊ณ ๋ฉ๋๋ค(_Node.js_ ๋ชฉ๋ก์ ํฌ์ธํธ๋ฅผ ๊บพ์). ๋ค์์ ์๋ชป ์ธก์ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋์ ๋ค์ ์ค ํ๋๋ฅผ ์ธก์ ํด์ผ ํฉ๋๋ค.
๊ทธ๋ค์ ๋ชจ๋ ์ฝ 40kb์ ๋๋ค.
unfetch
๋ ์๋ชป ๋ณด๊ณ ๋์์ต๋๋ค.
isomorphic-unfetch
๋ Node.js์ฉ node-fetch( code , docs )๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ณด๊ณ ๋ ํฌ๊ธฐ๋ ์ต์ํ node-fetch์ ํฌ๊ธฐ์ฌ์ผ ํฉ๋๋ค(์ด์ ์ฃผ์ ์ฐธ์กฐ).๊ทธ๊ฒ์ด ๋๋ฌด ๋ง์ด ์ ๊ธฐ๋์์ผ๋ฏ๋ก node-fetch
์ ๋ํ ๋์ ๊ฒฝํ์ ๋ํด ์ฝ๊ฐ ๋งํด์ผ ํฉ๋๋ค.
์ฐ์ ์๋นํ ์ฑ๊ณผ์
๋๋ค. ์ฌ๊ธฐ์ ๋ค์ด๊ฐ ์ฝ๋์ ์์ง๋์ด๋ง ๋
ธ๋ ฅ์ ์์ ์ฐ๋ฆฌ๊ฐ ์์ฒญํ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ง์ต๋๋ค. fetch
๋ ์์ API์ฒ๋ผ ๋ณด์ด๊ณ ์ฌ๋๋ค์ Node.js์์ ํธํ ๊ฐ๋ฅํ API๋ฅผ ์ ๊ณตํ๋ ค๋ ๋
ธ๋ ฅ์ด ๋ช
๋ชฉ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ฝ๋ ๊ธฐ๋ฐ์ ๋ฐฉ๋ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ฒ๋ค์์๋ ์ ํ ๋ณผ ์ ์๋ Node.js์ ์๋นํ ์ข ์์ฑ์ด์ง๋ง ์ข ์์ฑ ํฌ๊ธฐ๊ฐ Node.js, ํนํ ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์์ ๋ฌธ์ ๊ฐ ๋์ง ์๋ ๊ฒ์ ์๋๋๋ค.
node-fetch
๋ ๋ธ๋ผ์ฐ์ ์ API๋ฅผ ์์ ํ ์๋ฎฌ๋ ์ดํธํ๋ ๋ชจ๋ ์์
์ ์ํํ๊ธฐ ๋๋ฌธ์ ํ
์คํธํ ๋ ํ์ ๋ถ๊ฐ๊ฒฐํ์ง๋ง ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Node.js ๋ฐ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ์์ฉ ํ๋ก๊ทธ๋จ์์๋ ๊ทธ๋งํ ๊ฐ์น๊ฐ ์๋ ๋๋ฌด ๋ง์ ์ฝ๋์ ๋๋ฌด ๋ง์ ๊ฐ์ ์ฐธ์กฐ.
IMO, ํ์ฌ Node.js์ ๋ธ๋ผ์ฐ์ ๋ชจ๋์์ http ํด๋ผ์ด์ธํธ๊ฐ ๋๊ณ ์ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ๋ธ๋ผ์ฐ์ ์์ fetch
๋ฐ require(โhttpโ)
๋ฅผ ์ฌ์ฉํ์ฌ ๋ถํ ๊ตฌํ์ผ๋ก ๊ท ์ผํ API๋ฅผ ๊ตฌํํ๋ ๊ฒ์
๋๋ค. Node.js์ fetch
๋๋ require(โhttpโ)
๋ฅผ ์ง์ ๋์์ผ๋ก ํด์๋ ์ ๋๋ฉฐ ์์ชฝ์์ ์ด๋ฌํ API๋ฅผ ์๋ฎฌ๋ ์ดํธํ๋ ๋ฐ ์์กดํด์๋ ์ ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ฏฟ์ ์ ์์ ์ ๋๋ก ์์ bent
๊ตฌํ์์ ๋ณผ ์ ์๋ฏ์ด ์ค์ ๋ก ์๊ฐํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ฝ์ต๋๋ค. https://github.com/mikeal/bent/tree/master/src
@mikeal ์ ๊ณฑํ๊ธฐ ํ๋ค์ด์
๊ฒฐ๊ณผ์ ์ผ๋ก ์ฝ๋ ๊ธฐ๋ฐ์ ๋ฐฉ๋ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ฒ๋ค์์๋ ์ ํ ๋ณผ ์ ์๋ Node.js์ ์๋นํ ์ข ์์ฑ์ด์ง๋ง ์ข ์์ฑ ํฌ๊ธฐ๊ฐ Node.js, ํนํ ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์์ ๋ฌธ์ ๊ฐ ๋์ง ์๋ ๊ฒ์ ์๋๋๋ค.
OP์ ๋์ด๋ 0.4kB ๋ฒ๋ค ํฌ๊ธฐ์ ํจ๊ป ์ ๊ณต๋ ๋ชจ๋ ๋์ ์ค ๊ฐ์ฅ ์์ ๊ฒ์ ๋ฌด์์ ๋๊น?
@domenic ๋ธ๋ผ์ฐ์ API๋ฅผ ์๋ฎฌ๋ ์ดํธํ๋ ๋ณต์ก์ฑ์ด ์ฃผ์ ๋ฌธ์ ์ด๋ฉฐ ๋๋ฒ๊ทธ๋ฅผ ์๋ํ ๋ ๋ถํ์ํ ์ฝ๋์ ๊ฐ์ ์ฐธ์กฐ๊ฐ ๋ง์ต๋๋ค. Blob API
๊ฐ ์๊ณ body
header marshalling
์ ๊ฑฐ์ 400ํ์ด ์์ผ๋ฉฐ ์ด๋ ๋ณด๊ณ ์์ง๋ ์์ต๋๋ค. ๋
ธ์ถ๋๋ ์ค์ API.
๋ด๊ฐ ๋งํ๋ฏ ์ด ๊ทธ๊ฒ์ ์ธ์์ ์ด์ง๋ง fetch
API๋ฅผ ์๋ฎฌ๋ ์ดํธํ๋ ๊ฒ ์ธ์ ๋ค๋ฅธ ์์
์ ์ํํ๋ ค๋ ๊ฒฝ์ฐ ๋งค์ฐ ๊ฐ๊ฒฐํ๊ณ ์๋ฆฌํ๋ฉฐ ๊ถ๊ทน์ ์ผ๋ก ๋ถํ์ํ ์ฝ๋์
๋๋ค.
@mikeal ๋น์ ์ node-fetch๊ฐ fetch API์ 100% ํธํ๋๊ธฐ ์ํด ๋ ๋ง์ ์ฝ๋๊ฐ ํ์ํ๋ค๊ณ ์ธ๊ธ์กฐ์ฐจ ํ์ง ์์์ต๋๋ค: what-wg(ํ๊ฒฝ์ ์๋ฎฌ๋ ์ด์ ํ ๋ ํ์ํ ๊ฒ)์์ ์ฝ๊ณ ์ธ ์ ์๋ ์คํธ๋ฆผ์ ์ง์ํ์ง ์์ต๋๋ค. Cloudflare ์์ ์์ฒ๋ผ.
ํ , ๋๋ ์ฌ์ ํ "0.4 kB, ํ ์ด๋ธ์ ๋ค๋ฅธ ๋ชจ๋ ํญ๋ชฉ๋ณด๋ค ์๊ณ ๊ตฌ๋ถ๋ฌ์ง ํฌ๊ธฐ์ 0.25x"๋ก "๊ถ๊ทน์ ์ผ๋ก ๋ถํ์ํ" ์ฝ๋์ "ํค"์ ์ ๊ณฑํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค(์๋ง๋ "์ค๋ฅธ์ชฝ ์ ๊ทผ" ๋ฐ "๋ฏฟ์ ์ ์์ ์ ๋๋ก ์์").
@domenic ๋ธ๋ผ์ฐ์ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ๋น๊ตํ๊ณ ์์ต๋๊น? Node.js์์ ๋๋ฒ๊น
ํ๋ ๋ณต์ก์ฑ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์์๋ ๋๋ถ๋ถ์ node-fetch
์ฝ๋๊ฐ ์กด์ฌํ์ง ์์ ๊ฒ์ผ๋ก ์์ํ๋ฏ๋ก ๋ฌด์์ ๋น๊ตํ๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
OP์ ๊ฐ์ ๋น๊ตํ๊ณ ์์ต๋๋ค. ์ด๋ป๊ฒ ์ธก์ ๋๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋ง๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ธก์ ๋์ง ์์์ ์ ์์ต๋๋ค. ์ด๋ OP๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐ ์ข์ ์ ๋ณด๊ฐ ๋ ๊ฒ์ ๋๋ค!
@domenic ์ ์, ์ด๊ฒ๋ค์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๋ฒ๋ค ํฌ๊ธฐ์ด๋ฉฐ, ๊ฒ์๋ฌผ์ด ๊ฝค ์ค๋๋์๊ธฐ ๋๋ฌธ์ bent
์์น๊ฐ ์ฌ์ ํ ์ถฉ๋ถํ ๋น์ทํ์ง๋ง ๋ง์ ๊ฒ๋ค์ด ์ต์ ์ด ์๋ ์ ์์ต๋๋ค.
@root/request - 500 LoC ๋ฐ ZERO ์ข ์์ฑ์ผ๋ก ์์ฑ๋ 80/20 ๋๋กญ์ธ ๊ต์ฒด:
์๋์ ์ผ๋ก request.js์ ๋์์ ๋ํด ๋ง๋ค๊ณ ํ ์คํธํ์ต๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ! ๋ด ํ๋ก์ ํธ์ ๋ํ ์์ฒญ์ ํฉ๋นํ ๋์ฒด๋ฅผ ์ฐพ๊ธฐ ์ํด ์ฝ๊ฐ์ ์กฐ์ฌ๋ฅผ ํ๊ณ ์์ต๋๋ค. ์ง๊ธ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ์ต๋๋ค. https://github.com/emanuelcasco/http-packages-benchmark
์ถ์ฒ๊ณผ ์๊ฒฌ์ ๋ฌผ๋ก ํ์ํฉ๋๋ค!
รs request
๋ ์ด์ ๊ณต์์ ์ผ๋ก ์ฌ์ฉ๋์ง ์์ต๋๋ค. postman-request
๋ฅผ request
๋ฐ @root/request
์ ๋ํ ์์ ํ ๋๋กญ์ธ ๋์ฒดํ์ผ๋ก ๊ณต์์ ์ผ๋ก ์ ์ํ๋ ๊ฒ์ ์ค์์ฑ์ ๋ ๊ฐ์กฐํ ์ ์์ต๋๋ค. request
์ ์ ํ๋ ํ์ ์งํฉ์ด ํ์ํ๊ณ ์๋ฅผ ๋ค์ด ์ ๊ฒฝ ์ฐ์ง ์๋ ์ฌ๋๋ค์ ์ํ $#$. ์คํธ๋ฆผ.
์ด๋ฅผ ํตํด ๋ชจ๋ ํจํค์ง ๊ด๋ฆฌ์๊ฐ request
๋ฅผ ์ญ์ ํ๊ณ ์ด ๋ฌธ์ ์ ๋ํด ๋ช ๋ถ ์ด์์ ๊ฐ๋ฐ ์๊ฐ์ ์๋นํ์ง ์๊ณ ์ ์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ์ฑ์ ๋ฆฌํฉํ ๋งํ ํ์ ์์ด ์ฑ๊ฐ์ ์ฌ์ฉ ์ค๋จ ๋ฉ์์ง๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋์ฒดํ์ด ์กด์ฌํ๋ค๋ ์ฌ์ค์กฐ์ฐจ ๊นจ๋ซ๋ ๋ฐ์๋ ์๋นํ ์๊ฐ๊ณผ ์ข์ ์ด ํ์ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์, "์ฌ์ฉ ์ค๋จ"๋ง์ผ๋ก๋ ์๋ฌด ๊ฒ๋ ์์๋์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์, ๊ธฐ์ ์ ์ผ๋ก ๋ชจ๋ ์ฌ๋์ ์ฌ์ ํ request
๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์์ผ๋ก ์์ญ ๋
๋์ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง deprecation์ด ์ฌ์ฉ๋์ด์ผ ํ๋ ๊ฒ์ ์๋๋๋ค. ์ง์ ์ค๋จ์ ๋๊ตฐ๊ฐ๊ฐ ํ๋ฌ๊ทธ๋ฅผ ๋ฝ๊ธฐ๋ก ๊ฒฐ์ ํ ๋๊น์ง ์ฌ๋๋ค์ด ์์ ์ ์ฝ๋๋ฅผ ์
๊ทธ๋ ์ด๋ํ ์ ์๋ "์ ์ ๊ธฐ๊ฐ"์ผ๋ก ํ๋์ ์ด๊ตฌํ๋ ์ญํ ์ ํด์ผ ํฉ๋๋ค.
์ ๋ "์ง์ ์ค๋จ"์ด "์ง์ ์ข
๋ฃ" ๋๋ "์ ์ง ๊ด๋ฆฌ ์ข
๋ฃ"๋ฅผ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฒ์ ์ ๋ง ์ซ์ดํฉ๋๋ค. ๊ทธ๋ฌ๋ postman-request
์ ๊ฐ์ด ๊ณต์์ ์ผ๋ก ์ง์๋๊ณ ์ ๊ทน์ ์ผ๋ก ์ ์ง๋๋ ๊ธฐ๋ฅ์ด ํฌํจ๋ ๋๋กญ์ธ ๊ต์ฒด๊ฐ ์๋ค๋ฉด ๊ตฌ์
ํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๊ท์ฐฎ์ ๊ฒ์
๋๋ค.
์ฌ์ค, ์ด ํจํค์ง์ ์ ์ง ๊ด๋ฆฌ๋ฅผ ์ฐํธ ๋ฐฐ๋ฌ๋ถ ํ์ ๋๊ธธ ์๊ฐ์ ํ ์ฌ๋์ด ์์ต๋๊น? request
๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋์ postman-request
๋ฅผ request
๋ก ์ด์ํ๊ณ ์๋ก์ด ๊ณต์ ์ ์ง ๊ด๋ฆฌ์๊ฐ ๋๋๋ก ์ ์ํ์ง ์์ผ์๊ฒ ์ต๋๊น?
์ฌ๊ธฐ์์ ๋ด ์์ ๋์๊ด ์ ํ๋ณดํ๊ฒ ๋์ด ์ฃ์กํฉ๋๋ค.
nodejs์์๋ง ์ฌ์ฉํ๋๋ก ์ค๊ณ
const http = require('@zhangfuxing/http');
const assert = require('assert');
(async () => {
// http
const httpRes = await http.get('http://baidu.com');
assert(httpRes.includes('<html>'));
// https
const httpsRes = await http.get('https://cnodejs.org/api/v1/topics?limit=1&mdrender=false');
assert(httpsRes.success === true);
// download file: use pipe
const fs = require('fs');
const res = await http.get('http://localhost:3000', {
responseType: "stream"
})
res.pipe(require('fs').createWriteStream('zfx.txt'))
// or use pipeline
const stream = require('stream');
const util = require('util');
const pipeline = util.promisify(stream.pipeline);
const res = await http.get(`${url}/stream`, {
responseType: "stream"
});
await pipeline(res, fs.createWriteStream('zfx.txt'));
// post Buffer
const res = await http.post('http://localhost/upload', Buffer.from('abc'));
assert(res.success === true);
// post Stream
const fs = require('fs');
const readStream = fs.createReadStream('./index.js');
const res = await http.post('http://localhost/upload', readStream);
assert(res.success === true);
// post json
const data = {
username: 'zfx',
password: 'password'
};
const res = await http.post('http://localhost/upload', data);
assert(res.success === true);
// post application/x-www-form-urlencoded
const data = {
username: 'zfx',
password: 'password'
};
const options = {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
};
const res = await http.post('http://localhost/upload', data, options);
assert(res.success === true);
// post FormData
const FormData = require('form-data');
const form = new FormData();
const fs = require('fs');
const readStream = fs.createReadStream('./index.js');
form.append('my_field', 'my value');
form.append('my_buffer', Buffer.from('abc'));
form.append('my_file', readStream);
// Set filename by providing a string for options
form.append('my_file', readStream, '1.js' );
// provide an object.
form.append('my_file', readStream, {
filename: 'bar.jpg',
contentType: 'image/jpeg',
knownLength: 19806
});
const formHeaders = form.getHeaders();
const res = await http.post('http://localhost/upload', form, {
headers: {
...formHeaders,
},
});
assert(res.success === true);
// head
const res = await http.head(url);
assert(res.statusCode === 200);
assert(res.statusMessage === 'OK');
assert(res.headers && typeof res.headers === 'object');
assert(res.statusCode === 200);
assert(res.data === '');
// options
const res = await http.options(url);
assert(res === 'GET,HEAD,POST,PUT,PATCH,DELETE');
})().catch(console.error);
์ฒ์๋ถํฐ TS๋ก ์์ฑ๋ ๊ฒ์ ๊ฐ์ํ ๋ ์ต์ ์ ํ ์คํฌ๋ฆฝํธ SPA๋ฅผ ๊ตฌ์ถํ๋ ๊ฒฝ์ฐ Wretch ๊ฐ ์ต์์ ์ต์ ์ด๋ผ๋ ๊ฒ์ ์์์ต๋๋ค. ์ฌ์ค์ Axios์ ๋์ผํ ๊ธฐ๋ฅ์ด๋ฉฐ ์ถ๊ฐ ๋ฏธ๋ค์จ์ด ๋ฅผ ์ง์ํฉ๋๋ค. API๋ Ky์ ๋นํด ๋ช ๊ตฐ๋ฐ ๋ ์ข์ ๊ฒ ๊ฐ์์.
์ด๋ค ์ค ์ด๋ค ๊ฒ์ด http2๋ฅผ ์ง์ํฉ๋๊น?
@sakalys got
์๋ ์คํ์ ์ธ HTTP2 ์ง์์ด ์์ผ๋ฉฐ, ์ด๋ ๋ค์ ์ฃผ์ ๋ฆด๋ฆฌ์ค(๊ณง ์ถ์)์์ ๋ด์ฅ๋์ด ์์ ์ ์ผ๋ก ์ ๊ณต๋ ์์ ์
๋๋ค.
๊ฑฐ์ ๋๋กญ ์ธ ๊ต์ฒด?
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฒ์ ๋ณด๋ ์ ๋ง ์ฌํ๋๋ค. ๋๋ axios๋ฅผ ์ข์ํ์ง๋ง ์ด๋ค ๋ชฉ์ ์ผ๋ก ์ , ๋์ ์ฒซ ๋ฒ์งธ ์ ํ์ ์์ฒญ์ด์์ต๋๋ค.
์ด๋ฌํ ์ง์ ์์ฒญ ํ์ด๋ฐ์ด ์์ต๋๊น? ์ฒซ ๋ฒ์งธ ๋ฐ์ดํธ๊น์ง์ ์๊ฐ, ๋คํธ์ํฌ ์ง์ฐ ๋ฑ?
ํ๋ก์ ํธ์ ์์ฒญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ํ์ด๋ฐ์ด ์ค์ํฉ๋๋ค.
Google์ gaxios๋ฅผ ์ ๊ณตํฉ๋๋ค. https://github.com/googleapis/gaxios - ๋ ธ๋ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ํตํ axios API
$
got
readme์์got
,request
,node-fetch
,axios
,superagent
๋ฅผ ์ ๋น๊ตํ์ต๋๋ค. : https://github.com/sindresorhus/got#comparison
_(๋ถ์ ํํ ๋ด์ฉ์ด ์์ผ๋ฉด PR ํ์ํฉ๋๋ค. ์ต๋ํ ์ค๋ฆฝ์ ์ผ๋ก ์ ์งํ๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค.)_Got์๋
request
์์ ์ด๋ํ๊ธฐ ์ํ ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋๋ ์์ต๋๋ค. https://github.com/sindresorhus/got/blob/master/migration-guides.md
request
์์ ๋ค์์ผ๋ก ์ด๋ํ๊ธฐ ์ํ Got์ ๋ง์ด๊ทธ๋ ์ด์
๊ฐ์ด๋๊ฐ _์ด๋_ํ์ต๋๋ค.
https://github.com/sindresorhus/got/blob/master/documentation/migration-guides.md
์ฐํธ ๋ฐฐ๋ฌ๋ถ ์์ฒญ์ ์ถ๊ฐํ๋๋ก ์ ์ํ ์ ์์ต๋๊น? ๋ค์ ํ๋ก์ ํธ์์ ์ด๊ฒ์ ์๋ํ ๊ฒ์ ๋๋ค. ์ด์จ๋ , ์ด๊ฒ์ ๋ฌธ์์ ๊ทธ๊ฒ์ ๋ํด ๋งํ ๊ฒ์ ๋๋ค ...
Postman Runtime ๋ด์์ ์ฌ์ฉ๋๋ ์ฐ์ํ ์์ฒญ ๋ชจ๋์ ํฌํฌ์ ๋๋ค. ์์ฒญ์์ ์์ ๋์ง ์์ ๋ช ๊ฐ์ง ๋ฒ๊ทธ์์ ์ด ํฌํจ๋์ด ์์ต๋๋ค.
Redaxios๋ ๊ธฐ๋ณธ ๊ฐ์ ธ์ค๊ธฐ https://github.com/developit/redaxios ๋ฅผ ์ฌ์ฉํ๋ 800๋ฐ์ดํธ์ ๊ฐ์ต๋๋ค.
์ด๋ฐ!! ๋๋ 3์๊ฐ ๋์ ๋ด ์ฝ๋๋ฅผ ๊ณ์ํด์ ํ์ธํ๋ฉด์ ์ด๊ฒ์ ์์๋ด๊ณ ์์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋์๊ฒ ์ค๋ฅ 404๋ฅผ ์ฃผ์๊ณ , ๋๋ ์ข์ ํ์ต๋๋ค. ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. ๋๋ Fetch์ ํจ๊ป ๊ฐ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
https://www.npmjs.com/package/teeny-request ๋ Google API์์ ์ฌ์ฉํ๋ ๋ ๋ค๋ฅธ ์ต์ ์ ๋๋ค.
์์ฒญ๊ณผ ๋น์ทํ์ง๋ง ํจ์ฌ ์๊ณ ์ต์ ๋ ์ ์ต๋๋ค. ํ๋ ์๋์์ ๋ ธ๋ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์์ฒญ์ ์ฌ์ฉํ ์์น์ ํ๋๋ค. ๋ชจ๋์ ๋ก๋ ๋ฐ ๊ตฌ๋ฌธ ๋ถ์ ์๊ฐ์ ๊ฐ์ ํฉ๋๋ค.
node-fetch
๋๋ ํ์ฌ PostMan์์ ์ ์ง ๊ด๋ฆฌํ๋ requests
์ ๋ถ๊ธฐ ๋ฒ์ ์ด ๋ ๋ซ์ต๋๋ค. ์ ๋ ์ด์ ๋ง Node ์ฌ์ ์ ์์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ ๊ฒ์ด ํ์ํฉ๋๋ค.
axios์ ์๊ฐ ์ด๊ณผ๋ ์์ ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค๐๐ฟ
์ฌ๊ธฐ์ ํ์ด ๋ณด์ด์ง ์์ ๋งค์ฐ ๋๋์ต๋๋ค.
url-request
๋ ์ด๋ป์ต๋๊น?
url-request
๋ ์ด๋ป์ต๋๊น?
์์ง ์ฝ๊ฐ ์ด๋ฆฌ๊ณ (1์ผ!) ์ผ๋ถ ๊ธฐ๋ฅ์ด ๋ถ์กฑํ์ง๋ง ์ ๋งํด ๋ณด์ ๋๋ค.
@cjk ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค. ์ด๋ค ๊ธฐ๋ฅ์ด ๋ง์์ ๋์๋์? ์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ง์ํด ์ฃผ์ ๋ค๋ฉด.
๋น ๋ฅธ Q. ๊ธฐ๋ณธ nodejs http ๋์ ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ค ์ด์ ์ด ์์ต๋๊น?
@cgarrovillo ์์ ์ฝ๋ => ๋ ๋ง์ ์ํฅ
url-request ๋ฅผ ์๋ํ๊ณ ๊ธฐ๋ฅ ์ธํธ์ ๊ฐ๋ฅ์ฑ์ ์ดํด๋ณด์ธ์ ๐ค
@cjk ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค. ์ด๋ค ๊ธฐ๋ฅ์ด ๋ง์์ ๋์๋์? ์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ง์ํด ์ฃผ์ ๋ค๋ฉด.
@Debdut ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์๊ฐํ๊ณ ์์ต๋๋ค.
url-request
๋ฌธ์์์ ์ง์๋๋ ํญ๋ชฉ๊ณผ ๋ฐฉ๋ฒ์ด ๋ช
ํํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ๋น์ ์ด ์ ๊ณตํ๋ ๋ง์ ์๋ฅผ ์ข์ํ์ต๋๋ค!
์๋์ด ์ค์ง๋ ๋๊น์ง ์์ฒญ์ ๊ณ์ ์ฌ์ฉํ์ธ์.
Angular rxjs์์ ๊ด์ฐฐ ๊ฐ๋ฅํ๊ณ ์ฐ์ํฉ๋๋ค.
๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ฒญ๊ณผ ๊ฐ์ ์ฟ ํค ํญ์๋ฆฌ๊ฐ ์์ต๋๊น?
ํ ์คํธ ๋ ธ๋๊ฐ ๋นจ๊ฐ์์ธ HTTP ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ป์์ต๋๋ค. โ
๊ฒฐ๊ณผ
HTTP ์์ฒญ์ ์ํํ ๋ ์ ์๋ํฉ๋๋ค. (๋จ์ผ ํ
์คํธ๋ฅผ ํ๋ค).
HTTPS ์์ฒญ์ ํ ๋ ์คํจ โ . ๋๋ ์ป์๋ค :
RequestError: connect ECONNREFUSED 127.0.0.1:443
์ฒ์์๋ ์ด๊ฒ์ด node-red env์ ๊ด๋ จ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๋์ค์ ์ด๊ฒ์ด got repo: https://github.com/sindresorhus/got/issues/1414 ์ ๊ณต๊ฐ ๋ฌธ์ ์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๐
๊ทธ๋ฆฌ๊ณ ์ ์๊ฐ์๋ _axios_ ๋์ ์ฌ์ฉํ ์ด์ ๊ฐ ์ถฉ๋ถํฉ๋๋ค. โ
๋จ์ง ๋น์ ์ด ์๊ณ ์ถ์์ต๋๋ค.
@damdauvaotran ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ฒญ๊ณผ ๊ฐ์ ์ฟ ํค ํญ์๋ฆฌ๊ฐ ์์ต๋๊น?
๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋ got.js๋ฅผ ์ฐธ์กฐํ์ธ์.
gaxios ๊ฐ ์ธ๊ธ๋์ง ์์ ์ด์ ๋ ๋ฌด์์ ๋๊น?
FWIW, ์ฌ๊ธฐ์ ๋งจ ์์ ์ธ๊ธ๋ ๋ชจ๋ ํ๋ก์ ํธ๋ฅผ ๋น๊ตํ๋ NPM ๋ํฅ ๋งํฌ ๊ฐ ์์ต๋๋ค. ๊ฒฐ์ ์ ๊ด๋ จ๋ ์ ์ผํ ์์๋ ์๋์ง๋ง ์ธ๊ธฐ๋๋ ์ฐ๋ฆฌ์ ๋๋ถ๋ถ์ ํ๋ก์ ํธ์์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ด ๊ธ์ ์ฐ๋ ์์ ์์ node-fetch
๊ฐ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋์์
๋๋ค.
ํฅ๋ฏธ๋ก์ด @ericsnap ... node-fetch ๋ฐ axios๋ ๊ฐ๊ฐ ์ธ๊ธฐ 1์์ 3์(๊ฑฐ์ 2์)์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ gaxios ๋ฌธ์ ์์ ๋ค์ ์คํธ๋ฉ๋ผ์ธ์ ์ฃผ๋ชฉํฉ๋๋ค.
node-fetch ์์ ์ธํฐํ์ด์ค์ ๊ฐ์ axios๋ฅผ ์ ๊ณตํ๋ HTTP ์์ฒญ ํด๋ผ์ด์ธํธ
๋ฐ๋ผ์ gaxios๋ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฒฐํฉํฉ๋๋ค. ๋๋ gaxios๋ก ์ ํํด ์์ผ๋ฉฐ ์ฌ์ฉํ๋ ๊ฒ์ด ๋งค์ฐ ์ฌ๋ฏธ์์ต๋๋ค.
https://www.npmtrends.com/node-fetch-vs-got-vs-axios-vs-superagent
ํ์ฌ ์์ฒญ ๋์์ ๊ฒํ ํ ํ @sindresorhus ์ ๋ฐ์ด๋ค์์ต๋๋ค. API์ ์ต์ํด์ง๋ ๋ฐ ํ๋ฃจ ์ ๋ ๊ฑธ๋ ธ์ต๋๋ค(๋ฌธ์๋ ์๋นํ ์ข์์ต๋๋ค). extend
๋ก ์ธํด LoC๊ฐ ํฌ๊ฒ ๊ฐ์ํ๊ณ ํ ๊ณณ์์ ๋๋ฌด ๋ง์ ๊ฒ์ ์ค์ ํ๋ฉด ํธ์ถ ์ฌ์ดํธ ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์์์ LoC์ ๋ถ๊ณผํฉ๋๋ค. ์์ฒญ, ์์ฒญ-์ฝ์, ์์ฒญ-์ฝ์ ๋ค์ดํฐ๋ธ ๋์ค๋ณด๋ค ํจ์ฌ ๋งค๋๋ฝ๊ฒ ๋๊ปด์ง๋๋ค. ํ๋ฅญํ ๊ธฐ๋ฅ ์ธํธ๋ ์์ต๋๋ค. @sindresorhus ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!
๋ง์ด๊ทธ๋ ์ด์ ์ ๊ธฐ๋ํ์ง ์์์ง๋ง ์ง๊ธ์ ํจ์ฌ ๊นจ๋ํด์ก์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
ํ ์ด๋ธ์ ๋ค์ ์ด์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด ์์น๋ฅผ ๋๋ํ ๋๊ณ ๋ณด๋ฉด ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋งค์ฃผ ์์ฒ ๊ฐ์ ๋ณ๊ณผ ์๋ฐฑ๋ง ๊ฐ์ ๋ค์ด๋ก๋๋ฅผ ๊ธฐ๋กํ์ง๋ง ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ฐฑ ๊ฐ์ ๋ฌํฉ๋๋ค.
๋ด 2์ผํธ, ๋ฌด์ํ๊ณ ๋์ด๊ฐ๋ ๋ฉ๋๋ค. ๋๊ธ์ ์์ ํ๊ฑฐ๋ ์ด์๋ฅผ ์ ๊ธฐํ ํ์๊ฐ ์์ต๋๋ค.