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

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ํ”ํžˆ ๋งˆ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด๋‹ค. 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 ๋ฐฐ์—ด์„ ๋„˜๊ฒจ์ฃผ๋ฉด..
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ฒฐ๊ตญ ํƒ€์ž…์„ ์œ„ํ•œ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ๋งˆ๋‹ค ํƒ€์ž…์„ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๋งŽ์€ ํƒ€์ž… ๊ตฌ๋ฌธ์€ ์‚ฌ์‹ค ๋ถˆํ•„์š”ํ•˜๋‹ค. ์ด๋ ‡๊ฒŒ ์•„๋ฌด ์ƒ๊ฐ์—†์ด ๋ช…์‹œํ–ˆ๋˜ ํƒ€์ž…๋“ค์ด ์žˆ๋‹ค. ํ•˜์ˆ˜์˜ ์ฝ”๋“œ. ํƒ€์ž… ์ถ”๋ก ์ด ๋œ๋‹ค๋ฉด ๋ช…์‹œ์  ํƒ€์ž… ๊ตฌ๋ฌธ์€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ์˜คํžˆ๋ ค ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ์•ˆ์ข‹์•„์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—. ํ•˜์ง€๋งŒ ํƒ€์ž…์ด ์ถ”๋ก ๋  ์ˆ˜ ์žˆ์Œ์—๋„ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ๋ช‡๊ฐ€์ง€ ์ƒํ™ฉ๋“ค์ด ์žˆ๋‹ค. ๋” ์ •ํ™•ํ•œ ์œ„์น˜์— ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ์ •์˜ํ•  ๋•Œ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ช…์‹œํ•  ๋•Œ ํƒ€์ž… ๋„“ํžˆ๊ธฐ let ์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ. ๊ฐ’์ด ์žฌํ• ๋‹น๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฒ˜์Œ ์ดˆ๊ธฐํ™”ํ•œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ๊ฐ’๋“ค์˜ ์ง‘ํ•ฉ์„ ์œ ์ถ”ํ•ด์•ผ ํ•จ. ์–ด๋Š์ •๋„ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ํƒ€..
์ฑ…์„ ์ด์šฉํ•œ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋ฉด์„œ ํ‰์†Œ์— ์“ฐ์ง€ ์•Š๋Š” (๊ฒฝํ—˜์ด ์•„๋‹Œ ์ฑ… ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๋Š”) ๊ธ€์„ ์“ฐ๋ฉด์„œ ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์™„๋ฒฝํžˆ ์ดํ•ดํ•˜๊ณ , ์ •๋ฆฌํ•˜๊ณ , ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์„๊นŒ. ์ฑ…์˜ ์ˆœ์„œ ๊ทธ๋Œ€๋กœ ์“ฐ์ง€ ์•Š๊ณ  ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ํ๋ฆ„๋Œ€๋กœ ์žฌ๊ตฌ์„ฑํ•ด์„œ ๊ธ€์„ ์“ฐ๋„๋ก ๋…ธ๋ ฅํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ. ์ง€๋‚œ์ฃผ์— ๊ณต๋ถ€ํ–ˆ๋˜ ๊ตฌ์กฐ์  ํƒ€์ดํ•‘์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. interface Room { numDoors: number; ceilingHeightFt: number; } const obj = { numDoors: 1, ceilingHeightFt: 10; elephant: 'present', } const r: Room = obj; ์ถ”๋ก ๋œ obj์˜ ํƒ€์ž…์€ Roomํƒ€์ž…์˜ ๋ถ€๋ถ„ ..
ํƒ€์ž…์„ ์“ฐ๋Š”๋ฐ์„œ ์‹ค๋ ฅ์˜ ํŽธ์ฐจ๊ฐ€ ํฌ๊ฒŒ ๋‚˜ํƒ€๋‚œ๋‹ค. ์ง€๋‚œ ๋„ฅ์Šคํ„ฐ์ฆˆ ํ™œ๋™ ํ›„๊ธฐ์— ์ ์—ˆ๋˜ ๋ฌธ์žฅ์ด๋‹ค. ์–ด๋ ต๊ฒŒ ๋ง‰ ํƒ€์ž…์„ ์ด๋ฆฌ์ €๋ฆฌ ์“ฐ๊ณ  ์ด๋Ÿฐ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์˜ค๋žซ๋™์•ˆ ๋™๋™๋Œ€๋‹ค ๋ฐœ๊ฒฌํ•œ ๋ฐฉ๋ฒ•์ด ์•Œ๊ณ ๋ณด๋ฉด ๊ต‰์žฅํžˆ ๊ธฐ๋ณธ์ ์ธ ํƒ€์ž… ๋ฌธ๋ฒ•์ด์—ˆ๋˜ ๊ฒฝ์šฐ๊ฐ€ ๊ฝค ์žˆ์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์–ผ๋ ˆ๋ฒŒ๋ ˆ ๊ฐœ๋ฐœํ•ด์˜จ ํ•œ๊ทœ์ง„์„ ์œ„ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ฟŒ์ˆ˜๊ธฐ ์Šคํ„ฐ๋””. ํƒ€์ž… ์ดํ•ดํ•˜๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ๊ฐ’์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ–๋Š”๋‹ค. ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ํ™•๋ณดํ•ด์•ผ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด, ๊ฐ’์„ ์ฐธ์กฐํ•  ๋•Œ ํ•œ ๋ฒˆ์— ์ฝ์–ด ๋“ค์—ฌ์•ผ ํ•  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ์–ด ๋“ค์ธ 2์ง„์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์„ํ• ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด. ํ•˜์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ •์  ํƒ€์ž… ์ด ์•„๋‹Œ ๋™์  ํƒ€์ž… ์–ธ์–ด์ด๋‹ค. ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์„ ์‚ฌ์ „์— ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฐ์ด..
๋‘๋‘ฅ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด์„œ 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๋ฅผ ์ถ”..
ํ•œ๊ทœ์ง„
'๐Ÿง‘‍๐Ÿ’ป ์งง์€ํ˜ธํก' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก