๐ŸŒค๏ธ ๋””์ง€ํ„ธ ์‚ฌ์ด๋‹ˆ์ง€ ๋‚ ์”จ ์œ„์ ฏ ๊ฐœ๋ฐœ๊ธฐ: ๋ฌด๋ฃŒ API์˜ ํ•จ์ •๋ถ€ํ„ฐ ๊ธฐ์ƒ์ฒญ API ํ—ˆ๋ธŒ ์ •์ฐฉ๊นŒ์ง€

๐ŸŒค๏ธ ๋””์ง€ํ„ธ ์‚ฌ์ด๋‹ˆ์ง€ ๋‚ ์”จ ์œ„์ ฏ ๊ฐœ๋ฐœ๊ธฐ: ๋ฌด๋ฃŒ API์˜ ํ•จ์ •๋ถ€ํ„ฐ ๊ธฐ์ƒ์ฒญ API ํ—ˆ๋ธŒ ์ •์ฐฉ๊นŒ์ง€

๋””์ง€ํ„ธ ์‚ฌ์ด๋‹ˆ์ง€ ์†”๋ฃจ์…˜์˜ ํด๋ผ์ด์–ธํŠธ์™€ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด, ๊ณ ๊ฐ์‚ฌ ํ™”๋ฉด ํ•œ๊ตฌ์„์„ ์ฐจ์ง€ํ•˜๋Š” '๋‚ ์”จ ์œ„์ ฏ'์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์˜จ๋‹ค.

๋‹จ์ˆœํžˆ ๊ธฐ์˜จ๊ณผ ๋ง‘์Œ/ํ๋ฆผ ์•„์ด์ฝ˜๋งŒ ๋„์šฐ๋ฉด ๋˜๋Š” ๊ฐ„๋‹จํ•œ ์ž‘์—…์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ๋ง‰์ƒ ์‹ค๋ฌด์— ์ ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ผ์ด์„ ์Šค, API ํ˜ธ์ถœ ์ œํ•œ, ๋ฐ์ดํ„ฐ ์ •ํ™•๋„ ๋“ฑ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฐ์ด ํ•œ๋‘ ๊ฐœ๊ฐ€ ์•„๋‹ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ํ•ด์™ธ ๋ฌด๋ฃŒ API์—์„œ ์‹œ์ž‘ํ•ด ๊ธฐ์ƒ์ฒญ API ํ—ˆ๋ธŒ์— ์ •์ฐฉํ•˜๊ธฐ๊นŒ์ง€์˜ ์ขŒ์ถฉ์šฐ๋Œ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ณผ์ •๊ณผ ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •๋ฆฌํ•ด ๋ณธ๋‹ค.

1. ์ฒซ ๋ฒˆ์งธ ์‹œ๋„: Open-Meteo์™€ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ ์บ์‹ฑ์˜ ์กฐํ•ฉ

์ดˆ๊ธฐ ํ”„๋กœํ† ํƒ€์ž…์€ Open-Meteo API๋ฅผ ํ™œ์šฉํ•ด ๊ตฌํ˜„ํ–ˆ๋‹ค. ๋ณ„๋„์˜ ํ‚ค ๋ฐœ๊ธ‰ ์—†์ด ์œ„๊ฒฝ๋„๋งŒ ๋˜์ง€๋ฉด ์ฆ‰์‹œ ๋‚ ์”จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ๋Š” ์ด๋งŒํ•œ ๋…€์„์ด ์—†์—ˆ๋‹ค.

์‚ฌ์ด๋‹ˆ์ง€ ํŠน์„ฑ์ƒ ๋””์Šคํ”Œ๋ ˆ์ด๊ฐ€ 24์‹œ๊ฐ„ ์ผœ์ ธ ์žˆ์œผ๋ฏ€๋กœ, API ์ผ์ผ ํ˜ธ์ถœ ์ œํ•œ(Free Tier)์„ ๋ฐฉ์–ดํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด์—ˆ๋‹ค.

  • ํ•ด๊ฒฐ์ฑ…: localStorage๋ฅผ ํ™œ์šฉํ•ด ํ•œ ๋ฒˆ ๋ฐ›์•„์˜จ ๋‚ ์”จ ๋ฐ์ดํ„ฐ๋ฅผ 55๋ถ„๊ฐ„ ์บ์‹ฑํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค. (์ž๋™ ๊ฐฑ์‹  ์ธํ„ฐ๋ฒŒ์€ 60๋ถ„์œผ๋กœ ์„ค์ •ํ•˜์—ฌ, ์บ์‹œ ๋งŒ๋ฃŒ ์งํ›„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํƒ€์ด๋จธ๋ฅผ ๋งž์ท„๋‹ค.)

์„ฑ๋Šฅ๋„ ์‘๋‹ต ์†๋„๋„ ์™„๋ฒฝํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง„์งœ ๋ฌธ์ œ๋Š” ์ฝ”๋“œ ๋ฐ–, **'๋ผ์ด์„ ์Šค'**์— ์žˆ์—ˆ๋‹ค.

2. ์ƒ์—…์  ์ด์šฉ์˜ ๋ฒฝ: ๋ฌด๋ฃŒ API๋Š” ์ง„์งœ ๋ฌด๋ฃŒ๊ฐ€ ์•„๋‹ˆ๋‹ค

ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋‚ฉํ’ˆํ•˜๋Š” ์ƒ์—…์šฉ(B2B) ์„œ๋น„์Šค์— Open-Meteo์˜ ๋ฌด๋ฃŒ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ์“ฐ๋Š” ๊ฒƒ์ด ๋ฒ•์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ๊ฒ€ํ† ํ•ด ๋ณด์•˜๋‹ค. ๊ฒฐ๋ก ์€ **'์ ˆ๋Œ€ ๋ถˆ๊ฐ€'**์˜€๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ํ•ด์™ธ ๋ฌด๋ฃŒ ๋‚ ์”จ API๋Š” ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋‚˜ ๋น„์ƒ์—…์  ์šฉ๋„์— ํ•œํ•ด์„œ๋งŒ ๋ฌด๋ฃŒ ํŠธ๋ž˜ํ”ฝ์„ ์—ด์–ด๋‘”๋‹ค. ์ถœ์ฒ˜(CC BY 4.0)๋ฅผ ํ™”๋ฉด์— ๋ช…์‹œํ•˜๋”๋ผ๋„, ์ƒ์—…์šฉ ์„œ๋น„์Šค์—์„œ ๋ฌด๋ฃŒ ์„œ๋ฒ„๋กœ ๊ณ„์† ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์•ฝ๊ด€ ์œ„๋ฐ˜์œผ๋กœ ์–ด๋А ๋‚  ๊ฐ‘์ž๊ธฐ IP๊ฐ€ ์˜๊ตฌ ์ฐจ๋‹จ๋  ๋ฆฌ์Šคํฌ๊ฐ€ ์ปธ๋‹ค. ๊ฒฐ๊ตญ ๋ผ์ด์„ ์Šค ์ด์Šˆ์—์„œ 100% ์ž์œ ๋กญ๊ณ  ์ƒ์—…์  ์ด์šฉ์ด ํ—ˆ์šฉ๋˜๋Š” ๊ธฐ์ƒ์ฒญ ๊ณต๊ณต๋ฐ์ดํ„ฐ๋กœ ๋ฐฉํ–ฅ์„ ํ‹€์–ด์•ผ ํ–ˆ๋‹ค.

3. ๊ธฐ์ƒ์ฒญ API ๋„์ž…๊ธฐ: "returnReasonCode: 12"์˜ ๋Šช

์•ˆ์ „ํ•œ ๋Œ€ํ•œ๋ฏผ๊ตญ ๊ธฐ์ƒ์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ธฐ๋กœ ํ•˜๊ณ  API ์—ฐ๋™์„ ์‹œ๋„ํ–ˆ๋‹ค. ์œ„๊ฒฝ๋„๋ฅผ ๊ธฐ์ƒ์ฒญ ์ „์šฉ '๊ฒฉ์ž ์ขŒํ‘œ(nx, ny)'๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณต์‹๊นŒ์ง€ ์ ์šฉํ•˜์—ฌ ์™„๋ฒฝํ•˜๊ฒŒ ์ค€๋น„ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ๋Œ์•„์˜จ ๊ฒƒ์€ ์ฐจ๊ฐ€์šด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์˜€๋‹ค.

returnReasonCode: "12" (ํ•ด๋‹น ์˜คํ”ˆAPI ์„œ๋น„์Šค๊ฐ€ ์—†๊ฑฐ๋‚˜ ํ๊ธฐ๋จ)

์›์ธ์„ ๋ถ„์„ํ•˜๋Š” ๊ณผ์ •์—์„œ **๊ณต๊ณต๋ฐ์ดํ„ฐํฌํ„ธ(data.go.kr)**๊ณผ **๊ธฐ์ƒ์ฒญ API ํ—ˆ๋ธŒ(apihub.kma.go.kr)**๋ฅผ ํ˜ผ๋™ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ๊ธฐ์ƒ์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ์ ์€ ๊ฐ™์ง€๋งŒ, ๋‘ ๊ณณ์€ ๋ฐœ๊ธ‰ํ•˜๋Š” ํ‚ค์˜ ์ข…๋ฅ˜(serviceKey vs authKey)์™€ ์—”๋“œํฌ์ธํŠธ ์ฃผ์†Œ๊ฐ€ ์™„์ „ํžˆ ๋‹ฌ๋ž๋˜ ๊ฒƒ์ด๋‹ค.

4. ์น˜๋ช…์ ์ธ ๋ฐœ๊ฒฌ: '์‹คํ™ฉ' ๋ฐ์ดํ„ฐ์—๋Š” ํ•˜๋Š˜์ด ์—†๋‹ค?

๋ฌธ์„œ๋ฅผ ํŒŒ๊ณ ๋“ค๋ฉฐ ๊ฐ€์žฅ ํฌ๊ฒŒ ๊นจ๋‹ฌ์€ ์•„ํ‚คํ…์ฒ˜์  ์ด์Šˆ๊ฐ€ ํ•˜๋‚˜ ๋” ์žˆ์—ˆ๋‹ค. ์ฒ˜์Œ์— ๊ตฌํ˜„ํ•˜๋ ค ํ–ˆ๋˜ ๊ธฐ์ƒ์ฒญ์˜ '์ดˆ๋‹จ๊ธฐ์‹คํ™ฉ(getUltraSrtNcst)' API์—๋Š” ์•„์ฃผ ์น˜๋ช…์ ์ธ ๋‹จ์ ์ด ์กด์žฌํ–ˆ๋‹ค.

  • ์‹คํ™ฉ ๋ฐ์ดํ„ฐ์—๋Š” ๊ธฐ์˜จ, ์Šต๋„, ํ’์†, ๊ฐ•์ˆ˜ ํ˜•ํƒœ(๋น„/๋ˆˆ)๋Š” ์žˆ์ง€๋งŒ, ๊ฐ€์žฅ ์ค‘์š”ํ•œ 'ํ•˜๋Š˜ ์ƒํƒœ(SKY - ๋ง‘์Œ/๊ตฌ๋ฆ„๋งŽ์Œ/ํ๋ฆผ)' ๋ฐ์ดํ„ฐ๊ฐ€ ์•„์˜ˆ ์กด์žฌํ•˜์ง€ ์•Š์•˜๋‹ค.

๋น„๊ฐ€ ์˜ค์ง€ ์•Š์„ ๋•Œ ์‚ฌ์ด๋‹ˆ์ง€ ํ™”๋ฉด์— ํ•ด(โ˜€๏ธ)๋ฅผ ๋„์›Œ์•ผ ํ• ์ง€, ๊ตฌ๋ฆ„(โ˜๏ธ)์„ ๋„์›Œ์•ผ ํ• ์ง€ ์•Œ ๊ธธ์ด ์—†๋Š” ๊ฒƒ์ด๋‹ค. AWS(์ž๋™๊ธฐ์ƒ๊ด€์ธก์žฅ๋น„)๋Š” ๊ธฐ๊ณ„์ ์œผ๋กœ ์ˆ˜์น˜๋งŒ ์žด ๋ฟ, ํ•˜๋Š˜์— ๊ตฌ๋ฆ„์ด ์–ผ๋งˆ๋‚˜ ๊ผˆ๋Š”์ง€ ๊ด€์ธกํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

5. ์ตœ์ข… ํ•ด๊ฒฐ์ฑ…: '์ดˆ๋‹จ๊ธฐ์˜ˆ๋ณด'๋กœ์˜ ์„ ํšŒ์™€ API ํ—ˆ๋ธŒ ์ •์ฐฉ

๊ฒฐ๊ตญ ํ•˜๋Š˜ ์ƒํƒœ(SKY)์™€ ๊ฐ•์ˆ˜ ํ˜•ํƒœ(PTY)๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๋‚ ์”จ ์•„์ด์ฝ˜์„ ์ •ํ™•ํ•˜๊ฒŒ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด, ์‹คํ™ฉ์ด ์•„๋‹Œ '์ดˆ๋‹จ๊ธฐ์˜ˆ๋ณด(getUltraSrtFcst)' API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ ๊ตฌ์ถ•ํ•œ ํŒŒ์ดํ”„๋ผ์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํ”Œ๋žซํผ: ๊ณต์‹ ๋ฌธ์„œ๊ฐ€ ์ž˜ ๊ฐ–์ถฐ์ง„ **๊ธฐ์ƒ์ฒญ API ํ—ˆ๋ธŒ(apihub.kma.go.kr)**์˜ ๋‹จ๊ธฐ์˜ˆ๋ณด ์กฐํšŒ์„œ๋น„์Šค(2.0)๋ฅผ ์‚ฌ์šฉ.
  2. ๋ฐ์ดํ„ฐ: ์ดˆ๋‹จ๊ธฐ์˜ˆ๋ณด์กฐํšŒ(getUltraSrtFcst)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ง‘์Œ/ํ๋ฆผ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•๋ณด.
  3. ํ˜ธ์ถœ ์ตœ์ ํ™”: ์ดˆ๋‹จ๊ธฐ์˜ˆ๋ณด๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š” '๋งค์‹œ 45๋ถ„' ๊ทœ์น™์— ๋งž์ถฐ ์‹œ์Šคํ…œ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜์—ฌ ์š”์ฒญ.
  4. ์•„์ด์ฝ˜ ๋ Œ๋”๋ง ๋กœ์ง: ๊ฐ•์ˆ˜๊ฐ€ ์žˆ์„ ๋•Œ๋Š” ๋น„/๋ˆˆ ์•„์ด์ฝ˜์„ ์šฐ์„ ํ•˜๊ณ , ๊ฐ•์ˆ˜๊ฐ€ ์—†์„ ๋•Œ๋งŒ ํ•˜๋Š˜ ์ƒํƒœ(SKY) ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ํ•ด๋‚˜ ๊ตฌ๋ฆ„์„ ๋„์šฐ๋Š” ๋ถ„๊ธฐ ๋กœ์ง ์ ์šฉ.

6. ๋‚ ์”จ ์œ„์ ฏ ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Pseudo-code)

๊ตฌ์ฒด์ ์ธ ์–ธ์–ด์— ์ข…์†๋˜์ง€ ์•Š๋„๋ก, ์ „์ฒด์ ์ธ ๋…ผ๋ฆฌ ํ๋ฆ„๊ณผ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ˆ˜๋„ ์ฝ”๋“œ(Pseudo-code)๋กœ ์ •๋ฆฌํ•ด ๋‘์—ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐฑ์—”๋“œ๋กœ ๋กœ์ง์„ ์ด๊ด€ํ•  ๋•Œ๋„ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค.

6.1. ๋ฉ”์ธ ๋ผ์ดํ”„์‚ฌ์ดํด (Main Lifecycle)

ALGORITHM WeatherPlayer_Run:
  // 1. UI ๋ Œ๋”๋ง ์ค€๋น„
  IF Target_DOM is NOT found:
    PRINT "DOM ์˜ค๋ฅ˜: ๋ Œ๋”๋ง ์ค‘๋‹จ"
    EXIT

  // 2. ์ดˆ๊ธฐ 1ํšŒ ์ฆ‰์‹œ ์‹คํ–‰
  CALL Update_Weather_Flow()

  // 3. ์ฃผ๊ธฐ์  ์‹คํ–‰ (ํƒ€์ด๋จธ)
  START Timer(Interval: 60 minutes) DO:
    CALL Update_Weather_Flow()

6.2. ๋‚ ์”จ ์—…๋ฐ์ดํŠธ ํ๋ฆ„ (Update Flow)

ALGORITHM Update_Weather_Flow:
  // 1. ์ขŒํ‘œ ๋ณ€ํ™˜ (WGS84 -> ๊ธฐ์ƒ์ฒญ ๊ฒฉ์ž)
  (nx, ny) = CALL Convert_LatLon_To_Grid(User_Lat, User_Lon)

  // 2. ๋ฐ์ดํ„ฐ ์ทจ๋“ (์บ์‹œ OR API)
  WeatherData = CALL Fetch_Weather_Data(nx, ny)

  // 3. ํ™”๋ฉด ๋ Œ๋”๋ง
  IF WeatherData is valid:
    CALL Render_Weather_UI(WeatherData)

6.3. ๋ฐ์ดํ„ฐ ์ทจ๋“ ๋ฐ ์บ์‹ฑ (Fetch & Cache)

ALGORITHM Fetch_Weather_Data(nx, ny):
  CacheKey = "KMA_API_" + nx + "_" + ny
  CurrentTime = Get_Current_Time()
  CacheTTL = 55 minutes

  // 1. ๋กœ์ปฌ ์บ์‹œ ํ™•์ธ
  IF Cache_Exists(CacheKey):
    CacheData = Load_Cache(CacheKey)
    IF (CurrentTime - CacheData.SavedTime) < CacheTTL:
      RETURN CacheData.Data  // API ํ˜ธ์ถœ ์—†์ด ์บ์‹œ ๋ฐ˜ํ™˜

  // 2. ์บ์‹œ๊ฐ€ ์—†๊ฑฐ๋‚˜ ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด API ํ˜ธ์ถœ ์ค€๋น„
  (BaseDate, BaseTime) = CALL Calculate_KMA_Time(CurrentTime)

  // 3. ๊ธฐ์ƒ์ฒญ API ํ—ˆ๋ธŒ ํ˜ธ์ถœ
  Response = HTTP_GET(
    URL: "[https://apihub.kma.go.kr/.../getUltraSrtFcst](https://apihub.kma.go.kr/.../getUltraSrtFcst)",
    Params: AuthKey, BaseDate, BaseTime, nx, ny, dataType="JSON"
  )

  // 4. ์‘๋‹ต ํŒŒ์‹ฑ ๋ฐ ์ถ”์ถœ (๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์‹œ๊ฐ„๋Œ€์˜ ์˜ˆ๋ณด๋งŒ ํ”ฝ์—…)
  ParsedResult = {}
  FOR EACH item IN Response.Items:
    // T1H, SKY, PTY ๋“ฑ ๋™์ผํ•œ ์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ ์•„์ง ์—†์œผ๋ฉด ์ฒซ ๋ฒˆ์งธ ๊ฐ’(์ตœ์‹ ) ์ €์žฅ
    IF item.category IS NOT IN ParsedResult:
      ParsedResult[item.category] = item.fcstValue

  // 5. ์ƒˆ ๋ฐ์ดํ„ฐ ์บ์‹ฑ
  SAVE_CACHE(CacheKey, Data: ParsedResult, SavedTime: CurrentTime)

  RETURN ParsedResult

6.4. ๋ฐœํ‘œ ์‹œ๊ฐ ์‚ฐ์ถœ (Time Calculation)

ALGORITHM Calculate_KMA_Time(CurrentTime):
  TargetTime = CurrentTime

  // ํ˜„์žฌ ์‹œ๊ฐ์ด ๋งค์‹œ 45๋ถ„ ์ด์ „์ด๋ผ๋ฉด, ์•„์ง ์ตœ์‹  ์˜ˆ๋ณด๊ฐ€ ์„œ๋ฒ„์— ์—†์Œ
  IF TargetTime.Minute < 45:
    TargetTime = TargetTime - 1 hour  // ์ด์ „ ์‹œ๊ฐ„๋Œ€๋กœ ๋กค๋ฐฑ

  BaseDate = FORMAT(TargetTime, "YYYYMMDD")
  BaseTime = FORMAT(TargetTime, "HH") + "30" // ์ดˆ๋‹จ๊ธฐ์˜ˆ๋ณด๋Š” ๋ฌด์กฐ๊ฑด ๋ถ„(minute)์ด 30๋ถ„

  RETURN (BaseDate, BaseTime)

6.5. ํ™”๋ฉด ๋ Œ๋”๋ง ๋ฐ ์•„์ด์ฝ˜ ํŒ๋ณ„ (UI Rendering)

ALGORITHM Render_Weather_UI(Data):
  PTY = Data.PTY (๊ฐ•์ˆ˜ํ˜•ํƒœ)
  SKY = Data.SKY (ํ•˜๋Š˜์ƒํƒœ)
  Temp = Data.T1H (๊ธฐ์˜จ)

  // 1. ๋‚ ์”จ ์•„์ด์ฝ˜ ํŒ๋ณ„
  SkyIcon = ""
  RainIcon = ""

  IF PTY > 0: // ๋น„๋‚˜ ๋ˆˆ์ด ์˜ฌ ๋•Œ
    SkyIcon = "โ˜๏ธ" // ๋น„๊ฐ€ ์˜ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋Š˜์€ ํ๋ฆผ
    IF PTY == 1 OR 4 OR 5: RainIcon = "โ˜”" (๋น„)
    IF PTY == 2 OR 6:      RainIcon = "๐ŸŒง๏ธโ„๏ธ" (๋น„/๋ˆˆ)
    IF PTY == 3 OR 7:      RainIcon = "โ„๏ธ" (๋ˆˆ)
  ELSE: // ๋น„๊ฐ€ ์•ˆ ์˜ฌ ๋•Œ
    IF SKY == 1: SkyIcon = "โ˜€๏ธ" (๋ง‘์Œ)
    IF SKY == 3: SkyIcon = "๐ŸŒค๏ธ" (๊ตฌ๋ฆ„๋งŽ์Œ)
    IF SKY == 4: SkyIcon = "โ˜๏ธ" (ํ๋ฆผ)

  // 2. DOM ์—…๋ฐ์ดํŠธ
  UPDATE_DOM(Element: SkyContainer, Value: SkyIcon)
  UPDATE_DOM(Element: RainContainer, Value: RainIcon)
  UPDATE_DOM(Element: TempContainer, Value: Temp + "ยฐC")

๐Ÿ’ก ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

๋‚ ์”จ ์œ„์ ฏ ๊ฐœ๋ฐœ์€ ๊ฒ‰๋ณด๊ธฐ์—” ๊ฐ„๋‹จํ•˜์ง€๋งŒ, ์ƒ์—…์  ๋ผ์ด์„ ์Šค ๊ฒ€ํ† , ์œ„๊ฒฝ๋„ ์ขŒํ‘œ ๋ณ€ํ™˜, ๊ธฐ์ƒ ๊ด€์ธก ์‹œ์Šคํ…œ์˜ ํŠน์„ฑ(์‹คํ™ฉ vs ์˜ˆ๋ณด)์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•œ ๊ฒฝํ—˜์ด์˜€๋‹ค.