useEffect
ํ
์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ๊ฐ์ ธ์ค๋ ๊ฒ ๊ฐ๋ฅํ ์ด์ ๋ HTTP ์์ฒญ ์ ์ก์ ์ผ์ข
์ ์ฌ์ด๋ ์ดํํธ๋ก ์ปดํฌ๋ํธ์ ์ํ(state)๋ฅผ ๋ฐ๊ฟ๋ฒ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ ๋ ๊ฒ์ฒ๋ผ ์ด๋ฐ ์ฌ์ด๋ ์ดํํธ๋ useEffect
์ ์ฌ์ฉํ๋ค. ํจ์๋ก ์ง์ด๋ฃ๋ ๊ฒ ์ญ์ ์๊ด ์๋ค. ํจ์ ์ผ๋ถ๋ถ์ผ๋ก ํธ์ถํ์ง๋ง ์๋๋ค๋ฉด ๋ง์ด๋ค. ๋ง์ฝ ๊ทธ๋ ๊ฒ ํ๋ค๋ฉด, ํจ์ ํธ์ถ์ด ๋๋ ์๊ฐ ์ํ(state)์ ๊ฐฑ์ ์ด ๋ฐ์ํ๊ณ , ์ปดํฌ๋ํธ ํจ์๊ฐ ์ฌ๋ ๋๋ง-์ฌํ๊ฐ ๋๋ฉด์ ๋ฌดํ์ผ๋ก ํธ์ถ๋๋ ๋ฌดํ๋ฃจํ๊ฐ ๋ฐ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํผํ๊ธฐ ์ํด์ ์ฐ๋ฆฌ๋ useEffect
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
useEffect
๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ ์ฃผ๊ธฐ ์์์ ์ฌ์ฉ๋์ด์ผ ํ๋ ์ฝ๋๊ฐ ์์ ๋ ์ ์ฉํ๋ค. ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ ๋๋ง๋ ๊ฒฝ์ฐ๋ ์กฐ๊ธ ๋ค๋ฅด์ง๋ง ๋ง์ด๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์ useEffect
๋ฅผ ์ถ๊ฐํ๊ณ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ function ์์ฝ์ด๋ฅผ ์ด์ฉํ ์ ๊ท ํจ์๋ฅผ ํตํด effect
ํจ์๋ฅผ ์ ์ํ๋ค.
useEffect(() => {
fetchMoviesHandler();
});
useEffect
ํจ์ ์์์ ์ฐ๋ฆฌ๊ฐ ๊ทธ๋์ ๋ฐ์ดํฐ๋ฅผ fetch ํด์ค๋ ๋ฐ ์ฌ์ฉํ๋ fetchMoviesHandler
ํธ๋ฆฌ๊ฑฐ ํจ์๋ฅผ ํธ์ถํ๋ค.fetchMoviesHandler
ํจ์๋ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํธ์ถ๋์ง๋ง ๋์์ ์ปดํฌ๋ํธ ์ฌํ๊ฐ๊ฐ ๋ฐ์ํ ๋์๋ ํธ์ถํ๊ฒ ๋๋ค. ์ด ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ์์ ๊ฑฐ๋ก ํ๋ ๋ฌดํ ๋ฃจํ ์ด์๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ปดํฌ๋ํธ ์ฌํ๊ฐ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ํธ์ถํ์ง ์๋๋ก ์ถ๊ฐํด์ค์ผ ํ ๊ฒ์ด ์๋ค.useEffect(() => {
fetchMoviesHandler();
}, []);
useEffect
์ ์์กด์ฑ ๋ฐฐ์ด์ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ์ธ์ effect
ํจ์๊ฐ ๋ค์ ์คํ๋๋ ์ง๋ฅผ ์ ์ํ๋ค๋ ๋ป์ด๋ค. ์ฆ, ์ฐ๋ฆฌ๊ฐ ์ถ๊ฐํ ์์กด์ฑ ๋ฐฐ์ด์ ๋ชฉ๋ก์ด ๊ฐฑ์ ๋๊ฑฐ๋ ๋ณํ ๋๋ง๋ค effect
ํจ์๊ฐ ์ฌ์คํ๋๋๋ก ์ ์ํ๋ ๊ฒ์ด๋ค. ํ์ฌ๋, ์์กด์ฑ ๋ฐฐ์ด์ ์๋ฌด ๊ฒ๋ ๋ค์ด์์ง ์๋ค. ์ด ์ํ๋ก ์ ์ฅํ๋ค๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ต์ด๋ก ๋ก๋ฉ๋ ๋๋ฅผ ์ ์ธํ๊ณ ๋ ์ ๋ ์ฌ์คํ๋์ง ์์ ๊ฒ์ด๋ค. ๋ฐ๋ผ์, ์ดํ๋ฆฌ์ผ์ด์
์ ์๋ก๊ณ ์นจํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ฆ์ fetch ํด์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.effect
ํจ์์์ ์ฌ์ฉํ๋ ๋ชจ๋ ์์กด์ฑ์ ์์กด์ฑ ๋ฐฐ์ด์ ์ถ๊ฐํด์ผ ํ๋คeffect
ํจ์ ๋ด์์ ์ฌ์ฉํ๋ ๋ชจ๋ ์์กด์ฑ์ ์ด ์์กด์ฑ ๋ฐฐ์ด์ ํ์ํด๋๋ ๊ฒ ๊ฐ์ฅ ์ข๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์์๋ fetchMoviesHandler
๊ฐ ๋ฐ๋ก ๊ทธ ๋์์ด๋ค. ์ด๊ฒ์ effect
์ ๋ํ ์์กด์ฑ์ด๊ธฐ ๋๋ฌธ์ด๋ค.useEffect(() => {
fetchMoviesHandler();
}, [fetchMoviesHandler]);
useEffect
์ ๋ ๋ฒ์งธ ์ธ์์ธ ์์กด์ฑ ๋ฐฐ์ด์ fetchMoviesHandler
๋ฅผ ํฌ์ธํฐํ์. ์ด fetchMoviesHandler
ํจ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด effect
๋ ์ฌ์คํ ๋ ๊ฒ์ด๊ณ , ๋ง์ฝ ์ธ๋ถ ์ํ(state)๋ฅผ ์ด์ฉํ๋ค๋ฉด ์ด fetchMoviesHandler
ํจ์๋ ๋ฐ๋ ์ ์์ผ๋ ๋ง์ด๋ค.fetchMoviesHandler
๋ ํจ์์ด๊ณ , ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ ๋๋ง ๋ ๋๋ง๋ค ์ด fetchMoviesHandler
ํจ์ ์ญ์ ๋ฐ๋๊ฒ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์์กด์ฑ ๋ฐฐ์ด์ ์ด fetchMoviesHandler
ํจ์๋ฅผ ์ถ๊ฐํ๊ฒ ๋๋ฉด ๋ฌดํ ๋ฃจํ๊ฐ ๋ฐ์๋ ๊ฒ์ด๋ค. ๋ฌดํ ๋ฃจํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ ์์กด์ฑ ๋ฐฐ์ด์ ์ด fetchMoviesHandler
ํจ์๋ฅผ ์ถ๊ฐํ๋๋ฐ, ๋ ๋ค์ ๋ฌดํ ๋ฃจํ๊ฐ ๋ฐ์ํ๋ค๋ ๋งค์ฐ ์์ํ ๊ฒ์ด๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์๋ก์ด ํด๊ฒฐ์ฑ
์ ํตํด ๋ฌดํ ๋ฃจํ๋ฅผ ๋ฐฉ์งํ ์ ์๊ฒ ๋๋ค.useCallback
์ ํตํ ๋ฌดํ ๋ฃจํ ๋ฐฉ์งํ๊ธฐasync function fetchMoviesHandler() {
...
}
useCallback
ํ
์ ์ฌ์ฉํด์ ์ฐ๋ฆฌ์ ํจ์ fetchMoviesHandler
๋ฅผ ๊ฐ์ธ๋ ๊ฒ์ด๋ค.const fetchMoviesHandler = useCallback(() => {
...
});
fetchMoviesHandler
ํจ์๋ useCallback
์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ์์๊ฐ ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ ํํ๋ก ๋ณ๊ฒฝํ๊ณ , ํ์ดํ ํจ์๋ฅผ ํตํด ์ด๋ฅผ ๊ฐ์ธ์ค๋ค. ๊ทธ๋ฆฌ๊ณ useCallback
์ ๋ ๋ฒ์งธ ์ธ์์ธ ์์กด์ฑ ๋ฐฐ์ด๋ ์ถ๊ฐํด์ค๋ค.const fetchMoviesHandler = useCallback(() => {
...
}, []);
fetchMoviesHandler
ํจ์๋ ์ธ๋ถ ์์กด์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋น ์ํ๋ก ํ๊ธฐํ๋ค. fetchMoviesHandler
ํจ์ ๋ด๋ถ์์ ์ฌ์ฉํ๋ fetch API ๋ ๊ธ๋ก๋ฒ ๋ธ๋ผ์ฐ์ API ์ด๊ณ ์ด๋ ์์กด์ฑ์ด ์๋๋ฉฐ, ๋ํ setMovies
, setError
, setIsLoding
๊ฐ์ ์ํ(state) ์
๋ฐ์ดํธ ํจ์๋ ๋ฆฌ์กํธ์์ ์ ๋ ๋ณ๊ฒฝ์ด ์ผ์ด๋์ง ์์ ๊ฒ์ด๋ผ ๋ณด์ฅํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์์กด์ฑ์ผ๋ก ์ถ๊ฐํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.const fetchMoviesHandler = useCallback(async () => {
...
}, []);
async/await
๋ฅผ ์ฌ์ฉํด์ ๋น๋๊ธฐ์ ์ผ๋ก ์์
ํด์๋ ๊ฒ์ ๊ทธ๋๋ก ํด์ฃผ๊ธฐ ์ํด async
์์ฝ์ด๋ฅผ ์ต๋ช
ํจ์ ์์ ์ถ๊ฐํด์ค๋ค.App
์ปดํฌ๋ํธ ๋ด๋ถ์์ ์๋ก์ด ์ปดํฌ๋ํธ AddMovie
๋ฅผ ์ถ๊ฐํ๋ค.<AddMovie onAddMovie={addMovieHandler} />
AddMovie
์ปดํฌ๋ํธ์๋ movies๋ฅผ ์ฝ์ ๋ก๊ทธ์ ๋จ๊ธฐ๋ addMovieHandler
ํจ์๋ ํฌ์ธํฐ ํ๋ค.function addMovieHandler(movie) {
console.log(movie);
}
AddMovie
์ปดํฌ๋ํธ๋ฅผ ๋ณด๋ฉด, ์ฌ์ฉ์ ์
๋ ฅ ์์์ ๋ ๋๋งํ๊ณ ์ฌ์ฉ์ ์
๋ ฅ์ ๋ฐ๊ณ ์๋ ๊ฑธ ์์ ์๋ค.function AddMovie(props) {
const titleRef = useRef('');
const openingTextRef = useRef('');
const releaseDateRef = useRef('');
function submitHandler(event) {
event.preventDefault();
// could add validation here...
const movie = {
title: titleRef.current.value,
openingText: openingTextRef.current.value,
releaseDate: releaseDateRef.current.value,
};
props.onAddMovie(movie);
}
...
}
AddMovie
์์ ๋ ๋๋งํ๋ ํผ์ ํตํด์ ์ํ๋ฅผ ์ง์ ์ถ๊ฐํ ์ ์๋๋ก ํ ๊ฒ์ด๋ค.AddMovie
์ปดํฌ๋ํธ ํผ์ ์ด์ฉํด์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ ํ๋ 'POST' ์์ฒญ์ ์์ง ๋ถ๊ฐ๋ฅํ ์ํ๋ค. ๊ทธ๋ ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ 'POST' ์์ฒญ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์ ๋ ๋ค๋ฅธ ๋๋ฏธ API๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ๋ค. ๋ฐ๋ก ๊ตฌ๊ธ์ด ์ ๊ณตํ๋ ๋ฐ์ดํฐ ์ ์ฅ ์๋น์ค์ธ Firebase ์ด๋ค.Firebase ๋ ๊ตฌ๊ธ์์ ์ ๊ณตํ๋ ์๋น์ค์ด๊ณ , ์ ์ฒด ์๋น์ค๋ฅผ ๊ตฌ์ฑํ๊ณ ์๋ ์ ํ๊ณผ ์๋น์ค๊ฐ ๋งค์ฐ ๋ค์ํ๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ง๊ธ ๋ณต์กํ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ง ์๊ธฐ ๋๋ฌธ์ ๊ทธ ์ค ์ผ๋ถ๋ถ๋ง์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
const response = await fetch("https://react-http2-xxxxxxx.firebaseio.com/");
const response = await fetch(
"https://react-http2-xxxxxxx.firebaseio.com/movies.json"
);
movies.json
์ด๋ผ๋ ์ธ๊ทธ๋จผํธ๋ฅผ ์ถ๊ฐํ๋ค. ์ด movies
๋ผ๋ ์ด๋ฆ์ ์ฐ๋ฆฌ๊ฐ ์์๋ก ์ ํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋ฆฌ๊ฐ ์ง์ ํ ์ด๋ฆ movies
๋ก ๋
ธ๋๊ฐ ์๋กญ๊ฒ ๋ง๋ค์ด์ง๊ฒ ๋๋ค. ์ด๊ฒ์ ๋์ REST API ๋ก ์๋ก ๋ค๋ฅธ ์ธ๊ทธ๋จผํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์๋ก ๋ค๋ฅธ ๋
ธ๋๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๊ฒ ์ค์ ํด์ฃผ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ์ด๋ฆ์ ์ฐ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฌด์์ผ๋ก ๊ด๋ฆฌํ ๊ฒ์ธ์ง์ ๋ฐ๋ผ ์ด๋ฆ์ ์ง๊ด์ ์ผ๋ก ์ ํด์ ์ค์ ํด์ค๋ค.movies
์ ํ์ฅ์ .json
์ ์ถ๊ฐํ๋ ์ด์ ๊ฐ ๊ถ๊ธํ ๊ฒ์ด๋ค. ์ด๋ Firebase์ ์๊ตฌ ์ฌํญ์ผ๋ก, ์์ฒญ์ ์ ๋ฌํ๋ ค๋ URL ๋์ .json
์ ๋ฐ๋์ ์ถ๊ฐํด์ผ ํ๋ค. ๋ง์ฝ ์ด ํ์ฅ์๋ฅผ ์ถ๊ฐํ์ง ์๋๋ค๋ฉด, ์์ฒญ์ ์คํจํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค.function addMovieHandler(movie) {
console.log(movie);
}
addMovieHandler
ํจ์๋ฅผ ๋ณด์. ๋ฒํผ์ ํด๋ฆญํ๋ฉด addMovieHandler
๊ฐ movie ๋ผ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ์ฝ์์ ์ถ๋ ฅํ๋ ๋ก์ง์ด๋ค.function submitHandler(event) {
event.preventDefault();
// could add validation here...
const movie = {
title: titleRef.current.value,
openingText: openingTextRef.current.value,
releaseDate: releaseDateRef.current.value,
};
props.onAddMovie(movie);
}
AddMovie
์ปดํฌ๋ํธ์์ props ๋ก ์ ๋ฌ๋ฐ์ onAddMovie
(addMovieHandler)์ ๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ์ฃผ๋ moive ์ ํํ๋ ์ด๋ค๊ฐ? ์์ ์ฝ๋์์ ์ ์ ์๋ฏ์ด moive
๋ผ๋ ์ด๋ฆ์ ๊ฐ์ฒด ์์๋ title
๊ณผ openingText
๊ทธ๋ฆฌ๊ณ releaseDate
๋ฅผ ๋ด๊ฒจ์๋ค. (id
๋ firebase์์ ์๋์ ์ผ๋ก ์ถ๊ฐ๋๋ค.) ๊ทธ๋ฌ๋, ์ด addMovieHandler
์์๋ ferch API๋ฅผ ์ด์ฉํด์ ๋ ๋ค๋ฅธ HTTP ์์ฒญ์ ์ ์กํด์ผ ํ๋ค. ์ด์ ์๋ ๊ฑฐ๋ก ํ ์ด์ผ๊ธฐ์ง๋ง fetch ๋ผ๊ณ ํด๋ ์ฌ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ญํ ๋ง ํ๋ ๊ฒ์ด ์๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐ์๋ fetch ๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.function addMovieHandler(movie) {
console.log(movie);
}
addMovieHandler
๋ก ๋์์์, ๋ฐ์ดํฐ๋ฅผ firebase์ ์์ฒญํด์ ์ ์กํ๋ ๋ก์ง์ ์ถ๊ฐํ๋๋ก ํ์. ์ฐ๋ฆฌ์ ๋ชฉ์ ์ ์์ฒญ ์ ์ก์ด๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ URL ์ ๋ฐ๋๋ก ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ด๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์ฅ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ ๊ฒ์ด๋ค.function addMovieHandler(movie) {
fetch("https://react-http2-xxxxxxx.firebaseio.com/movies.json");
console.log(movie);
}
fetch()
๋ฅผ ๋ถ๋ฌ์์ firebase ๋ก๋ถํฐ ์ ๊ณต๋ฐ์ ๊ธฐ์กด์ URL์ ์ถ๊ฐํ๋ค. ํ์ง๋ง fetch API ๋ ๊ธฐ๋ณธ์ ์ผ๋ก 'GET' ์ด default ์ด๊ธฐ ๋๋ฌธ์ 'POST' ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ fetch API ์ ๋ ๋ฒ์งธ ์ธ์๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.function addMovieHandler(movie) {
fetch("https://react-http2-xxxxxxx.firebaseio.com/movies.json", {});
console.log(movie);
}
function addMovieHandler(movie) {
fetch("https://react-http2-xxxxxxx.firebaseio.com/movies.json", {
method: "POST",
});
console.log(movie);
}
body
๋ผ๋ ์ต์
์ ์ถ๊ฐํ๋ค.function addMovieHandler(movie) {
fetch("https://react-http2-xxxxxxx.firebaseio.com/movies.json", {
method: "POST",
body: movie,
});
console.log(movie);
}
body
์๋ ์ฐ๋ฆฌ๊ฐ ์ถ๊ฐํ๊ณ ์ ํ๋ ๊ฒ์ ์ ๋๋ค. ์ด๋ฒ์๋ movie ๋ผ๋ ๋งค๊ฐ ๋ณ์(๊ฐ์ฒด)๋ฅผ ๋ฐ์ body
์ ๋๊ฒจ์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ผ๋ก ์ง์ ํ๋ค.function addMovieHandler(movie) {
fetch("https://react-http2-xxxxxxx.firebaseio.com/movies.json", {
method: "POST",
body: JSON.stringify(movie),
});
console.log(movie);
}
body
๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๊ฐ ์๋ JSON
๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ๋ค. JSON
์ ๋ฐ์ดํฐ ํํ๋ก ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๊ฐ์ ๋ฐ์ดํฐ ๊ตํ์ ์ฌ์ฉ๋๋ ์ ํ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์ ๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ ๋ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด movie ๋ฅผ JSON
์ผ๋ก ๋ณํํ๋ ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ์ ์๋ ๋ด์ฅ ๋ฉ์๋์ธ JSON.stringify()
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. JSON.stringify()
๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ ๋ฐฐ์ด์ JSON ํํ๋ก ๋ณํํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.function addMovieHandler(movie) {
fetch("https://react-http2-xxxxxxx.firebaseio.com/movies.json", {
method: "POST",
body: JSON.stringify(movie),
headers: {},
});
console.log(movie);
}
headers
ํค๋ฅผ ์ถ๊ฐํ๋ค. headers
ํค๋ฅผ ์ถ๊ฐํ ๋๋ ๊ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ง์ ํด์ผ ํ๋ค.function addMovieHandler(movie) {
fetch("https://react-http2-xxxxxxx.firebaseio.com/movies.json", {
method: "POST",
body: JSON.stringify(movie),
headers: {
"Content-Type": "application/json",
},
});
console.log(movie);
}
headers
์ ๊ฐ์ฒด ๊ฐ ์์ "Content-Type" ์ ํค๋ก ์ง์ ํ๊ณ , ๊ฐ์ผ๋ก๋ "application/json" ์ ๋ฃ์ด์ค๋ค. Firebase ์๋ headers
๊ฐ ๋ฐ๋์ ํ์ํ ๊ฒ์ ์๋๋ค. headers
ํค๊ฐ ์ค์ ๋์ด ์์ง ์๋๋ผ๋ ์์ฒญ์ ์ ์์ ๊ธ๋ก ์ฒ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์์ฒญ์ ๋ฐ๋ ๋ ๋ค๋ฅธ ๋๋ค์์ API๋ ์ด๋ฌํ headers
๋ฅผ ํ์๋ก ํ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐํด์ฃผ์๋ค. ์์ฒญ์ ๋ฐ๋ API์์๋ ์ด headers
๋ฅผ ํตํด์ ์ด๋ค ์ปจํ
์ธ ๊ฐ ์ ๋ฌ๋๋์ง๋ฅผ ์ ์ ์์ ๊ฒ์ด๋ค.async/await
๋ก fetch API๋ก ์ ์ก๋๋ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐasync/await
๋ฅผ ์ถ๊ฐํด์ค์ผ ํ๋ค.async function addMovieHandler(movie) {
const response = await fetch(
"https://react-http2-xxxxxxx.firebaseio.com/movies.json",
{
method: "POST",
body: JSON.stringify(movie),
headers: {
"Content-Type": "application/json",
},
}
);
const data = await response.json();
console.log(data);
}
response
๋ผ๋ ์์๋ก await์ ๋ถ์ฌ ๊ฐ์ ธ์จ ๋ค await ๋ก response.json()
์ ํตํด JSON ํ์์ผ๋ก ๋ณํํ ๋ฐ์ดํฐ๋ฅผ data
์์์ ํ ๋นํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ก๊ทธ์์ ํ์ธํ ์ ์๋๋ก ์ฝ์ ๋ก๊ทธ๋ ์ถ๊ฐํด์ค๋ค.๋ฌผ๋ก ์ด ๋ชจ๋ ๊ณผ์ ์์ ์ด์ ์ ํ์ตํ๋ ๊ฒ์ฒ๋ผ ์์ฒญ(response)์ ๋ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ถ๊ฐํ ์ ์์ ๊ฒ์ด๋ค.
data
๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ด ๊ทธ๋๋ก ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ Firebase ๋ฐฑ์๋๋ก ๋์์ ์ค์๊ฐ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ํญ๋ชฉ์ ํ์ธํด๋ณด๋ฉด movies
๋ผ๋ ์๋ก์ด ๋
ธ๋๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ์ ์ ์๋ค. ์ฐ๋ฆฌ๊ฐ ์ด์ ์ URL ๋ค์ movies.json
์ ์ ์ด์ ์ ์ก ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด moives
๋ผ๋ ๋
ธ๋ ์์๋ ๋ฐฉ๊ธ Firebase๊ฐ ์๋ ์์ฑํ ์ํธํ ๋ ID๊ฐ ์๊ณ , ์ด ์์ ๋ณด๋ฉด ์ฐ๋ฆฌ๊ฐ ํผ์ ์
๋ ฅํ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๊ฒ์ ์ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์ ๋๊ตฌ์ ์ฝ์์์๋ Firebase ๋ก๋ถํฐ ๋ฐ์ response
๊ฐ์ฒด๊ฐ ์ถ๋ ฅ๋์ด ์๊ณ , name ํ๋์ Firebase๊ฐ ์๋ ์์ฑ๋ ID ๋ฅผ ์ ์ด์ ์๋ตํ๋ค.Cannot read properties of undefined (reading 'map')
const fetchMoviesHandler = useCallback(async () => {
setIsLoading(true);
setError(null);
try {
const response = await fetch(
"https://react-http2-xxxxxxx.firebaseio.com/movies.json"
);
if (!response.ok) {
throw new Error("Something went wrong!");
}
const data = await response.json();
console.log(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);
} catch (error) {
setError(error.message);
}
setIsLoading(false);
}, []);
fetchMoviesHandler
ํจ์๋ก ๋์๊ฐ๋ณด์. ๊ทธ ์ ์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์ค์ต์ฉ ์ํ ๋ฐ์ดํฐ์์๋ results
ํ๋๊ฐ ์์ ๊ฒ์ผ๋ก ์์ํ์ง๋ง, ์ง๊ธ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ์์๋ ํด๋น ํ๋๊ฐ ์กด์ฌํ์ง ์๋๋ค. ์ด ๋ถ๋ถ์ ์์ ์ด ํ์ํ ๊ฒ ๊ฐ๋ค.const data = await response.json();
console.log(data);
data
๋ฅผ fetch ํด์ค๋ ๋ถ๋ถ์ ์ฝ์ ๋ก๊ทธ๋ฅผ ์ถ๊ฐํด์ ์๋ก๊ณ ์นจ์ ํด๋ณด๋ฉด,data
๊ฐ ๊ฐ์ฒด๋ก ๋์ด์๊ณ , ์ด ๊ฐ์ฒด ์์ ์ํธํ๋ ID ํค๊ฐ ์์ผ๋ฉฐ, ์ค์ ๋ก ์ ์ฅ๋ ์ํ ๋ฐ์ดํฐ๋ ์ค์ฒฉ๋ ๊ฐ์ฒด๋ก ๋ํ๋๊ณ ์์์ ์ ์ ์๋ค. ์ฆ, ๋ฐฐ์ด๋ก ๊ฐ์ ธ์ค์ง ์๊ณ ๊ฐ์ฒด๋ก ๋ฐ์์ค๊ณ ์๋ ๊ฒ์ด๋ค. (id
๊ฐ key ์ด๋ฉฐ, ์ค์ ๋ฐ์ดํฐ๋ ์ค์ฒฉ ๊ฐ์ฒด์ด๋ค.) ์ด์ ์ด๊ฒ data
๋ฅผ ๋ค์ ๋ณํํ ๊ฐ์ setMovies
์ ๋ด์์ ์ํ(state)๋ฅผ ๊ฐฑ์ ํด์ค ๊ฒ์ด๋ค.const loadedMovies = [];
map
์ ํ์ํ์ง ์์ผ๋ฏ๋ก, ๋น ๋ฐฐ์ด์ ํ๋ ๋ง๋ ๋ค์const loadedMovies = [];
for (const key in data) {
}
for
๋ฃจํ์ key in
์ ์ด์ฉํด์ ๊ฐ์ฒด ์์ ๋ชจ๋ key๋ฅผ ํ์ธํ๋ค.const loadedMovies = [];
for (const key in data) {
loadedMovies.push({});
}
loadedMovies
๋ฐฐ์ด์ push()
๋ฅผ ์ด์ฉํด์ ๊ฐ์ฒด๋ฅผ ํธ์ฌํ๋๋ฐ,const loadedMovies = [];
for (const key in data) {
loadedMovies.push({
id: key,
});
}
id
๋ ๊ธฐ๋ณธ์ key
๊ฐ์ผ๋ก ์ค์ ํ๊ณ const loadedMovies = [];
for (const key in data) {
loadedMovies.push({
id: key,
title: data[key].title,
openingText: data[key].openingText,
releaseDate: data[key].releaseDate,
});
}
title
๊ณผ openingText
, releaseDate
์ ๊ฐ์ผ๋ก ๋ฃ์ด์ค๋ค. ์ด๋ ๊ฒํ๋ฉด response
๋ก ๋ฐ์ ์ค์ฒฉ ๊ฐ์ฒด๋ฅผ ํ๊ณ ๋ค์ด๊ฐ๊ฒ ๋๋ค. ์ด๊ฒ์ด ์๋ฐ์คํฌ๋ฆฝํธ์ ์์ฑ์ ๋ํ '๋์ ์ ๊ทผ ๋ฐฉ๋ฒ' ์ด๋ค. ์ด์ loadedMovies
๋ ๋ด๋ถ์ ๊ฐ์ฒด๊ฐ ์๋ ๋ฐฐ์ด์ด ๋๋ฉฐ, ๊ฐ ๊ฐ์ฒด๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์๋ค. ๋ฐ๋ผ์ ๊ธฐ์กด์ map
์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋์๋ transformedMovies
๋ฅผ ์ญ์ ํ๊ณ ,setMovies(loadedMovies);
setMovies
์ ์ํ ์
๋ฐ์ดํธ ๊ฐ์ผ๋ก loadedMovies
๋ฅผ ํฌ์ธํฐ ํด์ค๋ค.MoviesList
์ ์ ์์ ์ผ๋ก ๋ก๋ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๋ ๋ฒ์งธ ์ํ๋ฅผ ๋ ๋ค๋ฅธ ํ
์คํธ๋ฅผ ํตํด ์ถ๊ฐํด๋ณด๊ณ , ๋ค์ "Fetch Movies" ๋ฒํผ์ ๋๋ฅด๋ฉด๐จ ํด๋น ํฌ์คํ ์ Udemy์ โReact ์๋ฒฝ ๊ฐ์ด๋โ ๊ฐ์๋ฅผ ๋ฒ ์ด์ค๋ก ํ ๊ธฐ๋ก์ ๋๋ค.
โ๐ป ๊ฐ์ git repo ๋ฐ๋ก๊ฐ๊ธฐ