[TIL] 0608 | React with Redux, Next.js, TypeScript

Teasanยท2022๋…„ 6์›” 8์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
4/36
post-thumbnail

๋ชฉ์ฐจ

  • ๋ฆฌ์•กํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์†Œํ†ตํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์‹œ์ž‘ ์•ฑ ๋ฐ ๋ฐฑ์—”๋“œ
  • GET ์š”์ฒญ ๋ณด๋‚ด๊ธฐ

โœง ๋ฆฌ์•กํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์†Œํ†ตํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ๋ฆฌ์•กํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์–ด๋–ป๊ฒŒ ์†Œํ†ต์„ ํ• ๊นŒ? ๋ฆฌ์•กํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์†Œํ†ต์„ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ๋‚˜๋งˆ ์ดํ•ดํ•˜๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋ฆฌ์•กํŠธ ์•ฑ์ด๋‚˜ ์ผ๋ฐ˜์ ์ธ ๋ธŒ๋ผ์šฐ์ € ์•ฑ ์ฆ‰, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ง์ ‘ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์‚ฌ์‹ค ๋˜ํ•œ ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ง์ ‘ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์—†๋‹ค

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

์ง์ ‘์ ์œผ๋กœ ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์— ์˜ํ•œ ๋ณด์•ˆ ์ด์Šˆ

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

๋ฐฑ์—”๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ํ†ต์‹ 

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

โœง ์‹œ์ž‘ ์•ฑ ๋ฐ ๋ฐฑ์—”๋“œ

  • ์šฐ๋ฆฌ๋Š” ๋”๋ฏธ ๋ฐ์ดํ„ฐ ๋Œ€์‹ , ์‹ค์ œ๋กœ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋”๋ฏธ ์•ฑ API ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” SWAPI ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. SWAPI๋Š” ๋ฐฑ์—”๋“œ ์•ฑ์ด๊ณ  API ์ด๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ง์ ‘ ์†Œํ†ตํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ์•ž์„œ ๊ฑฐ๋ก ํ•ด์™”๋‹ค.)

    ์‹ค์Šต์šฉ ๋”๋ฏธ ๋ฐ์ดํ„ฐ API - swapi

API(Application Programming Interface)

  • ํ•ด๋‹น ์‚ฌ์ดํŠธ์— ๊ธฐ์žฌ๋œ ๋”๋ฏธ ๋ฐ์ดํ„ฐ "API"๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์•ฝ์ž๋กœ ๋งค์šฐ ๋„“์€ ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ๋‹จ์ˆœ์ด ๋ฆฌ์•กํŠธ๋‚˜ HTTP ์š”์ฒญ์—๋งŒ ๊ธฐ๋Šฅํ•˜๋Š” ๊ฐœ๋…์ด ์•„๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹ค๋ฃจ๋ฉฐ ๋˜ ์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ, ์ž‘์—…์— ๋Œ€ํ•œ ๊ทœ์น™์ด ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋œ ๊ฒƒ์„ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  HTTP ์š”์ฒญ์— ๋Œ€ํ•œ API๋ฅผ ๋งํ•  ๋•Œ์—๋Š” ๋ณดํ†ต "REST" ํ˜น์€ "GraphQL API"๋ฅผ ์˜๋ฏธํ•œ๋‹ค. "RESTful API"์— ๋Œ€ํ•œ ๊ณต๋ถ€๋ฅผ ํ•œ์ ์ด ์žˆ๋‹ค๋ฉด ์ด๋Š” ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์„œ๋กœ ๋‹ค๋ฅธ ํ‘œ์ค€์„ ์˜๋ฏธํ•จ์„ ๊ธˆ๋ฐฉ ์ดํ•ดํ•  ๊ฒƒ์ด๋‹ค.

  • swapi ์‚ฌ์ดํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ "REST API"์ด๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ ์š”์ฒญ์„ ์ „์†กํ•˜๊ฒŒ ๋˜๋ฉด ํŠน์ •ํ•œ ํ˜•์‹์— ๋งž์ถฐ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์ค€๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ URL์— ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉด ๊ทธ์— ๋งž๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ ์ด๊ฒƒ์ด API ์ด๋‹ค. ์ ‘๊ทผ ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋ฉด ๊ฒฐ๊ณผ๋„ ๋‹ค๋ฅด๋‹ค. ์ด์ œ ์šฐ๋ฆฌ์˜ ๋ฆฌ์•กํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•˜๋˜ ๋”๋ฏธ ๋ฐ์ดํ„ฐ ๋Œ€์‹ , ์ด API๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๊ณ ์ž ํ•œ๋‹ค.

โœง GET ์š”์ฒญ ๋ณด๋‚ด๊ธฐ

  • ๋ฆฌ์•กํŠธ ์•ฑ์—์„œ ์š”์ฒญ์„ ์ „์†กํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ์žŠ์–ด์„œ๋Š” ์•ˆ๋˜๋Š” ์‚ฌ์‹ค์ด ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ •๊ทœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ๋ผ๋Š” ์‚ฌ์‹ค์ด๋‹ค. ๋ฆฌ์•กํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ฒฐ๊ตญ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋Š” ๋œป์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์†”๋ฃจ์…˜์„ ํ†ตํ•ด์„œ ๋ฆฌ์•กํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์–ด๋–ค HTTP ์š”์ฒญ์ด๋“  ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

fetch API

  • ์ตœ๊ทผ์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ HTTP ์š”์ฒญ์„ ์ „์†กํ•˜๋Š” ๋‚ด์žฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์กด์žฌํ•˜๋Š”๋ฐ ๊ทธ๊ฒƒ์€ fetch API ๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค.

    MDN ๊ณต์‹๋ฌธ์„œ ์ฐธ๊ณ  : fetch API

  • fetch API ๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅํ˜•์ด๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด API๋ฅผ ํ†ตํ•ด์„œ HTTP ์š”์ฒญ์„ ์ „์†กํ•˜๊ณ  ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

fetch API ์‚ฌ์šฉํ•ด์„œ ์˜ํ™” ์ •๋ณด ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

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

๊ธฐ์กด์˜ ๋”๋ฏธ ๋ฐ์ดํ„ฐ

const dummyMovies = [
  {
    id: 1,
    title: "Some Dummy Movie",
    openingText: "This is the opening text of the movie",
    releaseDate: "2021-05-18",
  },
  {
    id: 2,
    title: "Some Dummy Movie 2",
    openingText: "This is the second opening text of the movie",
    releaseDate: "2021-05-19",
  },
];
  • ๋จผ์ € ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ๊ฑฐ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ์ด ํŠธ๋ฆฌ๊ฑฐ ํ•จ์ˆ˜์—์„œ fetch API๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.
function fetchMoviesHandler() {
  fetch();
}
  • fetch API ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์š”์ฒญ์„ ์ „์†กํ•˜๋ ค๋Š” URL์„ '๋ฌธ์ž์—ด'๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films");
}
  • fetch API์—๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋‘ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ํ†ตํ•ด์„œ ๋‹ค์–‘ํ•œ ํ˜ธ์ถœ ์„ ํƒ ์‚ฌํ•ญ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ—ค๋”๋‚˜ ๋ฐ”๋”” ๋˜๋Š” HTTP ์š”์ฒญ ๋ฉ”์†Œ๋“œ(POST, PUT, PATCH, DELETE)๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. fetch API ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ "GET"์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋งŒ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ์— ๋‘ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ์ƒ๋žตํ–ˆ๋‹ค. ์ด์ œ ์ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ๋งค ๋ฒˆ HTTP ์š”์ฒญ์ด ์ „์†ก๋  ๊ฒƒ์ด๋‹ค.

fetch API ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์‘๋‹ต ์ฒ˜๋ฆฌํ•˜๊ธฐ - then()

  • HTTP ์š”์ฒญ์ด ์ „์†ก๋˜๋Š” ๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์‘๋‹ต ์—ญ์‹œ ์ฒ˜๋ฆฌํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ์ด fetch() ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ์ด ๊ฐ์ฒด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋‚˜ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์‘๋‹ต์— ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ค€๋‹ค.
function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films");
}
  • fetch() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ์ฆ‰๊ฐ์ ์ธ ํ–‰๋™ ๋Œ€์‹  ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฐ์ฒด๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด HTTP ์š”์ฒญ ์ „์†ก์€ '๋น„๋™๊ธฐ ์ž‘์—…' ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰๊ฐ์ ์œผ๋กœ ๋๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ช‡ ์ดˆ-๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆฌ๊ธฐ๋„ ํ•˜๋ฉฐ ์‹ฌ์ง€์–ด ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ fetch() ๋กœ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ ๋’ค์— ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์—†๋„๋ก ํ•œ ๊ฒƒ์ด๊ณ , ๋‹ค๋งŒ ์ด ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” then()์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

    MDN ๊ณต์‹๋ฌธ์„œ ์ฐธ๊ณ  : Promise.prototype.then()

function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films").then();
}
  • ๋ฐ”๋กœ then()์„ ํ†ตํ•ด์„œ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (๊ทธ๋ฆฌ๊ณ  catch ๋ฌธ์„ ์ถ”๊ฐ€ํ•ด์„œ ์ž ์žฌ์  ์˜ค๋ฅ˜๋‚˜ ์—๋Ÿฌ๋“ฑ์„ ํ•ธ๋“ค๋ง ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์ผ๋‹จ ๋ฌด์‹œํ•˜๋„๋ก ํ•˜์ž.)
function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films").then((res) => {});
}
  • then()์˜ ์ธ์ž๋กœ res(response) ๋ฅผ ๋ฐ›๊ณ , ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ˜ํ™˜ํ•ด๋ณด์ž. ์ธ์ž๋กœ ๋“ค์–ด์˜จ res๋Š” ๊ฐ์ฒด์ด๋ฉฐ ์š”์ฒญ์˜ ์‘๋‹ต์— ๋Œ€ํ•œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‘๋‹ต์˜ ํ—ค๋”๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์–ป์„ ์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ํ™•์ธํ•ด์•ผ ํ•  ๊ฒƒ์€ res์˜ ๋ณธ๋ฌธ์ด๋‹ค. API๋Š” ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ์ „์†กํ•œ๋‹ค.

API์˜ ๋ฐ์ดํ„ฐ๋Š” JSON ํ˜•์‹์ด๋‹ค

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

  • ์ด ์™ธ์—๋„ JSON์€ ์—ผ๋‘ํ•ด๋‘ฌ์•ผ ํ•˜๋Š” ๊ทœ์น™๋“ค์ด ์žˆ๋‹ค. ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†๊ณ  ๋ชจ๋‘ ๋ฐ์ดํ„ฐ์ด๊ธฐ๋„ ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  JSON ๋ฐ์ดํ„ฐ์˜ ๋˜ ๋‹ค๋ฅธ ์ด์ ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ณ€ํ™˜ ์ž‘์—…์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜์ง€๋งŒ ๊ธ€๋จธ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  JSON ํ˜•์‹์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ์˜ ๋ณ€ํ™˜์ด ๋งค์šฐ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์— ์žˆ๋‹ค.
function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films").then((res) => {
    return res;
  });
}
  • ๊ทธ๋ฆฌ๊ณ  ๋‹คํ–‰ํžˆ ์ด response ์˜ ๊ฐ์ฒด์—๋Š” ๋‚ด์žฅ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์–ด์„œ JSON response์˜ ๋ณธ๋ฌธ์„ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

JSON Response ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ - json()

function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films").then((res) => {
    return res.json();
  });
}
  • response ๊ฐ์ฒด์— ์žˆ๋Š” ๋‚ด์žฅ ๋ฉ”์†Œ๋“œ์ธ json()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ค„ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด json() ๋ฉ”์†Œ๋“œ ์—ญ์‹œ, ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€์ ์ธ then() ๊ตฌ์—ญ์„ ์ƒ์„ฑํ•ด์•ผํ•  ํ•„์š”์„ฑ์ด ์žˆ๋‹ค.
function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films")
    .then((res) => {
      return res.json();
    })
    .then();
}
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ์ด ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ์ž‘์—…์ด ๋๋‚˜๊ณ  ๋‚œ ์งํ›„์— ๋ฐ”๋กœ ์ถ”๊ฐ€ํ•œ then()์ด ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค.
function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films")
    .then((res) => {
      return res.json();
    })
    .then((data) => {
      return data;
    });
}
  • ๊ทธ๋ฆฌ๊ณ  then()์„ ํ†ตํ•ด์„œ ๋ณ€ํ™˜ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

  • ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ๋ณด๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธธ ์›ํ•˜๋Š” ์˜์—ญ์€ 'results'์˜ ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— data.result๋กœ ์ ‘๊ทผํ•ด์„œ ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.
function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films")
    .then((res) => {
      return res.json();
    })
    .then((data) => {
      return data.results;
    });
}
  • ๋‹น์—ฐํžˆ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ data.result๋กœ ์ ‘๊ทผํ•ด์„œ ๋ฐ˜ํ™˜ ๋œ ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด๋‘˜ ์ƒํƒœ(state)๋„ ํ•„์š”ํ•  ๊ฒƒ์ด๋‹ค.

์ƒํƒœ(state)์— ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ

const [movies, setMovies] = useState([]);
  • ์ด ์ƒํƒœ(state)์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด, data.results ์—์„œ ๊ฐฑ์‹ ๋˜๊ณ  ์ด๋ฅผ ํ™”๋ฉด์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films")
    .then((res) => {
      return res.json();
    })
    .then((data) => {
      setMovies(data.results);
    });
}
  • ์ด์ œ JSON์˜ ๋ฐฐ์—ด์ด movies ๋ผ๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ(state)๊ฐ€ ๋˜์—ˆ๋‹ค. ์ด์ œ ์—ฌ๊ธฐ์— ์žˆ๋Š” movies์˜ ์ƒํƒœ(state)๋ฅผ props์— ๋Œ€ํ•œ ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
<section>
  <MoviesList movies={movies} />
</section>
  • MoviesList ์ปดํฌ๋„ŒํŠธ์—์„œ Movie ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฐ’์„ ๋ณด๋ฉด,
<ul className={classes["movies-list"]}>
  {props.movies.map((movie) => (
    <Movie
      key={movie.id}
      title={movie.title}
      releaseDate={movie.release}
      openingText={movie.openingText}
    />
  ))}
</ul>
  • id ์™€ title, release, openingText ๊ฐ€ props๋กœ ์ „๋‹ฌ๋˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ ์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ props ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ์ด๋ฆ„๊ณผ ๋ฐ›์•„์˜ค๋Š” ๋ฐ์ดํ„ฐ์˜ key ๊ฐ’๋“ค์ด ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ props๋กœ ์ „๋‹ฌ์„ ํ•˜๋”๋ผ๋„ ์ด๋ฆ„์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

๋ฐ์ดํ„ฐ ํ˜•์‹์˜ ์ด๋ฆ„ ๋ณ€ํ™˜ํ•˜๊ธฐ

function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films")
    .then((res) => {
      return res.json();
    })
    .then((data) => {
      setMovies(data.results);
    });
}
  • ๋จผ์ € HTTP ์š”์ฒญ์„ ์ƒ์„ฑํ•˜๋Š” App ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ data.results๋ฅผ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ๋งŒ๋“ค๊ธฐ ์ „์— ๋ณ€ํ™˜ ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.
function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films")
    .then((res) => {
      return res.json();
    })
    .then((data) => {
      const transformedMovies = data.results.map();
      setMovies(data.results);
    });
}
  • data.results๋ฅผ ๋งคํ•‘ํ•˜๋Š” transformedMovies๋ผ๋Š” ์ƒˆ๋กœ์šด ์ƒ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ๋„˜๊ฒจ๋ฐ›์€ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films")
    .then((res) => {
      return res.json();
    })
    .then((data) => {
      const transformedMovies = data.results.map((movieData) => {
        return {};
      });
      setMovies(data.results);
    });
}
  • ๋ฐ˜ํ™˜๋˜๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋Š” ๋ณ€ํ™˜๋œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ์ฑ„์›Œ์ง„ ๋ฐฐ์—ด์ด ๋  ๊ฒƒ์ด๋‹ค. map()์—์„œ movieData๋ผ๋Š” ์ธ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ, ์ด ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์€ API๋กœ ๋ฐ›์•„์˜ค๋Š” ๊ฐ์ฒด์˜ ํ˜•์‹๊ณผ ๋™์ผํ•˜๋‹ค.

  • ์ด์ค‘ ์šฐ๋ฆฌ๋Š” episode_id, title, opening_crawl, release_date ๋งŒ ๊ฐ€์ ธ์˜ฌ ์˜ˆ์ •์ด๋‹ˆ, ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์•ˆ์—์„œ ์šฐ๋ฆฌ๊ฐ€ props๋กœ ๋„˜๊ฒจ์ค„ ์ด๋ฆ„์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ return ํ•˜๋ฉด ๋  ๊ฒƒ์ด๋‹ค.
function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films")
    .then((res) => {
      return res.json();
    })
    .then((data) => {
      const transformedMovies = data.results.map((movieData) => {
        return {
          id: movieData.episode_id,
          title: movieData.title,
          openingText: movieData.opening_crawl,
          releaseDate: movieData.release_date,
        };
      });
      setMovies(data.results);
    });
}
  • ์ด์ œ ํ…์ŠคํŠธ๊ฐ€ ๋ณ€ํ™˜ ๋˜์—ˆ์œผ๋‹ˆ, ์ด ๋ณ€ํ™˜๋œ transformedMovies ๋ฅผ setMovies์— ์ €์žฅํ•œ๋‹ค.
function fetchMoviesHandler() {
  fetch("https://swapi.dev/api/films")
    .then((res) => {
      return res.json();
    })
    .then((data) => {
      const transformedMovies = data.results.map((movieData) => {
        return {
          id: movieData.episode_id,
          title: movieData.title,
          openingText: movieData.opening_crawl,
          releaseDate: movieData.release_date,
        };
      });
      setMovies(transformedMovies);
    });
}
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ fetchMoviesHandler ํ•จ์ˆ˜๋ฅผ ๋ฒ„ํŠผ์— onClick์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํฌ์ธํ„ฐํ•ด์ค€๋‹ค.
<button onClick={fetchMoviesHandler}>Fetch Movies</button>

  • ์ €์žฅํ•˜๊ณ , "Fetch Movies" ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ฒ„ํŠผ ํด๋ฆญ ํ›„ ์˜ํ™”์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

์ •๋ฆฌ

  • ํ™”๋ฉด์˜ ๊ฒฐ๊ณผ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์™ธ๋ถ€ API์—์„œ fetch ํ•ด์˜จ ์ฆ‰, ๋ฐฑ์—”๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์™€ ์†Œํ†ตํ•œ ๊ฒฐ๊ณผ๋ฌผ์ธ ์…ˆ์ด๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋ฆฌ์•กํŠธ ์•ฑ์„ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ์„ ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ์ด๊ฒƒ์€ ์ด๋ก ์ ์œผ๋กœ ์ •ํ™•ํ•œ ํ‘œํ˜„์ด ์•„๋‹ˆ๋ฉฐ, ๋‹ค๋งŒ ๋ฆฌ์•กํŠธ ์•ฑ์—์„œ ๋ฐฑ์—”๋“œ๋กœ HTTP ์š”์ฒญ์„ ์ „์†ก์„ ํ–ˆ์„ ๋ฟ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์šฐ๋ฆฌ๋Š” ์žŠ์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

โœฆ ์ถœ์ฒ˜


๐Ÿšจ ํ•ด๋‹น ํฌ์ŠคํŒ…์€ Udemy์˜ โŒœReact ์™„๋ฒฝ ๊ฐ€์ด๋“œโŒŸ ๊ฐ•์˜๋ฅผ ๋ฒ ์ด์Šค๋กœ ํ•œ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค.
โœ๐Ÿป ๊ฐ•์˜ git repo ๋ฐ”๋กœ๊ฐ€๊ธฐ

profile
์ผ๋‹จ ๊ณต๋ถ€๊ฐ€ '์ ์„ฑ'์— ๋งž๋Š” ๊ฐœ๋ฐœ์ž. ๊ทผ์„ฑ์žˆ์Šต๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€