Multi-source API Normalization ๊ธฐ๋ฐ ์ค์๊ฐ AQI ๋ชจ๋ํฐ๋ง ์์คํ ๊ตฌ์ถ
I built a real-time Air Quality Index monitor from scratch โ AtmoPulse ๐
AI ์์ฝ
Context
WAQI์ OpenAQ๋ผ๋ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ํฌ๋งท์ ๊ฐ์ง ์ธ๋ถ API๋ฅผ ํตํฉํ์ฌ ์ ์ธ๊ณ ๊ณต๊ธฐ์ง ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ๊ณตํด์ผ ํ๋ ์ํฉ. ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ์ธํด ์ผ๊ด๋ UI ๋ ๋๋ง๊ณผ ๋งต ๋ง์ปค ํ์ ์ ๋ฐ์ดํฐ ์ ํฉ์ฑ ํ๋ณด๊ฐ ํต์ฌ ๊ณผ์ ๋ก ์์ฉ.
Technical Solution
- ์๋ก ๋ค๋ฅธ API ์๋ต ๊ท๊ฒฉ์ ๋จ์ผ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๋ณํํ๋ Normalization Layer ์ค๊ณ๋ฅผ ํตํ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ํ๋ณด
- React์ Component Lifecycle๊ณผ Leaflet.js์ DOM ์กฐ์ ์ถฉ๋ ๋ฐฉ์ง๋ฅผ ์ํด useRef ๊ธฐ๋ฐ์ Map Instance ๊ด๋ฆฌ ์ ๋ต ์ฑํ
- Firebase Authentication์ onAuthStateChanged๋ฅผ ํ์ฉํ ์ํ ์ ์ง ๋ฐ ๊ถํ๋ณ ๊ธฐ๋ฅ ์ ๊ทผ ์ ์ด ๋ก์ง ๊ตฌํ
- TypeScript์ ์๊ฒฉํ Typing์ ํตํ API Response ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ์๋ก ๋ฐํ์ ํ์ ์๋ฌ ๋ฐฉ์ง ๋ฐ ๊ฐ๋ฐ ์์ฐ์ฑ ํฅ์
- API ๊ณผ๋ํ ํธ์ถ ๋ฐฉ์ง๋ฅผ ์ํ Cooldown Timer ๋์ ์ผ๋ก Rate Limit ์ ์ด ๋ฐ ๋ฆฌ์์ค ์ต์ ํ ๊ตฌํ
์ค์ฒ ํฌ์ธํธ
1. ๋ค์ ์ธ๋ถ API ํตํฉ ์ ๊ฐ๋ณ API ์์กด์ฑ์ ๋ถ๋ฆฌํ๋ ์ถ์ํ ๊ณ์ธต(Normalization Layer)์ ๊ตฌ์ถํ๋๊ฐ
2. ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Vanilla JS)์ ์ํ๋ฅผ React Lifecycle ๋ด์์ ์์ ์ ์ผ๋ก ์ ์ดํ๊ธฐ ์ํด useRef๋ฅผ ์ ์ ํ ํ์ฉํ๋๊ฐ
3. API ์๋ต ๋ฐ์ดํฐ์ ๋ถํ์ค์ฑ์ ์ ๊ฑฐํ๊ธฐ ์ํด TypeScript Interface๋ฅผ ํตํด ์คํค๋ง๋ฅผ ๋ช ํํ ์ ์ํ๋๊ฐ
4. ์ธ์ฆ ์ํ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ UI ์ ๋ฐ์ดํธ ์ ๋น๋๊ธฐ ์ํ ๋๊ธฐํ ์ ๋ต์ด ์๋ฆฝ๋์๋๊ฐ