AvailableMeals.js
ํ์ผ ๋ด๋ถ์ ์๋ ๋๋ฏธ ๋ฐ์ดํฐ DUMMY_MEALS
๋ฅผ Firebase Realtime Database ์ ์๊ธฐ๋ก ์์ฑํ์ฌ ์ฎ๊ธด๋ค.const [meals, setMeals] = useState([]);
useEffect(() => {
const fetchMaels = async () => {
const response = await fetch(
"https://react-http2-xxxxxxxxx/meals.json"
).then();
const responseData = await response.json();
// ๊ฐ์ฒด๋ก ๋ฐ์์ค๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ดํ ์์ผ์ผ ํจ.
const loadedMeals = [];
for (const key in responseData) {
loadedMeals.push({
id: key,
name: responseData[key].name,
description: responseData[key].description,
price: responseData[key].price,
});
}
setMeals(loadedMeals);
};
fetchMaels();
}, []);
fetch()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ API๋ฅผ ์ฐ๊ฒฐํ๊ณ http ์์ฒญ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๋ก์ง์ด๋ค.fetch();
fetch()
ํจ์๋ฅผ ์์ฑํ๋, useEffect()
ํ
์์ ๋ฃ์ด์ฃผ์. ์ต์ด 1ํ ์ดํ๋ก ๋ฐ์ดํฐ๋ฅผ ์๋ก ๋ฐ์์ฌ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์, ์์กด์ฑ ๋ฐฐ์ด์ ๋น ๋ฐฐ์ด๋ก ๋จ๊ฒจ์ค๋ค.useEffect(() => {
fetch();
}, []);
.json
์ ๋ถ์ฌ์ค์ผ ํ๋๋ฐ, ์ด๋ ํ์ด์ด๋ฒ ์ด์ค์์ ์๊ตฌํ๋ ๊ฒ์ผ๋ก ์ ๊ทผํ๊ณ ์ถ์ ๋ฐ์ดํฐ ์ด๋ฆ ๋ค์ ๋ถ์ด๋ฉด ๋๋ค.useEffect(() => {
fetch("https://react-http2-xxxxxxxxx/meals.json");
}, []);
meals
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค. ์์ fetch
๋ฅผ ํตํ HTTP ์์ฒญ์์ ๋ ๋ฒ์งธ ์ธ์๋ก HTTP ๋ฉ์๋ ๋ฑ์ ๋ณ๊ฒฝํ์ฌ ์์ฒญ์ ๋ณด๋ผ ์๋ ์๋ค. ํ์ง๋ง ํ์ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ธฐ๋ง ํ๋ฉด ๋๊ณ , fetch
ํจ์์ ๋ํจํธ๋ "GET" ์ด๊ธฐ ๋๋ฌธ์, ๊ตณ์ด ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ ํ์๊ฐ ์์ ๊ฒ์ด๋ค.useEffect(() => {
fetch("https://react-http2-xxxxxxxxx/meals.json");
}, []).then();
fetch
๋ promise๋ฅผ ๋ฐํํ๋ค. HTTP ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ๋น๋๊ธฐ ํ
์คํฌ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ค์ .then()
ํจ์๋ฅผ ์ถ๊ฐํ๋ค. ์ด then()
ํจ์๋ ์๋ต์ ๋ฐ์ผ๋ฉด ์์ฒญ์ด ์ด๋ฃจ์ด์ง ๋ ํธ๋ฆฌ๊ฑฐ๊ฐ ๋๋ค. ์๋ฌ๋ฅผ ํธ๋ค๋งํ๊ฑฐ๋ ํ ๋ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.useEffect(async () => {
await fetch("https://react-http2-xxxxxxxxx.firebaseio.com/meals.json").then();
}, []);
async/await
ํค์๋๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ฐ ๊ทธ ์ด์ ๋ useEffect()
๋ก ์
๋ ฅํ ํจ์์์๋ promise๋ก ๋ฐํํด์๋ ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ์์ ํ์ตํ๋ ๋ด์ฉ์ฒ๋ผ useEffect
์ ์
๋ ฅํ ํจ์๋ ์คํ ๊ฐ๋ฅํ cleanup ํจ์๋ฅผ ๋ฐํํ ์ง๋ ๋ชจ๋ฅด๊ณ , ์ด๋ cleanup ํจ์๊ฐ ๋์์ ์คํ๋์ด์ผ ํ๋ค๋ ๋ป์ด๊ธฐ๋ ํ๋ค. ์ฆ, promise ๋ async/await
ํค์๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด cleanup์ ๋ฐํํ์ง ์๋๋ค. ๋ฐ๋ผ์ useEffect
์ ์
๋ ฅํ ํ์ฌ์ ์ด ํจ์๋ async
ํจ์๋ก ๋ณ๊ฒฝํด์๋ ์๋๋ค. ํ์ง๋ง useEffect
๋์ async/await
ํค์๋๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, ์ด๋ฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์๋ ์๋ค.useEffect(() => {
const fetchMeals = async () => {
await fetch("https://react-http2-xxxxxxxxx.firebaseio.com/meals.json");
};
fetchMeals();
}, []);
fetchMeals
)๋ฅผ ๋ง๋ค๊ณ ์ด ์์์ async/await
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋๋ก ํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด .then()
์ ํ์๊ฐ ์์ผ๋ ์ด ๋ถ๋ถ์ ์ญ์ ํด์ค๋ค. ์ด๋ฌํ ๋ฐฉ์์ ํตํด์ ํด๋น ํจ์๋ ์ฌ์ ํ ์คํ๋๊ณ , useEffect
ํจ์ ์ ์ฒด์์๋ ์ด์ promise๋ฅผ ๋ฐํํ์ง ์๊ณ ์๋ ์ฐ๋ฆฌ๋ async/await
ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. ์ด๊ฒ์ ๋ชจ๋ ์ฝ๊ฐ์ ํํผ?๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋งํ ์ ์์ ๊ฒ์ด๋ค.useEffect(() => {
const fetchMeals = async () => {
const response = await fetch(
"https://react-http2-xxxxxxxxx.firebaseio.com/meals.json"
);
};
fetchMeals();
}, []);
fetchMeals
ํจ์ ๋ด๋ถ์์ fetch()
๋ก ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ response
๋ณ์ ์์ ๋ฃ์ด์ค๋ค.useEffect(() => {
const fetchMeals = async () => {
const response = await fetch(
"https://react-http2-xxxxxxxxx.firebaseio.com/meals.json"
);
const responseData = await response.json();
};
fetchMeals();
}, []);
response
๋ฅผ json()
์ผ๋ก ๋ณํํ๊ณ , ๊ทธ๊ฒ์ responseData
๋ณ์์ ํ ๋นํ๋ค. ์ด ์ญ์ fetchMeals
ํจ์ ๋ด๋ถ์์ promise๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ await
๋ฅผ ๋ถ์ฌ์ค๋ค.responseData
๋ ํ์ด์ด๋ฒ ์ด์ค์ ํน์ ๋์ด ์์ผ๋ฉฐ, ํญ์ ์ด๋ฌํ id
๊ฐ ์๋ ๊ฐ์ฒด๊ฐ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ "m1, m2, m3, m4"๊ฐ key ๊ฐ ๋๊ณ , ํค์ ๋ํ ๊ฐ์useEffect(() => {
const fetchMeals = async () => {
const response = await fetch(
"https://react-http2-xxxxxxxxx.firebaseio.com/meals.json"
);
const responseData = await response.json();
};
fetchMeals();
}, []);
responseData
๋ผ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ์๋์ ์ฝ๋๋ค์ ํ์ธํด๋ดค์ ๋ ๊ฐ์ฒด๊ฐ ์๋ ๋ฐฐ์ด์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐฐ์ด๋ก ๋ณํํ ํ์์ฑ์ด ์๋ค.// ๋ฐฐ์ด์ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ผ ํ๋ค.
const mealsList = DUMMY_MEALS.map((item) => (
<MealItem
key={item.id}
id={item.id}
name={item.name}
description={item.description}
price={item.price}
/>
));
loadedMeals
๋ผ๋ ์ด๋ฆ์ ๋น ๋ฐฐ์ด ์์๋ฅผ ์์ฑํ๊ณ ,useEffect(() => {
const fetchMeals = async () => {
const response = await fetch(
"https://react-http2-xxxxxxxxx.firebaseio.com/meals.json"
);
const responseData = await response.json();
const loadedMeals = [];
};
fetchMeals();
}, []);
responseData
์ฆ, responseData
๊ฐ์ฒด์ ๋ชจ๋ ํค๋ฅผ ๋ฐ๋ณตํ์ฌ loadedMeals
๋ฐฐ์ด ์์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค.useEffect(() => {
const fetchMeals = async () => {
const response = await fetch(
"https://react-http2-xxxxxxxxx.firebaseio.com/meals.json"
);
const responseData = await response.json();
const loadedMeals = [];
for (const key in responseData) {
loadedMeals.push();
}
};
fetchMeals();
}, []);
key
๋ ์์์ ์๊ธฐํ ๋๋ก ํ์ด์ด๋ฒ ์ด์ค์ "meals"์ด๋ ์ด๋ฆ์ ๋ฐ์ดํฐ ๋ด๋ถ์ id
๋ฅผ ๊ฐ๋ฅดํจ๋ค.loadedMeals
๋ฅผ ์ด์ฉํด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ฒ์์ ๋น์ด์๋ ๋ฐฐ์ด์ ๋ฐ์ด ๋ฃ์ ๊ฒ์ด๋ค.for (const key in responseData) {
loadedMeals.push({});
}
id
๋ฅผ ์์ ํ๋ ๊ฒ์ meals
๊ฐ id
ํ๋๋ฅผ ๊ฐ์ง๋ค๊ณ ์์ํ๊ธฐ ๋๋ฌธ์ด๋ค.const mealsList = DUMMY_MEALS.map((item) => (
<MealItem
key={item.id}
//
id={item.id}
//
name={item.name}
description={item.description}
price={item.price}
/>
));
id
ํ๋๋ฅผ ๊ฐ๋๋ก ํด์ผ ํ๋ค.for (const key in responseData) {
loadedMeals.push({
id: key,
});
}
id
๋ key
๋ก ๊ฐ์ ์ค์ ํ๋๋ฐ, ์ด๋ ์์ ๋งํ๋ค์ํผ key
๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์ค๋ ๊ฐ๋ณ meal์ id
๊ฐ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์ ๋๋จธ์ง name, description, price
ํ๋๋ฅผ ๋ง์ ์์ฑํด๋ณด์. ์ฃผ์ด์ง ๋ฐ์ดํฐ์ธ responseData
์์ for in ์ผ๋ก ๋๋ฉด์ ๊ฐ๊ฐ์ ํ๋ ์์ฑ์ ๊ฐ์ ธ์ฌ ์ ์์ ๊ฒ์ด๋ค.for (const key in responseData) {
loadedMeals.push({
id: key,
name: responseData[key].name,
description: responseData[key].description,
price: responseData[key].price,
});
}
loadedMeals
๋ฅผ ๋๋จธ์ง ์ปดํฌ๋ํธ์ ๋
ธ์ถํด์ผ๋ง ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์๋ฃ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํด์ผ ํ๋ค. ์ด๊ฒ์ ๋น๋๊ธฐ ํ
์คํฌ๋ก ์ปดํฌ๋ํธ๊ฐ ์ฒ์์ผ๋ก ๋ก๋ฉ๋ ํ์๋ง ์์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ฒ์์๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ๊ฐ ๊ทธ๊ณณ์ ์์ ๊ฒฝ์ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์
๋ฐ์ดํธํด์ผ ํ๋ค. ๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ด ์ปดํฌ๋ํธ๊ฐ ์
๋ฐ์ดํธ๋๊ณ , ๋ ์ดํ๋ฆฌ์ผ์ด์
์ ์ฒด๊ฐ ๋ค์ ์
๋ฐ์ดํธ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด์ ์ด๋ฅผ ์ํ ์ํ(state)๊ฐ ํ์ํ๋ค๋ ๊ฑธ ์ถ์ธกํ ์ ์์ ๊ฒ์ด๋ค.const [meals, setMeals] = useState([]);
const mealsList = meals.map((item) => (
<MealItem
key={item.id}
id={item.id}
name={item.name}
description={item.description}
price={item.price}
/>
));
mealsList
์ปดํฌ๋ํธ์์ DUMMY_MEALS
๋ก ๋งคํํด์ฃผ๋ ๊ฒ์ meals ์ํ(state)๋ก ์์ ํด์ค๋ค. ์ด๋ ์ฒ์์๋ ๋น ๋ฐฐ์ด์ด์ง๋ง ๋ฐ์ดํฐ๊ฐ ๋ก๋ฉ๋๋ฉด ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ค.useEffect(() => {
const fetchMeals = async () => {
const response = await fetch(
"https://react-http2-xxxxxxxxx.firebaseio.com/meals.json"
);
const responseData = await response.json();
const loadedMeals = [];
for (const key in responseData) {
loadedMeals.push();
}
setMeals(loadedMeals);
};
fetchMeals();
}, []);
loadedMeals
๋ฐ์ดํฐ๋ฅผ meals ์
๋ฐ์ดํธ ํจ์์ธ setMeals
์ ๋ฃ์ด์ค๋ค. ์ด์ ์ปดํฌ๋ํธ๋ ๋ฐ์ดํฐ๊ฐ ์
๋ฐ์ดํธ๊ฐ ๋ ๊ฒ์ด๋ค.useEffect
ํจ์ ๋ด๋ถ์์ ์คํ๋๋ ๋ก์ง๋ค์ ์ ๋ถ ์์กด์ฑ์ด ์๊ณ , ์ธ๋ถ ์ปดํฌ๋ํธ์ ํน์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ ์์ง๋ ์์ผ๋, ์ฒ์ ๋ก๋ฉ ๋ ๋๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋๋ก ์ฆ ์คํํ ์ ์๋๋ก ๋น ๋ฐฐ์ด๋ก ๋๋ ๊ฒ์ด ๋ง๊ธฐ์ ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค๋ ๊ฑธ ๊ธฐ์ตํ์.๐จ ํด๋น ํฌ์คํ ์ Udemy์ โReact ์๋ฒฝ ๊ฐ์ด๋โ ๊ฐ์๋ฅผ ๋ฒ ์ด์ค๋ก ํ ๊ธฐ๋ก์ ๋๋ค.
โ๐ป ๊ฐ์ git repo ๋ฐ๋ก๊ฐ๊ธฐ