서버 구현 없이 간단한 CRUD 프로젝트를 구현할 수 있는 npm package.
= 서버 구현 없이 새로 생성한 값을 저장할 수 있다(날아가지 않음).
npm i json-server
"scripts": {
"start": "react-scripts start & npm run server",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"server": "json-server --watch [파일경로 =>]./src/db/db.json --port 8000"
},
위와 같이 설정한 후 npm run start하면 npm run start와 npm run server가 동시에 실행되어야 하는데 서버 실행은 안됨! 왜..?mac에선 되고 windows에선 안되는건지 구글링해보기 + scripts를 다르게 작성해야할 수도 있음
mock data 생성 -> axios 라이브러리와 http request로 데이터 관리
포커스 : 디렉토리를 어떻게 구분했는지?, 어떻게 각 파일이 체이닝 되었는지? 단계가 어떻게 나뉘어져 있는지? 현업 종사자는 유지보수 측면에서 어떻게 작성하는지?...
mock data는 src/database/databse.json로 저장(package.json scripts 부분에 들어갈 경로는 ./src/database/database.json)
axios 인스턴스를 src/services/movieServise.js에서 생성함. axios에 바로 http request를 호출하지 않고, url을 넣은 axios 인스턴스만 만듬. -> 이렇게 만든 axios 인스턴스를 또 외부에서 만든 HttpRequest class의 인자로 전달함으로써 최종적으로 axios와 http request가 이루어지는 movieRequest라는 인스턴스를 생성함.
src/http/httpRequest.js에 HttpRequest class를 만들어서 생성자로 service를 초기화 해줌.(service는 axios 인스턴스이다) 그리고 axios를 통해 데이터를 관리할 http request들이 어떻게 동작할건지 재선언해줌. ★이부분이 가장 신박했다★
src/models/useMovieModel.js에서는 위에서 만든 movieRequest 인스턴스(axios와 http request 연결된)를 가져와서 실제로 데이터를 가져오는 작업을 진행함. 가져온 데이터는 useState로 관리. 세터함수에 가져온 데이터를 전달하는 작업을 따로 callback함수로 감쌈
★분업화 = 하나의 함수는 하나의 행동만★
getMovies() : axios.get으로 데이터를 가져오는 작업
getMoviesCallback() : 가져온 데이터를 세터함수로 전달하는 작업
patchMovieById() : axios.patch로 데이터를 변경하는 작업(Promise를 반환한다!!)
다같이 return ~> (custom hooks 같이!)
//MainPage.jsx에 모두 작성
//json-server 사용 안함
const api = "/data/sampleFeed.json";
const getFeed = async (url) => {
const {
data: { feeds },
} = await axios.get(url);
setFeeds({ feeds: feeds });
};
...
useEffect(() => {
if (user) {
getFeed(api);
} else return;
}, []);
movie && movie.map(()=>{...}) //undefined나 null인 값을 map하면 오류가 나므로 이렇게 걸르던것을
=> movie?.map(()=>{...}) //옵셔널 체이닝으로 더 짧게 표현가능해짐