본문으둜 κ±΄λ„ˆλ›°κΈ°

πŸ–₯️React, TypeScript, Tailwind둜 Dropdown κ΅¬ν˜„ν•˜κΈ°

Β· μ•½ 10λΆ„

πŸ“š 정리​

πŸ”¬ κ°œμš”β€‹

넀이버 λΆ€μŠ€νŠΈμΊ ν”„μ˜ κ·Έλ£Ή ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ, Dropdown μ»΄ν¬λ„ŒνŠΈλ₯Ό κ΅¬ν˜„ν•˜κ²Œ λ˜μ—ˆλ‹€.

ν‰μ†ŒλΌλ©΄ Reactλ₯Ό μ‚¬μš©ν•΄μ„œ HTML둜 λ“œλžλ‹€μš΄μ„ κ΅¬ν˜„ν•˜λŠ” κ²ƒμ²˜λŸΌ κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν–ˆκ² μ§€λ§Œ, νŒ€μ˜ 핡심 κ°€μΉ˜λŠ” μ‚¬μš©μž κ΄€μ μ—μ„œμ˜ 완성도 μ˜€κΈ°μ— μ’€ 더 λ””ν…ŒμΌν•œ κ΅¬ν˜„μ„ μ‹œλ„ν•΄λ³΄κ²Œ λ˜μ—ˆλ‹€.

μ²˜μŒμ—λŠ” λ‹¨μˆœν•˜κ²Œ 이벀트 ν•œλ‘κ°œ μ •λ„λ§Œ μΆ”κ°€ν•˜κ³ , 곡톡 μ»΄ν¬λ„ŒνŠΈλ§Œ 뽑아내면 λ˜κ² μ§€? 라고 μƒκ°ν•˜λ˜κ²Œ unmount μ‹œμ— 이벀트λ₯Ό μ μš©ν•˜λŠ” 문제λ₯Ό λ§Œλ‚˜κ³  λ‚˜μ„œ.. ν•˜λ£¨μ’…μΌ κ³ λ―Όν•˜κ³  νƒκ΅¬ν•˜λŠ” μž‘μ—…μ΄ λ˜μ–΄λ²„λ Έλ‹€...

κ·Έλž˜μ„œ 이번 κΈ€μ—μ„œλŠ” Dropdown을 κ΅¬ν˜„ν•˜λ©΄μ„œ 배운 것듀과 λ”λΆˆμ–΄μ„œ unmount μ‹œμ— 이벀트λ₯Ό μ μš©ν•˜λŠ” 방법에 λŒ€ν•΄ 정리해보렀 ν•œλ‹€.

🎯 κ΅¬ν˜„μ˜ λͺ©ν‘œβ€‹

missing
κ΅¬ν˜„ν•΄μ•Όλ§Œ ν–ˆλ˜ νŽ˜μ΄μ§€

λ‚΄κ°€ κ΅¬ν˜„ν•΄μ•Ό ν–ˆλ˜ νŽ˜μ΄μ§€λŠ” μœ„μ™€ κ°™μ•˜λ‹€.

missing
κ΅¬ν˜„ν•˜κ³ μž ν–ˆλ˜ μ»΄ν¬λ„ŒνŠΈ

그리고 μœ„μ— λ³΄μ΄λŠ” Dropdown μ»΄ν¬λ„ŒνŠΈκ°€ λ‚΄κ°€ κ΅¬ν˜„ν•˜κ³ μž ν–ˆλ˜ μ»΄ν¬λ„ŒνŠΈμ˜€λ‹€.

πŸ€” κ΅¬ν˜„μ‹œ κ³ λ €ν•΄μ•Ό ν–ˆλ˜ 점​

μ•žμ„œ λ§ν–ˆλ“―μ΄ 우리 νŒ€μ€ μ‚¬μš©μž κ΄€μ μ—μ„œμ˜ 완성도λ₯Ό μ€‘μš”μ‹œν•˜κ³  μžˆμ—ˆλ‹€.

여기에 λ”ν•΄μ„œ 기본적인 ν”„λ‘œμ νŠΈ κΈ°κ°„ 이후에도 μ§€μ†μ μœΌλ‘œ 이 ν”„λ‘œμ νŠΈλ₯Ό μœ μ§€λ³΄μˆ˜ν•˜λ©΄μ„œ 끌고 κ°€κ³  μ‹Άλ‹€λŠ” 생각이 μžˆμ—ˆλ‹€.

이에 λ”°λΌμ„œ λ‹€μŒμ˜ 사항을 κ³ λ €ν•΄μ•Όν•  ν•„μš”κ°€ μžˆμ—ˆλ‹€.

  1. μ™„λ²½ν•˜κ²Œ κΉŒμ§€λŠ” μ•„λ‹ˆλ”λΌλ„, μ‚¬μš©μž κ΄€μ μ—μ„œ μ‹œκ°μ μΈ μ™„μ„±λ„λŠ” κ°œλ°œκΈ°ν•œ λ‚΄μ—μ„œ μ΅œλŒ€ν•œ κ³ λ €ν•΄μ•Ό ν•œλ‹€.
  2. ν”„λ‘œμ νŠΈ μ΄ν›„μ˜ μœ μ§€λ³΄μˆ˜λ₯Ό μœ„ν•΄μ„œ μ»΄ν¬λ„ŒνŠΈ κ΅¬μ‘°λŠ” μ΅œλŒ€ν•œ μž‘κ²Œ μͺΌκ°œμ•Ό ν•œλ‹€.
  3. μ»΄ν¬λ„ŒνŠΈκ°€ μž¬μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€μ–΄μ Έμ•Ό ν•œλ‹€. (DX 및 ν˜‘μ—… 관점)

κ·Έλ ‡κ²Œ 이런 원칙을 λ°”νƒ•μœΌλ‘œ κ°œλ°œμ„ μ§„ν–‰ν•˜κ²Œ λ˜μ—ˆλ‹€.

πŸ€” λ‚΄κ°€ κ³ λ―Όν–ˆλ˜ ꡬ쑰​

missing
λ‚΄κ°€ κ³ λ―Όν–ˆλ˜ ꡬ쑰

λ‚΄κ°€ κ³ λ―Όν–ˆλ˜ κ΅¬μ‘°λŠ” μœ„μ™€ κ°™μ•˜λ‹€.

missing
λΆ„ν•΄ν•΄μ„œ μ‚΄νŽ΄λ³Έ ꡬ쑰

이λ₯Ό 쑰금 더 λœ―μ–΄λ³΄λ©΄ μœ„μ™€ 같은 ꡬ쑰가 λœλ‹€.

μ΅œλŒ€ν•œ μž‘μ€ μ»΄ν¬λ„ŒνŠΈλ‘œ κ΅¬μ„±ν•˜κ³ μž ν•˜μ˜€μœΌλ©°, 이λ₯Ό λ°”νƒ•μœΌλ‘œ κ΅¬ν˜„ν•˜κ²Œ λ˜μ—ˆλ‹€.

πŸ€” μž¬μ‚¬μš© λ²”μœ„μ— λŒ€ν•œ 고민​

μ»΄ν¬λ„ŒνŠΈλ₯Ό μž‘κ²Œ λ‚˜λˆ„λŠ” 것 κΉŒμ§€λŠ” μ’‹μ•˜λŠ”λ°, 이듀을 μ–΄λ””κΉŒμ§€ μž¬μ‚¬μš©κ°€λŠ₯ν•˜κ²Œ ν•  것인가에 λŒ€ν•œ 의문이 생겼닀.

μ²˜μŒμ—λŠ” shadcn처럼 κ΅¬ν˜„μ„ ν• κΉŒ 생각을 ν–ˆμ—ˆλ‹€.

μ΅œλŒ€ν•œ λ²”μš©μ μœΌλ‘œ λ§Œλ“€κ³ , λ‚˜μ€‘μ— ν•„μš”ν•œ 정보λ₯Ό λ”°λ‘œ μ™ΈλΆ€μ—μ„œ μ£Όμž…μ„ λ°›κ²Œ ν•˜λŠ” μ‹μœΌλ‘œ 갈까 ν•˜λŠ” 고민이 μžˆμ—ˆλ‹€.

λ‹€λ§Œ, μ—¬κΈ°μ„œ ν•œ 가지가 λ§ˆμŒμ— 걸리게 λ˜μ—ˆλ‹€. shadcn은 μ§„μ§œ λ²”μš©μ μΈ λͺ©μ μ„ κ°–κ³  λ‚˜μ˜¨ λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€. 그리고 λ‹Ήμ—°ν•˜κ²Œλ„ 이게 κ°œλ°œλ˜κΈ°κΉŒμ§€ 정말 λ§Žμ€ μ»¨νŠΈλ¦¬λ·°ν„°λ“€μ˜ κΈ°μ—¬κ°€ μžˆμ—ˆμ„ 것이닀.

ν•˜μ§€λ§Œ, ν”„λ‘œμ νŠΈμ—μ„œλŠ” μ΄λ ‡κ²ŒκΉŒμ§€ 큰 λ²”μš©μ„±μ΄ ν•„μš”ν•˜μ§€ μ•Šμ•˜λ‹€. κ·Έλž˜μ„œ μ‹€μ œλ‘œ κΈ°νšμ„œ Figmaλ₯Ό μ‚΄νŽ΄λ³΄μ•˜κ³ , μ‚¬μš©λ˜λŠ” 뢀뢄을 확인할 수 μžˆμ—ˆλ‹€.

missing
λ“œλžλ‹€μš΄μ΄ μ‚¬μš©λ˜λŠ” μž₯μ†Œ 1
missing
λ“œλžλ‹€μš΄μ΄ μ‚¬μš©λ˜λŠ” μž₯μ†Œ 2

μœ„μ˜ 두 κ²½μš°μ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” 것을 확인할 수 μžˆμ—ˆλ‹€.

좔후에 λ­”κ°€ 좔가적인 μš”μ†Œκ°€ λ“€μ–΄μ˜¨λ‹€κ³  ν•˜μ§€λ§Œ, λͺ¨λ“  경우λ₯Ό κ³ λ €ν•˜κΈ° λ³΄λ‹€λŠ” 쑰금 더 μ’ν˜€μ„œ λ‹€μŒκ³Ό 같은 λ²”μœ„λ§Œ κ³ λ €ν•˜λ©΄ 될 것 κ°™μ•˜λ‹€.

β–Έ λ²„νŠΌμ˜ 경우 μ—¬λŸ¬ μ’…λ₯˜μ˜ μ•„μ΄μ½˜μ— λŒ€μ‘μ΄ 될 수 μžˆμ–΄μ•Ό ν•œλ‹€. λ‚˜μ•„κ°€μ„œ, 기쑴의 μš”μ†Œμ— 영ν–₯을 μ£Όλ©΄ μ•ˆλœλ‹€.
β–Έ λ²„νŠΌμ— ν…μŠ€νŠΈκ°€ 듀어왔을 λ•Œ λ°°μΉ˜ν•΄μ€„ 수 μžˆλ„λ‘ children으둜 λ°›μ•„μ„œ μ²˜λ¦¬ν•˜λŠ” λ‘œμ§μ„ κ΅¬ν˜„ν•œλ‹€.
β–Έ λ“œλžλ‹€μš΄ μ•„μ΄ν…œμ€ μ™ΈλΆ€λ‘œλΆ€ν„° μž…λ ₯λ°›λŠ”λ‹€.
β–Έ λ“œλžλ‹€μš΄ μ•„μ΄ν…œμ— λŒ€ν•œ 이벀트 μ²˜λ¦¬λ„ μ™ΈλΆ€λ‘œλΆ€ν„° μž…λ ₯λ°›λŠ”λ‹€. λ³Έ λ“œλžλ‹€μš΄μ€ wrapper에 λŒ€ν•œ 이벀트 ν•Έλ“€λŸ¬λ§Œ μž…λ ₯λ°›λŠ”λ‹€. μ—¬κΈ°μ„œ e.target.closest와 같은 이벀트 버블링 방식을 μ‚¬μš©ν•œλ‹€.
β–Έ λ“œλžλ‹€μš΄μ—μ„œμ˜ μ™ΈλΆ€λ‘œλΆ€ν„° λ°›λŠ” μ΄λ²€νŠΈλŠ” onClickμ—λ§Œ μ μš©ν•˜λ„λ‘ ν•œλ‹€.
β–Έ Figma에 ν‘œμ‹œλœ λ””μžμΈμ€ μ „λΆ€ κ΅¬ν˜„ν•œλ‹€. μΆ”κ°€λ‘œ μ‚¬μš©μž νŽΈμ˜μ„±μ— λŒ€ν•œ 뢀뢄은 주어진 개발 κΈ°ν•œ 내에 μ΅œλŒ€ν•œ κ³ λ €ν•œλ‹€.


μœ„μ™€ 같은 생각을 가지고 κ°œλ°œμ— 착수λ₯Ό ν•˜κ²Œ λ˜μ—ˆλ‹€.

πŸ§‘β€πŸ’» 계측 ꡬ쑰​

λ“œλžλ‹€μš΄μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ λ‚΄κ°€ κΎΈλ¦° 계측 κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

/dropdown
- Dropdown
- Trigger
- Menu
- Item

사싀 μ²˜μŒλΆ€ν„° μ΄λ ‡κ²Œ λ‚˜μ˜¨ 것은 μ•„λ‹ˆλ‹€.

λ‚΄ 개발 원칙 쀑 ν•˜λ‚˜μΈ 2번 κ΅¬ν˜„ν•˜κΈ°λΌλŠ” 게 μžˆλŠ”λ°.. 일단 λ¨Όμ € λΉ λ₯΄κ²Œ κ΅¬ν˜„μ„ 해보고, κ·Έ λ‹€μŒμ— λ‹€μ‹œ κ΅¬ν˜„ν•˜λ©΄μ„œ κ·Έλ•Œ 완성도λ₯Ό λ†’μ΄μžλŠ” λ§ˆμΈλ“œμ…‹μ΄λ‹€.

ν•˜λ„ 개발 기간을 μ œλŒ€λ‘œ λͺ»λ§žμΆ°μ„œ λ‚΄ λ‚˜λ¦„λŒ€λ‘œ μ„Έμš΄ 원칙이닀.

사싀 μ²˜μŒλΆ€ν„° 이런 ꡬ쑰가 λ‚˜μ™”λ˜ 것은 μ•„λ‹ˆμ—ˆλ‹€.

기쑴에 Dropdown은 HTMLμ΄λ‚˜ Vanilla JS λ“±μœΌλ‘œ κ΅¬ν˜„λ§Œ ν•΄λ΄€κ³ , Reactμ—μ„œλŠ” λ§Œλ“€μ–΄μ§€λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό κ°€μ Έλ‹€μΌμ—ˆλ‹€.

이에 따라, 처음 λ§Œλ“€μ–΄λ³΄κ²Œ λ˜λŠ” κ²ƒμ΄μ—ˆκ³ .. 호기둭게 μ‹œμž‘μ€ ν–ˆμ§€λ§Œ.. μž¬μ‚¬μš©μ„±μ΄ λ†’κ²Œ λ§Œλ“œλŠ” 것이 생각보닀 쉽지 μ•ŠμŒμ„ κΉ¨λ‹¬μ•˜λ‹€.

missing
μ½”λ“œ 1
missing
μ½”λ“œ 2
missing
μ½”λ“œ 3
missing
μ½”λ“œ 4

μœ„λŠ” λ‚΄κ°€ μ²˜μŒμ— μž‘μ„±ν–ˆλ˜ μ½”λ“œλ“€μ΄λ‹€. 보여주기 λΆ€λ„λŸ¬μ›Œμ„œ μΌλΆ€λŸ¬ ꡉμž₯히 μž‘κ²Œ ν‘œμ‹œλ₯Ό ν–ˆλ‹€.

missing
μ²˜μŒμ— μž‘μ„±ν•œ ꡬ쑰

그리고 이에 λ”°λ₯Έ κ΅¬μ‘°λŠ” μœ„μ™€ κ°™μ•˜λ‹€.

κ·Έλƒ₯ λ¬΄ν„±λŒ€κ³  μ§œλ‹€λ³΄λ‹ˆ, λ‚˜ μŠ€μŠ€λ‘œλ„ μ•Œμ•„λ³΄κΈ° μ–΄λ €μš΄ μ§€μ €λΆ„ν•œ μ½”λ“œκ°€ λ‚˜μ™”λ‹€.

그에 λ”°λΌμ„œ, κ΅¬ν˜„ν–ˆλ˜ 것을 λ°”νƒ•μœΌλ‘œ λ‹€μ‹œκΈˆ κ°ˆμ•„μ—Žμ„ ν•„μš”κ°€ μžˆμ—ˆλŠ”λ° 그게 μ•žμ„œμ„œ 보여쀀 ꡬ쑰이닀.

이 κ³Όμ •μ—μ„œ μ»΄ν¬λ„ŒνŠΈ μ»΄νŒŒμš΄λ“œ νŒ¨ν„΄μ΄ 뭔지 μ•Œκ²Œ λ˜μ—ˆκ³ , 각 μ»΄ν¬λ„ŒνŠΈλ₯Ό μ†μ„±μœΌλ‘œ λ„˜κ²¨μ„œ μ‚¬μš©ν•˜λŠ” 방법이 μžˆμŒμ„ 배울 수 μžˆμ—ˆλ‹€.

πŸ§‘β€πŸ’» κ΅¬ν˜„ 과정​