
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 ๋ฐ๋ก๊ฐ๊ธฐ