npx create-react-app .
npm run start
rfce
스타일링
css- JS에서 어떻게 CSS 파일을 불러올 수 있는 걸까?
- CRA를 통해 설치된 웹팩이 우리 모르게 해 주고 있는 것
scsshttps://create-react-app.dev/docs/adding-a-sass-stylesheet
CSS Modules- [name].module.scss
- 이름 충돌 방지
CSS in JS- styled-components
- emotion
- …
- Tailwind CSS
- bootstrap
npm install -D sass
import styles from "./Post.module.scss";
CSS in JSnpm install -D styled-components

useEffect
'useEffect' 후크는 구성 요소가 렌더링된 직후에 호출되며 모든 변경 사항이 DOM에 반영됩니다.
이는 데이터 가져오기 작업에 이상적!
코드에서 useEffect는 구성요소가 DOM에 마운트될 때 서로 다른 두 엔드포인트(nowPlayingEndpoint 및 topRatedEndpoint)에서 영화 데이터를 가져오는 데 사용됩니다.
이렇게 하면 영화 데이터를 가져와 가능한 한 빨리 사용자에게 표시할 수 있습니다.
=> 즉, useEffect 를 사용하면 한번만 마운트시 데이터를 가지고 오니까 계속 상태가 업데이트 되지 않기 위해( 리소스 낭비를 하지 않기 위해) 사용
import { useEffect, useState } from "react";
import styles from "./App.module.scss";
import Header from "./components/Header";
import MoviesList from "./components/MoviesList";
const TMDB_ACCESS_TOKEN = process.env.REACT_APP_TMDB_ACCESS_TOKEN;
const nowPlayingEndpoint =
"https://api.themoviedb.org/3/movie/now_playing?language=ko-KR®ion=KR&page=1";
const topRatedEndpoint =
"https://api.themoviedb.org/3/movie/top_rated?language=ko-KR®ion=KR&page=1";
const options = {
method: "GET",
headers: {
accept: "application/json",
Authorization: `Bearer ${TMDB_ACCESS_TOKEN}`,
},
};
const getMovies = async (endpoint) => {
const response = await fetch(endpoint, options);
const data = await response.json();
const movies = data.results;
return movies;
};
function App() {
const [movies, setMovies] = useState({ nowPlaying: [], topRated: [] });
useEffect(() => {
Promise.all([
getMovies(nowPlayingEndpoint),
getMovies(topRatedEndpoint),
]).then(([nowPlaying, topRated]) => setMovies({ nowPlaying, topRated }));
}, []);
return (
<div className={styles.app}>
<Header />
<main>
<MoviesList listTitle="현재 상영작" movies={movies.nowPlaying} />
<MoviesList listTitle="평점이 높은 영화" movies={movies.topRated} />
</main>
</div>
);
}
export default App;
Promise.all ?
Promise.all은 여러 Promise를 동시에 처리하는 데 사용되는 JavaScript의 메서드
서로 의존하지 않는 여러 비동기 작업이 있고 모든 작업이 완료된 후에만 일부 작업을 수행하려는 경우 Promise.all은 이러한 작업을 관리하는 효율적인 방법입니다.
Promise.all([
getMovies(nowPlayingEndpoint),
getMovies(topRatedEndpoint),
])
.then(([nowPlaying, topRated]) => setMovies({ nowPlaying, topRated }));
Promise.all 함수는 Promise 배열을 인수로 사용합니다. 귀하의 경우 이러한 약속은 getMovies(nowPlayingEndpoint) 및 getMovies(topRatedEndpoint)를 호출한 결과입니다. 이러한 함수는 지정된 엔드포인트에서 영화 데이터를 비동기적으로 가져옵니다.
모든 Promise가 해결되기를 기다리는 중: Promise.all은 전달된 모든 Promise가 해결되기를 기다립니다.
즉, 모든 비동기 작업(현재 재생 중인 영화 및 최고 평점 영화 가져오기)이 완료될 때까지 기다립니다. Promise 중 하나라도 실패하면(즉, 거부되면) Promise.all은 거부하는 첫 번째 Promise의 이유로 즉시 거부하여 전체 작업이 실패합니다.
수행해야 하는 여러 개의 독립적인 비동기 작업이 있고 계속 진행하기 전에 모든 작업이 완료될 때까지 기다리고 싶은 경우.
작업 순서가 중요하지 않은 경우 'Promise.all'은 작업이 시작된 순서대로 완료된다는 것을 보장하지 않습니다.
여러 비동기 작업의 결과를 집계해야 하는 경우.