IKKIM

🌦️ 날씨 μ•ˆλ‚΄ μ½˜ν…μΈ 

메인 ν™”λ©΄ 상단 날씨 적용
메인 ν™”λ©΄ 상단 날씨 적용
λ‘œλ΄‡ λŒ€κΈ° ν™”λ©΄ 쀑 날씨 ν‘œμ‹œ
λ‘œλ΄‡ λŒ€κΈ° ν™”λ©΄ 쀑 날씨 ν‘œμ‹œ
λ‘œλ΄‡ λŒ€κΈ° ν™”λ©΄ 쀑 날씨 ν‘œμ‹œ (영문)
λ‘œλ΄‡ λŒ€κΈ° ν™”λ©΄ 쀑 날씨 ν‘œμ‹œ (영문)
λ‘œλ΄‡ λŒ€κΈ° ν™”λ©΄ 쀑 날씨 ν‘œμ‹œ (쀑문)
λ‘œλ΄‡ λŒ€κΈ° ν™”λ©΄ 쀑 날씨 ν‘œμ‹œ (쀑문)

πŸ“Œ ν”„λ‘œμ νŠΈ κ°œμš”

  • λ‘œλ΄‡μ΄ μ„€μΉ˜λœ 건물 μœ„μΉ˜λ₯Ό κΈ°μ€€μœΌλ‘œ 였늘, 내일, μ£Όκ°„ μ˜ˆλ³΄μ™€ λŒ€κΈ°μ§ˆ 정보λ₯Ό μ•ˆλ‚΄ν•˜λŠ” μ½˜ν…μΈ μž…λ‹ˆλ‹€.
  • 기상청 예보 데이터λ₯Ό 화면에 ν‘œμ‹œν•˜κ³ , 같은 λ°μ΄ν„°λ‘œ μŒμ„± μ•ˆλ‚΄ 문ꡬλ₯Ό 쑰립해 ν•¨κ»˜ μ œκ³΅ν•©λ‹ˆλ‹€.
  • 고객사 κ±΄λ¬Όλ§ˆλ‹€ 예보 κ²©μžμ™€ λŒ€κΈ°μ§ˆ μΈ‘μ •μ†Œκ°€ λ‹€λ₯΄λ―€λ‘œ, ν˜„μž₯ κΈ°μ€€ 날씨가 λ‚˜μ˜€λ„λ‘ μœ„μΉ˜ 정보λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
  • λŒ€κΈ° ν™”λ©΄, 메인 ν™”λ©΄, 날씨 μ „μš© ν™”λ©΄ λ“± μ—¬λŸ¬ μœ„μΉ˜μ—μ„œ λ…ΈμΆœλ˜λ―€λ‘œ, λ°°μΉ˜λ³„λ‘œ ν‘œμ‹œ λ²”μœ„λ₯Ό λ‹¬λ¦¬ν•˜λ©΄μ„œλ„ 데이터 μ²˜λ¦¬λŠ” ν•˜λ‚˜λ‘œ μœ μ§€λ˜λ„λ‘ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.
  • 기획 단계뢀터 μ°Έμ—¬ν•΄ ν”„λ‘ νŠΈμ—”λ“œλ₯Ό λ‹¨λ…μœΌλ‘œ λ‹΄λ‹Ήν–ˆμœΌλ©°, UI/UX 섀계뢀터 κΈ°λŠ₯ 개발과 μ„±λŠ₯ μ΅œμ ν™”κΉŒμ§€ μˆ˜ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.
  • ν…μŠ€νŠΈμ™€ μŒμ„± μ•ˆλ‚΄λŠ” κ΅­μ œν™”(i18n)λ₯Ό μœ„ν•΄ λ‹€κ΅­μ–΄λ₯Ό μ§€μ›ν•˜μ—¬, λ‹€μ–‘ν•œ μ–Έμ–΄ ν™˜κ²½μ—μ„œλ„ μœ μ—°ν•˜κ²Œ λŒ€μ‘ν•©λ‹ˆλ‹€.

πŸ§‘β€πŸ’» μ£Όμš” κΈ°μ—¬

  • 건물별 예보 κ²©μžμ™€ λŒ€κΈ°μ§ˆ μΈ‘μ •μ†Œλ₯Ό μ§€μ •ν•΄, λ‘œλ΄‡μ΄ μ„€μΉ˜λœ ν˜„μž₯ κΈ°μ€€μ˜ 날씨λ₯Ό μ œκ³΅ν•˜λ„λ‘ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.
  • 기상청 API 데이터λ₯Ό 였늘, 내일, μ£Όκ°„ μ„Έ μ˜μ—­μœΌλ‘œ ꡬ뢄해 λ Œλ”λ§ν–ˆμŠ΅λ‹ˆλ‹€.
  • UI μ»΄ν¬λ„ŒνŠΈλ₯Ό κΈ°λŠ₯ λ‹¨μœ„λ‘œ λΆ„λ¦¬ν•˜κ³  μƒμœ„ νŽ˜μ΄μ§€μ—μ„œ μ‘°ν•©ν•˜λ„λ‘ 섀계해, μ—¬λŸ¬ 화면에 λ°°μΉ˜ν•˜λ©΄μ„œλ„ μž¬μ‚¬μš©μ„±κ³Ό ν™•μž₯성을 ν™•λ³΄ν–ˆμŠ΅λ‹ˆλ‹€.
  • ν™”λ©΄ μ§„μž…λ§ˆλ‹€ λ°œμƒν•˜λ˜ API ν˜ΈμΆœμ„ 미듀웨어 μΊμ‹±μœΌλ‘œ μ „ν™˜ν•˜κ³  κ°±μ‹  μ£ΌκΈ°λ₯Ό 12μ‹œκ°„μœΌλ‘œ μ„€μ •ν•΄,
    λ‘œλ΄‡ 1λŒ€λ‹Ή ν•˜λ£¨ 30νšŒμ—μ„œ 2회둜 μ€„μ˜€μŠ΅λ‹ˆλ‹€.
  • 응닡이 비정상일 λ•Œ λ§ˆμ§€λ§‰ 정상 데이터λ₯Ό localStorageμ—μ„œ λΆˆλŸ¬μ™€ λŒ€μ²΄ ν‘œμ‹œν•˜λ„λ‘ μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.
  • 가곡이 λλ‚œ 데이터λ₯Ό μž¬μ‚¬μš©ν•˜λ„λ‘ λ°”κΏ” 평균 λ‘œλ”© μ‹œκ°„μ„ 1,600msμ—μ„œ 700ms둜 μ€„μ˜€μŠ΅λ‹ˆλ‹€.
  • 날씨 데이터λ₯Ό μ‘°ν•©ν•΄ TTS μŒμ„± μ•ˆλ‚΄ 문ꡬλ₯Ό μƒμ„±ν•˜κ³ , μž…μ£Όμ‚¬ λͺ…칭을 ν¬ν•¨ν•œ 맞좀 μ•ˆλ‚΄λ₯Ό μ œκ³΅ν–ˆμŠ΅λ‹ˆλ‹€.
  • i18n λ‹€κ΅­μ–΄: ko-KR, en-US, zh-CN UI ν…μŠ€νŠΈμ™€ μŒμ„± μ•ˆλ‚΄λ₯Ό μ œκ³΅ν–ˆμŠ΅λ‹ˆλ‹€.
  • 기상청 API 응닡 규격과 ν•„λ“œ 의미λ₯Ό λ‚΄λΆ€ λ¬Έμ„œλ‘œ 정리해, 이후 λ‹€λ₯Έ κ°œλ°œμžκ°€ 응닡 ꡬ쑰λ₯Ό λ‹€μ‹œ νŒŒμ•…ν•˜μ§€ μ•Šμ•„λ„ λ˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ”§ 기술 선택 및 섀계 κ³ λ―Ό

μ—¬λŸ¬ ν™”λ©΄μ—μ„œ μž¬μ‚¬μš©λ˜λŠ” ꡬ쑰

  • 날씨 μ½˜ν…μΈ λŠ” λŒ€κΈ° ν™”λ©΄, 메인 ν™”λ©΄, 날씨 μ „μš© ν™”λ©΄ λ“± μ—¬λŸ¬ μœ„μΉ˜μ—μ„œ λ…ΈμΆœλμŠ΅λ‹ˆλ‹€.
    같은 데이터λ₯Ό μ“°μ§€λ§Œ λ°°μΉ˜λ§ˆλ‹€ ν‘œμ‹œ λ²”μœ„μ™€ λ™μž‘μ΄ λ‹¬λžκ³ , ν™”λ©΄λ³„λ‘œ λ”°λ‘œ λ§Œλ“€λ©΄ 쀑볡이 계속 λŠ˜μ–΄λ‚˜λŠ” κ΅¬μ‘°μ˜€μŠ΅λ‹ˆλ‹€.
  • μ•„ν† λ―Ή λ””μžμΈ νŒ¨ν„΄μ„ μ°Έκ³ ν•΄ UI μ»΄ν¬λ„ŒνŠΈλ₯Ό κΈ°λŠ₯ λ‹¨μœ„λ‘œ λ‚˜λˆ„κ³  μƒμœ„ νŽ˜μ΄μ§€μ—μ„œ μ‘°ν•©ν•˜λ„λ‘ μ„€κ³„ν–ˆμŠ΅λ‹ˆλ‹€.
  • μ΄λ ‡κ²Œ λ‚˜λˆ λ‘λ‹ˆ 배치 μœ„μΉ˜κ°€ λŠ˜μ–΄λ‚˜λ„ 데이터λ₯Ό κ°€μ Έμ˜€κ³  κ°€κ³΅ν•˜λŠ” λ‘œμ§μ€ ν•˜λ‚˜λ‘œ μœ μ§€λκ³ ,
    ν™”λ©΄λ§ˆλ‹€ λ‹€λ₯Έ λΆ€λΆ„λ§Œ 쑰합을 λ°”κΏ” λŒ€μ‘ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
  • 기상청 API 응닡 규격과 ν•„λ“œ μ˜λ―ΈλŠ” λ‚΄λΆ€ λ¬Έμ„œλ‘œ μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.
    응닡 ν•„λ“œλͺ…이 직관적이지 μ•Šμ•„, λ‚˜μ€‘μ— μˆ˜μ •ν•  μ‚¬λžŒμ΄ κ·œκ²©μ„ λ‹€μ‹œ ν•΄μ„ν•˜μ§€ μ•Šλ„λ‘ ν•˜κΈ° μœ„ν•¨μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

문제 상황

  • μ΄ˆκΈ°μ—λŠ” 날씨 화면에 μ§„μž…ν•  λ•Œλ§ˆλ‹€ APIλ₯Ό ν˜ΈμΆœν–ˆμŠ΅λ‹ˆλ‹€.
    λ‘œλ΄‡ 1λŒ€ κΈ°μ€€ ν•˜λ£¨ 평균 30회 정도가 λ°œμƒν–ˆκ³ , ν™”λ©΄ μ§„μž… λ•Œλ§ˆλ‹€ 응닡을 κΈ°λ‹€λ €μ•Ό ν•΄μ„œ 첫 화면이 늦게 λ³΄μ—¬μ‘ŒμŠ΅λ‹ˆλ‹€.
  • 더 큰 λ¬Έμ œλŠ” 기상청 API 응닡 였λ₯˜μ˜€μŠ΅λ‹ˆλ‹€. μ£Ό 1회 이상 비정상 응닡이 λ°œμƒν–ˆκ³ ,
    값이 λΉ„λ©΄μ„œ 화면이 μ•„μ˜ˆ λœ¨μ§€ μ•ŠλŠ” λŸ°νƒ€μž„ 였λ₯˜λ‘œ μ΄μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.
    ν˜„μž₯μ—μ„œλŠ” λ‘œλ΄‡ 화면이 λΉ„μ–΄ μžˆλŠ” μƒνƒœλ‘œ λ°©μΉ˜λ˜λ―€λ‘œ 운영 문제둜 μ΄μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

ν•΄κ²° 방법

  • 예보 λ°μ΄ν„°λŠ” κ·Έλ ‡κ²Œ 자주 λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€λŠ” μ μ—μ„œ μΆœλ°œν–ˆμŠ΅λ‹ˆλ‹€.
    기상청 λ™λ„€μ˜ˆλ³΄λŠ” 3μ‹œκ°„ κ°„κ²©μœΌλ‘œ λ°œν‘œλ˜μ§€λ§Œ, λ‘œλ΄‡ μ•ˆλ‚΄ ν™”λ©΄μ—μ„œ 였늘, 내일, 주간을 λ³΄μ—¬μ£ΌλŠ” μš©λ„λΌλ©΄
    κ·Έ μ•ˆμ—μ„œ 의미 있게 달라지지 μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ§€ μ§„μž…λ§ˆλ‹€ ν˜ΈμΆœν•˜λŠ” λŒ€μ‹  λ―Έλ“€μ›¨μ–΄μ˜ 캐싱 κΈ°λŠ₯을 μ‚¬μš©ν•˜κ³  κ°±μ‹  μ£ΌκΈ°λ₯Ό 12μ‹œκ°„μœΌλ‘œ μž‘μ•˜μŠ΅λ‹ˆλ‹€.
    TanStack Queryμ—μ„œ staleTime을 λ‘λŠ” 것과 같은 κ°œλ…μœΌλ‘œ, μ˜€μ „κ³Ό μ˜€ν›„ ν•œ λ²ˆμ”©μ΄λ©΄ μΆ©λΆ„ν•˜λ‹€κ³  νŒλ‹¨ν–ˆμŠ΅λ‹ˆλ‹€.
  • 응닡 였λ₯˜μ— λŒ€ν•΄μ„œλŠ” λ§ˆμ§€λ§‰μœΌλ‘œ 정상 μˆ˜μ‹ ν•œ 데이터λ₯Ό 'localStorage'에 보관해두고,
    μƒˆ 데이터가 비정상이면 κ·Έ κ°’μœΌλ‘œ 화면을 μ±„μš°λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.
    μ‚¬μš©μž μž…μž₯μ—μ„œλŠ” 쑰금 였래된 예보λ₯Ό 보게 λ˜μ§€λ§Œ, 빈 화면을 λ³΄λŠ” 것보닀 λ‚«λ‹€κ³  νŒλ‹¨ν–ˆμŠ΅λ‹ˆλ‹€.
  • 결과적으둜 API ν˜ΈμΆœμ€ ν•˜λ£¨ 2회둜 μ€„μ—ˆκ³ , 응닡 μ΄μƒμœΌλ‘œ 화면이 λΉ„λŠ” 였λ₯˜λŠ” λ°œμƒν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

πŸ”₯ νŠΈλŸ¬λΈ”μŠˆνŒ…

첫 화면이 λœ¨κΈ°κΉŒμ§€μ˜ μ§€μ—°

  • κΈ°μ‘΄ 흐름은 ν™”λ©΄ μ§„μž… -> API 호좜 -> 미듀웨어가 응닡 μˆ˜μ‹  및 μ •μ œ -> ν”„λ‘ νŠΈ 전달 ->
    ν”„λ‘ νŠΈμ—μ„œ 화면에 맞게 가곡 -> λ Œλ”λ§ μˆœμ„œμ˜€μŠ΅λ‹ˆλ‹€.
    λͺ¨λ“  단계λ₯Ό ν™”λ©΄ μ§„μž… μ‹œμ μ— μ²˜μŒλΆ€ν„° λ‹€μ‹œ κ±°μ³€μŠ΅λ‹ˆλ‹€.
  • 캐싱을 μ μš©ν•˜λ©΄μ„œ κ°€κ³΅κΉŒμ§€ λλ‚œ 데이터λ₯Ό μ €μž₯ν•΄ μž¬μ‚¬μš©ν•˜λ„λ‘ λ°”κΏ”,
    μ§„μž… μ‹œμ μ—λŠ” λ Œλ”λ§λ§Œ ν•˜λ©΄ λ˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.
  • κ°œλ°œμžλ„κ΅¬ λ„€νŠΈμ›Œν¬ νƒ­κ³Ό μ½˜μ†” 타이머, 미듀웨어가 λ Œλ” μ™„λ£Œ μ‹ ν˜Έλ₯Ό λ°›λŠ” μ‹œμ  κ°„κ²©μœΌλ‘œ ν™•μΈν•œ κ²°κ³Ό
    평균 1,600msμ—μ„œ 700ms둜 μ€„μ—ˆμŠ΅λ‹ˆλ‹€.