πŸ”˜ λ””μžμΈμ‹œμŠ€ν…œ λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈ 개발기

thumb_hyeokΒ·2023λ…„ 5μ›” 18일
1
post-thumbnail

πŸƒπŸ»Β λ“€μ–΄κ°€λ©°

μ–΄μ©Œλ‹€λ³΄λ‹ˆ NEXTSTEP λ¦¬μ•‘νŠΈ κ°•μ˜μ— μžˆλŠ” λ―Έμ…˜μ—μ„œ λ””μžμΈ μ‹œμŠ€ν…œμ„ κ°œλ°œν•˜λŠ” μ‚¬μ΄λ“œ ν”„λ‘œμ νŠΈμ— μ°Έμ—¬ν•˜κ²Œ λ˜μ—ˆλ‹€. λͺ©μ μ€ κ΅μœ‘μƒλ“€μ΄ λ¦¬μ•‘νŠΈ ν•™μŠ΅μ—λ§Œ 집쀑할 수 μžˆλ„λ‘ μ»΄ν¬λ„ŒνŠΈλ₯Ό κ°€μ Έλ‹€ 써 UI κ΅¬ν˜„λ₯Ό νŽΈλ¦¬ν•˜κ²Œ ν•˜λ„λ‘ ν•΄μ£ΌκΈ° μœ„ν•¨μ΄μ—ˆλ‹€!

λ””μžμΈμ‹œμŠ€ν…œμ΄ μ μš©λ˜λŠ” λ―Έμ…˜μ€ 페이먼츠 , μž₯λ°”κ΅¬λ‹ˆ 두 κ°€μ§€λ‘œ, λ‚˜λŠ” μž₯λ°”κ΅¬λ‹ˆ λ―Έμ…˜μ—μ„œ κ°œλ°œνŒ€μ— 지원, μž₯λ°”κ΅¬λ‹ˆ λ―Έμ…˜μ— μ‚¬μš©λ  λ²”μš©μ μΈ Button μ»΄ν¬λ„ŒνŠΈλ₯Ό κ°œλ°œν•˜κ²Œ λ˜μ—ˆλ‹€!


πŸ€”Β λ””μžμΈμ‹œμŠ€ν…œμ€ μ–΄λ–»κ²Œ λ§Œλ“€μ–΄?

λ””μžμΈμ‹œμŠ€ν…œμ„ κΌ­ ν•œ 번 λ§Œλ“€μ–΄λ³΄κ³ , μ μš©ν•΄λ³΄κ³  싢은 λ‘œλ§μ€ κ°–κ³  μžˆμ—ˆμ§€λ§Œ, 막상 β€œλͺ¨λ“  λ²„νŠΌβ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” λ²”μš©μ μΈ 곡톡 λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€μ–΄μ•Όν•œλ‹€κ³  μƒκ°ν•˜λ‹ˆ μ’€ 뢀담감이 μžˆμ—ˆλ‹€. μ–΄μ°Œ 됐든 λ‚΄κ°€ μ œλŒ€λ‘œλœ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ œκ³΅ν•˜μ§€ λͺ»ν•˜λ©΄ λˆλ‚΄κ³  κ°•μ˜ λ“£λŠ” 뢄듀이 λΆˆνŽΈμ„ κ²ͺ게 λ˜λŠ” μ…ˆμ΄λ‹ˆκΉŒ(…)

κ·Έλž˜μ„œ, λ‚˜λŠ” λ‚˜λ¦„ κΆŒμœ„μžˆλŠ” μ• ν”Œμ˜ Human Interface Guidelines(μ΄ν•˜ HIG)κ³Ό, λ‹€λ₯Έ λ””μžμΈμ‹œμŠ€ν…œλ“€μ˜ λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈλ₯Ό 보며 천천히 틀을 μž‘μ•„κ°€κΈ° μ‹œμž‘ν–ˆλ‹€.

HIGμ—μ„œλŠ” μ΄λ ‡κ²Œ λ§ν•œλ‹€.

λ‹€μž¬λ‹€λŠ₯ν•˜κ³  κ³ λ„λ‘œ μ‚¬μš©μž μ •μ˜ν•  수 μžˆλŠ” λ²„νŠΌμ€ μ‚¬λžŒλ“€μ—κ²Œ μ•±μ—μ„œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” κ°„λ‹¨ν•˜κ³  μΉœμˆ™ν•œ 방법을 μ œκ³΅ν•©λ‹ˆλ‹€. 일반적으둜 λ²„νŠΌμ€ κΈ°λŠ₯을 λͺ…ν™•ν•˜κ²Œ μ „λ‹¬ν•˜κΈ° μœ„ν•΄ μ„Έ 가지 속성을 κ²°ν•©ν•©λ‹ˆλ‹€.

  • μŠ€νƒ€μΌ. 크기, 색상 및 λͺ¨μ–‘을 기반으둜 ν•˜λŠ” μ‹œκ°μ  μŠ€νƒ€μΌ.
  • μ½˜ν…μΈ .Β λͺ©μ  전달을 μœ„ν•΄ λ²„νŠΌμ΄ ν‘œμ‹œν•˜λŠ” 기호(μΈν„°νŽ˜μ΄μŠ€ μ•„μ΄μ½˜), ν…μŠ€νŠΈ λ ˆμ΄λΈ” λ˜λŠ” λ‘˜ λ‹€.
  • μ—­ν• .Β λ²„νŠΌμ˜ 의미둠적 의미λ₯Ό μ‹λ³„ν•˜κ³  λͺ¨μ–‘에 영ν–₯을 쀄 수 μžˆλŠ” μ‹œμŠ€ν…œ μ •μ˜ μ—­ν• .

이λ₯Ό νŒ€μž₯인 μ½€ν”Όκ°€ λ§Œλ“€μ–΄μ˜¨ figmaλ₯Ό 보며 λ§Œλ“€μ–΄λ³΄κΈ° μ‹œμž‘ν–ˆλ‹€. μ•„λž˜μ—μ„œ μŠ€νƒ€μΌ, μ½˜ν…μΈ , 역할을 κ²°ν•©ν•΄ λ²„νŠΌμ„ λ§Œλ“€μ–΄κ°€λŠ” 과정을 ν•˜λ‚˜ ν•˜λ‚˜ μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜μž!


πŸŽ¨Β μŠ€νƒ€μΌ

HIGμ—μ„œλŠ” iOS, iPadOSμ—μ„œ μ‚¬μš©λ˜λŠ” λ²„νŠΌμ˜ 집합을 μ œμ‹œν•΄μ€€λ‹€. 4κ°€μ§€μ˜ λ²„νŠΌ μŠ€νƒ€μΌκ³Ό 3κ°€μ§€μ˜ μ‚¬μ΄μ¦ˆλ‘œ 총 12κ°€μ§€μ˜ λ²„νŠΌμ΄ μ‘΄μž¬ν•œλ‹€.

Filled μŠ€νƒ€μΌμ€ β€œλ³΄κΈ°μ—μ„œ κ°€μž₯ κ°€λŠ₯성이 높은 μž‘μ—…β€μ„ ν‘œμ‹œν•˜λŠ” λ²„νŠΌμ— μ‚¬μš©λœλ‹€. 말이 μ’€ μ–΄λ €μ›Œμ„œ μ˜ˆμ‹œλ₯Ό λ³΄μ—¬μ£Όμžλ©΄ μ•„λž˜μ™€ 같은 상황을 주둜 이야기 ν•œλ‹€. κ·Έλž˜μ„œ 쒋은 UXλ₯Ό μœ„ν•΄μ„œ Filled λ²„νŠΌμ„ λ‚¨λ°œν•˜μ§€ λ§λΌλŠ” 이야기도 ν•¨κ»˜ μ“°μ—¬μžˆλ‹€.

λ‚˜λŠ” variants propsλ₯Ό μ œκ³΅ν•˜μ—¬ Filled(Primary), Gray(Secondary), Plain μ΄λ ‡κ²Œ μ„Έ 가지 μŠ€νƒ€μΌμ„ μ§€μ›ν•˜κΈ°λ‘œ ν–ˆλ‹€. Tinted μŠ€νƒ€μΌμ€ figma에도 μ—†μ—ˆκ³ , 좔후에도 이 μ†Œκ·œλͺ¨ λ””μžμΈμ‹œμŠ€ν…œμ—μ„œ μ‚¬μš©λ  일은 μ—†μ–΄ λ³΄μ˜€λ‹€.

크기가 μ•„λ‹Œ μŠ€νƒ€μΌμ„ μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ μ˜΅μ…˜ μ€‘μ—μ„œ μ„ ν˜Έν•˜λŠ” 선택을 μ‹œκ°μ μœΌλ‘œ κ΅¬λ³„ν•˜μ‹­μ‹œμ˜€.

λ₯Ό λ§Œμ‘±ν•˜κΈ°μ—λ„ Secondary, Plain으둜 μΆ©λΆ„ν•  것 κ°™μ•˜λ‹€.

λ‹€μŒμœΌλ‘œ μ‚¬μ΄μ¦ˆλ‘œ λ„˜μ–΄κ°€μ„œ, widthλŠ” 가득 μ±„μš°λ„λ‘ ν•΄ μƒμœ„ μ»΄ν¬λ„ŒνŠΈμ˜ μ‚¬μ΄μ¦ˆμ— 영ν–₯을 받도둝 μ‘°μ •ν–ˆλ‹€. figma의 λ²„νŠΌλ“€μ„ λͺ¨λ‘ μ‚΄νŽ΄λ³΄κ³  heightλ₯Ό κΈ°μ€€μœΌλ‘œ Large(48px), Medium(38px), Small(28px) μ„Έ 가지 μ‚¬μ΄μ¦ˆλ₯Ό μ œκ³΅ν–ˆλ‹€. (HIGμ—μ„œλŠ” λ²„νŠΌμ˜ μ‚¬μ΄μ¦ˆλŠ” μ΅œμ†Œ 44x44λ₯Ό ꢌμž₯ν•˜μ§€λ§Œβ€¦ 이미 figmaκ°€ λ‚˜μ˜¨ 상황이라 μˆ˜μ • μš”μ²­μ„ λ“œλ¦¬κΈ°κ°€ μ’€ κ·Έλž¬λ‹€.)

export declare type ButtonVariant = keyof typeof ButtonStyles.Type;
export declare type ButtonSize = keyof typeof ButtonPadding;

// ButtonVariant = 'Primary' | 'Secondary' | 'Plain'
// ButtonSize = 'Large' | 'Medium' | 'Small'

πŸ’ΎΒ μ½˜ν…μΈ 

μ½˜ν…μΈ μ—μ„œ HIGκ°€ μ€‘μš”ν•˜κ²Œ μƒκ°ν•˜λŠ” μ„Έ κ°€μ§€λŠ” μ•„λž˜μ™€ κ°™μ•˜λ‹€.

  • μ‚¬λžŒλ“€μ΄ λ²„νŠΌμ˜ κΈ°λŠ₯을 μ¦‰μ‹œ 이해할 수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” λ²„νŠΌ μ½˜ν…μΈ λ₯Ό λ§Œλ“­λ‹ˆλ‹€.

  • μœ μš©ν•œ μ„ΈλΆ€ 정보λ₯Ό μ œκ³΅ν•˜λŠ” κ²½μš°μ—λ§Œ λ ˆμ΄λΈ” μ•„λž˜μ— μΆ”κ°€ ν…μŠ€νŠΈλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.

  • μ¦‰μ‹œ μ™„λ£Œλ˜μ§€ μ•ŠλŠ” μž‘μ—…μ— λŒ€ν•œ ν”Όλ“œλ°±μ„ μ œκ³΅ν•΄μ•Ό ν•  λ•Œ ν™œλ™ ν‘œμ‹œκΈ°λ₯Ό ν‘œμ‹œν•˜λ„λ‘ λ²„νŠΌμ„ κ΅¬μ„±ν•©λ‹ˆλ‹€.

λ‚˜λŠ” λͺ¨λ“  κ±Έ λ§Œμ‘±ν•˜κ³  μ‹Άμ–΄μ„œ 이λ₯Ό μœ„ν•œ props λ„€ 가지λ₯Ό μ œκ³΅ν–ˆλ‹€. prefixIconURL , suffix , childrun , loading 이 이 λ„€ 가지이닀. μ•„λž˜μ—μ„œ ν•˜λ‚˜ ν•˜λ‚˜κ°€ 무슨 역할을 ν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜μž.

1οΈβƒ£Β λ²„νŠΌμ˜ κΈ°λŠ₯ μ¦‰μ‹œ 이해

λ²„νŠΌμ˜ κΈ°λŠ₯을 μ‚¬μš©μžκ°€ μ¦‰μ‹œ μ΄ν•΄ν•˜λ„λ‘ childrun 을 톡해 λ²„νŠΌ ν…μŠ€νŠΈλ₯Ό μƒμœ„ μ»΄ν¬λ„ŒνŠΈλ‘œλΆ€ν„° λ°›λŠ” 것을 기본으둜 ν•˜λ˜, prefixIconURL 을 톡해 λ²„νŠΌμ— λ§žλŠ” μΈν„°νŽ˜μ΄μŠ€ μ•„μ΄μ½˜μ„ μ œκ³΅ν•  수 μžˆλ„λ‘ ν–ˆλ‹€. 예λ₯Ό λ“€μ–΄ 이런 λ²„νŠΌμ„ λ””μžμΈμ‹œμŠ€ν…œ μ΄μš©μžκ°€ νŽΈλ¦¬ν•˜κ²Œ μ œκ³΅ν•  수 μžˆλ‹€.

μž₯λ°”κ΅¬λ‹ˆ μ•„μ΄μ½˜μ„ μ œκ³΅ν•œλ‹€λ©΄, μ‚¬μš©μžκ°€ λ²„νŠΌμ΄ μž₯λ°”κ΅¬λ‹ˆ λ²„νŠΌμ΄λΌλŠ” 것을 ν…μŠ€νŠΈλ§Œ μ œκ³΅ν•˜λŠ” 것보닀 더 빨리 μ΄ν•΄ν•˜λŠ”λ°μ— 도움을 쀄 수 μžˆμ„ 것이닀!


2οΈβƒ£Β μœ μš©ν•œ μ„ΈλΆ€ 정보λ₯Ό 제곡

μž₯λ°”κ΅¬λ‹ˆ λ²„νŠΌ 같은 경우, μž₯λ°”κ΅¬λ‹ˆμ˜ μƒν’ˆμ΄ λͺ‡ κ°œλ‚˜ λ“€μ–΄μžˆλŠ” 지에 λŒ€ν•œ 정보λ₯Ό μ‚¬μš©μžμ—κ²Œ μ œκ³΅ν•˜λŠ” 것이 μ’€ 더 μœ μš©ν•  수 μžˆλ‹€. κ·ΈλŸ¬ν•œ 값듀은 suffix 둜 λ°›μ•„μ„œ λ²„νŠΌμ—μ„œ λ³΄μ—¬μ£ΌκΈ°λ‘œ ν–ˆλ‹€.

μž₯λ°”κ΅¬λ‹ˆμ— μƒν’ˆμ΄ λ‹΄κ²ΌλŠ”μ§€, λͺ‡κ°œλ‚˜ λ‹΄κ²¨μžˆλŠ”μ§€ 같은 κ°„λ‹¨ν•œ μ •λ³΄λŠ” μž₯λ°”κ΅¬λ‹ˆ νŽ˜μ΄μ§€κΉŒμ§€ μ΄λ™ν•˜μ§€ μ•Šκ³ λ„ μƒν’ˆλͺ©λ‘ νŽ˜μ΄μ§€ λ“±μ—μ„œ μ¦‰μ‹œ 확인할 수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.

λ¬Όλ‘  μ›ν•œλ‹€λ©΄ μ•„λž˜μ™€ 같이 prefixIconURL κ³Ό ν•¨κ»˜ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.


3οΈβƒ£Β μ¦‰μ‹œ μ™„λ£Œλ˜μ§€ μ•ŠλŠ” μž‘μ—…

μ•„κΉŒ λ§ν–ˆλ“―μ΄ μœ„μ—μ„œ loading μ΄λΌλŠ” props도 λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈκ°€ 받도둝 κ΅¬ν˜„ν•΄μ€¬λŠ”λ° API μš”μ²­λ“± μ¦‰μ‹œ μ™„λ£Œλ˜μ§€ μ•ŠλŠ” μž‘μ—…μΌ 경우 boolean 값을 μ œκ³΅ν•΄ μ•„λž˜μ™€ 같이 λ²„νŠΌ μƒνƒœλ₯Ό λ³€κ²½ν•  수 μžˆλ‹€.

λ²„νŠΌμ˜ cursor 값은 not-allowed 둜 λ³€κ²½λ˜κ³ , opacity 값도 μ‘°μ •λ˜μ–΄ μ•½κ°„ 투λͺ…해진닀. μΈν„°νŽ˜μ΄μŠ€ μ•„μ΄μ½˜κ³ΌλŠ” λ™μ‹œμ— ν‘œν˜„ν•  수 μ—†κ³ , λ‘˜ λ‹€ μ œκ³΅ν•˜λ©΄ loading μƒνƒœκ°€ λλ‚˜λ©΄ LoadingSpinner κ°€ μΈν„°νŽ˜μ΄μŠ€ μ•„μ΄μ½˜μœΌλ‘œ λŒ€μ²΄λœλ‹€.


πŸŽ­Β μ—­ν• 

HIGμ—μ„œλŠ” λ²„νŠΌμ„ λ„€ κ°€μ§€λ‘œ 역할을 κ΅¬λΆ„ν•œλ‹€. μΈμš©ν•˜μžλ©΄ μ΄λŸ¬ν•˜λ‹€.

  • 정상.Β νŠΉλ³„ν•œ μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€.
  • μ£Όμš”ν•œ.Β λ²„νŠΌμ€ κΈ°λ³Έ λ²„νŠΌμž…λ‹ˆλ‹€. μ‚¬λžŒλ“€μ΄ 선택할 κ°€λŠ₯성이 κ°€μž₯ 높은 λ²„νŠΌμž…λ‹ˆλ‹€.
  • μ·¨μ†Œ.Β λ²„νŠΌμ€ ν˜„μž¬ μž‘μ—…μ„ μ·¨μ†Œν•©λ‹ˆλ‹€.
  • 파괴적.Β λ²„νŠΌμ€ 데이터λ₯Ό νŒŒκ΄΄ν•  수 μžˆλŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

그런데 λ†€λžκ²Œλ„, μž₯λ°”κ΅¬λ‹ˆ λ―Έμ…˜μ—μ„œ μ‚¬μš©ν•˜λŠ” λ²„νŠΌμ—λŠ” β€œμ·¨μ†Œβ€, β€œνŒŒκ΄΄μ β€ μ—­ν• μ˜ λ²„νŠΌμ΄ μ—†μ—ˆλ‹€. 그리고 λͺ¨λ“  β€œPrimary” λ²„νŠΌμ€ β€œμ£Όμš”ν•œβ€ μ—­ν• μ˜ λ²„νŠΌμ΄μ—ˆλ‹€. ν•˜μ§€λ§Œ 이 글을 μ“°λ©΄μ„œ 깨달은 점은, μž₯λ°”κ΅¬λ‹ˆ μƒν’ˆμ„ μ‚­μ œν•  λ•Œ λͺ¨λ‹¬μ˜ λ²„νŠΌμ€ μ•„λ§ˆ β€œνŒŒκ΄΄μ β€ λ²„νŠΌκ³Ό β€œμ·¨μ†Œβ€ λ²„νŠΌμœΌλ‘œ ꡬ성될 것 κ°™μ•˜λ‹€.

1μ°¨ μŠ€ν”„λ¦°νŠΈκ°€ λλ‚˜κ³ , 2μ°¨ μŠ€ν”„λ¦°νŠΈλ‘œ λ“€μ–΄κ°ˆ λ•Œ, λΆ€μ‘±ν•œ role 을 쑰금 더 κ³ λ―Όν•΄μ„œ μΆ”κ°€ν•΄λ³΄λŠ” 것을 λͺ©ν‘œλ‘œ 작고 μ§„ν–‰ν•˜κΈ°λ‘œ ν–ˆλ‹€!


πŸ“–Β μ°Έκ³  자료

profile
μš°μ•„ν•œν…Œν¬μ½”μŠ€ 4κΈ° μ›Ή ν”„λ‘ νŠΈμ—”λ“œ

0개의 λŒ“κΈ€