๋ชฉ์ฐจ
- ๋ฆฌ์กํธ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํตํ๋ ๋ฐฉ๋ฒ
- ์์ ์ฑ ๋ฐ ๋ฐฑ์๋
- 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 ๋ฐ๋ก๊ฐ๊ธฐ