2022. 4. 11. 16:25ใReact
React - useEffect, useCallback
udemy ๋ฆฌ์กํธ ๊ฐ์์์ ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํ๊ณ ์ ์ด๋ค.
์ฐ์ useEffect ๊ฐ๋ ์ ๋ณด๋ฉด ์ด๋ ๋ฆฌ์กํธ์์ ์ ๊ณตํ๋ ํ ์ธ๋ฐ ๋ฆฌ์กํธ ๋ด๋ถ์ ์ผ๋ก UI๋ฅผ ์ง์ ๋ณํ์ํค๋ ๋ก์ง์ด ์๋ ๋ถ๋ถ์ ๋๋ถ๋ถ ์ด๊ณณ์ ์ ์ํ๋ค. ์ด๋ฅผ side-effect๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ ๋ถ์์ฉ์ด๋ผ๋ ๋ป์ ์๋๊ณ ์ฌ์ด๋์์ ์ผ์ด๋๋ ์ดํํธ ์ ๋๋ก ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ผ useEffect๋ฅผ ์ ์ธ๊น?
์ฒซ ๋ฒ์งธ๋ก ์์๋งํ UI๋ฅผ ๋ณํ์ํค๋ ๋ก์ง์ด ์๋ ๊ฒฝ์ฐ ์ ํํ๊ฒ ๋ถ๋ฆฌ์ํค๊ธฐ ์ํด์๊ฐ ์ฒซ ๋ฒ์งธ ์ด์ ์ด๊ณ , ๋ ๋ฒ์งธ๋ก๋ dependencies๊ฐ ์กด์ฌํ์ง ์์ ๋ ์ด๋ ์ฒ์ ์์ํ ๋ ํ๋ฒ๋ง ์ดํฉํธ ํจ๊ณผ๋ฅผ ์ค ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ ๋ฒ์งธ ์ด์ ์์ ์ดํด๋ณด๋ฉด ์ฌ์ดํธ์ ๋ค์ด๊ฐ์๋ง์ api๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒฝ์ฐ useEffect ๋ด๋ถ์์ ์ ์ํจ์ผ๋ก์จ ์ฒ์ ๋๋๋ง์ด ์ผ์ด๋ ์ดํ์ ์คํ๋๊ณ ๊ทธ ์ดํ๋ก๋ ์คํ์ด ๋์ง ์๋๋ค. ์ด๋ useEffect ๋ด๋ถ์ ๋ค์ด๊ฐ ๋ถ๋ถ์ด ์๋ ๋ถ๋ถ์์ ๋ณํ๊ฐ ์ผ์ด๋ฌ์ ๋ useEffect ๋ด๋ถ์ ๊ฐ์ ๋๋๋ง์ด ๋์ง ์๊ฒ ํจ์ผ๋ก์จ ์ฑ๋ฅ์ด ์ ํ๋๋ ๊ฒ์ ๋ง์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ useEffect์ ๋๋ฒ์งธ ์ธ์์ธ dependencies์๋ useEffect ๋ด๋ถ์์ ์ฌ์ฉํ ์ธ๋ถ ๋ณ์๋ค์ ์ ์ด์ค์ผํ๋ค.
์ด์ ๋ ์ธ๋ถ์ ๊ฐ์ ์ธ์ ๋ ์ง ๋ณํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด์ ์ํ ๋ถํ์ํ ๋ ๋๋ง์ ๋ง๊ธฐ ์ํด์์ด๋ค. dependencies์ ๋ณ์๋ฅผ ์ ์ํด ๋์ผ๋ฉด ํด๋น ๋ณ์๊ฐ ๋ณํ์ง ์๋์ด์ useEffect ๋ด๋ถ์ ํจ์๋ ๋ ๋๋ง๋์ง ์๋๋ค. ๋ฐ๋ผ์ useEffect๋ด๋ถ์๋ ์ฌ์ฉํ ์ธ๋ถ๋ณ์์ ๋ํด dependencies์ ์ ์ํด์ฃผ์ด์ผ ํ๋ค.
ํ์ง๋ง ์ฃผ์ํ ์ ์ด ์๋ค. dependencies์ ์ ์ํ ๋ ํ์ ์ด ์์ํ์ ์ด ์๋ ์ฐธ์กฐ ํ์ ์ด๋ผ๋ฉด useCallback, useMemo ๋ฑ์ผ๋ก ํด๋น ํ์ ์ ๊ฐ์ธ์ค์ผ ํ๋ค. ์ด์ ๋ ์ฐธ์กฐํ์ ์ ์ด๋ฆ๊ณผ ๊ฐ์ด ๊ฐ์๋ ์ฃผ์๊ฐ ๋ค๋ฅด๋ค๋ฉด ๋ค๋ฅด๋ค๊ณ ํ๋ณํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๋๋ฌธ์ useEffect๋ด๋ถ์์ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํด๋น ์ธ๋ถํจ์๋ฅผ useCallback์ผ๋ก ๋ฌถ์ด์ค์ผ ํ๋ค.
๊ทธ๋ผ ์ฌ๊ธฐ์ useCallback, useMemo๋ ๋ญ๊น?
์ฝ๊ฒ ์๊ฐํ๋ฉด ๋ฆฌ์กํธ ๋ด๋ถ์์ ํด๋น ํจ์๋ฅผ ์ฒ์ ๋๋๋งํ ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ ์ด๋ฆ๊ณผ ๊ฐ์ด ๊ฐ๋ค๋ฉด ๊ฐ๋ค๊ณ ํ๋ณํ๋ ํ ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. (ํ์๋ ์ด๋ ๊ฒ ์ดํดํจ)
์๋ ์์๋ฅผ ๋ณด๋ฉด useCallback์ ์์๋ฅผ ๋ณผ ์ ์๋ค. (udemy ๊ฐ์ ์ค, useMemo๋ ์ฌ์ฉํ์ง ์์.)
import React, { useState, useEffect, useCallback } from 'react';
import MoviesList from './components/MoviesList';
import './App.css';
function App() {
const [movies, setMovies] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const fetchMoviesHandler = useCallback(async () => { //์๋ฒ๋ก ๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด.
try {
setLoading(true);
setError(null);
const response = await fetch('https://swapi.dev/api/film/');
if(!response.ok) {
throw new Error("something wrong")
}
const data = await response.json();
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);
}
setLoading(false);
}, []); //๋ํ๋์๊ฐ ์๋ ์ด์ ๋ ์ธ๋ถ์ ๊ฐ์ด useCallback์ ๋ํ๋ ํจ์์์ ์ฌ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ.
useEffect(()=> {
fetchMoviesHandler();
}, [fetchMoviesHandler]);
let content = <p>Found no movies</p>
if (movies.length > 0) {
content = <MoviesList movies={movies} />
}
if (error) {
content = <p>{error}</p>;
}
//์ด๋ ๊ฒ ํ๋ฉด ์๋ฌ๊ฐ ์ฒ์์ ์์ผ๋๊น ๋งจ ๋ง์ง๋ง ๋จ์ ๋๋ค. ์ด๊ฑธ ์๋จ์ผ๋ก ์ฌ๋ฆฌ๋ฉด ๋น ๋ฅด๊ฒ ์คํ๋๊ธฐ์ loading์ด ๋ณด์ด์ง์๋๋ค.
//์ด๋ฅผ ์๋จ์ผ๋ก ์ฌ๋ฆฌ๋ฉด error๋ถ๋ถ์ setTimeout์ ํ๊ฒ ๋๋ฉด loading์ด ๋ณด์ธ๋ค.
if (loading) {
content = <p>currently loading...</p>;
}
return (
<React.Fragment>
<section>
<button onClick={fetchMoviesHandler}>Fetch Movies</button>
</section>
<section>
{content}
</section>
</React.Fragment>
);
}
export default App;
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React - useRef (0) | 2022.05.07 |
---|---|
State ๋์ด์ฌ๋ฆฌ๊ธฐ (0) | 2022.05.07 |
React - ํฉ์ฑ (0) | 2022.05.07 |