๋ชฉ๋ก๐จFrontEnd/React (13)
Input + Output = True

๐ yarn ๋ฆฌ์กํธ ์ค์น] ์์ฃผ ์ฐ๋ ๋ฆฌ์กํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ๋ช ๋ น์ด ๋ชจ์ ๋ฆฌ์กํธ yarn create react-app . ๋ฆฌ๋์ค yarn add react-redux ๋ฆฌ๋์ค ํดํท yarn add react-redux @reduxjs/toolkit ๋ฆฌ์ฝ์ผ yarn add recoil ์ฃผ์คํ ๋ yarn add zustand ๋ฆฌ์กํธ ๋ผ์ฐํฐ yarn add react-router-dom ์ ์์ค์ค yarn add axios ๋ฆฌ์กํธ ์ฟผ๋ฆฌ yarn add react-query ์คํ์ผ๋ ์ปดํฌ๋ํธ yarn add styled-components ํผ์์คํธ yarn add redux-persist ํฌ๋ก์ค์๋ธ yarn add cross-env json ์๋ฒ yarn add json-server json ์๋ฒ ์คํ yarn ..

๐๋ฆฌ์กํธ ๊ฐ์๋ / ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๋ฐฉ์ ๋ฆฌ์กํธ๋ ๊ฐ์๋(Virtual DOM)์ ์ฌ์ฉํ๊ณ , ๊ฐ์๋์ ์ค์ DOM์ ์ถ์ํํ ๊ฒ์ผ๋ก, ์ค์ DOM๊ณผ ๋์ผํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. DOM (Document Object Model ๋ฌธ์๊ฐ์ฒด๋ชจ๋ธ) ๋ธ๋ผ์ฐ์ ๊ฐ HTML ์น ํ์ด์ง๋ฅผ ์ธ์ํ๋ ๋ฐฉ์์ ๊ณ์ธตํ์์ผ ํธ๋ฆฌ๊ตฌ์กฐ๋ก ๋ง๋ ๊ฐ์ฒด(Object) ๋ชจ๋ธ DOM์ root(๋ฟ๋ฆฌ) node์์ ์์๋๋ค. ํธ๋ฆฌํ ์๋ฃ ๊ตฌ์กฐ๋ ์์ชฝ ๋ ธ๋๋ฅผ ๋ถ๋ชจ(parent) ๋ ธ๋, ์๋ซ์ชฝ ๋ ธ๋๋ฅผ ์์(child) ๋ ธ๋๋ผ๊ณ ํ๋ฉฐ root node๋ ๊ฐ์ฅ ์์์ ์์๋๋ node๋ก parent(๋ถ๋ชจ)๊ฐ ์๋ node์ด๊ณ , ์ด๋ฅผ ๋ฟ๋ฆฌ(root) node ๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. ๋ฐ๋๋ก, children(์์)์ด ์๋ node๋ฅผ ์(leaf) node๋ผ๊ณ ๋ ..

formdata react file upload / ๋ฆฌ์กํธ ์ด๋ฏธ์ง ์ ๋ก๋ / ๋ฆฌ์กํธ ์ด๋ฏธ์ง ์ ์ก ์ด๋ฏธ์ง๋ฅผ ์๋ฒ์ ์ ์กํ๋ ค๋ฉด ๋ณดํต FormData๋ผ๋ ๊ฒ์ด ํ์ํ๋ค. ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๊ณ , ์ด์ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ฝ๋๋ก ์ค๋ช ํ๊ฒ ๋ค. react + axios๋ฅผ ์ฌ์ฉํ๋ค. 1. html ์ธํ - ์ด๋ฏธ์ง ์ฒจ๋ถ 2. react ์ธํ - ์ด๋ฏธ์ง FormData ์ถ๊ฐ const [fileImg, setFileImg] = useState(); //formData func; const formData = new FormData(); const onChangeFile = (e) => { encodeFileToBase64(e.target.files[0]); const formImg = e.target.files[0]; setF..

๐ ๋ฆฌ์กํธ axios instance & interceptor/ axios ์๋ฌ ํธ๋ค๋ง ์ด๋ฒ ํ๋ก์ ํธ ์ฝ๋๋ฅผ ์์๋ก ์ฌ์ฉํ๊ฒ ๋ค โ axios instance (์ธ์คํด์ค) axios instance๋ axios๋ฅผ ์ฌ์ฉํ ๋ ๊ณตํต์ผ๋ก ๋ค์ด๊ฐ๋ ๊ธฐ๋ณธ ์ฝ๋๋ฅผ ๋ชจ๋ํ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค. import axios from "axios"; export const api = axios.create({ baseURL: "๊ธฐ๋ณธ์ผ๋ก ์ง์ ํ ์๋ฒ url", timeout: 1000, //์์ฒญ์ด ํด๋น ์ค์ ์๊ฐ๋ณด๋ค ์ง์ฐ๋ ๊ฒฝ์ฐ ์์ฒญ์ ์ค๋จ๋๋ฉฐ, catch๋ก ์๋ฌ๊ฐ ์ ๋ฌ๋๋ค headers: { "content-type": "application/json;charset=UTF-8", //"Accept": "application/..

๋ฆฌ์กํธ ์นด์นด์ค ๋ก๊ทธ์ธ (ํ๋ก ํธ ์์ ๋ก๊ทธ์ธ) ์ด๋ฒ ํ๋ก์ ํธ์์ ์งํํ ์ฝ๋๋ฅผ ์์๋ก ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค. 1. ๋ก๊ทธ์ธ ํด๋ฆญ ๋ฒํผ์ ํด๋ฆญ์ ์คํํ ํจ์ ์ถ๊ฐ 2. ์คํํ ํจ์์ ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ณธ ์ฝ๋ ์ถ๊ฐ const onClickSocialLoginKakao=()=>{ //์นด์นด์ค ๋ก๊ทธ์ธ const restApiKey = '์นด์นด์ค ๋๋ฒจ๋กํผ์์ ๋ฐ์ REST_API_KEY' const redirectUrl = '์ธ๊ฐ์ฝ๋ ๋ฐ๊ธ ๋ฐ์ ๋ ๋์์ฌ ํ์ด์ง' //์์ const restApiKey = 'abcdefghijklmnopqrstuvwxyz' const redirectUrl = 'http://localhost:3000/oauth' const KAKAO_AUTH_URL = `https://kauth.kakao.com..

๐ ๋๊ธฐ ๋น๋๊ธฐ / ์๋ฒ ํต์ (feat. react axios) โ ๋๊ธฐ์ ๋น๋๊ธฐ 1. ๋๊ธฐ (synchronous: ๋์์ ์ผ์ด๋๋) ์์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ ๋์์ ์ผ์ด๋๋ค๋ ์๋ฏธ. ์์ฒญ์ ํ๋ฉด ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ผ๋ ์์ฒญํ ์๋ฆฌ์์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋์ด์ผ ํ๋ค. ์ฅ์ : ์ค๊ณ๊ฐ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ด๋ค. ๋จ์ : ์ด๋ฒ ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ง ๋๊น์ง ๋ค์ ์์ ์งํ์ ๋ชปํ๊ณ ๋๊ธฐํด์ผ ํ๋ค. 2. ๋น๋๊ธฐ (Asynchronous: ๋์์ ์ผ์ด๋์ง ์๋) ์์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ ๋์์ ์ผ์ด๋์ง ์๋๋ค๋ ์๋ฏธ. ์์ฒญํ ๊ทธ ์๋ฆฌ์์ ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ง์ง ์์. ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์๋ฒ์์ ํต์ ์ ์ฐจ์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ค. ์ฅ์ : ์์ฒญ์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋๋ ์๊ฐ ๋์ ๋ค๋ฅธ ์์ ์ ์งํํ ์ ์๋ค. ๋จ์ : ๋๊ธฐ์๋ณด๋ค ์ค๊ณ๊ฐ ๋ค์ ๋ณต์กํ๋ค. ์๋ฅผ ๋ค์๋ฉด ๋๊ธฐ:..

๐ ๋ผ์ดํ์ฌ์ดํด(ํด๋์คํ vs ํจ์ํ), React hooks โ ๋ผ์ดํ์ฌ์ดํด(ํด๋์คํ vs ํจ์ํ) ๋ผ์ดํ์ฌ์ดํด(LifeCycle) ๋ฆฌ์กํธ์ ์ปดํฌ๋ํธ๋ค์ ๋ผ์ดํ์ฌ์ดํด(์๋ช ์ฃผ๊ธฐ)์ ๊ฐ์ง๊ณ ์๋ค. ๋ผ์ดํ์ฌ์ดํด์ ์ปดํฌ๋ํธ์ ์์ฑ๋ถํฐ ์ ๋ฐ์ดํธ, ๊ทธ๋ฆฌ๊ณ ์๋ฉธ(์ ๊ฑฐ)๋๋ ๊ณผ์ ์ ์๋ฏธํ๋ค. ํด๋์คํ ์ปดํฌ๋ํธ : ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋๋ฅผ ํตํด์ ํด๋น ์์ ์ ๋ฐ๋ผ ์ปดํฌ๋ํธ๋ฅผ ์กฐ์ํ๋ค. ํจ์ํ ์ปดํฌ๋ํธ : ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋๊ฐ ๋ฐ๋ก ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ ํ ์ ์ฌ์ฉํ์ฌ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋์ ๋น์ทํ๊ฒ ๋์ํ๋๋ก ๊ตฌํํ๋ค. ๋ผ์ดํ์ฌ์ดํด์ ํฌ๊ฒ ์ธ ๋จ๊ณ๋ก ๋๋ ์ง๋ค. ์์ฑ(Mount), ์ ๋ฐ์ดํธ(Update), ์ ๊ฑฐ(Unmount) Mount: ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ ๋จ๊ณ Update: ์๋ 5๊ฐ์ง ๊ฒฝ์ฐ๋ก ์ธํด ์ ๋ฐ์ดํธ ๋๋ค(๋ฆฌ..

๐ redux-persist ์ฌ์ฉ๋ฒ โ redux persist๋ฅผ ์ฌ์ฉํ๋ ์ด์ ? ๋ฆฌ๋์ค์ store๋ ํ์ด์ง ์๋ก๊ณ ์นจ์ด ๋ ๋ state ๊ฐ์ด ์ด๊ธฐํ ๋๋ค. ๋ง์ฝ ํ์ด์ง ์๋ก๊ณ ์นจ์ ํด๋ state ๊ฐ์ ์ ์งํ๊ณ ์ถ๋ค๋ฉด ์ ์ฅํ๊ณ ์ ํ๋ reducer state๋ฅผ LocalStorage ๋๋ SessionStorage์ ์ ์ฅํด์ ์๋ก๊ณ ์นจ์ ํด๋ ์ ์ฅ๊ณต๊ฐ์ ์๋ ๋ฐ์ดํฐ๋ฅผ redux์ ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค. ์ด ๋ฐฉ๋ฒ์ redux-persist๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋ค. โ redux persist ์ธํ ๋ฐฉ๋ฒ redux๊ฐ ์ด๋ฏธ ์ธํ ๋์ด ์๋ ์ํฉ์ ๊ฐ์ ํ๊ณ ์งํ redux persist ์ค์น yarn add redux-persist reducer์ persist store ์ ์ //configStore..

๐ React - ๋ฆฌ๋์ค(redux) ์ดํดํ๊ธฐ โ Redux๋? Redux ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ๋ฐ์ดํธํ๊ธฐ ์ํ ํจํด ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ํ๊ฐ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก๋ง ์ ๋ฐ์ดํธ๋ ์ ์๋๋ก ํ๋ ๊ท์น๊ณผ ํจ๊ป ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํด์ผ ํ๋ ์ํ์ ๋ํ ์ค์ ์ง์ค์ ์ ์ฅ์ ์ญํ ์ ํฉ๋๋ค. -redux ๊ณต์๋ฌธ์- ํ ๋ง๋๋ก ๋ฆฌ๋์ค๋ "state ์ฌ์ฉ์ ๋ ํธํ๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ"๋ผ๊ณ ์ดํดํ ์ ์๋ค Local State ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด A ์ปดํฌ๋ํธ ์์ ์๋ data๋ผ๋ state๋ฅผ(Local State) B ํน์ C ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๊ธฐ ์ํด A ์ปดํฌ๋ํธ์์ B๋ C ํน์ B๋ฅผ ํตํด์ C๋ก ์ ๋ฌํด์ฃผ์ด์ผ ํ๋ ๋ถํธํจ์ด ์๋ค ๋ง์ฝ ๊ทธ depth๊ฐ ๊น๋ค๋ฉด? ์ด๋ฏธ์ง(Without Redux..

๐ State, Props, ๋ฆฌ๋ ๋๋ง ๋ฐ์ ์กฐ๊ฑด State State State๋ ์ปดํฌ๋ํธ ์์์ ๊ด๋ฆฌ๋๊ณ ๋ฐ์ดํฐ ๋๋ ์ ๋ณด๋ฅผ ๋ด์ javascript ๊ฐ์ฒด์ด๋ค. (ํจ์ ๋ด์ ์ ์ธ๋ ๋ณ์์ฒ๋ผ) ๋ ๋๋ง๋ ๊ฐ์ ๋ํ๋ธ๋ค. (ํ๋ฉด์ ๋ณด์ด๋ ๊ฐ) ์ฌ์ฉ์ ๋๋ ๋คํธ์ํฌ ๋ณ๊ฒฝ์ ๋ฐ๋ผ state๋ฅผ ์์ ํ ์ ์๋ค. ๊ฐ์ฒด์ ์ํ๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ๋ฆฌ๋ ๋๋งํ๋ค. (setState()๋ฅผ ์ฌ์ฉํ๋ค.) Props Props (Properties) Props๋ ๋ฐ์ดํฐ ๋๋ ์ ๋ณด๋ฅผ ๋ด์ javascript ๊ฐ์ฒด์ด๋ค. (ํจ์ ๋งค๊ฐ๋ณ์์ฒ๋ผ) ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ : ์์ ์ปดํฌ๋ํธ๊ฐ ํ์ ์ปดํฌ๋ํธ์ ๊ฐ์ ์ ๋ฌํ ๋ ์ฌ์ฉํ๋ค. ์์ ํ ์ ์๋ค. (์ ๋ฌ๋ฐ์ ํ์ ์ปดํฌ๋ํธ ์ ์ฅ์์๋ ์ฝ๊ธฐ ์ ์ฉ ๋ฐ์ดํฐ์ด๋ค.) Stat..