[TIL] 엘리스 SW 엔지니어 트랙 Day 062
글 작성자: 망고좋아
반응형
📖 오늘 배운 내용 - 2022.01.18
- json-server
- 리액트, 리덕스, 라우터를 사용한 프로젝트 복습
- Development, Production의 차이
- CI/CD
📝 json-server
- 개발 초기 api가 아직 안 나왔을 때 mock을 사용해서 작업할 수 있다.
db.json
파일 만들어주고 사용할 데이터를 객체로 넣어주기- npx json-server --w db.json 실행
- npx json-server --w db.json --port 3333(포트 번호)
// db.json
{
"topics": [
{
"title": "html5",
"body": "html5 is ...",
"id": 1
},
{
"id": 2,
"title": "css",
"body": "css is..."
},
{
"title": "js",
"body": "js is ...",
"id": 3
}
]
}
async function test() {
let response = await fetch('http://localhost:3000/topics', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({title:'js', body:'js is ...'})
});
let result = await response.json();
}
test()
📝 리액트, 리덕스, 라우터를 사용한 프로젝트 복습
📕 리덕스, 리액트-리덕스, 리액트 라우터 설치
npm i redux react-redux react-router-dom
📕 리덕스 세팅 ( 리덕스 스토어를 만든다.)
import { createStore } from "redux";
// 리덕스 스토어를 만든다.
function reducer(state, action) {
// state 변경 코드
if (state === undefined) {
return {
topics: [],
};
}
const newState = { ...state }; // 객체는 불변하기 때문에 복제하여 사용
return newState; // 변경된 state가 새로운 state가 된다.
}
const store = createStore(
reducer,
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);
📕 react-redux적용
import { Provider } from "react-redux";
ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>,
document.getElementById("root")
);
- Provider 적용
📕 필요한 데이터 가져오기 (useEffect 사용)
useEffect(() => {
fetch("http://localhost:3333/topics")
.then((type) => type.json())
.then((result) => {
// state.topics 을 result의 값으로 변경한다.
console.log(result);
});
}, []);
- 앱이 실행될 때 딱 한 번만 실행 ⇒ useEffect 사용
- 컴포넌트 내부적인 변화를 위한 코드는
메인 이펙트
- 그 외를 사이드 이펙트라고 부른다. ⇒ useEffect에 위치시켜서 코드를 실행시킨다.
- 예를 들면 서버와 통신해서 데이터를 가져오기
npx json-server --port 3333 db.json
으로 실행
📕 fetch로 가져온 topics를 store에 저장 ⇒ 사용
// 수정하기
import { useDispatch } from "react-redux";
function App() {
const dispatch = useDispatch();
// topics 데이터를 1회 가져온다.
useEffect(() => {
fetch("http://localhost:3333/topics")
.then((type) => type.json())
.then((result) => {
// state.topics 을 result의 값으로 변경한다.
console.log(result);
dispatch({ type: "SET_TOPICS", topics: result });
});
}, []);
return (
<div>
<Header></Header>
<Nav></Nav>
<Article></Article>
</div>
);
}
- useDispatch import 해주고,
const dispatch = useDispatch();
정의 dispatch({ type: "SET_TOPICS", topics: result });
전달
// 리덕스 스토어를 만든다.
function reducer(state, action) {
// state 변경 코드
if (state === undefined) {
return {
topics: [],
};
}
const newState = { ...state };
if (action.type === "SET_TOPICS") {
newState.topics = action.topic;
}
return newState;
}
- reducer함수에서
action.type === "SET_TOPICS"
로 store에 저장.
📕 store에 저장한 데이터를 보여주기 ⇒ useSelector
import { useSelector } from "react-redux";
function Nav() {
const topics = useSelector((state) => state.topics);
return (
<nav>
<ul>
<li>nav</li>
</ul>
</nav>
);
}
export default Nav;
- useSelector는 state를 가져온다.
import { useSelector } from "react-redux";
const topics = useSelector((state) => state.topics);
- useSelector는 선택한 상태만 변경이 되었을 때 해당 함수를 다시 실행해서 리 렌더링 한다.
📕 리액트 라우팅 돔 설정하기
ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<BrowserRouter>
<App />
</BrowserRouter>
</Provider>
</React.StrictMode>,
document.getElementById("root")
);
- import { BrowserRouter } from "react-router-dom";
<BrowserRouter>
로 감싸주기
📕 a태그는 <Link to="">
로 바꿔주기
import { useSelector } from "react-redux";
import { Link } from "react-router-dom";
function Nav() {
const topics = useSelector((state) => state.topics);
let lis = [];
for (let i = 0; i < topics.length; i++) {
lis.push(
<li key={topics[i].id}>
<Link to={"/read/" + topics[i].id}>{topics[i].title}</Link>
</li>
);
}
return (
<nav>
<ul>{lis}</ul>
</nav>
);
}
export default Nav;
📕 Route, Routes 설정해주기
import { Route, Routes } from "react-router-dom";
return (
<div>
<Header></Header>
<Nav></Nav>
<Article></Article>
<Routes>
<Route path="/" element={<article><h1>Welcome</h1>Hello, WEB</article>}></Route>
<Route path="/read/:id" element={<article><h1>Read</h1></article>}></Route>
</Routes>
</div>
);
<Routes><Route path="/" element={<App />}></Route></Routes>
- 이렇게 설정해주면 된다.
- path는 경로를 적어주고 element로 해당 컴포넌트를 넘겨준다.
📕 id값 가져오기 (useParams)
import { useEffect, useState } from "react";
import { useParams } from "react-router-dom";
export function Read() {
// const params = useParams();
// cosnt id = params.id
const { id } = useParams();
const [topic, setTopic] = useState();
// id의 값이 바뀔 때 마다 useEffect가 실행.
useEffect(() => {
// topics/id 데이터를 가져온다.
fetch("http://localhost:3333/topics/" + id)
.then((type) => type.json())
.then((result) => {
setTopic(result);
});
}, [id]);
if (topic === undefined) {
return <>Loading...</>;
}
return (
<article>
<h1>Read</h1>
</article>
);
}
import { Route, Routes, useParams } from "react-router-dom";
const { id } = useParams();
📕 페이지 이동 설정 (useNavigate)
const go = useNavigate();
...
<form
onSubmit={async (e) => {
e.preventDefault();
const newTopic = await postTopic(e);
go("/read/" + newTopic.id);
const response = await fetch("http://localhost:3333/topics");
const topics = await response.json();
dispatch({ type: "SET_TOPICS", topics: topics });
}}
>
...
📝 리액트 프로젝트 Production으로 바꾸기
npm run build
// 설치
npm install -g serve
// 실행
serve -s build
📕 Production level인 경우에만 어떤 메시지를 출력하고 싶다면
// index.js
if (process.env.NODE_ENV !== "production") {
console.log("현재 Production 빌드로 돌아가고 있어요!");
}
- 이걸 사용하는 경우는 많지 않지만 이렇게 사용할 수 있다.
💡 오늘 깨달은 것
- 오늘 전체적인 복습을 하니까 리액트의 전체적인 흐름에 대해서 감을 잡기 시작했다!! 역시 반복이 답이다!!
- 만약 재사용성을 고려한다면 store로 받기보다는 props로 받는 것이 더 나을 수도 있다.
- Development과 Production의 차이점은 디버깅 기능의 유무이다. 그래서 Development가 느리다.
- 포트는 한정적인데 여러 개를 돌리고 싶다면? => Proxy Server 사용!!
- 포트가 막혀있는데 더 필요하다면 리버스 프록시를 이용해서 포트를 다 뚫어 놓을 수 있다.
- git 문제 상황 시나리오 연습 : Git Exercises
반응형
'프로그래밍 > Today I Learned' 카테고리의 다른 글
[TIL] 엘리스 SW 엔지니어 트랙 Day 064 (0) | 2022.01.20 |
---|---|
[TIL] 엘리스 SW 엔지니어 트랙 Day 063 (0) | 2022.01.19 |
[TIL] 엘리스 SW 엔지니어 트랙 Day 061 (0) | 2022.01.17 |
[TIL] 엘리스 SW 엔지니어 트랙 Day 060 (0) | 2022.01.17 |
[TIL] 엘리스 SW 엔지니어 트랙 Day 059 (0) | 2022.01.17 |
댓글
이 글 공유하기
다른 글
-
[TIL] 엘리스 SW 엔지니어 트랙 Day 064
[TIL] 엘리스 SW 엔지니어 트랙 Day 064
2022.01.20 -
[TIL] 엘리스 SW 엔지니어 트랙 Day 063
[TIL] 엘리스 SW 엔지니어 트랙 Day 063
2022.01.19 -
[TIL] 엘리스 SW 엔지니어 트랙 Day 061
[TIL] 엘리스 SW 엔지니어 트랙 Day 061
2022.01.17 -
[TIL] 엘리스 SW 엔지니어 트랙 Day 060
[TIL] 엘리스 SW 엔지니어 트랙 Day 060
2022.01.17