개발/FRONTEND

μ„œλΉ„μŠ€λ₯Ό μœ„ν•œ 둜직 μž‘μ„±ν•˜κΈ°

caffhheine 2024. 8. 6. 14:40

 

λͺ©ν‘œ


μ–΄νŠΈλž™μ…˜ ν”„λ‘œμ νŠΈλŠ” μ‹€ μ„œλΉ„μŠ€λ₯Ό μ—Όλ‘ν•˜μ—¬ μ§„ν–‰ν•œ ν”„λ‘œμ νŠΈμ˜€κΈ°λ•Œλ¬Έμ—, 그에 λ§žμΆ”μ–΄ μœ μ§€λ³΄μˆ˜λ₯Ό μœ„ν•œ 섀계가 ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€. 또, 이후 μ„œλΉ„μŠ€μ˜ ν™•μž₯도 κ³ λ €ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό λͺ¨λ‘ κ³ λ €ν•˜μ—¬ μš”κ΅¬ 쑰건을 μƒκ°ν•΄λ³΄μžλ©΄

  1. μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•΄μ•Όν•œλ‹€. (μ€‘λ³΅λ˜λŠ” λ‘œμ§μ€ μ΅œλŒ€ν•œ ν”Όν•΄μ•Όν•œλ‹€)
  2. μΆ”ν›„ μ„œλΉ„μŠ€λ₯Ό ν™•μž₯ν•  수 μžˆμ–΄μ•Όν•œλ‹€.
  3. 인원이 λ³€κ²½λ˜κ±°λ‚˜ ν•˜λŠ” μ—¬λŸ¬κ°€μ§€ 사항에 λŒ€λΉ„ν•΄ λ¬Έμ„œν™”λ₯Ό μ² μ €νžˆ μ§„ν–‰ν•΄μ•Όν•œλ‹€.

νŒ€μ›λ“€κ³Ό μ–΄νŠΈλž™μ…˜ μ„œλΉ„μŠ€λ₯Ό μ€€λΉ„ν•˜λ©΄μ„œ λ‚΄λ¦° 결둠은 λ‹€μŒκ³Ό κ°™μ•˜μŠ΅λ‹ˆλ‹€.

  1. λ””μžμΈ μ‹œμŠ€ν…œμ„ 톡해 곡톡 μ»΄ν¬λ„ŒνŠΈλ₯Ό κ΄€λ¦¬ν•˜μ—¬ μ€‘λ³΅λ˜λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό μ΅œλŒ€ν•œ ν”Όν•œλ‹€.
  2. λͺ¨λ…Έλ ˆν¬ ꡬ쑰λ₯Ό λ„μž…ν•˜μ—¬ μΆ”ν›„ μ„œλΉ„μŠ€λ₯Ό ν™•μž₯ν•  수 μžˆλ„λ‘ ν•œλ‹€.
  3. λ””μžμΈ μ‹œμŠ€ν…œμ— Storybook을 λ„μž…ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈμ— λŒ€ν•΄μ„œ λ¬Έμ„œν™”λ₯Ό μ§„ν–‰ν•˜κ³ , λ…Έμ…˜μ„ 톡해 개발 기둝을 남긴닀.

λͺ¨λ…Έλ ˆν¬


μš°μ„ , λͺ¨λ…Έλ ˆν¬λ₯Ό μ™œ μ‚¬μš©ν•˜λŠ”κ°€? 에 λŒ€ν•΄μ„œλΆ€ν„° μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

λͺ¨λ…Έλ ˆν¬λž€, ν•˜λ‚˜μ˜ μ €μž₯μ†Œλ₯Ό μ˜λ―Έν•˜λŠ” ‘Monolithic Repository’의 μ€„μž„λ§λ‘œ, λ§Žμ€ ν”„λ‘œμ νŠΈλ₯Ό 단일 μ €μž₯μ†Œμ—μ„œ κ΄€λ¦¬ν•˜λŠ” 방식을 λ§ν•©λ‹ˆλ‹€.

단일 μ €μž₯μ†Œμ—μ„œ μ—¬λŸ¬ ν”„λ‘œμ νŠΈλ₯Ό κ΄€λ¦¬ν•¨μœΌλ‘œμ¨ μ—¬λŸ¬κ°€μ§€ 이점이 μƒκΈ°λŠ”λ° μ΄λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. ν”„λ‘œμ νŠΈλ₯Ό 생성할 λ•Œ 기본적으둜 μ„ΈνŒ… ν•΄μ•Ό ν•˜λŠ” 일듀이 쀄어든닀.
  2. νŒ¨ν‚€μ§€μ˜ 쀑볡 μ½”λ“œλ₯Ό 쀄일 수 μžˆλ‹€.
  3. 개발자 κ²½ν—˜μ„ μΌκ΄€μ μœΌλ‘œ μœ μ§€μ‹œμΌœ 쀄 수 μžˆλ‹€.
  4. λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ 변경사항을 νŒŒμ•…ν•˜λŠ”λ° μš©μ΄ν•˜λ‹€.

κ·Έλ ‡λ‹€κ³  ν•΄μ„œ λͺ¨λ…Έλ ˆν¬κ°€ λ°˜λ“œμ‹œ 기쑴의 방식보닀 항상 λ‚˜μ€ 방법은 μ•„λ‹™λ‹ˆλ‹€. λͺ¨λ…Έλ ˆν¬λŠ” λ‹€μŒκ³Ό 같은 μƒν™©μ—μ„œ μ‚¬μš©ν–ˆμ„ λ•Œ νš¨κ³Όμ μž…λ‹ˆλ‹€.

  1. μœ μ‚¬ν•œ μ œν’ˆμ˜ 집합일 λ•Œ
  2. μ—¬λŸ¬ ν”„λ‘œμ νŠΈμ˜ λ³€ν™”λ₯Ό ν•œλˆˆμ— νŒŒμ•…ν•΄μ•Ό ν•  λ•Œ
  3. 곡톡 κΈ°λŠ₯을 μž¬μ‚¬μš©ν•˜λŠ” κ΄€λ ¨λœ ν”„λ‘œμ νŠΈμ˜ 집합일 λ•Œ

μœ„μ˜ λ‚΄μš©μ„ μΆ©λΆ„νžˆ κ³ λ €ν•˜μ—¬ λͺ¨λ…Έλ ˆν¬μ™€ λ©€ν‹°λ ˆν¬λ₯Ό μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

λͺ¨λ…Έλ ˆν¬λ₯Ό κ΅¬ν˜„ν•˜λŠ” λ°©λ²•μ—λŠ” μ—¬λŸ¬κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€. ν˜„μ—…μ—μ„œλŠ” λͺ¨λ…Έλ ˆν¬λ₯Ό 관리할 λ•Œ 일반적으둜 turborepo λ‚˜ lerna λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

μ–΄νŠΈλž™μ…˜ λ˜ν•œ μœ„μ˜ 방법을 μ‚¬μš©ν• κΉŒ ν–ˆμœΌλ‚˜, λͺ¨λ…Έλ ˆν¬λ₯Ό 처음 μ μš©ν•΄λ³΄λŠ” 것이기 λ•Œλ¬Έμ— λͺ¨λ…Έλ ˆν¬ ν™˜κ²½μ„ 직접 κ΅¬μΆ•ν•΄λ³΄λŠ”κ²Œ μ’‹λ‹€κ³  μƒκ°ν–ˆκ³ , 자료λ₯Ό μ°Ύμ•„λ³Έ κ²°κ³Ό pnpm μ—μ„œ workspace κΈ°λŠ₯을 톡해 λͺ¨λ…Έλ ˆν¬ ν™˜κ²½μ„ μ§€μ›ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

ν•˜μ—¬, μ–΄νŠΈλž™μ…˜μ€ pnpm workspace 기반으둜 λͺ¨λ…Έλ ˆν¬ ν™˜κ²½μ„ κ΅¬μ„±ν–ˆμœΌλ©°, νŒ¨ν‚€μ§€ λ§€λ‹ˆμ € λ˜ν•œ pnpm으둜 μ‚¬μš©ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ…Έλ ˆν¬ ν™˜κ²½μ—μ„œ 일반적으둜 μ‚¬μš©λ˜λŠ” νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €λŠ” pnpmκ³Ό yarn-berry 두 μ’…λ₯˜μΈλ°, yarn-berry의 경우 plug-n-playκΈ°λŠ₯을 톡해 zero-install ν™˜κ²½μ„ ꡬ좕할 수 μžˆλ‹€λŠ” 점은 맀λ ₯μ μ΄μ—ˆμœΌλ‚˜, 3λ²„μ „κΉŒμ§€ ghost dependencyλ¬Έμ œκ°€ μžˆμ—ˆκ³ , ν•΄λ‹Ή λ‚΄μš©μ΄ 4λ²„μ „μœΌλ‘œ 메이저 μ—…λ°μ΄νŠΈκ°€ μ§„ν–‰λ˜λ©° ν•΄κ²°λ˜μ—ˆλ‹€κ³ λŠ” ν•˜λ‚˜ yarn-berry의 PnPκ°€ Git에 μ§€μ†μ μœΌλ‘œ λΆ€ν•˜λ₯Ό μ€€λ‹€λŠ” λ‚΄μš©κ³Ό λͺ¨λ“  νŒ¨ν‚€μ§€λ“€μ΄ PnPλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ μ—μ„œ pnpm을 μ„ νƒν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

Yarn λŒ€μ‹  pnpm으둜 λ„˜μ–΄κ°„ 3가지 이유

 

Yarn λŒ€μ‹  pnpm으둜 λ„˜μ–΄κ°„ 3가지 이유

νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €λ₯Ό λ°”κΎΈκ³  1λ…„ λ™μ•ˆ μ‚¬μš©ν•΄λ³΄λ©° λ“  생각듀

engineering.ab180.co

 

λ””μžμΈ μ‹œμŠ€ν…œ


λ””μžμΈ μ‹œμŠ€ν…œμ΄λž€ λ””μžμΈ 원칙과 규격, μž¬μ‚¬μš©ν•  수 μžˆλŠ” UI νŒ¨ν„΄κ³Ό μ»΄ν¬λ„ŒνŠΈ, μ½”λ“œλ₯Ό ν¬κ΄„ν•˜λŠ” μ‹œμŠ€ν…œμ„ λ§ν•©λ‹ˆλ‹€.

λ””μžμΈ μ‹œμŠ€ν…œμ€ 크게 3가지 μ •λ„λ‘œ λ‚˜λ‰˜λŠ”λ°

  1. UI κ°€μ΄λ“œλΌμΈ(μŠ€νƒ€μΌ κ°€μ΄λ“œ)
    • UIλ₯Ό ν‘œμ€€ν™”ν•˜κ³  ν™”λ©΄ κ°„μ˜ 일관성을 ν™•λ³΄ν•˜κΈ° μœ„ν•œ κ°€μ΄λ“œμž…λ‹ˆλ‹€.
  2. UX κ°€μ΄λ“œλΌμΈ
    • μ„œλΉ„μŠ€μ™€ λΈŒλžœλ“œ μΈ‘λ©΄μ—μ„œ μ‚¬μš©μžκ°€ 일관적이고 μ°¨λ³„ν™”λœ κ²½ν—˜μ„ ν•˜λ„λ‘ ν•˜κΈ° μœ„ν•œ κ°€μ΄λ“œμž…λ‹ˆλ‹€.
  3. λ””μžμΈ μ‹œμŠ€ν…œ
    • λ””μžμΈ 원칙과 규격, μž¬μ‚¬μš© κ°€λŠ₯ν•œ UI νŒ¨ν„΄κ³Ό μ»΄ν¬λ„ŒνŠΈ, μ½”λ“œλ₯Ό ν¬κ΄„ν•˜λŠ” μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

μ–΄νŠΈλž™μ…˜μ˜ 경우 μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈμ™€ μ•„μ΄μ½˜ νŒ¨ν‚€μ§€λ₯Ό λ””μžμΈ μ‹œμŠ€ν…œμ— μΆ”κ°€ν–ˆκ³ , 이λ₯Ό 톡해 μ€‘λ³΅λ˜λŠ” μ½”λ“œλ₯Ό 쀄이고 μ‚¬μš©μžμ—κ²Œ 일관적인 κ²½ν—˜μ„ 주고자 ν–ˆμŠ΅λ‹ˆλ‹€.

μ–΄νŠΈλž™μ…˜μ˜ 경우 ν˜„μž¬ μ„œλΉ„μŠ€μ€‘μΈ λ‰΄μŠ€λ ˆν„° μ„œλΉ„μŠ€ 이외에도 μΆ”ν›„ λ°±μ˜€ν”ΌμŠ€μ™€ 같은 μ„œλΉ„μŠ€λ₯Ό κ³„νšν•˜κ³ μžˆμ—ˆκΈ° λ•Œλ¬Έμ— μ‚¬μš©μžμ—κ²Œ 일관적인 κ²½ν—˜μ„ μ£ΌλŠ” 것이 μ€‘μš”ν•˜λ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

또, μ΄λ ‡κ²Œ μƒμ„±λœ μ»΄ν¬λ„ŒνŠΈμ— λŒ€ν•΄μ„œ Storybook을 톡해 λ¬Έμ„œν™”λ₯Ό μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μΆ”ν›„ λ””μžμ΄λ„ˆμ™€ 같은 λΉ„κ°œλ°œμž 직ꡰ과 μ†Œν†΅ν•  λ•Œ 어렀움이 없도둝 ν•˜κ³ , κ°œλ°œμ— μƒˆλ‘œ μ°Έμ—¬ν•˜λŠ” μ‚¬λžŒλ“€λ„ κ°€μ΄λ“œλ₯Ό 톡해 μ‰½κ²Œ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν•˜κ³ μž ν–ˆμŠ΅λ‹ˆλ‹€.

그리고 μƒμ„±λœ Storybookλ¬Έμ„œλŠ” chromatic μ„œλΉ„μŠ€λ₯Ό 톡해 λ°°ν¬ν–ˆκ³ , 이λ₯Ό Github Action 을 톡해 CD νŒŒμ΄ν”„λΌμΈμ„ κ΅¬μΆ•ν•˜μ—¬ μ΅œμ‹ μ˜ λ‚΄μš©μ„ λ°˜μ˜ν•˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.

 

UI / AspectRatio / Aspect Ratio Default

 

@storybook/cli - Storybook

 

666aec0e794cb6ede5f76082-uvfjsfssbu.chromatic.com

 

Storybook은 chromatic을 ν†΅ν•œ μ»΄ν¬λ„ŒνŠΈ ν…ŒμŠ€νŠΈλ„ μ§€μ›ν•˜λŠ”λ°, μ–΄νŠΈλž™μ…˜ μ„œλΉ„μŠ€λŠ” μΆ”ν›„ ν…ŒμŠ€νŠΈ 둜직의 μΆ”κ°€λ₯Ό 톡해 DS의 컀버리지 μƒνƒœλ₯Ό κ°œμ„ ν•  μ˜ˆμ •μ΄λ©°, shadcn/ui기반으둜 λ˜μ–΄μžˆλŠ” μ»΄ν¬λ„ŒνŠΈ λ˜ν•œ μžμ²΄μ»΄ν¬λ„ŒνŠΈλ‘œ ꡐ체할 μ˜ˆμ •μž…λ‹ˆλ‹€.

μ¨λ“œνŒŒν‹° μ‹œμŠ€ν…œμ„ ν†΅ν•œ μ‚¬μš©μž κ²½ν—˜ κ°œμ„ ν•˜κΈ°


여기에 μΆ”κ°€μ μœΌλ‘œ μ¨λ“œνŒŒν‹° μ‹œμŠ€ν…œμ„ ν†΅ν•΄μ„œ μ‚¬μš©μžμ˜ κ²½ν—˜μ„ κ°œμ„ ν•˜κ³ μž ν–ˆμŠ΅λ‹ˆλ‹€.

 

Sentryλ₯Ό νƒ‘μž¬ν•˜μ—¬ μ—λŸ¬λ₯Ό λ‘œκΉ…ν•˜κ³ , μ—λŸ¬μ— λŒ€ν•œ λ””ν…ŒμΌν•œ 정보λ₯Ό λ°›μ•„ μ—λŸ¬λ₯Ό μˆ˜μ •ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 이후 ν”„λ‘ νŠΈμ—”λ“œ μ„œλΉ„μŠ€μ˜ λ‘œλ“œ λ°ΈλŸ°μ‹±μ„ κ³ λ €ν•˜μ—¬ μ—λŸ¬λ₯Ό μ’…ν•©μ μœΌλ‘œ λ‘œκΉ…ν•  수 μžˆλ„λ‘ ꡬ좕해놓은 κ²ƒμž…λ‹ˆλ‹€.

 

 

Sentryμ—μ„œλŠ” 특히 μ—λŸ¬κ°€ λ””ν…ŒμΌν•˜κ²Œ λ‘œκΉ…λ˜μ–΄ μ–΄λ–€ ν™˜κ²½μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν–ˆλŠ”μ§€λ₯Ό μ‰½κ²Œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ„Έμ…˜ λ¦¬ν”Œλ ˆμ΄ κΈ°λŠ₯을 ν†΅ν•΄μ„œ μ •ν™•νžˆ μ–΄λ–€ μƒν™©μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν–ˆλŠ”μ§€λ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

μ—λŸ¬ λ°œμƒμ‹œμ—λŠ” μŠ¬λž™κ³Ό μ•Œλ¦Ό 연동섀정을 해두어 μŠ¬λž™ μ•Œλ¦Όμ„ 톡해 ν”„λ‘œλ•μ…˜μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν–ˆμŒμ„ λΉ λ₯΄κ²Œ 인지할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

이외에도 채널톑 을 톡해 일반 μœ μ €μ—κ²Œ λ¬Έμ˜μ™€ ν”Όλ“œλ°±μ„ λ°›μ•„ μœ μ €μ˜ μ‚¬μš©μ„±μ„ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.

κΈ°μ‘΄μ—λŠ” μ„œλΉ„μŠ€μ— 문의λ₯Ό ν•˜λ €λ©΄ 일반 μœ μ €μ—κ²ŒλŠ” 접근성이 λ–¨μ–΄μ§€λŠ” κΉƒν—ˆλΈŒ μ΄μŠˆλ‚˜, μ–Έμ œ λ‹΅μž₯이 μ˜¬μ§€ 기약이 μ—†λŠ” 이메일을 μ‚¬μš©ν•΄μ•Όν–ˆμ§€λ§Œ, 채널톑을 μΆ”κ°€ν•¨μœΌλ‘œμ¨ μ‹€μ‹œκ°„μœΌλ‘œ 문의λ₯Ό λ°›κ³  ν•΄λ‹Ή λ‚΄μš©μ— λŒ€ν•΄ λ‹΅λ³€ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ°Έκ³ 


https://yozm.wishket.com/magazine/detail/1830/

https://medium.com/musinsa-tech/journey-of-a-frontend-monorepo-8f5480b80661

https://fastcampus.co.kr/pages/43837