API

ํ•™์Šต ํ‚ค์›Œ๋“œ

  • URL๊ตฌ์กฐ

  • API

  • REST API

    • HTTP Method(CRUD)

  • GraphQL

  • Fetch API

    • Promise

    • ReableStream

    • Unicode

  • CORS

    • ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…

API

๐ŸŒŽ URL ๊ตฌ์กฐ

  • Uniform Resource Locators ์˜ ์•ฝ์ž

  • HTML,css ๋ฌธ์„œ, ์ด๋ฏธ์ง€ ๋“ฑ ๋ฆฌ์†Œ์†Œ์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ฃผ์†Œ

  • URL์€ Scheme(=Protocol), Domain Name(=IP), Port, Path, Parameter, Anchor๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

URL

Scheme(=Protocol)__

  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ

  • ์›น์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•œ ๋ฐฉ์‹์œผ๋กœ HTTP/HTTPS ํ”„๋กœํ† ์ฝœ์ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ ๋จ

  • HTTPS/HTTP ์™ธ์—๋„ mailto:(์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ), ftp:(ํŒŒ์ผ์„ ์ฃผ๊ณ  ๋ฐ›๋Š” ํ”„๋กœํ† ์ฝœ) ๋“ฑ ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์ด ์กด์žฌ

    • HTTP(Hyper Text Transfer Protocol): ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์„œ๋ฒ„๊ฐ€ ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ํ†ต์‹ ๊ทœ์•ฝ

    • HTTPS(Hyper Text Transter Protocol Secure): HTTP์—์„œ ๋ณด์•ˆ์ด ๊ฐ•ํ™”๋œ ๋ฒ„์ „

ํ”„๋กœํ† ์ฝœ์ด๋ž€? ์ค‘์•™ ์ปดํ“จํ„ฐ์™€ ๋‹จ๋ง๊ธฐ ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ์›ํ™œํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํ†ต์‹  ๊ทœ์•ฝ

Domain Name (๋„๋ฉ”์ธ)

  • ์ปดํ“จํ„ฐ์™€์˜ ํ†ต์‹ ์—์„œ๋Š” ์ˆซ์ž๋กœ ํ‘œํ˜„๋œ ์ฃผ์†Œ(=IP)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๊ฐ€ ์‰ก๊ฒŒ ๊ธฐ์–ตํ•˜๊ณ  ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ค€ ์„œ๋น„์Šค๊ฐ€ ๋„๋ฉ”์ธ์ด๋‹ค.

https://www.naver.com (ํ˜ธ์ŠคํŠธ๋ช…(์ฐจ์ƒ์œ„ ๋„๋ฉ”์ธ/์„œ๋ธŒ ๋„๋ฉ”์ธ) - ๋„๋ฉ”์ธ๋ช… - ์ตœ์ƒ์œ„ ๋„๋ฉ”์ธ๋ช…)

  • www: ํ˜ธ์ŠคํŠธ๋ช…(์ฐจ์ƒ์œ„ ๋„๋ฉ”์ธ/์„œ๋ธŒ ๋„๋ฉ”์ธ)

    • ๋ณด์กฐ ๋„๋ฉ”์ธ์œผ๋กœ์จ URL๋กœ ์ „์†กํ•˜๊ฑฐ๋‚˜ ๊ณ„์ • ๋‚ด์˜ IP ์ฃผ์†Œ๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ํฌ์›Œ๋”ฉ๋˜๋Š” ๋„๋ฉ”์ธ ์ด๋ฆ„์˜ ํ™•์žฅ์ž

  • naver: ๋„๋ฉ”์ธ๋ช…

    • ์ž„์˜๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ์˜ ์ด๋ฆ„

    • ์‚ฌ์šฉ์ž์—๊ฒŒ ์‰ฝ๊ฒŒ ๊ธฐ์–ต ๋  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋น„์Šค๋ช…์œผ๋กœ ์ง€์ •์—์„œ ์‚ฌ์šฉ

  • com: ์ตœ์ƒ์œ„ ๋„๋ฉ”์ธ๋ช…

    • ๋„๋ฉ”์ธ ๋ ˆ๋ฒจ ์ค‘ ๊ฐ€์žฅ ๋†’์€ ๋‹จ๊ณ„์— ์žˆ๋Š” ๋„๋ฉ”์ธ

    • ๋„๋ฉ”์ธ์˜ ๋ชฉ์ , ์ข…๋ฅ˜, ๊ตญ๊ฐ€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

localhost : ์ž์‹ ์˜ ์ปดํ“จํ„ฐ๋ฅผ ์˜๋ฏธ(์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฃจํ”„๋ฐฑ)

Port

  • ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์„œ๋ฒ„๋ฅผ ์ด์šฉํ• ์ง€ ๊ฒฐ์ •ํ•˜๋ฉฐ, : (์ฝœ๋ก ) ๋’ค์— ๋‚˜์˜จ๋‹ค

  • URL์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ‘œ์ค€ ํฌํŠธ๋ฒˆํ˜ธ๊ฐ€ ์ƒ๋žต๋˜์–ด ์žˆ๋‹ค.(HTTP์˜ ๊ฒฝ์šฐ 80, HTTPS์˜ ๊ฒฝ์šฐ 443)

Path

Parameter

  • ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง

  • ? ๋ฌผ์Œํ‘œ ๋’ค์— ๋‚˜์—ด๋˜๊ณ , &๊ธฐํ˜ธ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์กด์žฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ?key=value&key=value

๐Ÿ“– API๋ž€?

  • Application Programming Interface

  • ์„œ๋กœ ๋‹ค๋ฅธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜(ํ”„๋กœ๊ทธ๋žจ)์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋งค๊ฐœ์ฒด(= ์ผ์ข…์˜ ๊ทœ์•ฝ)

  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ์ „์†ก ํ†ต์‹ ์„ ์œ„ํ•œ ๊ทœ์น™์ด๋‚˜ ๋ฃฐ,

  • ๋Œ€ํ‘œ์ ์œผ๋กœ ์›นAPI, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API๊ฐ€ ์žˆ๋‹ค.

๐Ÿ“– REST API ๋ž€?

  • REST ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋น„์Šค API๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ

  • REST๋Š” ์ž์› ๊ธฐ๋ฐ˜์˜ ๊ตฌ์กฐ(ROA, Resource Oriented Architecture) ์„ค๊ณ„์˜ ์ค‘์‹ฌ์— Resource๊ฐ€ ์žˆ๊ณ  HTTP Method๋ฅผ ํ†ตํ•ด Resource๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋œ ์•„ํ‚คํ…์ณ๋ฅผ ์˜๋ฏธ

    • URL๊ณผ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ต‰์žฅํžˆ ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ โ‡’ ๊ฐœ๋ฐœ์ž ์นœํ™”์ ,๋‹จ์ˆœํ•จ

    • ์บ์‹ฑ์„ ์ง€์›ํ•˜๊ธฐ์— ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ ์ˆ˜๋ฅผ ์ค„์ž„์œผ๋กœ์จ API์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. โ‡’ ์‘๋‹ต์—๋Š” ์บ์‹ฑ ๊ฐ€๋Šฅ ์—ฌ๋ถ€์™€ ๊ธฐ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ์บ์‹ฑ ํ—ค๋”๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ

    • ๊ตฌ์ถ•, ํ…Œ์ŠคํŠธ ๋ฐ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๋„๊ตฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋” ์‰ฝ๋‹ค.

    • ์›น ๋ธŒ๋ผ์šฐ์ €, ๋ชจ๋ฐ”์ผ ์žฅ์น˜ ๋ฐ IoT ์žฅ์น˜ ๋“ฑ ๊ด‘๋ฒ”์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋ฒ„์™€ ํ˜ธํ™˜์ด ๊ฐ€๋Šฅ โ‡’ ํ˜ธํ™˜์„ฑ ์šฐ์ˆ˜

    • ๊ฐ ๋ฆฌ์†Œ์Šค๋Š” ๊ณ ์œ  ์‹๋ณ„์ž(URI)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ํ‘œ์ค€ HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE) ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โ‡’ ๋ฆฌ์†Œ์Šค ์ง€ํ–ฅ์ 

๐Ÿค– HTTP Method(CRUD)

  • ์„œ๋ฒ„๊ฐ€ ์ˆ˜ํ–‰ ํ•ด์•ผ ํ•  ๋™์ž‘์„ ์ง€์ • ํ•˜์—ฌ ์š”์ฒญ(request)์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•

  • ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ : GET,POST,PUT,DELETE + PATCH

  • Read๋Š” Collection(๋ณต์ˆ˜)๊ณผ Item(Element)(๋‹จ์ˆ˜)๋กœ ๋‚˜๋‰จ

    1. Create (Collection Pattern ํ™œ์šฉ) โ†’ POST/products โ‡’ ์ƒํ’ˆ ์ถ”๊ฐ€ (JSON ์ •๋ณด ํ•จ๊ป˜ ์ „๋‹ฌ)

    2. Read (Collection) โ†’ GET /products โ‡’ ์ƒํ’ˆ ๋ชฉ๋ก ํ™•์ธ

    3. Read (Item) โ†’ GET /products/{id} โ‡’ ํŠน์ • ์ƒํ’ˆ ์ •๋ณด ํ™•์ธ

    4. Update (Item) โ†’ PUT(๋ฎ์–ด์“ฐ๊ธฐ) ๋˜๋Š” PATCH(์ผ๋ถ€ ๋ณ€๊ฒฝ) /products/{id} โ‡’ ํŠน์ • ์ƒํ’ˆ ์ •๋ณด ๋ณ€๊ฒฝ (JSON ์ •๋ณด ํ•จ๊ป˜ ์ „๋‹ฌ)

    5. Delete (Item) โ†’ DELETE /products/{id} โ‡’ ํŠน์ • ์ƒํ’ˆ ์‚ญ์ œ

๐Ÿ“– GraphQL ๋ž€?

  • API๋ฅผ ์œ„ํ•œ ์ฟผ๋ฆฌ ์–ธ์–ด(Query Language)์ด๋ฉฐ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋Ÿฐํƒ€์ž„

    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ™•ํžˆ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์„ ์ค„์ด๊ณ  API์˜ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

    • ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค์™€ ๊ด€๊ณ„๋ฅผ ํฌํ•จํ•˜๋Š” ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์ฟผ๋ฆฌ ์ค‘์ฒฉ์„ ํ†ตํ•ด ๊ณ„์ธต์  ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. โ‡’ ์œ ์—ฐํ•œ ์ฟผ๋ฆฌ

    • ๋ฒ„์ „๊ด€๋ฆฌ ์œ ์šฉ

    • RestAPI์˜ ๊ฒฝ์šฐ ๋ฐฑ์—”๋“œ ์ธก์—์„œ ๋ชจ๋“  URL์„ ๊ฐœ๋ฐœํ•˜์ง€ ์•Š์œผ๋ฉด ์ž‘์—… ์ž์ฒด๊ฐ€ ์‚ฌ์‹ค์ƒ ๋ถˆ๊ฐ€๋Šฅ ํ•˜์ง€๋งŒ, ์ฟผ๋ฆฌ ํ…Œ์ŠคํŒ…์„ ์œ„ํ•œ GraphiQL๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ์ง€์›ํ•˜์—ฌ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

REST API vs GraphQL

RestAPI์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ผ์ผ์ด ๊ฐœ๋ฐœํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋Œ€์‘ํ•ด์•ผ ํ•˜๊ธฐ์— ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฌ๊ณ , GraphQL์˜ ๊ฒฝ์šฐ์—๋Š” ์›์น™์ ์œผ๋กœ Multipart ๋ฐฉ์‹์˜ ์ „์†ก์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๊ธฐ์— ์ด๋ฏธ์ง€, ์˜์ƒ ๋“ฑ์˜ ์ฒ˜๋ฆฌ์— ๊ต‰์žฅํžˆ ์•ฝํ•œ ๋ชจ์Šต์„ ๋ณด์ธ๋‹ค.

โ‡’ ์ธ์ฆ, ์™ธ๋ถ€ ์„œ๋ฒ„์™€์˜ ์—ฐ๋™ ๋“ฑ์€ Rest API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ์ •๋ณด๋ฅผ ์†ก์ˆ˜์‹  ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” GraphQL์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ์ ˆํ•˜๊ฒŒ ๊ฐœ๋ฐœ์˜ ๊ท ํ˜•์„ ๋งž์ถ”์–ด ๋ณด์ž!

โœ๐Ÿป ์ •๋ฆฌ

  • REST API ์™€ GraphQL ๋‘˜ ๋‹ค ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๋ชฉ์ ํ•œ๋‹ค.

  • API ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ์‹

  • GraphQL๊ณผ REST์˜ ์žฅ๋‹จ์ ์„ ํŒŒ์•…ํ•ด ์„œ๋น„์Šค์— ๋งž๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ฅด๋Š” ๊ฒƒ์ด ์ค‘์š”

๐Ÿ”— ์ฐธ๊ณ 

๐Ÿ“– Fetch API

  • ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜๋Š” Web API

  • ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์ธก์—์„œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ €์— ๋‚ด์žฅ๋œ fetch() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ• ์‹คํ—˜

fetch('http://localhost:3000/products');
// โ†’ Promise

fetch ํ•จ์ˆ˜๋Š” HTTP response ๊ฐ์ฒด๋ฅผ ๋ž˜ํ•‘ํ•œ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

fetch('http://localhost:3000/products')
  .then(response => console.log(response));

const response = await fetch('http://localhost:3000/products');
// โ†’ Response

๋”ฐ๋ผ์„œ ํ”„๋กœ๋ฏธ์Šค์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์ธ then(await)์„ ์‚ฌ์šฉํ•˜์—ฌ resolveํ•œ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

Response {
  __proto__: Response {
    type: 'basic',
    url: 'http://localhost:3000/products',
    redirected: false,
    status: 200,
    ok: true,
    statusText: '',
    headers: Headers {},
    body: ReadableStream {},
    bodyUsed: false,
    arrayBuffer: ฦ’ arrayBuffer(),
    blob: ฦ’ blob(),
    clone: ฦ’ clone(),
    formData: ฦ’ formData(),
    json: ฦ’ json(),
    text: ฦ’ text(),
    constructor: ฦ’ Response()
  }
}

fetch ํ•จ์ˆ˜๋กœ ๋ฐ›์€ Response ๊ฐ์ฒด์—๋Š” HTTP ์‘๋‹ต์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ๋“ค์ด ์žˆ๋‹ค. Response ๊ฐ์ฒด์˜ body์—๋Š”ReadableStream์˜ ๋‚ด์šฉ์ด ๋“ค์–ด์žˆ๋‹ค.

const reader = response.body.getReader();

const chunk = await reader.read();
// โ†’ chunk.value๋Š” Uint8Array ํƒ€์ž…
// โ†’ ์›๋ž˜๋Š” chunk.done์ด true์ผ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด์•ผ ํ•จ

const body = new TextDecoder().decode(chunk.value);

const data = JSON.parse(body);

.getReader()๋ฅผ ํ†ตํ•ด Reader ๊ฐ์ฒด๋ฅผ ์–ป์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ chunk.value๋Š” Uint8Array ํƒ€์ž…์œผ๋กœ string์œผ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค. TextDecoder๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ์ž์—ด๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

fetch('http://example.com/movies.json')
  .then((res) => res.json())
  .then((data) => console.log(data));
const response = await fetch('http://example.com/movies.json'); 
const data = await response.json()

json() ๋‚ด์žฅ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ, res.json ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ์‹œ HTTP ์‘๋‹ต body ํ…์ŠคํŠธ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ฐ”๊พผ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (์ž์ฃผ ์ผ๋˜ .then(res โ‡’ res.json())์˜ ์˜๋ฏธ์˜€๋‹ค)

๐Ÿ“– Promoise๋ž€?

  • ๋น„๋™๊ธฐ ์—ฐ์‚ฐ์ด ์ข…๋ฃŒ๋œ ์ดํ›„์— ๊ฒฐ๊ณผ ๊ฐ’๊ณผ ์‹คํŒจ ์‚ฌ์œ ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ์—์„œ ๋งˆ์น˜ ๋™๊ธฐ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋‹ค๋งŒ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ๋ฏธ๋ž˜์˜ ์–ด๋–ค ์‹œ์ ์— ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๊ฒ ๋‹ค๋Š” '์•ฝ์†'(ํ”„๋กœ๋ฏธ์Šค)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿ“– CORS(Cross-Origin Resource Sharing)

  • ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ 

  • ์ถœ์ฒ˜๋Š” '์˜ค๋ฆฌ์ง„origin'์˜ ๋ฒˆ์—ญ์˜ ํ‘œํ˜„์œผ๋กœ URL์—์„œ ๋„๋ฉ”์ธ๋งŒ ๋œปํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ํ”„๋กœํ† ์ฝœ๊ณผํฌํŠธ๊นŒ์ง€ ํฌํ•จํ•˜๋Š” ๊ฐœ๋…

  • ์ถœ์ฒ˜๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์„ธ ์š”์†Œ ํ”„๋กœํ† ์ฝœ/๋„๋ฉ”์ธ(ํ˜ธ์ŠคํŠธ์ด๋ฆ„)/ํฌํŠธ๋กœ ์ด์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋‹ค๋ฅด๋ฉด CORS ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋œ๋‹ค.

  • CORS๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜๋ผ๋„ ๋ฆฌ์†Œ์Šค ์š”์ฒญ,์‘๋‹ต์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ •์ฑ…์„ ์˜๋ฏธ

์ฆ‰, '์ถœ์ฒ˜๊ฐ€ ๊ต์ฐจํ•œ๋‹ค'๋ผ๋Š” ์˜๋ฏธ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ ค๋Š” '๋‘ ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ์˜๋ฏธ' CORS๋ฅผ ์„ค์ •ํ•œ๋‹ค๋Š” ๊ฑด '์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅธ ์„œ๋ฒ„๊ฐ„์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ '๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

โญ๏ธ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์‚ฌ์‹ค!!

  • ์ด๋ ‡๊ฒŒ ์ถœ์ฒ˜๋ฅผ ๋น„๊ตํ•˜๋Š” ๋กœ์ง์ด ์„œ๋ฒ„์— ๊ตฌํ˜„๋œ ์ŠคํŽ™์ด ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ์ŠคํŽ™์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

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

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

๐Ÿค” CORS๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€?

  • ๊ทผ๋ณธ์ ์œผ๋กœ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‘๋‹ต ํ—ค๋”์— ์˜ฌ๋ฐ”๋ฅธ Acccess-Control-Allow-Origin์ด ๋‚ด๋ ค์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์„ธํŒ…ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

  • ํ”„๋ก์‹œ ์„œ๋ฒ„ ์‚ฌ์šฉํ•˜๊ธฐ

๐Ÿ”— ์ฐธ๊ณ 

Last updated