๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

react

(29)
React / Router ์‹ค์Šต - ๋™๋ฌผ ์ •๋ณด ์‚ฌ์ดํŠธ ๋งŒ๋“ค๊ธฐ ๊ธฐ๋Šฅ ๋ชฉ๋ก๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ ๋™๋ฌผ ๋ชฉ๋ก ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ธฐ๋™๋ฌผ ์ƒ์„ธ ์ •๋ณด ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ๋™๋ฌผ ์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ & ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑmain.jsxโŽฟ  app.jsx    โŽฟ  Main.jsx    โŽฟ  Detail.jsx    โŽฟ  Search.jsx     1. ๋™๋ฌผ ๋ชฉ๋ก์„ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ธฐmain.jsxReact Router๋ฅผ ์•ฑ ์ „์ฒด์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ App ์ปดํฌ๋„ŒํŠธ๋ฅผ BrowserRouter ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ๊ณ  ์žˆ๋‹ค.createRoot(document.getElementById('root')).render( ,);  App.jsx๊ฐ๊ฐ์˜ Route์—์„œ๋Š” ๊ฐ ํŽ˜์ด์ง€์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์š”์†Œ๋กœ ๋ถˆ๋Ÿฌ์™€ ๋ถ„๊ธฐ๋ณ„๋กœ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋„๋ก ํ•˜๊ณ ,Routes๋Š” ์ด Route๋“ค์„ ..
React / Router React Router React์—์„œ SPA ๋ฐฉ์‹์œผ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ* ๋ผ์šฐํŒ… : ์š”์ฒญ ์ฃผ์†Œ์— ๋งž๋Š” ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ   ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ค์น˜์ด๋ฏธ ์ƒ์„ฑ๋œ react ํ”„๋กœ์ ํŠธ์— ์„ค์น˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.npm i react-router-dom     ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ React Router๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ณณ์„ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ผ๋‹ค.์ด ๋•Œ ์•„๋ž˜์ฒ˜๋Ÿผ App ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ๊ฒŒ ๋˜๋ฉด ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ์•ฑ ์ „์ฒด์— ์ ์šฉ์‹œ์ผœ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์ด ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. * StrictMode๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋กœ, UI๋Š” ๋ Œ๋”๋งํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ž์†๋“ค์— ๋Œ€ํ•œ ๋ถ€๊ฐ€์ ์ธ ๊ฒ€์‚ฌ์™€ ๊ฒฝ๊ณ ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค.createRoot(document.getElementById('root')).render( ..
React / ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง ๋ฆฌ์•กํŠธ์—์„œ๋Š” ๋‹จ์ˆœ ๊ฐ’๋งŒ์ด ์•„๋‹Œ HTML ๊ตฌ์กฐ๋‚˜ ๋””์ž์ธ๋„ ๋‹น์—ฐํžˆ ๋ฐ”๊ฟ”์„œ ๋ฆฌ๋ Œ๋”๋ง ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋‚˜ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์กฐ๊ฑด๋ฌธ์ด๋‚˜ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.  ๋‹ค์Œ์€ ํŠน์ • ๊ฐ์ • ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ทธ ๊ฐ์ •์˜ ํ‘œ์ •์„ ํ™”๋ฉด์— ๋ Œ๋”๋ง์‹œํ‚ค๋Š” ์ฝ”๋“œ๋‹ค. setMood()๋กœ ๊ฐ์ •์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ  ์žˆ๋Š”๋ฐ, ์ด ๋•Œ ์„ธ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฆฌ๋ Œ๋”๋งํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. App.jsxfunction App() { const [mood, setMood] = useState('Normal'); return ( ๊ธฐ๋ถ„ : {mood} setMood('Ha..
React / state, props๋ฅผ ์ด์šฉํ•ด CRUD ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ Todo-List ๋งŒ๋“ค๊ธฐ App.jsx๋”๋ณด๊ธฐ import { useState } from 'react';import './App.css';function App() { const [todoList, setTodoList] = useState([ { id: 0, content: '๋ฐฅ๋จน๊ธฐ' }, { id: 1, content: '๊ณต๋ถ€ํ•˜๊ธฐ' }, { id: 2, content: '์ž ์ž๊ธฐ' }, ]); return ( );}function TodoInput({ todoList, setTodoList }) { const [inputValue, setInputValue] = useState(''); const insertTodo = () => { if (!inp..
React / props, state ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ Props (property)props๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ •๋ณด์˜ ์ง‘ํ•ฉ์œผ๋กœ, ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. ํŠน์ง•React ๋‚ด์—์„œ ์†์„ฑ์œผ๋กœ ์‚ฌ์šฉ๋จ์ฝ๊ธฐ์ „์šฉ(Read-only)์ž„๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋œ Props๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ(์ •์˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ) ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ ์ž์‹ ์ปดํฌ๋„ŒํŠธ // ํ•จ์ˆ˜ํ˜•function ์ž์‹ ์ปดํฌ๋„ŒํŠธ ({props์ด๋ฆ„}){}// ํด๋ž˜์Šคํ˜•super(props)props.props์ด๋ฆ„// ๋˜๋Š”this.props.props์ด๋ฆ„  ์ด์ „ ๊ธ€(์ƒํƒœ๊ด€๋ฆฌ)์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ counter ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด์„œ props๋ฅผ ํ™•์ธํ•ด๋ณด๊ฒ ๋‹ค.  ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ Count(์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฆ„) ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ์•ˆ์—..
React / Eslint(airbnb ...?) prettier ์ ์šฉํ•˜๊ธฐ + 250416 ์ˆ˜์ • ๋‚ด์šฉโ–ผ๋”๋ณด๊ธฐ- eslint-plugin-import, eslint-plugin-jsx-a11y ๋ถ€๋ถ„ import, plugin, rules์— ๋นผ๋จน์€๊ฑฐ ์ˆ˜์ •- ๊ทธ ์™ธ ์—์–ด๋น„์—”๋น„ ๊ทœ์น™ ์ผ๋ถ€ ์ถ”๊ฐ€์›๋ž˜ ์ œ๋ชฉ์—๋Š” airbnb ํ˜•์‹์ด๋ผ๊ณ  ์ผ์—ˆ๋Š”๋ฐ์‚ฌ์‹ค airbnb ํŒจํ‚ค์ง€๋Š” ๋‚ด๊ฐ€ ์ด ํฌ์ŠคํŠธ์—์„œ ์ž‘์„ฑํ•œ Flat Config ํ˜•์‹์—์„œ๋Š” ์•„์ง ์ง€์›ํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค... ์ˆ˜์ • ์ „์—๋„ eslint-config-airbnb๋Š” flat config์—์„œ ์•„์ง์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— rules์—์„œ ์ˆ˜๋™์œผ๋กœ ๋ถˆ๋Ÿฌ์™€์ค˜์•ผ ํ•œ๋‹ค๊ณ  ์ค‘๊ฐ„์— ์ž‘์„ฑํ•ด๋‘๊ธด ํ–ˆ์œผ๋‚˜ ์•„์˜ˆ ๋Œ์˜ฌํ•ด๋‘”๋‹ค... ์™œ๋ƒํ•˜๋ฉด ๊ธฐ์กด .eslintrc ํŒŒ์ผ ํ˜•์‹์—์„œ๋Š” "extends":["airbnb"] ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ์‹์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒFlat Config ..
React / SPA vs MPA React๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•ด์•ผ๋งŒ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธ ํ•˜๋„๋ก ํ•˜๋Š” ์ž‘๋™๋ฐฉ์‹ ๋•Œ๋ฌธ์ด๋‹ค.React๋Š” ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋งŒ ๋ฆฌ๋ Œ๋”๋งํ•ด ์—…๋ฐ์ดํŠธ ํ•˜๋Š” SPA ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด ๋Œ€ํ‘œ์ ์ธ SPA ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.  SPA(Single Page Application) : ํ•œ ๊ฐœ์˜ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž‘๋™ ๋ฐฉ์‹์ดˆ๊ธฐ์— HTML 1๊ฐœ๋งŒ ๋กœ๋“œ์ดํ›„ ํŽ˜์ด์ง€ ์ด๋™์€ JS๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ›์•„์™€ ๊ทธ๋ ค์คŒ (URL์ด ๋ฐ”๋€Œ์–ด๋„ ์‹ค์ œ๋กœ ํ•œ ํŽ˜์ด์ง€์—์„œ ๋™์ž‘)ํŽ˜์ด์ง€ ์ „ํ™˜์‹œ ์ƒˆ๋กœ๊ณ ์นจ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์•„ ์•ฑ์ฒ˜๋Ÿผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ž‘๋™ํŠน์ง•CSR(Client Side Rendering) : ํ™”๋ฉด์„ ์™„์„ฑํ•˜๋Š” ์ฃผ์ฒด๊ฐ€ ํด๋ผ์ด์–ธํŠธ์ดˆ๊ธฐ ๋กœ๋”ฉ์ด ์ข€ ๋ฌด๊ฒ์ง€๋งŒ..
React / ์ƒํƒœ๊ด€๋ฆฌ ๋ฆฌ์•กํŠธ๋Š” ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ(๋ฌด์—‡์„ ๊ฒฐ๊ณผ๋กœ ์–ป๊ณ ์ž ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ์‹)์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.๋ฌด์—‡์„ ํ™”๋ฉด์— ํ‘œํ˜„ํ• ์ง€ JSX๋ฌธ๋ฒ•์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด, JSX์— ๋“ค์–ด๊ฐ€๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ™”ํ–ˆ์„ ๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งž๋Š” ํ™”๋ฉด์ด ๊ฒฐ๊ณผ๋กœ ํ‘œ์‹œ๋œ๋‹ค.  ์ƒํƒœ(state)React ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋กœ, ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ state๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.state๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ณ , ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ํ๋ฆ„์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’๋งŒ state์— ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค. ์•„๋ž˜๋Š” state๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์˜ˆ์‹œ๋‹ค.function App() { let counter = 0; function increase() { counter++; console.log(counter); } functi..