๐Ÿ” ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค FE ๋ฐ๋ธŒ์ฝ”์Šค 5๊ธฐ WIL = 12.04 ~ 12.10

Jun 2k (Jun2)ยท2023๋…„ 12์›” 11์ผ
0

23.12.04 ~ 23.12.10

๐Ÿ’ป Intro & TMI

๋Œ€๋ง์˜ React ๊ฐ•์˜๊ฐ€ ์‹œ์ž‘๋˜์—ˆ๋‹ค. React ๊ฐ•์˜๋Š” ์‹œ์ž‘๋˜์—ˆ์ง€๋งŒ ๊ฐ•์˜๋ง๊ณ ๋„ ํ•  ์ผ์ด ๋„ˆ๋ฌด๋„ˆ๋ฌด ๋งŽ์•˜๋‹ค.
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์Šคํ„ฐ๋””์—์„œ 3์ฃผ์ฐจ Todo List ๊ณผ์ œ ts ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, Vue ๊ณผ์ œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ๊ฐœ์ธ ํฌํŠธํด๋ฆฌ์˜ค ์ ๊ฒ€ ๋“ฑ๋“ฑ ๋จธ๋ฆฌ๊ฐ€ ํ„ฐ์ ธ๋‚˜๊ฐˆ ๊ฑฐ ๊ฐ™์•˜๋‹ค.
๊ทธ๋ž˜๋„ ๋” ์ด์ƒ ์ •๋ฆฌ๋ฅผ ๋ฏธ๋ฃจ๋ฉด ์•ˆ ๋  ๊ฒƒ ๊ฐ™์•„ ํ•œ ์ฃผ ๋™์•ˆ ๋ฐฐ์šด ๊ฒƒ ์ค‘ ์ค‘์š”ํ•œ ๊ฒƒ์„ ์š”์•ฝํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.



๐Ÿง ์ด๋ฒˆ์ฃผ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ๊ฒƒ

Storybook ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ
Context API์˜ ํ•„์š”์„ฑ
ํด๋ฆฝ๋ณด๋“œ: writeText()
์ปดํฌ๋„ŒํŠธ์— ๊ตฌํ˜„ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์žฌ์กฐ๋ช…
์ปดํฌ๋„ŒํŠธ ์ปจํ…Œ์ด๋„ˆ์—์„œ Children์„ ๋ฐฐ์—ด๋กœ ๋ฟŒ๋ ค์ฃผ๊ธฐ


Storybook ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ

๋ฆฌ์•กํŠธ ๊ฐ•์˜์—์„œ ๊ฐ€์žฅ ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  ์‹ ์„ ํ–ˆ๋˜ ๊ฒƒ์ด ๋ฐ”๋กœ Storybook์ด์—ˆ๋‹ค.
์ด์ „์— ๋ฆฌ์•กํŠธ๋ฅผ ํด๋ก ์ฝ”๋”ฉ์„ ํ†ตํ•ด ๊ฒ‰ํ•ฅ๊ธฐ์‹์œผ๋กœ ๋ฐฐ์› ์„ ๋•Œ๋Š” ๋‹น์žฅ useEffect๋‚˜ Redux ๊ฐ™์€ ๋‚ด์žฅ ํ•จ์ˆ˜๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ๊ณต๋ถ€ํ–ˆ์—ˆ์ง€ React๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐœ๋ฐœํ•  ๋•Œ ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœํ• ์ง€์— ๋Œ€ํ•ด์„œ๋Š” ๋“ฃ๋„๋ณด๋„ ๋ชปํ–ˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด Storybook์€ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” React์— ๋Œ€ํ•ด์„œ ๋…๋ฆฝ์ ์ธ UI ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค.
๋‚ด๊ฐ€ ๋งŒ๋“  ๋˜๋Š” ๋™๋ฃŒ๊ฐ€ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ์˜ UI์™€ ํ•ด๋‹น ๋™์ž‘์„ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ข…์˜ ๊ฐ€์ด๋“œ๋ถ ์—ญํ• ์„ ํ•œ๋‹ค.

์ƒ๊ฐ๋ณด๋‹ค ๊ณต์‹๋ฌธ์„œ๊ฐ€ ์ข€ ๋ถˆ์นœ์ ˆํ•ด์„œ ๊ฐ•์‚ฌ๋‹˜์ด ์Šคํ† ๋ฆฌ๋ถ์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ arguments ๋“ค์˜ ๊ธฐ๋ณธ๊ฐ’๊ณผ ์ปจํŠธ๋กค ๋ฐฉ์‹์„ ์ง€์ •ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ํ˜„์žฌ ๋ฒ„์ „๊ณผ ๋งž์ง€ ์•Š์•„ ์ฐพ๋Š”๋ฐ ๊ณ ์ƒํ–ˆ๋‹ค.

// ๊ฐ•์‚ฌ๋‹˜์€ defaultValue๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ๋‹ค.
// ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ํ˜„์žฌ ๋ฒ„์ „(6.3)์—์„œ๋Š” ๊ธฐ๋ณธ๊ฐ’์— ๋Œ€ํ•œ ์ถ”๋ก ์ด ๋˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ undefined๋กœ ์ •์˜ํ•˜๋ฏ€๋กœ args๋ฅผ ํ†ตํ•ด ๋”ฐ๋กœ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
argsTypes: {
  size: {
    defaultValue: 10,
    control: { type: 'range', min: 1, max: 20 },
  }
}

// ํ˜„์žฌ ๋ฒ„์ „(6.3)์—์„œ์˜ ๋ฐฉ๋ฒ•
args: {
  size: 10,
},
  
argsTypes: {
  size: {
    control: { type: 'range', min: 1, max: 20 },
  }
}

storybook์— ๋Œ€ํ•ด์„œ ์ง„์งœ ์ฒ˜์Œ ์ ‘ํ•ด๋ณด์•˜๊ธฐ์— ์ด๊ฒƒ์„ ์ •๋ง ํ˜„์—…์—์„œ๋„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์— ์˜๋ฌธ์„ ํ’ˆ์—ˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์„ธํฌ ๋ฉ˜ํ† ๋‹˜๊ป˜ ์งˆ๋ฌธ๋“œ๋ ธ์„ ๋•Œ์—๋„ storybook์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋ง์”€์„ ํ•ด์ฃผ์…จ๊ณ  ์‹ค์ œ๋กœ ์‹ค์Šต์„ ํ•˜๋ฉด์„œ ์ง„ํ–‰ํ•ด๋ณด๋‹ˆ ํ˜‘์—…์„ ํ•  ๋•Œ ํŒ€์› ๊ฐ„์— ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ๊ณต์œ ๋ฅผ ํ•  ๋•Œ ํ•œ๋ˆˆ์— ์‹œ๊ฐ์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์–ด ์ข‹๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.

๋‹จ, React์—์„œ ์ž‘์„ฑํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ Storybook์œผ๋กœ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ๋ฌธ๋ฒ•์„ ์ž˜ ํŒŒ์•…ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ง„์ž…์žฅ๋ฒฝ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ข€ ํ ์ด์—ˆ๋‹ค.
๋˜ํ•œ ์ปดํฌ๋„ŒํŠธ์— ๋งŽ์€ props๊ฐ€ ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๋ฉด ์ด๋ฅผ storybook์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ๋„ ์–ด๋ ค์› ๊ธฐ์— React์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ ์ฝ”๋“œ๊ฐ€ ์ •๋ง ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

2์ฃผ ํ›„ ํŒ€ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ•œ ๋ฒˆ ๊ธฐ์šฉ์„ ๊ณ ๋ คํ•ด๋ณผ๋งŒํ•œ ๊ฐœ๋ฐœํ™˜๊ฒฝ ํˆด์ด๋‹ค.



Context API์˜ ํ•„์š”์„ฑ

๊ธฐ๋ณธ์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
์ธ์ ‘ํ•ด ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— props๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ๋‹ค.

ํ•˜์ง€๋งŒ ์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌ์กฐ์  ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๋‹ค๋ฉด? ๋‹จ๊ณ„์ ์œผ๋กœ ํƒ€๊ณ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋ฏ€๋กœ ๋กœ์ง์ด ๋ณต์žกํ•ด์ง„๋‹ค. ์ด ํ˜„์ƒ์€ Prop Drilling ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด React์—์„œ๋Š” Redux, Recoil, Mobx, Context API ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

์ผ๋‹จ ๊ธฐ์ดˆ๊ฐ€ ์ค‘์š”ํ•˜๋‹ˆ React์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” Context API์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  ์•Œ์•„๋ณด์•˜๋‹ค.

๊ธฐ๋ณธ์ ์ธ ๋กœ์ง์€ Context Provider๊ฐ€ ์ œ๊ณต(Provide)ํ•ด์•ผํ•  props๋ฅผ ์ „๋‹ฌ๋ฐ›์•„
Context Consumer๊ฐ€ ํ•ด๋‹น props๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์‚ฌ์šฉ(Consume)ํ•œ๋‹ค.

props๋ฅผ ์ž์œ ์ž์žฌ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ๋•Œ๋ฌธ์— ์œ ์šฉํ•˜๋‹ค๊ฐ€ ๋ง‰ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๋ญ๋“  ๊ณผ์œ ๋ถˆ๊ธ‰!
๊ผญ ํ•„์š”ํ•œ ์ง€์ ์—๋งŒ ์‚ฌ์šฉํ•˜์ž.

๋˜ํ•œ Cosumer๋Š” ๋ฐ˜๋“œ์‹œ Provider์™€ ๋™์‹œ์— ์กด์žฌํ•ด์•ผํ•˜๋ฏ€๋กœ ์ปดํฌ๋„ŒํŠธ์˜ ๋…๋ฆฝ์„ฑ์„ ํ•ด์น  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋”๋”์šฑ ์‚ฌ์šฉ์— ์ฃผ์˜๋ฅผ ๊ธฐํ•ด์•ผ ํ•œ๋‹ค.



ํด๋ฆฝ๋ณด๋“œ: writeText()

์ด๋ชจ์ง€ ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€ ์‹ค์Šต ์ค‘ ์ด๋ชจ์ง€ ๋ฆฌ์ŠคํŠธ item์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ํ•ด๋‹น item์— ์žˆ๋Š” ์ด๋ชจ์ง€ ์‹ฌ๋ณผ์„ ๋ณต์‚ฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

์ด ๋•Œ ์“ฐ์ธ ๊ฒƒ์ด clipboard ์ธํ„ฐํŽ˜์ด์Šค์˜ wirteText() ๋ฉ”์„œ๋“œ์ด๋‹ค.

// navigator.clipboard ์— ์ ‘๊ทผํ•ด ์ง€์ •๋œ emoji.symbol ํ…์ŠคํŠธ ๋ฌธ์ž์—ด์„ ์ปดํ“จํ„ฐ ํด๋ฆฝ๋ณด๋“œ์— ์ €์žฅํ•œ๋‹ค.
// ๊ทธ๋ฆฌ๊ณ  ctrl+v๋กœ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ•ด๋‹น ์ด๋ชจ์ง€ ์‹ฌ๋ณผ์ด ๋ถˆ๋Ÿฌ์™€์ง„๋‹ค.
<ListItem onClick={() => navigator.clipboard.writeText(emoji.symbol)}>

์ด๊ฒƒ์„ ํ†ตํ•ด ํด๋ฆฝ๋ณด๋“œ์— ์ €์žฅํ•  ์š”์†Œ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋ณต์‚ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์œ ์šฉํ•  ๊ฑฐ ๊ฐ™๋‹ค.



์ปดํฌ๋„ŒํŠธ์— ๊ตฌํ˜„ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์žฌ์กฐ๋ช…

React๋ฅผ ์ž˜ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ปดํฌ๋„ŒํŠธํ™”๋ฅผ ํ• ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.

์‹ค์Šต์„ ํ†ตํ•ด ๊ฑฐ์˜ 20๊ฐœ ์ •๋„์— ๋‹ฌํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ฉด์„œ ๋А๋‚€ ์ ์€
๊ฐ„๋‹จํ•œ Slider(๋ณผ๋ฅจ ์กฐ์ ˆ๋ฐ”)๋‚˜ Badge๋ฅผ ๋งŒ๋“ค ๋•Œ์—๋„

  1. ์–ด๋– ํ•œ ์†์„ฑ์ด๋‚˜ ์˜ต์…˜์„ props๋กœ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”์ง€
  2. ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•ด ๊ฐ ์š”์†Œ๋“ค์„ ์–ด๋–ป๊ฒŒ ์„ธ๋ถ„ํ™”ํ• ์ง€

์ด ๋‘ ๊ฐ€์ง€๋ฅผ ๊ณ ๋ คํ•ด์„œ ๋งŒ๋“ค์–ด์•ผ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋ณด์žฅ๋˜๋Š” ์ข‹์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด Slider ์ปดํฌ๋„ŒํŠธ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š”

์‚ฌ์šฉ์ž๊ฐ€ ์žก๊ณ  ์กฐ์ ˆํ•˜๋Š” ์†์žก์ด๋Š” Handle, ์ „์ฒด ๋ง‰๋Œ€๊ฐ€ Rail, ์œ ํšจํ•œ Rail ๋ฒ”์œ„๋ฅผ Track์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

์ด๊ฒƒ๋“ค์„ ๋ถ„๋ฆฌํ•˜์—ฌ handle์— MouseEvent๋ฅผ ์ถ”์ ํ•˜์—ฌ Track์˜ width๋ฅผ ๊ณ„์‚ฐ๋˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๊ฐ’์„ ์กฐ์ ˆํ•˜๋Š” ๋ง‰๋Œ€๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด๊ฒƒ์„ ๋˜ ๊ธฐ๋Šฅ ๋˜๋Š” ๋ฐ์ดํ„ฐ, ์˜ต์…˜์— ๋”ฐ๋ผ ์„ธ๋ถ„ํ™”ํ•˜๋Š” ์•„์ด๋””์–ด๋‚˜ ์„ผ์Šค๊ฐ€ ์ •๋ง ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.



์ปดํฌ๋„ŒํŠธ ์ปจํ…Œ์ด๋„ˆ์—์„œ Children์„ ๋ฐฐ์—ด๋กœ ๋ฟŒ๋ ค์ฃผ๊ธฐ

Breadcrumb์ด๋‚˜ Tab ์ปดํฌ๋„ŒํŠธ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น item๋“ค์„ ๋‹ด๋Š” Container์— ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ item ๋“ค์ด ์ปดํฌ๋„ŒํŠธ๋กœ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๊ฒƒ์„ ์ผ๋ฐ˜ํ™”ํ•˜์—ฌ props๋กœ ๋ฐ›์€ children ์ปดํฌ๋„ŒํŠธ ์š”์†Œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค ๋‹ค์‹œ ์›ํ•˜๋Š” Container์˜ children ์š”์†Œ์— ๋ฟŒ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŠน์ˆ˜ ๋กœ์ง์ด ํ•„์š”ํ•˜๋‹ค.

๋‹ค์Œ์€ Breadcrumb ์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ์ด๋‹ค.

const Breadcrumb = ({ children, ...props }) => {
  const items = React.Children.toArray(children)
  	// React.Children.toArray๋กœ props๋กœ ๋ฐ›์€ children ์š”์†Œ๋ฅผ ๋ฐฐ์—ดํ™”ํ•œ๋‹ค.
  	// ๋ฐฐ์—ดํ™” ํ•œ children์ด BreadcrumbItem ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ์™”๋Š”์ง€ filterํ•œ๋‹ค.
    .filter((element) => {
      if (
        React.isValidElement(element) &&
        element.props.__TYPE === 'BreadcrumbItem'
      ) {
        return true;
      }

      console.warn("Only accepts Breadcrumb.Item as it's children.");
      return false;
    })
  	// filterํ•œ ์š”์†Œ๋“ค์„ ๋‹ค์‹œ cloneElement ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด props๋ฅผ ๋ถ€์—ฌํ•ด์„œ ์ปดํฌ๋„ŒํŠธํ™”ํ•œ๋‹ค.
    .map((element, index, elements) => {
      return React.cloneElement(element, {
        ...element.props,
        active: index === elements.length - 1,
      });
    });
  return <BreadcrumbContainer>{items}</BreadcrumbContainer>;
};

isValidElement, cloneElement, React.Children.toArray ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด์„œ ์ฒ˜์Œ์ด์—ˆ๊ธฐ์— ๋ฌด์Šจ ์†Œ๋ฆฐ๊ณ  ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‹ค์ˆ˜์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋ฌถ์Œ์„ ๋‹ค์‹œ ์ปดํฌ๋„ŒํŠธํ™”ํ•  ๋•Œ๋Š”

  1. ์›ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ธ์ง€ ํ™•์ธํ•œ ๋’ค
  2. ๋ฐฐ์—ด ์š”์†Œ์— props๋ฅผ ๋ถ€์—ฌํ•ด์„œ ๋‹ค์‹œ React ์ปดํฌ๋„ŒํŠธ๋กœ cloneํ•˜์—ฌ ๋งคํ•‘

์ด ๋‘๊ฐ€์ง€ ๋กœ์ง์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.



๐Ÿ‘€ ๋А๋‚€์ 

์„ ํ˜‘๋‹˜์˜ React ๊ฐ•์˜๋Š” ๋ญ”๊ฐ€ ์—„์ฒญ ํ•จ์ถ•์ ์ด๋‹ค. ๋ ˆ๋ฒจ์ด ์ดˆ์‹ฌ์ž๊ฐ€ ์•„๋‹Œ ์–ด๋А์ •๋„ ์ค‘์ƒ๊ธ‰์ž ๊ธฐ์ค€์— ๋งž์ถฐ์ ธ ์žˆ๋‹ค.
๊ฐ•์˜ ๋Ÿฌ๋‹ ํƒ€์ž„์€ 10~15๋ถ„์ด์ง€๋งŒ ๊ถŒ์žฅ ํ•™์Šต ์‹œ๊ฐ„์€ 50๋ถ„์œผ๋กœ ์ง€์ •๋˜์–ด ์žˆ๋Š” ์ด์œ ๋ฅผ ์•Œ๊ฒ ๋‹ค. ๋‹จ์ˆœํžˆ HRD-net ์‹œ๊ฐ„ ์ฑ„์šฐ๊ธฐ ์šฉ๋„๊ฐ€ ์•„๋‹ˆ๋ผ ์ •๋ง ์ถ”๊ฐ€์ ์ธ ์ž๊ฐ€ ํ•™์Šต์ด ํ•„์š”ํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ๋‚˜๋Š” ์˜คํžˆ๋ ค ์ข‹๋‹ค. ๋…์Šคํด๋Ÿฝ์„ ํ†ตํ•ด React ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ •๋…ํ•˜๊ธฐ๋กœ ํ–ˆ์—ˆ๊ณ  ์„ ํ˜‘๋‹˜ ๊ฐ•์˜๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๊ฐœ๋…์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋Š” ๋ฉ”ํƒ€์ธ์ง€๋ฅผ ๋А๋‚„ ๋•Œ๋งˆ๋‹ค ๊ด€๋ จ ๋‚ด์šฉ์„ ๊ณต์‹๋ฌธ์„œ์—์„œ ์ฐพ์•„ ์ฝ์–ด๋ณด๋‹ˆ ์‹œ๊ฐ„์€ ์—„์ฒญ ๊ฑธ๋ฆฌ์ง€๋งŒ ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹ค์‹œ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„ ์ข‹๋‹ค.

๊ฐ•์˜ ์ด์™ธ ํ† ์ด ํ”„๋กœ์ ํŠธ, ๊ณง ์žˆ์„ React ๊ณผ์ œ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์Šคํ„ฐ๋”” ๋“ฑ์œผ๋กœ ์ธํ•ด ๊ฐ•์˜๊ฐ€ ์กฐ๊ธˆ์”ฉ ๋ฐ€๋ฆฌ๊ธฐ๋„ ํ•˜๊ฒ ์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์ดˆ์‹ฌ์žƒ์ง€ ์•Š๊ณ  ๊ธฐ์ดˆ(๊ณต์‹๋ฌธ์„œ = ๊ต๊ณผ์„œ)๋ฅผ ๋‹ค์ง€๋ฉด์„œ React๋ฅผ ์กฐ๊ธˆ์”ฉ ๊นจ๋‹ฌ์•„๋‚˜๊ฐ€๋ณด๋„๋ก ํ•˜์ž.

๐Ÿ‘ Keep

React๋Š” ํŠธ๋ Œ๋“œ์ด์ž ํ•„์ˆ˜ ๊ธฐ์ˆ  ์—ญ๋Ÿ‰์ด๊ธฐ์— ๊ณต์‹๋ฌธ์„œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์ ธ๋‚˜๊ฐ€๊ณ  ์žˆ๋‹ค. ์‹œ๊ฐ„์„ ํˆฌ์žํ•œ๋งŒํผ React ์—ญ๋Ÿ‰๋„ ์„ฑ์žฅํ•ด๋‚˜๊ฐ€๋ฉด ์ข‹๊ฒ ๋‹ค.

๐Ÿ˜ฑ Problem

์‹œ๊ฐ„์ด ์ง„์งœ ๋„ˆ๋ฌด๋„ˆ๋ฌด ๋ถ€์กฑํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์–ธ์  ๊นŒ์ง€ ํ•‘๊ณ„๋ฅผ ๋Œˆ ์ˆœ ์—†๋Š” ๋ฒ•... ๋ˆˆ ๋–  ์žˆ์„ ๋•Œ ์ตœ๋Œ€ํ•œ ์ง‘์ค‘ํ•˜๊ณ  ํ•˜๋‚˜์”ฉ ํ•˜๋‚˜์”ฉ ํ•ด๋ณด์ž..

๐Ÿ˜œ Try

๋ง‰์ƒ ๊ฐ•์˜๋ฅผ ๋“ค์–ด๋„ ์ง์ ‘ ๋‚ด๊ฐ€ ๋‚ด ์ฝ”๋“œ๋ฅผ ์•ˆ ์ณ๋ณด๋ฉด ๋ง์งฑ ๋„๋ฃจ๋ฌต์ผ ๊ฑฐ ๊ฐ™๋‹ค. ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ React+ts๋กœ ํ•˜๊ธฐ๋กœ ํ–ˆ์œผ๋‹ˆ ์ฉ์€๋ฌด๋ผ๋„ ๋ฒ ์–ด๋ณด์ž. ๋”ฅ๋‹ค์ด๋ธŒ๋„ ๊ผญ ํ•ด๋ณด์ž ์ด๋ฒˆ์—”!!

๋ฒˆ์™ธ

2์ฐจ ํŒ€ ์ดํ›„ ์˜คํ”„๋ผ์ธ ๋ชจ์ž„์ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์Šคํƒ€๋””์›๊ณผ ์ „์ฒด ์˜คํ”„๋ผ์ธ ๋ชจ๊ฐ์ฝ” ์ผ์ •์ด ์žกํ˜”๋‹ค. ์˜จ๋ผ์ธ์œผ๋กœ ๋ณด๋˜ ํ”„๋กฑ์ด๋“ค์„ ๋งŒ๋‚œ๋‹ค๋‹ˆ ์•Œ์ฐจ๊ณ  ์œ ์ตํ•œ ์‹œ๊ฐ„์ด ๋˜๊ธธ ๊ธฐ์›ํ•˜๋ฉฐ ์˜ค๋Š˜๋„ ๋‹ฌ๋ ค๋ณด์ž๊ณ 



๐Ÿ˜… ํ•ด๋‹น ๋‚ด์šฉ์€ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด๋‚˜ ์˜คํ•ดํ•˜๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ค€๋น„์ค‘...

0๊ฐœ์˜ ๋Œ“๊ธ€