Technical Challenges
1. ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
Event-Driven Streaming Architecture ์ ํ
๋ฌธ์ ์ํฉ
์ด๊ธฐ ์์คํ ์ FastAPI ํฌ๋กค๋ฌ๊ฐ LibreView์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ MySQL์ ์ ์ฅํ๋ฉด, Spring Boot Scheduler๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์กฐํํ๋ ๋จ์ ๋ฐฐ์น ๊ตฌ์กฐ์์ต๋๋ค. ์ด๋ก ์ธํด ๊ธ๊ฒฉํ ํ๋น ๋ณํ๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ฐ์งํ์ง ๋ชปํ๊ณ , ์ฌ์ฉ์๋ ์ง์ฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๊ฒ ๋๋ ํ๊ณ๊ฐ ์์์ต๋๋ค.
๊ธฐ์ ์ ํด๊ฒฐ
์ค์๊ฐ์ฑ ํ๋ณด๋ฅผ ์ํด Event-Driven Streaming Architecture๋ก ์ ํํ์ต๋๋ค.
์ํคํ ์ฒ ๊ตฌ์ฑ
Airflow: ํฌ๋กค๋ง ์ค์ผ์ค ๊ด๋ฆฌ ๋ฐ ETL ์ํฌํ๋ก์ฐ ์กฐ์จ
Kafka: ๋ฐ์ดํฐ ์คํธ๋ฆผ ์ ๋ฌ ๋ฐ ๋ฉ์์ง ์ ์ค ๋ฐฉ์ง
Spring Boot Consumer: Kafka ๋ฉ์์ง ๊ตฌ๋ ํ MySQL ์ ์ฌ
Redis Cache: ์ต์ ๋ฐ์ดํฐ ์บ์ฑ์ผ๋ก ๋น ๋ฅธ ์กฐํ ์ง์
WebSocket (STOMP): ํด๋ผ์ด์ธํธ์ ์ค์๊ฐ ํธ์
Kafka Topic์ผ๋ก ๋ฐํ๋ ๋ฐ์ดํฐ๋ Consumer์์ ์ฒ๋ฆฌ๋๋ ์ฆ์ MySQL์ ์ ์ฅ๋๊ณ , WebSocket์ ํตํด ๋์๋ณด๋์ ์ค์๊ฐ ์ ์ก๋ฉ๋๋ค.
LibreView โ Airflow (ETL) โ Kafka (Producer)
โ
Spring Boot (Consumer)
โโโ MySQL (Storage)
โโโ Redis (Cache)
โโโ WebSocket โ Dashboard๊ฒฐ๊ณผ
๋ฐ์ดํฐ ์์ง ์ฆ์ ํด๋ผ์ด์ธํธ์ ๋ฐ์๋๋ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํ์ฌ ์ค์๊ฐ ํ๋น ๋ณํ ๋ชจ๋ํฐ๋ง์ด ๊ฐ๋ฅํด์ก์ต๋๋ค.
2. ์์ ์ ์ธ ํ์ดํ๋ผ์ธ ์ฌ๊ตฌ์ฑ
Modular DAG ๊ธฐ๋ฐ ์์ ์ฑ ํ๋ณด
๋ฌธ์ ์ํฉ
์ด๊ธฐ ํ์ดํ๋ผ์ธ์ ๋จ์ผ ์ค์ผ์ค๋ฌ๋ก ๊ตฌ์ฑ๋์ด, ์์ ์คํจ ์ ์ ์ฒด ํ๋ก์ธ์ค๊ฐ ์ค๋จ๋๊ณ ์ฌ์คํ์ด ํ์ํ์ต๋๋ค. ๋ํ ์์ฐจ ์ฒ๋ฆฌ๋ก ์ธํ ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ์ต๋๋ค.
๊ธฐ์ ์ ํด๊ฒฐ
Modular DAG ๊ธฐ๋ฐ ํ์ดํ๋ผ์ธ์ Airflow๋ก ์ฌ์ค๊ณํ์ต๋๋ค.
ํต์ฌ ๊ฐ์ ์ฌํญ
Task ๋ ๋ฆฝํ: crawl โ validate โ store โ aggregate๋ก ๋ถ๋ฆฌ
๋ณ๋ ฌ ์ฒ๋ฆฌ: S3 ์ ์ฅ๊ณผ MySQL ์ ์ฌ ๋์ ์ํ
๋ถ๋ถ ์ฌ์คํ: XCom์ ํ์ฉํด ์คํจํ Task๋ง ์ฌ์คํ
๊ฒฐํฉ๋ ์ํ: Kafka๋ก ์์ง(Producer)๊ณผ ์ฒ๋ฆฌ(Consumer) ๋ถ๋ฆฌ
์ค์๊ฐ ์ฒ๋ฆฌ: Spark Streaming์ผ๋ก ๋ฐ์ดํฐ ์คํธ๋ฆผ ์ฒ๋ฆฌ
๋ฐฐ์น ์ง๊ณ: Spark Batch๋ก ์ผ์ผ ํต๊ณ ์๋ ๊ณ์ฐ
๊ฒฐ๊ณผ
๋ณ๋ ฌ ์ฒ๋ฆฌ๋ก ์ ํํ์ฌ ํ์ดํ๋ผ์ธ์ ์์ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์์ผฐ์ต๋๋ค.
3. ๋ฐ์ดํฐ ํ์ง ๊ด๋ฆฌ ์ฒด๊ณ ๊ตฌ์ถ
๋ค์ธต ๊ฒ์ฆ์ ํตํ ์ ๋ขฐ๋ ํ๋ณด
๋ฌธ์ ์ํฉ
์ธ๋ถ ํฌ๋กค๋ง ๋ฐ์ดํฐ์์ ๋๋ฝ, ์ค๋ณต, ๋น์ ์ ๊ฐ์ด ๋ฐ๊ฒฌ๋์ด ํต๊ณ ๋ถ์ ๊ฒฐ๊ณผ์ ์ ๋ขฐ๋๊ฐ ์ ํ๋์์ต๋๋ค.
๊ธฐ์ ์ ํด๊ฒฐ
Airflow์ Data Validation Layer๋ฅผ ์ถ๊ฐํ๊ณ , ๋ค์ธต ๊ฒ์ฆ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํ์ต๋๋ค.
๊ฒ์ฆ ๋ก์ง
๋ฒ์ ๊ฒ์ฆ: ๋น์ ์ ํ๋น๊ฐ(40~400mg/dL ๋ฒ์ ์ธ) ์ ๊ฑฐ
์ค๋ณต ์ ๊ฑฐ: pet_id + timestamp ๊ธฐ์ค deduplication
ํ์์กด ์ ๊ทํ: UTC โ KST ๋ณํ
๋ฉฑ๋ฑ์ฑ ๋ณด์ฅ: Kafka Consumer์ idempotency ๋ก์ง ์ ์ฉ
DB ์ ์ฝ: MySQL UNIQUE INDEX๋ก ์ค๋ณต ์ฐจ๋จ
์๋ ์๋ฆผ: ์ด์์น ๋น์จ ์ด๊ณผ ์ Slack Webhook ๋ฐ์ก
๊ฒฐ๊ณผ
๋ฐ์ดํฐ ์ ํฉ์ฑ์ด ๊ฐํ๋์ด ํต๊ณ ๋ถ์์ ์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์๊ฒ ๋์์ต๋๋ค.
4. ์ฒ๋ฆฌ ๊ณ์ธต ๋ถ๋ฆฌ ์ค๊ณ
Lambda Architecture ๊ธฐ๋ฐ ์ญํ ๋ถ๋ด
๋ฌธ์ ์ํฉ
๋ชจ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ํํ๋ฉด์ ์๋ฒ ๋ถํ๊ฐ ์ฆ๊ฐํ๊ณ , ํต๊ณ ์ง๊ณ ์ฟผ๋ฆฌ ์คํ ์ ์๋ต ์ง์ฐ์ด ๋ฐ์ํ์ต๋๋ค.
๊ธฐ์ ์ ํด๊ฒฐ
Lambda Architecture ํจํด์ผ๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ณ์ธต์ ๋ถ๋ฆฌํ์ต๋๋ค.
๊ณ์ธต๋ณ ์ญํ
Speed Layer (์ค์๊ฐ): Kafka + Spark Streaming โ Redis ์บ์ฑ
Batch Layer (์ ๊ธฐ ์ง๊ณ): Airflow + Spark Batch โ MySQL Summary Table
Serving Layer (์กฐํ): Spring Boot โ MySQL & Redis
Spark Batch๋ ๋งค์ผ ์๋ฒฝ Airflow DAG์ ์ํด ์คํ๋๋ฉฐ, ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ์ฌ ํ๊ท ํ๋น, ์คํ์ดํฌ ํ์ ๋ฑ์ ๊ณ์ฐํฉ๋๋ค.
๊ฒฐ๊ณผ
์ค์๊ฐ์ฑ๊ณผ ์ง๊ณ ํจ์จ์ฑ์ ๋์์ ํ๋ณดํ๊ณ , ์๋ฒ ๋ถํ๋ฅผ ๋ถ์ฐ์ํจ ์์ ์ ์ธ ์ด์ ํ๊ฒฝ์ ๊ตฌ์ถํ์ต๋๋ค.
5. ์ฌ๋ฃ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ถ
ํฌ๋กค๋ง ๊ธฐ๋ฐ ์ ๋ณด ์์ง ๋ฐ ๊ด๋ฆฌ
๋ฌธ์ ์ํฉ
๋ฐ๋ ค๋๋ฌผ ์ฌ๋ฃ์ ๋ํ ์ฒด๊ณ์ ์ธ ์ ๋ณด๊ฐ ๋ถ์กฑํ์ฌ, ์ฌ์ฉ์๊ฐ ์์ ์ฑ๋ถ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฃ๋ฅผ ๋น๊ตํ๊ธฐ ์ด๋ ค์ ์ต๋๋ค.
๊ธฐ์ ์ ํด๊ฒฐ
Selenium์ ํ์ฉํด ์ฌ๋ฃ ์ ๋ณด๋ฅผ ์๋ ์์งํ๊ณ MongoDB์ ์ ์ฅํ์ต๋๋ค.
๊ตฌํ ๋ด์ฉ
๋ค๋์์์ ๊ฐยท๊ณ ์์ด ์ฌ๋ฃ ์ ๋ณด ํฌ๋กค๋ง
์์ ์ฑ๋ถ ๋ฐ์ดํฐ ์ ๊ทํ (๋จ๋ฐฑ์ง, ํ์ํ๋ฌผ, GI ์ง์ ๋ฑ)
MongoDB ์คํค๋ง ์ค๊ณ ๋ฐ ์ธ๋ฑ์ฑ
์นดํ ๊ณ ๋ฆฌ๋ณ ํํฐ๋ง API ๊ตฌํ (์ ํ์ํ๋ฌผ, ์ GI, ๊ณ ๋จ๋ฐฑ ๋ฑ)
๊ฒฐ๊ณผ
์ฌ์ฉ์๊ฐ ์ํ๋ ์์ ๊ธฐ์ค์ ๋ง๋ ์ฌ๋ฃ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ตฌ์ถํ์ต๋๋ค.
ํฅํ ๊ฐ์ ๋ฐฉํฅ ํ์ฌ๋ ์นดํ ๊ณ ๋ฆฌ ๊ธฐ๋ฐ ํํฐ๋ง๋ง ์ ๊ณตํ๋ฉฐ, ํฅํ ํ๋น ๋ฐ์ดํฐ์ ์ฐ๊ณํ์ฌ ๊ฐ์ฒด๋ณ ๋ง์ถคํ ์ฌ๋ฃ ์ถ์ฒ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฐ์ ์ํฌ ์์ ์ ๋๋ค.
6. ๋๋ฉ์ธ ๊ธฐ์ค ์ ๋ฆฝ
์์์ฌ ํ์ ์ ํตํ ์๊ณ๊ฐ ํ์คํ
๋ฌธ์ ์ํฉ
ํ ๋ด๋ถ์ ๋ฐ๋ ค๋๋ฌผ ๊ฑด๊ฐ ๋ฐ์ดํฐ ํด์ ์ ๋ฌธ ์ง์์ด ๋ถ์กฑํด, ํ๋น ์ ์ ๋ฒ์์ ์๋ฆผ ๊ธฐ์ค์ด ๋ช ํํ์ง ์์์ต๋๋ค.
๊ธฐ์ ์ ํด๊ฒฐ
์์์ฌ ๋ฐ ๋ฐ๋ ค๋๋ฌผ ๋ณดํธ์ ์ธํฐ๋ทฐ๋ฅผ ํตํด ๋๋ฉ์ธ ์ง์์ ์์งํ๊ณ , ์์คํ ์ค๊ณ์ ๋ฐ์ํ์ต๋๋ค.
ํ๋ฆฝ๋ ๊ธฐ์ค
์์์ฌ ์๋ฌธ์ผ๋ก ํ๋น ์ ์ ๋ฒ์(80~120mg/dL) ๋ฐ ์คํ์ดํฌ ์ ์(30๋ถ ๋ด 30% ์ด์ ๋ณํ) ํ๋ฆฝ
๋ณดํธ์ ์ธํฐ๋ทฐ๋ก ์๋ฆผ ๋น๋ ๋ฐ ๋ฆฌํฌํธ ์งํ ๊ฒ์ฆ
์๋ฆผ ์ฐ์ ์์(์ ํ๋น > ๊ณ ํ๋น > ์คํ์ดํฌ) ๋ก์ง ๊ตฌํ
๊ฒฐ๊ณผ
๋๋ฉ์ธ ๊ธฐ์ค์ ๋ช ํํ ์ ์ํ์ฌ ๋ฐ์ดํฐ ํด์์ ์ผ๊ด์ฑ๊ณผ ์๋ฆผ ๋ก์ง์ ์ ๋ขฐ๋๋ฅผ ๋์์ต๋๋ค.
Last updated