๐Ÿง‘‍๐Ÿ’ป ์งง์€ํ˜ธํก/React

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ํ”ํžˆ ๋งˆ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด๋‹ค. Select, Toggle ๋˜๋Š” DatePicker ๋“ฑ์˜ ์ธํ’‹ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์„ค๊ณ„ํ•  ๋•Œ, ๊ทธ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ํ•ธ๋“ค๋งํ•  ์ปค์Šคํ…€ํ›…๋„ ๊ฐ™์ด ์ž‘์„ฑํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณดํ†ต์€ useToggle, useSelect ๋“ฑ์˜ ์ด๋ฆ„์œผ๋กœ ์“ฐ๊ณ  [value, onChange] ๊ฐ™์€ ๋ฐฐ์—ด์„ returnํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์™ธ์ฃผ ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ์ดˆ๊ธฐ์— ์ด๋Ÿฐ ์ปดํฌ๋„ŒํŠธ ์ž‘์—…์„ ํ•ด์•ผํ•  ์ผ์ด ๋งŽ์•˜๋‹ค. import useSelect from '~hooks/useSelect'; import Select from '~components/Select'; const App = () => { const [value, handleSelectValue] = useSelect(); return ( ); };..
๊ท€์ฐฎ์€ ์ผ์€ ๊ฝค๋‚˜ ์ž์ฃผ ์ผ์–ด๋‚œ๋‹ค. ์™ธ์ฃผ ์ž‘์—… ์ค‘ ํ…Œ์ด๋ธ” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ์ผ์ด ์žˆ์—ˆ๊ณ , ๊ธฐ์กด ์ฝ”๋“œ๋Š” Core UI๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ 4.0๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ๋˜๋ฉด์„œ PRO๋ฒ„์ „์ด ์ƒˆ๋กœ ์ƒ๊ฒผ๊ณ , ๊ทธ๋ฅผ ์œ„ํ•œ ๊ธ‰๋‚˜๋ˆ„๊ธฐ์— ํ…Œ์ด๋ธ” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฑธ๋ ค๋ฒ„๋ ธ๋‹ค. ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ onRowClick, scopedSlots๋“ฑ์˜ ๊ธฐ๋Šฅ๋“ค์ด ์‚ฌ๋ผ์กŒ๊ณ  ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋‹ค. { navigate(`/notices/${data.id}`); }} customCellItem={{ info: data => alert(data.index)}>์ปค์Šคํ…€cell, date: data => {data.date}, }} />; ์ถ”์ƒํ™”๋œ Table์€ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ปฌ๋Ÿผ๊ณผ data ๋ฐฐ์—ด์„ ๋„˜๊ฒจ์ฃผ๋ฉด..
๋‘๋‘ฅ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด์„œ Next.js๋ฅผ ์ฒ˜์Œ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ–ˆ๋‹ค. ๊ธฐํš์ƒ ์ด์ „ ํ”„๋กœ์ ํŠธ๋ณด๋‹ค SEO๋ฅผ ๋” ์‹ ๊ฒฝ์จ์•ผํ–ˆ๊ณ , ์ด๋ฏธ์ง€ ์ตœ์ ํ™”์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•ด์ค€๋‹ค๋Š” ์ ์ด ์ข‹์•˜๋‹ค. ์ด์ „๋ถ€ํ„ฐ ๊ณ„์† ์จ๋ณด๊ณ  ์‹ถ์—ˆ๋˜ ๊ธฐ์ˆ ์ด์—ˆ์–ด์„œ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ํ™˜๊ฒฝ์—์„œ ์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๊ณต๋ถ€ํ–ˆ๋˜ ๋‚ด์šฉ๊ณผ ๋งˆ์ฃผ์ณค๋˜ ๊ณ ๋ฏผ๋“ค์„ ๊ธฐ๋กํ•œ ๊ธ€์ด๋‹ค. ๋ชฉ์ฐจ 1. Next.js์˜ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) 2. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ์ฟ ํ‚ค ์‚ฌ์šฉํ•˜๊ธฐ 3. getInitialProps๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜๋Š”๊ฐ€? 1. Next.js์˜ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ๊ธ€์„ ์ค€๋น„ํ•˜๋ฉด์„œ Next.js์—์„œ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์˜ ๋ฐฉ์‹์„ ์กฐ๊ธˆ ๋” ๊ณต๋ถ€ํ•ด๋ณด์•˜๋‹ค. ๋จผ์ € ๋‹ค๋“ค ์•„๋Š” ์–˜๊ธฐ. Next.js๋Š” SSR์„..
์‚ฌ์‹ค ํ•œ๋ฒˆ์— ๋๋‚  ์ค„ ์•Œ๊ณ  dev ๋ธŒ๋žœ์น˜์— ๋ฐ”๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์•„์ง ์ œ๋Œ€๋กœ ์‹œ์ž‘๋„ ์•ˆํ–ˆ๋Š”๋ฐ ์ปค๋ฐ‹์ด 100๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ๋ถˆ์ƒ์‚ฌ๊ฐ€ ์ƒ๊ฒผ๋‹ค. ์–ด์จŒ๋“  ๋ชจ๋…ธ๋ ˆํฌ ์‹œ๋ฆฌ์ฆˆ ๋งˆ์ง€๋ง‰์€ Docker์™€ Github Actions๋ฅผ ์ด์šฉํ•œ CI/CD ๊ตฌ์ถ• ์‚ฝ์งˆ๊ธฐ. ๋ณ„๋กœ ์–ด๋ ค์šด ๋‚ด์šฉ์ด ์•„๋‹ˆ๊ณ , ๊ทธ๋ ‡๊ธฐ์— ๊ฑฐ์ฐฝํ•œ ์ •๋ณด ๊ณต์œ  ๋ชฉ์ ์€ ๊ฒฐ์ฝ” ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜์ฒ˜๋Ÿผ ์ŒฉํŒ ์ฒ˜์Œ ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ์‹œ๋„ํ•ด๋ณด๋Š” ์‚ฌ๋žŒ๋“ค์ด ์‰ฝ๊ฒŒ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ์„๋งŒํ•œ ๊ธ€์ด ๋ณ„๋กœ ์—†์–ด ํž˜๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊พธ์—ญ๊พธ์—ญ ์“ฐ๋Š” ๊ธ€. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด์ „์— ๊ตฌ์ถ•ํ•ด ์‚ฌ์šฉํ•˜๋˜ ์„ธํŒ…์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•˜๊ณ  ์žˆ๋‹ค. (1ํŽธ, 2ํŽธ) ํฌ๊ฒŒ ๋‹ค๋ฅผ๊ฑด ์—†์ง€๋งŒ, ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ํ•œ์ค„ํ•œ์ค„์”ฉ ๋ฐ”๊ฟ”๊ฐ€๋Š” ๊ณผ์ •์ด๋ผ๊ณ  ๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™์Œ. ๋”ฐ์ง€๊ณ  ๋ณด๋ฉด ํ•œ์ค„ํ•œ์ค„์”ฉ ๊ณ ์ณ๋‚˜๊ฐ€๋Š” ๊ณผ์ •.. "scripts": { // ... "admi..
1. ์‹œ์ž‘ํ•˜๊ธฐ yarn set version berry yarn init yarn add -D typescript @types/node @types/react ๋””๋ ‰ํ† ๋ฆฌ ํ•˜๋‚˜๋ฅผ ํŒŒ๊ณ  yarn ๋ฒ„์ „์„ berry๋กœ ์„ค์ •ํ•œ ํ›„์— package.json์„ ์ƒ์„ฑํ•ด์ค€๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋„ ํ•จ๊ป˜ ์„ธํŒ…ํ•ด์ค€๋‹ค. yarn ๊ด€๋ จ ์„ค์ •์€ ์ด์ „ ๊ธ€์—์„œ ์งค๋ง‰ํ•˜๊ฒŒ ์ ์–ด๋†“์•˜๋‹ค. ๋‹ค์‹œ ๊ฐ„๋žตํ•˜๊ฒŒ ์ ์ž๋ฉด, // ./package.json { "name": "dudoong-front", "packageManager": "yarn@3.3.0", "private": true, "workspaces": { "packages": [ "apps/*", "shared/*" ] }, // ... } ๋ฃจํŠธ์˜ package.json์—์„œ workspaces๋ฅผ ์ถ”..
๊ณ ์Šค๋ฝ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ธ๋ฒˆ์งธ ์ด์–ด์˜ค๋ฉด์„œ ํšจ์œจ์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ณ„์† ๊ณ ๋ฏผํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋ฒˆ์— ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ, ๋‘๋‘ฅ์„ ์‹œ์ž‘ํ•˜๋ฉด์„œ ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ๋ชจ๋…ธ๋ ˆํฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ CICD๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉด์„œ ๊ณต๋ถ€ํ–ˆ๋˜ ๊ฒƒ๋“ค๊ณผ ์‚ฝ์งˆ์— ๋Œ€ํ•œ ๊ธฐ๋ก์ด๋‹ค. 1) ๋„์ž… ์ด์œ , yarn workspaces, berry 2) ๋ชจ๋…ธ๋ ˆํฌ ํ™˜๊ฒฝ ์„ธํŒ… - vite, nextjs, storybook, emotion 3) CI/CD - docker, github actions ์„ธํŒ… 1. ๋„์ž… ์ด์œ  ์ž‘๋…„์— ์ฒ˜์Œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ• ๋•Œ ํ”„๋ก ํŠธ์ชฝ์„ 3๊ฐœ์˜ ๋ ˆํฌ๋กœ ๊ตฌ์„ฑํ–ˆ๋‹ค. ์œ ์ € ํ”„๋ก ํŠธ ์‚ฌ์ดํŠธ, ์–ด๋“œ๋ฏผ ์‚ฌ์ดํŠธ, ๊ทธ๋ฆฌ๊ณ  ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ–ˆ๋‹ค. ์Šคํ† ๋ฆฌ๋ถ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์€ npm ํŒจํ‚ค์ง€๋กœ ๋ฐฐํฌํ•ด์„œ ํ”„๋ก ํŠธ์™€ ์–ด๋“œ๋ฏผ์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก..
๋Œ€๋žต์ ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ๋ชจ๋‘ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ํ•˜๋ฃจ์ดํ‹€๋™์•ˆ ๊ธ‰ํ•˜๊ฒŒ ๋งˆ๋ฌด๋ฆฌํ–ˆ์Œ. ์ •๋ฆฌํ•˜์ž๋ฉด, todoItem์„ ์œ ์ €์™€ ๋‚ ์งœ์— ๋”ฐ๋ผ ๋ณ„๋„์˜ ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ํ• ์ผ์„ ์™„๋ฃŒํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋‚ ์งœ์˜ ๋‹ฌ๋ ฅ์— ์ƒ‰๊น”๊ณผ ๋‚จ์€ ๊ฐœ์ˆ˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ๋‹ค. 1. TodoItem ๊ธฐ๋Šฅ ํ™•์žฅ ๋‹ฌ๋ ฅ ๊ธฐ๋Šฅ ์ „์— ๋จผ์ € ํˆฌ๋‘ ํ”ผ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๋‚ ์งœ๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ ํ•˜๋‚˜์˜ ์ƒํƒœ๋กœ๋งŒ ๊ด€๋ฆฌํ–ˆ๋‹ค. ์ด์   ์„ ํƒํ•œ ๋‚ ์งœ์™€ ์„ ํƒํ•œ ํ”„๋กœํ•„์— ๋”ฐ๋ผ ํˆฌ๋‘๋“ค์„ ๊ด€๋ฆฌํ•˜๊ณ  ๋ณด์—ฌ์ค˜์•ผํ–ˆ๋‹ค. ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ–ˆ์Œ. ์ฒ˜์Œ์—” ๋ฐฑ๋‹จ ๋””๋น„์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋˜์–ด์žˆ์„์ง€๋ฅผ ์ƒ๊ฐํ–ˆ๋‹ค (์›๋ž˜๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์™€์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ”„๋กœ์ ํŠธ์—์„  ๋ชฉ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—). 'ํˆฌ๋‘' ํ…Œ์ด๋ธ”์„ ํ•˜๋‚˜ ๋‘๊ณ , userId์™€ date ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•ด์„œ ๊ทธ๊ฑธ ํ†ตํ•ด ์ •๋ณด๋ฅผ ํŒจ์นญํ•ด์˜ค์ง€ ์•Š์•˜์„๊นŒ? ..
๋ฏธ๋ฃจ๊ณ  ๋ฏธ๋ฃจ๋˜ ํˆฌ๋‘๋ฉ”์ดํŠธ ๋‹ฌ๋ ฅ์„ ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค. ํ”„๋ก ํŠธ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ํ•œ๋ฒˆ์ฏค์€ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š” ๊ด€๋ฌธ ๊ฐ™์€ ๋Š๋‚Œ์ด ์žˆ๋Š”๋ฐ, ์ด๋ฒˆ ๊ธฐํšŒ์— ํ•ด๋ณด๋Š”๊ฑฐ๋กœ. dayjs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์‹ค์ œ ํˆฌ๋‘๋ฉ”์ดํŠธ๋ผ๊ณ  ํ•ด๋„ ๋ฏฟ๊ฒ ์ฃ ? ์•„์ง ๋‹ฌ๋ ฅ์—์„œ ๋‚ ์งœ๋ฅผ ์„ ํƒํ•˜๊ณ  ํ•ด๋‹น ๋‚ ์งœ์˜ ํˆฌ๋‘๋ฅผ ๋„์šฐ๋Š” ๋กœ์ง์€ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๋‹ค. ๋‹ค์Œ์ฃผ๊นŒ์ง€ ํ•ด๊ฐˆ ์˜ˆ์ •. ๋‹ฌ๋ ฅ์„ ๋งŒ๋“ค๊ธฐ ์ „์— ์ฐธ๊ณ ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ธ”๋กœ๊ทธ๋“ค์„ ๊ฐ€๋ดค์—ˆ๋Š”๋ฐ, ๋ญ”๊ฐ€ ๋‹ค ์‹œ์›์ฐฎ๋ณต์žกํ•˜๊ณ  ์ฐธ๊ณ ํ•˜๊ธฐ ์‹ซ์€ ๋ฐฉ๋ฒ•๋ฐ–์— ์—†์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์—ด์‹ฌํžˆ ๊ณ ๋ฏผ์„ ํ•ด๋ณด์•˜์Œ. Calender.tsx const Calender = () => { const [selectedDay, setSelectedDay] = useState( dayjs().format('MM/DD/YY'), ); const handleSelectDat..
ํ•œ๊ทœ์ง„
'๐Ÿง‘‍๐Ÿ’ป ์งง์€ํ˜ธํก/React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก