- ํ๋ก์ ํธ ๊ฐ์
- ์ฃผ์
- ์ฃผ์ ์ ์ ์ด์
- ํ๋ก์ ํธ ์ต์ข ๋ชฉํ
- ํ์ฉ ๊ธฐ์ ๋ฐ ํ๋ ์์ํฌ
- ํ๋ก์ ํธ ๋ด์ฉ
- Infra
- Data Pipeline
- Data
- ERD
- ๋ฐ์ดํฐ ์์ง
- Dashboard
- Cowork Tools
- ํ๋ก์ ํธ ๊ฒฐ๊ณผ
- ์ฃผ์ ์๊ฐํ ๊ฒฐ๊ณผ
- ๊ฒฐ๋ก ๋ฐ ํฅํ ๊ฐ์ ์ฌํญ
- ๊ฒฐ๋ก
- ํฅํ ๊ฐ์ ์ฌํญ
- ํ๋ก์ ํธ ์คํ ๋ฐฉ๋ฒ
์ ์ธ๊ณ ์ค์๊ฐ ๋นํ ๋ชจ๋ํฐ๋ง ๋ฐ ๊ณตํญ ๋ถ์
ํญ๊ณต ์ฐ์ ์ ๊ธ๋ก๋ฒํ๋ ์ธ์์์ ์ค์ํ ์ญํ ์ ๋ด๋นํ๋ฉฐ, ์ ์ธ๊ณ์ ์ผ๋ก ์๋ง์ ๋นํ๊ธฐ๊ฐ ๋์์ ์ดํญ ์ค์ ๋๋ค. ์ด๋ฌํ ํ๊ฒฝ์์ ์ค์๊ฐ ๋นํ ์ถ์ ์ ํญ๊ณต ์์ , ๊ณตํญ ๊ด๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ํญ๊ณต๊ธฐ ๊ฒฝ๋ก ์ต์ ํ๋ฅผ ์ํ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ณธ ํ๋ก์ ํธ๋ OpenSky API๋ฅผ ํ์ฉํ์ฌ ๋นํ๊ธฐ์ ์ค์๊ฐ ์์น ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํจ์ผ๋ก์จ, ํญ๊ณต ์ฐ์ ์ ๋ฐ์ดํฐ ํ์ฉ ๊ฐ๋ฅ์ฑ์ ํ๊ตฌํ๊ณ ๊ณตํญ ์ด์ ๋ฐ ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ ์ ๊ธฐ์ฌํ๊ณ ์ ํฉ๋๋ค.
- ์ค์๊ฐ ๋ฐ์ดํฐ ํ์ฉ ๊ฒฝํ: ์ผ์ ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฅผ ์์ง, ์ฒ๋ฆฌ, ์๊ฐํํ๋ ๊ณผ์ ์ ๊ฒฝํํ๋ฉฐ, ๋ฐ์ดํฐ ์์ง๋์ด๋ง ๋ฐ ๋์๋ณด๋ ์ค๊ณ ์ญ๋์ ๊ฐํํ๊ณ ์ ํฉ๋๋ค.
- ํญ๊ณต ์ฐ์ ์ ์ค์์ฑ: ํญ๊ณต๊ธฐ์ ์์น ์ ๋ณด๋ฅผ ์ถ์ ํ๋ ๊ธฐ์ ์ ํญ๊ณต ์ดํญ์ ์์ ์ฑ๊ณผ ํจ์จ์ฑ์ ๋์ด๋ ๋ฐ ๊ธฐ์ฌํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํญ๊ณต ์ฐ์ ์์ ๋ฐ์ดํฐ ํ์ฉ์ ๊ฐ๋ฅ์ฑ์ ๊ฒํ ํฉ๋๋ค.
- ์ฌ์ฉ์ ์ค์ฌ์ ๋์๋ณด๋ ๊ฐ๋ฐ: ๊ณตํญ ๊ด๋ฆฌ์, ํญ๊ณต ๊ด์ ์ฌ, ์ผ๋ฐ ์ฌ์ฉ์ ๋ฑ ๋ค์ํ ์ดํด๊ด๊ณ์์๊ฒ ํ์ํ ์ง๊ด์ ์ด๊ณ ์ ์ฉํ ๋์๋ณด๋๋ฅผ ์ค๊ณํ์ฌ ๋ฐ์ดํฐ ํ์ฉ์ ์ค์ง์ ์ธ ์ฌ๋ก๋ฅผ ์ ์ํฉ๋๋ค.
-
์ค์๊ฐ ๋นํ ๋ฐ์ดํฐ ์์ง ๋ฐ ์๊ฐํ
OpenSky API๋ฅผ ํ์ฉํ์ฌ ์ ์ธ๊ณ ๋นํ๊ธฐ์ ์ค์๊ฐ ์์น ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์์งํ๊ณ ์ด๋ฅผ ์ง๊ด์ ์ธ ์ง๋ ๊ธฐ๋ฐ ์ธํฐํ์ด์ค๋ก ์๊ฐํํ์ฌ ๋์๋ณด๋์ ๋ํ๋ ๋๋ค.
-
๋ค์ํ ์ฌ์ฉ์ ์๊ตฌ๋ฅผ ๋ฐ์ํ ๋์๋ณด๋ ์ค๊ณ
๊ณตํญ ๊ด๋ฆฌ์, ํญ๊ณต ๊ด์ ์ฌ ๋ฑ ๋ค์ํ ์ดํด๊ด๊ณ์๋ฅผ ๋์์ผ๋ก ์ ์ฉํ ์ ๋ณด์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ ๋์๋ณด๋๋ฅผ ๊ฐ๋ฐํฉ๋๋ค.
-
ํ์ฅ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์นํํ๋ก ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก ์ ์ฅํ๋ ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋์ฉ๋ ๋ฐ์ดํฐ ์ ์ฅ์ ๋ง์ถค์ธ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๊ตฌํํ์ฌ ๋์๋ณด๋์ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
-
ํญ๊ณต ๋ฐ์ดํฐ ํ์ฉ ๊ฐ๋ฅ์ฑ ์ ์
ํ๋ก์ ํธ๋ฅผ ํตํด ํญ๊ณต ๋ฐ์ดํฐ์ ํ์ฉ ๊ฐ๋ฅ์ฑ๊ณผ ์ ์ฌ์ ๊ฐ์น๋ฅผ ์ ์ํ์ฌ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ ๋ฐ ์๋น์ค ๊ฐ์ ์ ๊ธฐ์ฌํฉ๋๋ค.
์นดํ ๊ณ ๋ฆฌ | ๊ธฐ์ /๋๊ตฌ |
---|---|
๊ฐ๋ฐ ์ธ์ด | Python3 |
ํ์ ํด | Slack, Zep |
๋ฐ์ดํฐ ์์ง | Request, RestAPI (OpenSky API) |
๋ฐ์ดํฐ ๋ ์ดํฌ/๋ฐ์ดํฐ์จ์ดํ์ฐ์ค | PostgreSQL, Snowflake |
๋ฐ์ดํฐ ETL | Airflow |
์ธํ๋ผ | AWS (EC2) |
๋์๋ณด๋ | Tableau |
์ ์ฒด์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- OpenSky REST API์์ ์ ์ธ๊ณ ํญ๊ณต ์ ๋ณด ๋ฐ์ดํฐ๋ฅผ ํฌ๋กค๋ง.
- ๋ฐ์ดํฐ๋ฅผ Snowflake๋ก ์ฝ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ชฉ์ ์ ๋ง๋ ํ ์ด๋ธ ์์ฑ ๋ฐ ์ ๋ฐ์ดํธ.
- Airflow๋ฅผ ํ์ฉํด ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ฉฐ, EC2 ์์ Docker๋ฅผ ์์ฑ
- Airflow DAG๋ฅผ 5๋ถ, 1์๊ฐ ๊ฐ๊ฒฉ ๋ฑ์ผ๋ก ์ค์ ํ์ฌ ๋ฐ์ดํฐ ์ ์ฌ
- Snowflake์ Tableau๋ฅผ ์ฐ๋ํ์ฌ ๋์๋ณด๋ ์๊ฐํ ๋ฐ ๋ถ์
- ์์ฝ
Table Type | Table Name | Comment | Source |
---|---|---|---|
FACT | AIRPLANE_LOCATION | ํญ๊ณต๊ธฐ์ ์ค์๊ฐ ์์น ๊ฐ(5๋ถ ๋จ์ ๋์ ์ ์ฌ) | OpenSky REST API |
FACT | AIRPLANE_NOW_LOCATION | ํญ๊ณต๊ธฐ์ ์ค์๊ฐ ์ต์ ์์น ๊ฐ | OpenSky REST API |
FACT | AIRPLANE_DEPARTURE_ARRIVAL | ์กฐํ ์๊ฐ์ ํด๋นํ๋ ํญ๊ณต๊ธฐ์ ์ถ๋์ฐฉ ์ ๋ณด | OpenSky REST API |
DIM | AIRPORT_LOCATION | IATA, ICAO ์ฝ๋์ ์/๊ฒฝ๋ ๊ฐ์ ๋งคํํ๊ธฐ ์ํ ํ ์ด๋ธ | github/ip2location/ip2location-iata-icao |
DIM | AIRPORT_INFO | IATA, ICAO ์ฝ๋์ ํด๋นํ๋ ๊ณตํญ ๋ฉํ ๋ฐ์ดํฐ ํ ์ด๋ธ | ๊ตญํ ๊ตํต๋ถ_์ธ๊ณ๊ณตํญ_์ ๋ณด(๊ณต๊ณต๋ฐ์ดํฐ) https://www.data.go.kr/data/3051587/fileData.do?recommendDataYn=Y |
- (FACT) AIRPLANE_LOCATION, AIRPLANE_NOW_LOCATION
- Airflow Dag (5๋ถ ๊ฐ๊ฒฉ)์ ํตํด ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฌ
- ์ฝ๋
- Dag ๊ตฌ์ฑ
- OpenSkyAPI์
/states/all
์ ์์ฒญ - Snowflake Conn์ ์ด์ฉํด INSERT ๋ฌธ์ ์์ฑ, excutemany๋ก ํ๋ฒ์ ์ ์ฌ
- AIRPLANE_NOW_LOCATION ํ ์ด๋ธ์ TRUNCATE TABLE์ ํตํด ํ ์ด๋ธ์ ๋น์ด ๋ค ํ์ฌ ๋ฐ์ดํฐ๋ง ์ ์ฌ
- OpenSkyAPI์
- (FACT) AIRPLANE_DEPARTURE_ARRIVAL
- Airflow Dag (1์๊ฐ ๊ฐ๊ฒฉ)์ ํตํด (ํ์ฌ๋ก๋ถํฐ 25์๊ฐ ~ 24์๊ฐ ์ ) ๋ฐ์ดํฐ๋ฅผ ์ ์ฌ
- AIRPLANE_DEPARTURE_ARRIVAL ๋ฐ์ดํฐ๋ Opensky์ธก์์ ์ผ ๋ฐฐ์น๋ก ์ ์ฌ๋๊ณ ์์ด, 24์๊ฐ ์ด์ ๋ฐ์ดํฐ๋ ๋ฐํํ์ง ์์.
- ์ฝ๋
- Dag ๊ตฌ์ฑ
- OpenSkyAPI์
/api/flights/all
์ ์์ฒญ - Snowflake Conn์ ์ด์ฉํด INSERT ๋ฌธ์ ์์ฑ, excutemany๋ก ํ๋ฒ์ ์ ์ฌ
- OpenSkyAPI์
- Airflow Dag (1์๊ฐ ๊ฐ๊ฒฉ)์ ํตํด (ํ์ฌ๋ก๋ถํฐ 25์๊ฐ ~ 24์๊ฐ ์ ) ๋ฐ์ดํฐ๋ฅผ ์ ์ฌ
- (DIM) AIRPORT_LOCATION, AIRPORT_INFO
- Snowflake์ CSV๋ฅผ ํตํ 1ํ์ฑ ์ ์ฌ ์ค์
-
์ค์๊ฐ ๋นํ๊ธฐ ์์น ์ ๋ณด Chart
-
ํ ์๊ฐ ๋นํ ์ค์ธ ๋นํ๊ธฐ์ ์์น ์ ๋ณด๋ฅผ ์ง๋์ ํ์
-
SPI๋ฅผ ํ์ฉํด ํน์ ๋ชฉ์ ํญ๊ณต๊ธฐ ์ฌ๋ถ๋ฅผ ์๊น๋ก ๊ตฌ๋ถํด ํ์
- ์ฃผํฉ์ : ํน์ ๋ชฉ์ ํญ๊ณต๊ธฐ
- ํ๋์ : ์ผ๋ฐ ํญ๊ณต๊ธฐ
Dimension ํญ๊ณต๊ธฐ X axis ๊ฒฝ๋ Y axis ์๋ -
์ค์๊ฐ ๋ ธ์ ์ ๋ณด Chart
-
- ์ค์๊ฐ ๋นํ ๊ฒฝ๋ก๋ ๋นํ ์ค์ธ ํญ๊ณต๊ธฐ์ ์ถ๋ฐ-๋์ฐฉ ๊ณตํญ ์/๊ฒฝ๋ ๊ธฐ์ค์ผ๋ก ์์ฑ
- ํ ์๊ฐ ๋นํ ์ค์ธ ๋นํ๊ธฐ์ ํญ๊ณต ๊ฒฝ๋ก๋ฅผ Line Chart๋ก ์๊ฐํ
Line ๋นํ๊ธฐ์ ๊ฒฝ๋ก(์ถ๋ฐ-๋์ฐฉ) X axis ๊ฒฝ๋ Y axis ์๋ -
์ค์๊ฐ ๋นํ ๊ตญ๊ฐ ์์
-
์ค์๊ฐ ์ถ๋์ฐฉ ๊ณตํญ ์์ TOP 20
- ํ ์๊ฐ ๋นํ ์ค์ธ ๋นํ๊ธฐ์ ์ถ๋ฐ/๋์ฐฉ ๊ณตํญ ์์๋ฅผ ๊ตญ๊ฐ ๊ธฐ์ค์ผ๋ก ๋์ด
-
๊ณตํญ ์ถ๋์ฐฉ ์ ๋ณด
-
-
๊ณตํญ ๋ณ/๊ตญ์ ๋ณ ์ถ๋์ฐฉ ๋นํ๊ธฐ ์
- ํด๋น ์๊ฐ๋์ ์ถ๋์ฐฉํ ๋นํ๊ธฐ์ ๊ณตํญ/๊ตญ๊ฐ ํํ
Dimension ๊ณตํญ / ๊ตญ๊ฐ X axis ์๊ฐ(์) Y axis Count -
์ถ๋ฐ/๋์ฐฉ ๊ณตํญ TOP 10
-
์ถ๋ฐ-๋์ฐฉ ๊ณตํญ ๋ณ/๊ตญ๊ฐ ๋ณ ๋ ธ์ ์ ๋ณด
- ๋นํ๊ธฐ๊ฐ ๊ฐ์ฅ ๋ง์ด ๋นํํ ๊ฒฝ๋ก (๊ตญ๊ฐ-๊ตญ๊ฐ / ๊ณตํญ-๊ณตํญ) ์ ๋ณด๋ฅผ ํํ
Dimension ๊ณตํญ / ๊ตญ๊ฐ X axis Count Y axis ์ถ๋ฐ ๊ณตํญ - ๋์ฐฉ ๊ณตํญ
-
-
๊ณตํญ ํฌํ๋
-
์ต๊ทผ 1๊ฐ์ ๊ฐ ๋์ฐฉ ๋นํ๊ธฐ ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ณตํญ ๋ณ ํฌํ๋ ํํ
- ๊ณตํญ ์์น ์ ๋ณด ์ ๊ณต
- ํฌ๊ธฐ์ ๋ฐ๋ผ ํฌํ๋ ์ ๋ ํํ
-
๊ตญ๊ฐ ๋นํ ์ ๋ณด
- ์ค์๊ฐ ๋นํ ๋ฐ์ดํฐ ์์ง ๋ฐ ์๊ฐํ
- OpenSky API๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธ๊ณ ๋นํ๊ธฐ์ ์ค์๊ฐ ์์น ๋ฐ์ดํฐ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์์งํ์์ต๋๋ค.
- ์์ง๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ์ฌ ๋นํ๊ธฐ์ ํ์ฌ ์์น(์๋, ๊ฒฝ๋), ๊ฒฝ๋ก ๋ฑ์ ์ ๋ณด๋ฅผ ์ง๊ด์ ์ผ๋ก ์๊ฐํํ์์ต๋๋ค.
- ํ๋ธ๋ก(Tableau)๋ฅผ ํ์ฉํ ์ง๋ ๊ธฐ๋ฐ ๋์๋ณด๋๋ฅผ ๊ตฌํํ์ฌ ๋นํ ๊ฒฝ๋ก๋ฅผ ์ง๊ด์ ์ผ๋ก ํํํ์์ต๋๋ค.
- ํ์ฅ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
- Apache Airflow๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ ์์ง, ๋ณํ(ETL), ์ ์ฅ ์์ ์ ์๋ํํ๊ณ ๊ด๋ฆฌ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ์ค๊ณํ์์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์น(batch) ์ฒ๋ฆฌ ๋ฐฉ์์ผ๋ก ์ ์ฅํ๊ณ , ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด โSnowflakeโ๋ฅผ ํ์ฉํ์ฌ ์์ ์ ์ธ ํ์ดํ๋ผ์ธ์ ํ๊ฒฝ ๊ตฌ์ถํ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ์ ์ฅ ๊ณผ์ ์์์ ํธ๋์ญ์ ์์ ์ฑ์ ๋ณด์ฅํ์ฌ ์ค์๊ฐ ๋์๋ณด๋์ ์ ๋ขฐ์ฑ์ ํ๋ณดํ์์ต๋๋ค.
- ํญ๊ณต ๋ฐ์ดํฐ ํ์ฉ ๊ฐ๋ฅ์ฑ ๊ฒ์ฆ
- ๋ณธ ํ๋ก์ ํธ๋ ์ค์๊ฐ ํญ๊ณต ๋ฐ์ดํฐ์ ํ์ฉ ๊ฐ๋ฅ์ฑ์ ์ ์ฆํ๋ฉฐ, ๊ณตํญ ์ด์ ์ต์ ํ ๋ฐ ํญ๊ณต ์์ ์ฑ ํฅ์์ ์ํ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ ์ ๊ธฐ์ฌํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ์ ์ํ์์ต๋๋ค.
- ์ค์๊ฐ ๋นํ๊ธฐ ์์น ์ ๋ณด ์๊ฐํ
- ์ ์ธ๊ณ ํญ๊ณต๊ธฐ์ ์ค์๊ฐ ์๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ง๋์ ์๊ฐํํ์ฌ, ํ์ฌ ์ดํญ ์ค์ธ ํญ๊ณต๊ธฐ๋ค์ ์์น๋ฅผ ํ๋์ ํ์ธ ๊ฐ๋ฅ.
- ๋นํ๊ธฐ ํญ๊ณต ๊ฒฝ๋ก ์๊ฐํ
- ํน์ ํญ๊ณตํธ์ ์ถ๋ฐ์ง๋ถํฐ ๋์ฐฉ์ง๊น์ง์ ๊ฒฝ๋ก๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์ํ์ฌ ๊ฒฝ๋ก๋ฅผ ์ถ์ ํ ์ ์๋๋ก ๊ตฌํ.
- ๊ณตํญ ์ถ๋์ฐฉ ๋นํ ์ ๋ณด ์๊ฐํ
- ์ฃผ์ ๊ณตํญ์ ์ถ๋ฐ ๋ฐ ๋์ฐฉ ํญ๊ณตํธ ํํฉ์ ์ ๊ณตํ๋ฉฐ, ๊ณตํญ๋ณ ํผ์ก๋ ๋ฐ ์ด์ ์ํฉ์ ์๊ฐํด๋ณผ ์ ์๋๋ก ์ค๊ณ.
๋ณธ ํ๋ก์ ํธ๋ OpenSky API๋ฅผ ํตํด ์ค์๊ฐ ํญ๊ณต ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ์ด๋ฅผ ๋์๋ณด๋๋ก ์๊ฐํํ์ฌ ์ฌ์ฉ์์ ๊ณตํญ ์ด์์์๊ฒ ์ธ์ฌ์ดํธ๋ฅผ ์ ๊ณตํ๋ ์์คํ ์ ๊ตฌ์ถํ์์ต๋๋ค.
์ค์๊ฐ ๋นํ๊ธฐ ์์น ์ ๋ณด, ํญ๊ณต ๊ฒฝ๋ก, ๊ณตํญ ์ถ๋์ฐฉ ์ ๋ณด ๋ฑ์ ์ง๊ด์ ์ผ๋ก ์ ๊ณตํจ์ผ๋ก์จ ํญ๊ณต ์ฐ์ ์์ ๋ฐ์ดํฐ ํ์ฉ์ ํตํ ์ธ์ฌ์ดํธ๋ฅผ ๋์ถํ์ต๋๋ค.
๋ํ, ๋ณธ ํ๋ก์ ํธ๋ฅผ ํตํด ์ค์๊ฐ ๋ฐ์ดํฐ ์์ง, ์ฒ๋ฆฌ, ์ ์ฅ, ์๊ฐํ ์ ๋ฐ์ ๊ฑธ์น ๊ธฐ์ ์ ํตํฉ์ ์ผ๋ก ํ์ฉํจ์ผ๋ก์จ ๋ฐ์ดํฐ ์์ง๋์ด๋ง์ ์ค๋ฌด์ ์ญ๋์ ๊ฐํํ์์ต๋๋ค.
๊ฐ๋ฐ๋ ๋์๋ณด๋๋ ์ค์๊ฐ ํญ๊ณต ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ ๊ณตํ์ฌ ํญ๊ณต ์ฐ์ ์ ๋ฐ์ดํฐ ํ์ฉ ๊ฐ๋ฅ์ฑ์ ์ ์ํ๋ฉฐ, ๊ณตํญ ์ด์๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์๋ ๊ธฐ๋ฐ์ ๋ง๋ จํ์์ต๋๋ค.
- ํญ๊ณต๊ถ ๋ฐ์ดํฐ ์์ง ์ฝ๋ ๊ณ ๋ํ
- a. ํ์ฌ Github ๋ด GetTicketPriceData.py์, dag_get_airticket_price.py๊ฐ ๊ตฌํ๋์ด ์์
- i. ์ฝ๋ - https://github.com/bibibig-org/airbig/blob/master/dags/GetTicketPriceData.py
- ii. ์ค๋ช : ๋ค์ด๋ฒ ํญ๊ณต๊ถ ๊ฒ์์ POST ์์ฒญ์ ํตํด ๊ตญ๋ด/์ธ์ ํญ๊ณต๊ถ์ ์กฐํํ๋ ์๋น์ค
- b. ํด๋น ์๋น์ค๋ฅผ ํตํด ๊ฐ์ฅ ๋ง์ด ์ด์ฉํ๋ ํญ๊ณต ๋ ธ์ 100๊ฐ์ ํ๊ท ๊ตฌ๋งค ๊ฐ๊ฒฉ์ ๊ตฌํ๊ณ ์ ํ์์ผ๋, ๋ค์ด๋ฒ ํญ๊ณต๊ถ ํฌ๋กค๋ง ์ 150๊ฑด ์ด์์ POST ์์ฒญ์ ๋ณด๋ด๋ฉด ์ฝ 1์๊ฐ์ Time Out์ด ๋ด๋ถ์ ์ผ๋ก ์กด์ฌํ๋ ์ ์ ํ์ธํ์์ (503 ์๋ฌ ๋ฐํ, VPN ๋ฑ์ผ๋ก IP ์ ํ ์ ์ ์ ๊ฐ ๋ฐํ)
- c. ๊ณ ๋ํ ๋จ๊ณ์์ ์ด์ฉ ๊ฐ๋ฅํ IP ๋์ญ๋๋ฅผ ๋ค์ ํ๋ณดํ์ฌ, 503 ์๋ฌ ๋ฐํ์ ์๋ก์ด IP๋ฅผ ํตํด ์์ฒญํ๋ ๋ฐฉ์์ผ๋ก ๋์ ์ฝ๋ ์์ฑ ํ์
- a. ํ์ฌ Github ๋ด GetTicketPriceData.py์, dag_get_airticket_price.py๊ฐ ๊ตฌํ๋์ด ์์
- ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํ Spark ํด๋ฌ์คํฐ ๋์
- ํ์ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐฉ์์ pandas๋ก ์ด๋ฃจ์ด์ก์ผ๋ฉฐ, ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ํ๊ณ๊ฐ ์กด์ฌํ ์ ์์ต๋๋ค.
- Apache Spark ํด๋ฌ์คํฐ๋ฅผ ๋์ ํ์ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ ์ ๋ถ์ฐํ์ฌ ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๊ทน๋ํํ๊ณ , ๋๊ท๋ชจ ๋ฐ์ดํฐ ๋ถ์ ์์ ์ ์ต์ ํํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๋ ์ดํฌ ๋์
์ผ๋ก ๋น์ฉ ํจ์จํ
- Amazon S3๋ฅผ ๋ฐ์ดํฐ ๋ ์ดํฌ๋ก ํ์ฉํ์ฌ ์์ง๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ด๊ณ ๋น์ฉ ํจ๊ณผ์ ์ผ๋ก ์ ์ฅ ๋ฐ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- S3์ ํ์ฅ์ฑ์ ํ์ฉํ๋ฉด ๋ฐ์ดํฐ ์ฆ๊ฐ์ ๋ฐ๋ฅธ ์ ์ฅ์ ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
- SQL ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์กฐํ๋ฅผ ์ํ Athena ํ์ฉ
- S3์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ Amazon Athena๋ฅผ ํตํด SQL ๊ธฐ๋ฐ ์ฟผ๋ฆฌ๋ก ๋ถ์ํ์ฌ ๋ฐ์ดํฐ ์กฐํ ๋ฐ ํ์์ ๊ฐ์ํํ ์ ์์ต๋๋ค.
- ์ด๋ฅผ ํตํด ๊ธฐ์กด ๋์๋ณด๋์ ์ฐ๋ํ๊ฑฐ๋ ๋น ๋ฅธ ๋ฐ์ดํฐ ๋ถ์ ์์ ์ ์ง์ํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ์ต์ ํ ๋ฐฉํฅ
- Spark ํด๋ฌ์คํฐ์ S3 ๋ฐ์ดํฐ ๋ ์ดํฌ๋ฅผ ์ฐ๊ณํ์ฌ ๋ฐ์ดํฐ ์์ง, ์ฒ๋ฆฌ, ์ ์ฅ ๋ฐ ์กฐํ ๊ณผ์ ์ ๋์ฑ ์ต์ ํํ ์ ์์ต๋๋ค.
- Spark์ ๊ณ ๊ธ ์ฐ์ฐ ์ต์ ํ ๋ฐ ๋ฐ์ดํฐ ํํฐ์ ๋ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๋์ด๊ณ , ๋ถ์ ์๊ฐ ๋จ์ถ ๋ฐ ๋ฆฌ์์ค ์ฌ์ฉ์ ์ต์ํํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ ํ๋์ ๋ค์์ฑ ๊ฐ์
- OpenSky API ์ธ์๋ ํญ๊ณต์ฌ API์ ๊ฐ์ ์ธ๋ถ ๋ฐ์ดํฐ ์์ค๋ฅผ ํตํฉํ์ฌ ๋ฐ์ดํฐ ์ ํ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ๊ฐํํฉ๋๋ค.
- ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ ์ ์ ๋ฅผ ํตํด ๋ณด๋ค ๊นจ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ๊ฒฝํ ๋ฐ ๊ธฐ๋ฅ ๊ฐํ
- ๋์๋ณด๋ ์ธํฐํ์ด์ค๋ฅผ ๋์ฑ ์ง๊ด์ ์ด๊ณ ์ฌ์ฉ์ ์นํ์ ์ผ๋ก ๊ฐ์ ํ์ฌ ๋ฐ์ดํฐ ํ์ฉ์ ์ ๊ทผ์ฑ์ ๋์ ๋๋ค.
- ๋ชจ๋ฐ์ผ ๋ฐ ํ๋ธ๋ฆฟ ํ๊ฒฝ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ํ UI๋ฅผ ์ค๊ณํฉ๋๋ค.
- ํญ๊ณต ์ง์ฐ ์์ธก, ํผ์ก ๊ณตํญ ๊ฒฝ๊ณ , ํจ์จ์ ๊ฒฝ๋ก ์ถ์ฒ ๋ฑ์ ๊ณ ๊ธ ๋ถ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ์๋น์ค์ ๊ฐ์น๋ฅผ ํ์ฅํฉ๋๋ค.
OpenSky ์น ์ฌ์ดํธ ํ์ ๊ฐ์ - https://opensky-network.org/
Snowflake ๊ณ์ ์ค๋น
git clone https://github.com/bibibig-org/airbig.git
AIRFLOW_VAR_OPENSKY_ID="YourOpenSkyID"
AIRFLOW_VAR_OPENSKY_PW="YourOpenSkyPW"
AIRFLOW_VAR_SNOWFLAKE_ACCOUNT="YourSnowflakeAccount"
AIRFLOW_VAR_SNOWFLAKE_ID="YourSnowflakeID"
AIRFLOW_VAR_SNOWFLAKE_PW="YourSnowflakePW"
AIRFLOW_VAR_SNOWFLAKE_DATABASE="BIBIBIG"
AIRFLOW_VAR_SNOWFLAKE_SCHEMA="BRONZE_STATE_DATA"
- ์คํ ์์
- INIT_DATABASE_SCHEMA.sql ๊ตฌ๋ฌธ ์คํ
- ๋๋จธ์ง .sql ํ์ผ ์คํ
- AIRPLANE_LOCATION_DATA.csv, AIRPORT_INFO_DATA.csv๋ snowflake์ ๋์ผํ ๋ช ์นญ์ ๊ฐ์ง ํ ์ด๋ธ์ ๋ฐ์ดํฐ ์ ์ฌ
docker compose up
- upload_location_data_sql_insert : ์ค์๊ฐ ํญ๊ณต๊ธฐ ์์น๋ฅผ ์ ๋ก๋ (Snowflake์ ์ง์ Insert)
- upload_location_data : ์ค์๊ฐ ํญ๊ณต๊ธฐ ์์น๋ฅผ ์ ๋ก๋ (csv ์ ๋ก๋)
- opensky_flights_etl_dept_arrival_to_snowflake : ํญ๊ณต๊ธฐ์ ์ต๊ทผ 1์๊ฐ ๋ด ์ถ/๋์ฐฉ ์ ๋ณด ์ ๋ก๋ (Snowflake์ ์ง์ Insert)
- upload_ticket_price_naver : ์ต๋ค ์ด์ฉ ๊ฒฝ๋ก์ ๋ค์ด๋ฒ ํญ๊ณต๊ธฐ ๊ฐ๊ฒฉ ์กฐํ (์๋ ์กฐํ ๊ฐ๋ฅ)