javascript/[TIL] ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ (18) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ ํ๋ก ํธ์๋ ํ๋ก์ ํธ : ๊ธ์ฐ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ Quill ๋ผ์ด๋ธ๋ฌ๋ฆฌ : ๊ธ์ ์์ฑํ๋ ์๋ํฐ https://quilljs.com/docs/quickstart/ Quickstart - Quill Quickstart The best way to get started is try a simple example. Quill is initialized with a DOM element to contain the editor. The contents of that element will become the initial contents of Quill. Hello World! Some initial bold text var quill = new Quill quilljs.com toolbar const Editor = ({ title, body, onChange.. ํ๋ก ํธ์๋ ํ๋ก์ ํธ : ์์ ๋ฐ ํ์ ์ธ์ฆ ๊ตฌํ ํ์ ์ธ์ฆ UI ๊ตฌํ, ํ์ ์ธ์ฆ ๋ฆฌ๋์ค ์ฐ๋, ํค๋ ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ, ๋ก๊ทธ์ธ ์ ์ง ๋ฐ ๋ก๊ทธ์์ ํ๋ก์ ํธ๋ฅผ ์ฒ์ ๋ง๋ค๊ณ ๋์ ์ค๊ณ๋ฅผ ์์ํ ๋ ๊ฐ์ฅ ๋จผ์ ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ํ๋ก์ ํธ์ ์ค์นํ๊ณ ์ ์ฉํ๊ธฐ ๊ทธ๋ฆฌ๊ณ ์ฃผ์ ํ์ด์ง์ ๋ผ์ฐํธ ์ปดํฌ๋ํธ๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋จผ์ ํ์ ๊ฐ์ถ๊ณ ํ๋์ฉ ๊ฐ๋ฐ styled-component styled-component๋ก ๋ง๋ ์ปดํฌ๋ํธ(StyledButton)๋ฅผ ๋ฐ๋ก ๋ด๋ณด๋ด๋ฉด ์๋ import๊ฐ ์๋๋์ง ์๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ฆฌ์กํธ ์ปดํฌ๋ํธ(Button)๋ฅผ ๋ง๋ค์ด์ ๊ทธ ์์ styled-component๋ก ๋ง๋ ์ปดํฌ๋ํธ(StyledButton)๋ฅผ ๋ ๋๋งํด์ค๋ค. import styled from 'styled-components'; const StyledButton = styled.butt.. ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - JWT๋ฅผ ํตํ ํ์ ์ธ์ฆ ์์คํ ๊ตฌํํ๊ธฐ JWT(JSON Web Token) : ๋ฐ์ดํฐ๊ฐ JSON์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ ํ ํฐ์ ์๋ฏธํฉ๋๋ค. ๋ ๊ฐ์ฒด๊ฐ ์๋ก ์์ ํ๊ฒ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋๋ก ์น ํ์ค์ผ๋ก ์ ์๋์๋ค. ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์ํ๋ฅผ ์๋ฒ์์ ์ฒ๋ฆฌํ๋ ๋ํ์ ์ธ ๋ ๊ฐ์ง ์ธ์ฆ๋ฐฉ์ 1. ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ 2. ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ 1. ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ : ์๋ฒ๊ฐ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ์ค์์ ๊ธฐ์ตํ๊ณ ์๋ค. ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ ์์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์, ์๋ฒ๋ ์ธ์ ์ ์ฅ์์์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์กฐํํ๊ณ ์ธ์ id๋ฅผ ๋ฐ๊ธํ๋ค. ๋ฐ๊ธ๋ id๋ ์ฃผ๋ก ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค์ ์ ์ฅํ๋ค. ๊ทธ ๋ค์์ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค ์๋ฒ๋ ์ธ์ ์ ์ฅ์์์ ์ธ์ ์ ์กฐํํ ํ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ์ฌ ์์ ์ ์ฒ๋ฆฌํ๊ณ ์๋ตํ๋ค. ์ธ์ ์ ์ฅ์๋ ์ฃผ๋ก ๋ฉ๋ชจ๋ฆฌ, ๋์ค.. ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - mongoose๋ฅผ ์ด์ฉํ MongoDB ์ฐ๋ - MongpDB๋? - ์์ ํ๊ฒฝ ์ค์ - mongoose๋ก DB ์ฐ๊ฒฐํ๊ธฐ - esm์ผ๋ก ES ๋ชจ๋ import/export ๋ฌธ๋ฒ ์ฌ์ฉํ๊ธฐ - ์คํค๋ง์ ๋ชจ๋ธ ์ดํดํ๊ธฐ - REST API ๊ตฌํํ๊ธฐ - ํ์ด์ง๋ค์ด์ ๊ตฌํํ๊ธฐ MongoDB ๋ฌธ์ ์งํฅ์ NoSQL ๋ฐ์ดํฐ ๋ฒ ์ด์ค ↔ RDBMS(๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค : MySQL, OracleDB) ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฑ๋กํ๋ ๋ฐ์ดํฐ๋ค์ ์ ๋์ ์ธ ์คํค๋ง๋ฅผ ์ง๋๋ค. ์ฅ์ 1. ์ข ๋ฅ๊ฐ ๊ฐ์ ๋ฐ์ดํฐ๋ผ๊ณ ํ๋๋ผ๋, ์๋ก ๋ฑ๋กํ๋ ๋ฐ์ดํฐ ํ์์ด ๋ฐ๋๋ค๊ณ ํ๋๋ผ๋ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ์์ ํ ํ์๊ฐ ์๋ค. → ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๊ฐ ์์ฃผ ๋ฐ๋๋ค๋ฉด MongoDB๊ฐ ์ ๋ฆฌํฉ๋๋ค. ์ฅ์ 2. ์๋ฒ์ ๋ฐ์ดํฐ์์ด ๋์ด๋๋ ํ ์ปดํจํฐ์์๋ง ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋, ์ฌ๋ฌ ์ปดํจํฐ๋ก ๋ถ์ฐํ์ฌ ์ฒ๋ฆฌํ๋๋ก ํ์ฅํ.. ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - Koa ํ๋ ์์ํฌ, nodemon, koa-router Node.js ํ๊ฒฝ์์ ์น ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ Koa ์น ํ๋ ์์ํฌ 1. Koa๋ ํ์ํ ๊ธฐ๋ฅ๋ค๋ง ๋ถ์ฌ์ ์๋ฒ๋ฅผ ๋ง๋ค ์ ์๋ค. Koa๋ ๋ฏธ๋ค์จ์ด ๊ธฐ๋ฅ๋ง ์์ผ๋ฉฐ ๋๋จธ์ง๋(๋ผ์ฐํ , ํ ํ๋ฆฟ ํ์ผ ํธ์คํ ๋ฑ) ๊ธฐ๋ฅ๋ค์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฉํ์ฌ ์ฌ์ฉํ๋ค. (๋ฌด๊ฒ : koa < Express Express๋ ๋ฏธ๋ค์จ์ด, ๋ผ์ฐํ , ํ ํ๋ฆฟ ํ์ผ ํธ์คํ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด์๋ค.) 2. Koa๋ async/await ๋ฌธ๋ฒ์ ์ ์์ผ๋ก ์ง์ํด ๋น๋๊ธฐ ์์ ์ ๋ ํธ๋ฆฌํ๊ฒ ๊ด๋ฆฌ ํ ์ ์๋ค. Koa ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ 0. Koa ์น ํ๋ ์์ํฌ ์ค์นํ๊ธฐ yarn add koa 1. ์๋ฒ ๋์ฐ๊ธฐ const Koa = require('koa'); const app = new Koa(); // app.use() : ๋ฏธ๋ค์จ์ด ํจ์๋ฅผ ์ ํ.. ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ๋ฆฌ์กํธ vs Next JS vs Gatsby ์ธ์ ๋ญ ์จ์ผํ์ง? | CSR vs SSR vs SSG ๋ด ํ๋ก์ ํธ ๋ถ์ํ๊ณ ๋ง๋ ๊ธฐ์ ์คํ ์ ํํ๋๋ฒ! ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง : UI๋ฅผ ์๋ฒ์์ ๋ ๋๋ง ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ฆฌ์ํธ ํ๋ก์ ํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง์ ํ๊ณ ์์ต๋๋ค. (* ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง : UI ๋ ๋๋ง์ ๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋ ์ฒ๋ฆฌํ๋ ๊ฒ, ์ฒ์์๋ ๋น html ํ์ผ์ ๋๊ฒจ์ฃผ๋ฉฐ, ๊ทธ ์ดํ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํ๋๊ณ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ฉด์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํ๋ฉด์ด ๋ณด์ ๋๋ค.) ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ์ฅ์ 1. SEO(Search Engine Optimization : ๊ฒ์ ์์ง ์ต์ ํ) : ๊ฒ์ ์์ง์ด ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ด์ง๋ฅผ ์ํํ๊ฒ ์์งํ ์ ์๋ค. SPA๋ ๊ฒ์ .. ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - ์ฝ๋ ์คํ๋ฆฌํ ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ์์ฑํด ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ ๋, ๋น๋ ์์ ์ ๊ฑฐ์ณ์ ๋ฐฐํฌํด์ผ ํ๋ค. ๋น๋ ์์ ์ผ๋ก ํ๋ก์ ํธ์์ ์ฌ์ฉ๋๋ .js ์์ ๋ถํ์ํ ์ฃผ์, ๊ฒฝ๊ณ ๋ฉ์ธ์ง, ๊ณต๋ฐฑ์ ์ ๊ฑฐํด ํ์ผ ํฌ๊ธฐ๋ฅผ ์ต์ํํ๊ณ , ๋ธ๋ผ์ฐ์ ์์ JSX ๋ฌธ๋ฒ์ด๋ ๋ค๋ฅธ ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ด ์ํํ๊ฒ ์คํ๋๋๋ก ์ฝ๋์ ํธ๋์ค ํ์ผ ์์ ๋ ํ ์ ์๋ค. ์ ์ ํ์ผ(์ด๋ฏธ์ง)์ด ์๋ค๋ฉด ํด๋น ํ์ผ์ ์ํ ๊ฒฝ๋ก๋ ์ค์ ๋๋ค. ์ด ์์ ์ webpack์ด ๋ด๋นํ๋ฉฐ, webpack์์ ๋ณ๋์ ์ค์ ์ ํ์ง ์์ผ๋ฉด ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ํ๋์ ํ์ผ๋ก ํฉ์ณ์ง๊ณ ๋ชจ๋ CSS ํ์ผ๋ ํ๋์ ํ์ผ๋ก ํฉ์ณ์ง๋ค. CRA(create react-app)๋ก ํ๋ก์ ํธ๋ฅผ ๋น๋ํ ๊ฒฝ์ฐ, ์ต์ ๋ ๊ฐ ์ด์์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ์์ฑ๋๋ค. CRA์ ๊ธฐ๋ณธ webpack ์ค์ ์๋.. ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - ๋ฆฌ๋์ค ๋ฏธ๋ค์จ์ด๋ฅผ ํตํ ๋น๋๊ธฐ ์์ ๋ฆฌ์กํธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ API ์๋ฒ๋ฅผ ์ฐ๋ํ ๋๋ API ์์ฒญ์ ๋ํ ์ํ๋ ์ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. [ ์์ฒญ ์์ -> ๋ก๋ฉ ์ค -> ์์ฒญ ์ฑ๊ณต, ์คํจ -> ๋ก๋ฉ์ด ๋๋ฌ์ ] ์ ๋ช ์ํด์ผ ํฉ๋๋ค. ์์ฒญ ์ฑ๊ณต -> ์๋ฒ์์ ๋ฐ์ ์๋ต์ ๋ํ ์ํ๋ฅผ ๊ด๋ฆฌ ์์ฒญ ์คํจ -> ์๋ฒ์์ ๋ฐํํ ์๋ฌ์ ๋ํ ์ํ๋ฅผ ๊ด๋ฆฌ ๋ฆฌ์กํธ ํ๋ก์ ํธ์์ redux๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ด๋ฌํ ๋น๋๊ธฐ ์์ ์ ๊ด๋ฆฌํด์ผ ํ๋ค๋ฉด, middleware๋ฅผ ์ฌ์ฉํ์ฌ ํจ์จ์ ์ด ํธํ๊ฒ ์ํ ๊ด๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค. redux middleware๋ ์ก์ ์ ๋์คํจ์นํ์๋ reducer์์ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ ์์ ์ฌ์ ์ ์ง์ ๋ ์์ ๋ค์ ์คํํฉ๋๋ค. ์ก์ โถ middleware โถreducer โถ store ๋ฏธ๋ค์จ์ด๋ ์ก์ ๊ณผ ๋ฆฌ๋์ ์ฌ์ด์ ์ค๊ฐ์ reduc.. ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - ๋ฆฌ๋์ค(Redux) ๋ฆฌ๋์ค๋ ๋ฆฌ์กํธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : ์ปดํฌ๋ํธ์ ์ํ ์ ๋ฐ์ดํธ ๊ด๋ จ ๋ก์ง์ ๋ค๋ฅธ ํ์ผ๋ก ๋ถ๋ฆฌ์์ผ ํจ์จ์ ์ธ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค. (= ์ ๋ฐ์ดํธ์ ๊ด๋ จ๋ ๋ก์ง์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์์ ์๋ฒฝํ๊ฒ ๋ถ๋ฆฌ -> ์ ์ง ๋ณด์์ฑ์ด ๋์ ์ฝ๋๋ฅผ ์์ฑํด ๋ผ ์ ์๋ค. ) ์ปดํฌ๋ํธ๋ผ๋ฆฌ ๋๊ฐ์ ์ํ๋ฅผ ๊ณต์ ํ ์ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ์์ฝ๊ฒ ์ํ๊ฐ์ ์ ๋ฌ, ์ ๋ฐ์ดํธ ํ ์ ์๋ค. (์ ์ญ ์ํ๋ฅผ ๊ด๋ฆฌํ ๋ ํจ๊ณผ์ ) redux ๊ฐ๋ - ์ก์ ๊ฐ์ฒด ์ํ ๋ณ๊ฒฝ์ ์ค๋ช ํ๋ ๊ฐ์ฒด ๋ฐ๋์ type ํ๋(=์ก์ ์ ์ด๋ฆ)๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผํจ. ๊ทธ ์ธ์ ๊ฐ์ ์ ๋ฐ์ดํธ์ ์ฐธ๊ณ ํด์ผํ ๊ฐ ์ก์ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๊ธฐ ๋ณด๋จ, ์ก์ ๊ฐ์ฒด ์์ฑํจ์๋ฅผ ๋ง๋ค์ด์ ๊ด๋ฆฌํ๋ค. export const increase = () => ({ type: INCREASE }).. ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - ์ปดํฌ๋ํธ ์คํ์ผ๋ง(CSS, Sass, Css Module, styled-components) ์ปดํฌ๋ํธ๋ฅผ ์คํ์ผ๋ง ๋ฐฉ์ 1. ์ผ๋ฐ CSS : ์ปดํฌ๋ํธ๋ฅผ ์คํ์ผ๋งํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์ 2. Sass(Syntactically Awesome Style Sheets) (.scss, .sass) : CSS ์ ์ฒ๋ฆฌ๊ธฐ - ๋ณต์กํ ์์ ์ ์ฝ๊ฒ ํ ์ ์๋๋ก ํด์ฃผ๊ณ - ์คํ์ผ ์ฝ๋์ ์ฌํ์ฉ์ฑ์ ๋์ฌ์ค - ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ฌ์ค. -> ์ ์ง๋ณด์๋ฅผ ๋์ฑ ์ฝ๊ฒ ํด์ค // ๋ณ์ ์ฌ์ฉํ๊ธฐ $red : #fa5252; $orange : #fd7e14; // ๋ฏน์ค์ธ(์ฌ์ฌ์ฉ๋๋ ์คํ์ผ ๋ธ๋ก์ ํจ์์ฒ๋ผ ์ฌ์ฉ) @mixin square($size){ $calcualated : 32px * $size; width: $calcualated; height: $calcualated; } .SassComponent{ .box{ // .S.. ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - Context API Context API๋ ๋ฆฌ์กํธ ํ๋ก์ ํธ์์ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ ๋ฐ์ดํฐ๊ฐ (์ฌ์ฉ์ ๋ก๊ทธ์ธ ์ ๋ณด, ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ ์ค์ ํ ๋ง ๋ฑ) ์์๋ ์ ์ฉํ ๊ธฐ๋ฅ ๋ฆฌ๋์ค, ๋ฆฌ์กํธ ๋ผ์ฐํฐ, styled-components ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Context API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋์์ต๋๋ค. Context API๋ฅผ ์ฌ์ฉํ ์ ์ญ ์ํ ๊ด๋ฆฌ ํ๋ฆ ์ดํดํ๊ธฐ ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปดํฌ๋ํธ ๊ฐ ๋ฐ์ดํฐ๋ฅผ props๋ก ์ ๋ฌํ๊ธฐ ๋๋ฌธ์, ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ ๋ฐ์ดํฐ๋ ์ต์์ ์ปดํฌ๋ํธ์ธ App์ state์ ๋ฃ์ด์ ๊ด๋ฆฌํฉ๋๋ค. → ์ ์ง ๋ณด์์ฑ์ด ๋ฎ์์ง ๊ฐ๋ฅ์ฑ์ด ์๋ค. (์ด์ : ์ต์์ ์ปดํฌ๋ํธ์์ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๊ฑฐ์ณ props๋ก ์ํ๋ ์ํ์ ํจ์๋ฅผ ์ ๋ฌํ๊ธฐ ๋๋ฌธ) โ ํด๊ฒฐ : ๋ฆฌ๋์ค ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ์ ์ญ ์ํ ๊ด๋ฆฌ ์์ ์ ๋.. [๊ตฌ๊ธ๋ง] ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - ์ธ๋ถ API๋ฅผ ์ฐ๋ํ์ฌ ๋ด์ค ๋ทฐ์ด ๋ง๋ค๊ธฐ ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ์ต์ ๋ด์ค ๋ชฉ๋ก์ ๋ณด์ฌ ์ฃผ๋ ๋ด์ค ๋ทฐ์ด ํ๋ก์ ํธ ๋น๋๊ธฐ ์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๋ค ๋ณด๋ฉด ์ฒ๋ฆฌํ ๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์์ ์ด ์๋ค. ์) ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ฒ ์ชฝ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๋ Ajax ๊ธฐ๋ฒ์ ์ฌ์ฉํด ์๋ฒ์ API๋ฅผ ํธ์ถํจ์ผ๋ก์จ ๋ฐ์ดํฐ๋ฅผ ์์ ํฉ๋๋ค. ์ด๋ ๊ฒ ์๋ฒ์ API๋ฅผ ์ฌ์ฉํด์ผ ํ ๋๋ ๋คํธ์ํฌ ์ก์์ ๊ณผ์ ์์ ์๊ฐ ์์, ์๋ต์ ๋ฐ์ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ ๋ฌ๋ฐ์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. โถ ์ด ๊ณผ์ ์์ ํด๋น ์์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.(๋์์ ์ฌ๋ฌ ์์ฒญ์ ์ฒ๋ฆฌ, ๊ธฐ๋ค๋ฆฌ๋ ๊ณผ์ ์์ ๋ค๋ฅธ ํจ์๋ ํธ์ถ) ๊ทธ๊ฒ์ด ๋ฐ๋ก Ajax ๊ธฐ๋ฒ(Asynchronous JavaScript and XML) axios : ์๋ฐ์คํฌ๋ฆฝํธ HTTP ํด๋ผ์ด์ธํธ ์น ํต์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ htt.. ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ก SPA ๊ฐ๋ฐํ๊ธฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ผ์ฐํ ์ด๋? ๋ผ์ฐํ : ์ฌ์ฉ์๊ฐ ์์ฒญํ URL์ ๋ฐ๋ผ ์๋ง์ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ ์ฌ๋ฌ ํ์ด์ง๋ก ๊ตฌ์ฑ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋, ํ์ด์ง ๋ณ๋ก ์ปดํฌ๋ํธ๋ค์ ๋ถ๋ฆฌํด๊ฐ๋ฉด์ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ํ์ํ ๊ฒ์ด ๋ฐ๋ก ๋ผ์ฐํ ์์คํ ์ ๋๋ค. ๋ฆฌ์กํธ ๋ผ์ฐํฐ, Next.js ๋ฆฌ์ํธ์์ ๋ผ์ฐํ ์์คํ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. - ๋ฆฌ์กํธ ๋ผ์ฐํฐ : ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ฐํ ์์คํ ์ ์ค์ ํ ์ ์์ต๋๋ค. - Next.js : ๋ฆฌ์กํธ ํ๋ก์ ํธ์ ํ๋ ์์ํฌ, ์ด ํ๋ ์์ํฌ์ ๋ผ์ฐํ ์์คํ ์ ํ์ผ ๊ฒฝ๋ก ๊ธฐ๋ฐ์ผ๋ก ์๋ ๋ผ์ฐํ ๊ด๋ จ ๊ธฐ๋ฅ์ ๋ฆฌ์กํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ณต์์ ์ผ๋ก ์ง์ํ๋ ๊ฒ์ด ์๋ ์๋ ํํฐ๋ก ์ ๊ณต๋ฉ๋๋ค. * ์๋ ํํฐ๋? ํธํ๊ณ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ ์ํด, ํ๋ฌ๊ทธ์ธ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ๋ ์์ํฌ๋ก, ์ ์์ฌ.. ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - ์ปดํฌ๋ํธ ์ฑ๋ฅ ์ต์ ํ React DevTools๋ฅผ ํ์ฉํด ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋ง ํ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ ์ํฉ 1. ์์ ์ด ์ ๋ฌ๋ฐ์ props๊ฐ ๋ณ๊ฒฝ๋ ๋ 2. ์์ ์ state๊ฐ ๋ฐ๋ ๋ 3. ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋งํ ๋ 4. forceUpdate ํจ์๊ฐ ์คํ๋ ๋ -> ๋ฆฌ๋ ๋๋ง์ด ๋ถํ์ํ ๋๋ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํด์ฃผ์ด์ผํฉ๋๋ค. 1. React.memo : ์ด์ ๊ณผ ๊ฐ์ props๊ฐ ๋ค์ด์ฌ๋, ๋ ๋๋ง ๊ณผ์ ์ ์คํต, ๊ฐ์ฅ ์ต๊ทผ์ ๋ ๋๋ง๋ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ๋ฆฌ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํ (== React.memo๋ฅผ ์ฌ์ฉํ์ฌ ๋ถํ์ํ ์ปดํฌ๋ํธ ๋ ๋๋ง์ ๋ฐฉ์ง ํ ์ ์๋ค.) ๋ผ์ดํ์ฌ์ดํด ์ค 'shouldComponentUpdate'๋ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํฉ๋๋ค. ํ์ง๋ง โ์ด๋ ํจ์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ ๋์ Reac.. 10/11์ผ ์ค๋ ๊ตฌ๊ธ๋ง ํ ๋ด์ฉ (Prettier Option, CSS) Prettier : ์ฝ๋ ์คํ์ผ ์๋ ์ ๋ฆฌ ๋๊ตฌ ์๋ ์ ๋ ฌ, ์๋ ์ธ๋ฏธ์ฝ๋ก ์ถ๊ฐ, ํฐ๋ฐ์ดํ๋ก ํต์ผ ๋ฑ๋ฑ ์ด๋ฌํ ์คํ์ผ์ ์ฝ๊ฒ ์ปค์คํฐ๋ง์ด์ง ํ ์ ์๋ค. - "trailingComma" : ํญ๋ชฉ์ ๋์ด์์ ๋ง์ง๋ง ํญ๋ชฉ์๋ ์ฝค๋ง๋ฅผ ๋ถ์ด๋ ์ฝ๋ฉ๋ฐฉ์ - "printWidth" : ์ค ๋ฐ๊ฟ ํ ํญ ๊ธธ์ด ์ฐธ๊ณ - https://velog.io/@kyusung/eslint-prettier-config em, rem์ ๋ฌด์์ธ๊ฐ? em๋จ์๋ ์๋ ๊ธธ์ด ๋จ์๋ก ์์์ ๊ธ๊ผด ํฌ๊ธฐ์ ๊ด๋ จ๋์ด์๋ค. ์ง์ ๋ ์์์ font-size์ ๋ฐฐ์ rem๋จ์๋ root em์ด๋ผ๋ ๋ง ๊ทธ๋๋ก ์ต์์ ์์์ font-size์ ๋ํ em๋จ์ ์ด๋ค. ์ฐธ๊ณ - https://velog.io/@ursr0706/em%EB%8B%A8%EC%9C%84.. ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ - Hooks 1. useState 2. useEffect 3. useReducer 4. useMemo 5. useCallBack 6. useRef 7. ์ปค์คํ Hooks useEffect VS useCallBack VS useMemo useEffect useCallBack useMemo ํน์ ๊ฐ(๋ฐฐ์ด ์ ๊ฐ)์ด ์ ๋ฐ์ดํธ ๋ ๋, ํน์ ์์ ์ ์ํํ๋๋ก ์ค์ ์๋ก์ด ํจ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ์คํ๋๋์ง ์ฌ๋ถ์ ๊ด๋ จ ํน์ ๊ฐ์ด ์ ๋ฐ์ดํธ ๋ ๋, ํจ์๋ฅผ ์๋ก ์์ฑ, ํจ์ memoizationํ์ฌ, ๊ฐ์ ํจ์ ์ธ์คํด์ค ์ฌ์ฌ์ฉ โป ๋น ๋ฐฐ์ด, ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋ ๋ง๋ค์๋ ํจ์๋ฅผ ๊ณ์ํด์ ์ฌ์ฌ์ฉ ํน์ ๊ฐ์ด ์ ๋ฐ์ดํธ ๋ ๋, ์ฐ์ฐ์ ์คํ(o) ์๋ก ์์ฑ(x) ๊ฐ์ memoizationํ์ฌ, ๊ณ์ฐ ๊ฒฐ๊ณผ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉ ์ํ.. ์ด์ 1 2 ๋ค์