๋ฐ˜์‘ํ˜•

๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„ DAG(Directed Acyclic Graph)

apche spark๋ฅผ ์ ‘ํ•ด๋ดค๋‹ค๋ฉด, DAG๋ผ๋Š” ์šฉ์–ด๊ฐ€ ์ต์ˆ™ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„๋ผ๋Š” ๋ง์ž์ฒด ์ดํ•ดํ•˜๊ธฐ ์ข€ ์–ด๋ ต์ง€๋งŒ ๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์‰ฝ๋‹ค.

Airflow ๐Ÿช

์ตœ๊ทผ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด ์ง๋ฌด ์ฑ„์šฉ๊ณต๊ณ ๋ฅผ ๋ณด๋ฉด Airflow ์‚ฌ์šฉ๊ฒฝํ—˜์„ ์šฐ๋Œ€ํ•ด ์ฃผ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ชจ๋“  ์˜คํ”ˆ์†Œ์Šค๋ฅผ ์ ‘ํ•ด์„œ ๊ณต๋ถ€ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ, ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค์น˜๊นŒ์ง€๋Š” ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊น ใ…œ

๊ทธ๋ฆฌ๊ณ  ์˜คํ”ˆ์†Œ์Šค ํ•œ๋‘๊ฐœ๋งŒ ์ •ํ•ด์„œ ์ œ๋Œ€๋กœ ๊ณต๋ถ€ํ•ด๋„ ๋‹ค๋ฅธ๊ฑธ ์“ธ๋•Œ๋„ ์–ด๋ ต์ง€์•Š๊ฒŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ธˆ๋ฐฉ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
https://airflow.apache.org/docs/apache-airflow/stable/start/local.html

 

Running Airflow locally — Airflow Documentation

airflow.apache.org

 

๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๋ธ”๋ก์„ ๋ฌถ๊ฑฐ๋‚˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•˜๋Š” ํ”Œ๋žซํผ ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ (๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ์Šค์ผ€์ค„๋Ÿฌ ๋А๋‚Œ)

Hadoop์— ์ข…์†๋˜์ง€์•Š์Œ Python์œผ๋กœ ๊ฐœ๋ฐœ๊ฐ€๋Šฅํ•จ

1. ํ™˜๊ฒฝ ์„ธํŒ… (๋ฆฌ๋ˆ…์Šค RedHat)

kerberos openldap๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€๋“ค ์„  ์„ค์น˜ํ•„์š”

  sudo yum install -y \
        freetds \
        freetds-devel \
        krb5-server krb5-libs krb5-auth-dialog \
        openldap openldap-clients openldap-servers \
        libffi \
        cyrus-sasl-plain cyrus-sasl\ (libsasl2  ๋Œ€์‹  )
        openssl-devel \
        redhat-lsb \
        sqlite \
        unixODBC

๊ทผ๋ฐ ๋ณด์•ˆ๊นŒ์ง€ ์„ค์ •ํ•˜๋ฉด์„œ ๊ณต๋ถ€ํ•˜์ง€์•Š์„ ์˜ˆ์ •์ด๋ผ ์œ„๊ณผ์ •์€ ์ƒ๋žต ์ถ”ํ›„๋ฅผ ์œ„ํ•ด (๊ณต์‹์‚ฌ์ดํŠธ์—” ์šฐ๋ถ„ํˆฌ๊ธฐ์ค€ ๋ ˆ๋“œํ–‡๊ณ„์—ด ์ฐพ์•„๋ณด๋˜๊ฐ€ํ•ด์•ผํ•œ๋‹ค)

2. Airflow ๋‹ค์šด๋กœ๋“œ ๋ฐฉ๋ฒ•

  1. Apache Mirror์—์„œ ๋‹ค์šด https://dlcdn.apache.org/airflow/2.2.4/apache-airflow-2.2.4.tar.gz
  2. Github git clone -b v2-2-stable --single-branch https://github.com/apache/airflow.git
  3. ๊ณต์‹์‚ฌ์ดํŠธ https://airflow.apache.org/docs/apache-airflow/stable/installation/installing-from-sources.html

1๋ฒˆ ๋ฐฉ๋ฒ•์œผ๋กœ Airflow ์„ค์น˜

$ sudo wget https://dlcdn.apache.org/airflow/2.2.4/apache-airflow-2.2.4.tar.gz --no-check-certificate

build

python3 -m venv /opt/apache-airflow-2.2.4/
source /opt/apache-airflow-2.2.4/bin/activate

airflow ์‹คํ–‰

./airflow webserver -p 8080
  ____________       _____________
 ____    |__( )_________  __/__  /________      __
____  /| |_  /__  ___/_  /_ __  /_  __ \_ | /| / /
___  ___ |  / _  /   _  __/ _  / / /_/ /_ |/ |/ /
 _/_/  |_/_/  /_/    /_/    /_/  \____/____/|__/

 

728x90
๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

Extract - ์ถ”์ถœ 

Transform - ๋ณ€ํ™˜

Load - ๋กœ๋“œ

 

 

ETL

 

ELT

 

EtLT

 

728x90
๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ - ๋‹ค์–‘ํ•œ ์†Œ์Šค์—์„œ ์ƒˆ๋กœ์šด ๊ฐ€์น˜๋ฅผ ์–ป์„์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๊ณ  ๋ณ€ํ™˜ํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์ด๋‹ค

728x90
๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

01์žฅ: ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ์†Œ๊ฐœ

๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์ด๋ž€?
๋ˆ„๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ• ๊นŒ?
___SQL๊ณผ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์ง• ๊ธฐ์ดˆ
___ํŒŒ์ด์ฌ ๊ทธ๋ฆฌ๊ณ /๋˜๋Š” ์ž๋ฐ”
___๋ถ„์‚ฐ ์ปดํ“จํŒ…
___๊ธฐ๋ณธ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ
___๋ชฉํ‘œ ์ง€ํ–ฅ์  ์‚ฌ๊ณ ๋ฐฉ์‹
์™œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ• ๊นŒ?
์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ• ๊นŒ?

02์žฅ: ์ตœ์‹  ๋ฐ์ดํ„ฐ ์ธํ”„๋ผ

๋ฐ์ดํ„ฐ ์†Œ์Šค์˜ ๋‹ค์–‘์„ฑ
___์†Œ์Šค ์‹œ์Šคํ…œ ์†Œ์œ ๊ถŒ
___์ˆ˜์ง‘ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
___๋ฐ์ดํ„ฐ ์‚ฌ์ด์ฆˆ
___๋ฐ์ดํ„ฐ ํด๋ Œ์ง• ์ž‘์—…๊ณผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
___์†Œ์Šค ์‹œ์Šคํ…œ์˜ ์ง€์—ฐ ์‹œ๊ฐ„ ๋ฐ ๋Œ€์—ญํญ
ํด๋ผ์šฐ๋“œ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค ๋ฐ ๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ
๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋„๊ตฌ
๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋ฐ ๋ชจ๋ธ๋ง ๋„๊ตฌ
์›Œํฌํ”Œ๋กœ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”Œ๋žซํผ
___๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„
๋ฐ์ดํ„ฐ ์ธํ”„๋ผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

03์žฅ: ์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ํŒจํ„ด

ETL๊ณผ ELT
ETL์„ ๋„˜์–ด์„  ELT์˜ ๋“ฑ์žฅ
EtLT ํ•˜์œ„ ํŒจํ„ด
๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•œ ELT
๋ฐ์ดํ„ฐ ๊ณผํ•™์„ ์œ„ํ•œ ELT
๋ฐ์ดํ„ฐ ์ œํ’ˆ ๋ฐ ๋จธ์‹ ๋Ÿฌ๋‹์„ ์œ„ํ•œ ELT
___๋จธ์‹ ๋Ÿฌ๋‹ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋‹จ๊ณ„
___ํŒŒ์ดํ”„๋ผ์ธ์— ํ”ผ๋“œ๋ฐฑ ํ†ตํ•ฉ
___ML ํŒŒ์ดํ”„๋ผ์ธ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ž๋ฃŒ

04์žฅ: ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘: ๋ฐ์ดํ„ฐ ์ถ”์ถœ

ํŒŒ์ด์ฌ ํ™˜๊ฒฝ ์„ค์ •
ํด๋ผ์šฐ๋“œ ํŒŒ์ผ ์Šคํ† ๋ฆฌ์ง€ ์„ค์ •
MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ
___์ „์ฒด ๋˜๋Š” ์ฆ๋ถ„ MySQL ํ…Œ์ด๋ธ” ์ถ”์ถœ
___MySQL ๋ฐ์ดํ„ฐ์˜ ์ด์ง„ ๋กœ๊ทธ ๋ณต์ œ
PostgreSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ
___์ „์ฒด ๋˜๋Š” ์ฆ๋ถ„ Postgres ํ…Œ์ด๋ธ” ์ถ”์ถœ
___Write-Ahead ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ๋ณต์ œ
MongoDB์—์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ
REST API์—์„œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ
์นดํ”„์นด ๋ฐ Debezium์„ ํ†ตํ•œ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

05์žฅ: ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘: ๋ฐ์ดํ„ฐ ๋กœ๋“œ

Amazon Redshift ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ตฌ์„ฑ
Redshift ์›จ์–ดํ•˜์šฐ์Šค์— ๋ฐ์ดํ„ฐ ๋กœ๋“œ
___์ฆ๋ถ„ ๋ฐ ์ „์ฒด ๋กœ๋“œ
___CDC ๋กœ๊ทธ์—์„œ ์ถ”์ถœํ•œ ๋ฐ์ดํ„ฐ ๋กœ๋“œ
Snowflake ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ตฌ์„ฑ3
Snowflake ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์— ๋ฐ์ดํ„ฐ ๋กœ๋“œ
ํŒŒ์ผ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ๋กœ ์‚ฌ์šฉ
์˜คํ”ˆ ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ
์ƒ์—…์  ๋Œ€์•ˆ

06์žฅ: ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ํ•˜๊ธฐ

๋น„๋ฌธ๋งฅ์  ๋ณ€ํ™˜
___ํ…Œ์ด๋ธ”์—์„œ ๋ ˆ์ฝ”๋“œ ์ค‘๋ณต ์ œ๊ฑฐ
___URL ํŒŒ์‹ฑ
์–ธ์ œ ๋ณ€ํ™˜ํ•  ๊ฒƒ์ธ๊ฐ€, ์ˆ˜์ง‘ ์ค‘ ํ˜น์€ ์ˆ˜์ง‘ ํ›„?
๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ๊ธฐ์ดˆ
___์ฃผ์š” ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ์šฉ์–ด
___์™„์ „ํžˆ ์ƒˆ๋กœ ๊ณ ์นจ ๋œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง
___์™„์ „ํžˆ ์ƒˆ๋กœ ๊ณ ์นจ ๋œ ๋ฐ์ดํ„ฐ์˜ ์ฐจ์›์„ ์ฒœ์ฒœํžˆ ๋ณ€๊ฒฝ
___์ฆ๋ถ„ ์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง
___์ถ”๊ฐ€ ์ „์šฉ(Append-only) ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง
___๋ณ€๊ฒฝ ์บก์ฒ˜ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง

07์žฅ: ํŒŒ์ดํ”„๋ผ์ธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜

___๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„
์•„ํŒŒ์น˜ ์—์–ดํ”Œ๋กœ์šฐ ์„ค์ • ๋ฐ ๊ฐœ์š”
___์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ
___์—์–ดํ”Œ๋กœ์šฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
___์›น ์„œ๋ฒ„ ๋ฐ UI
___์Šค์ผ€์ค„๋Ÿฌ
___์‹คํ–‰๊ธฐ(Executors)
___์—ฐ์‚ฐ์ž(Operators)
์—์–ดํ”Œ๋กœ์šฐ DAG ๊ตฌ์ถ•
___๊ฐ„๋‹จํ•œ DAG
___ELT ํŒŒ์ดํ”„๋ผ์ธ DAG
์ถ”๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ ์ž‘์—…
___๊ฒฝ๊ณ  ๋ฐ ์•Œ๋ฆผ
___๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
๊ณ ๊ธ‰ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๊ตฌ์„ฑ
___๊ฒฐํ•ฉ๋œ ํŒŒ์ดํ”„๋ผ์ธ ์ž‘์—… ๋Œ€ ๊ฒฐํ•ฉ๋˜์ง€ ์•Š์€ ํŒŒ์ดํ”„๋ผ์ธ ์ž‘์—…
___DAG๋ฅผ ๋ถ„ํ• ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
___์„ผ์„œ๋กœ ์—ฌ๋Ÿฌ DAG ์กฐ์ •
๊ด€๋ฆฌํ˜• ์—์–ดํ”Œ๋กœ์šฐ ์˜ต์…˜
๊ธฐํƒ€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ
์ผ์ฐ ๊ทธ๋ฆฌ๊ณ  ์ž์ฃผ ๊ฒ€์ฆํ•  ๊ฒƒ

08์žฅ: ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ

___์†Œ์Šค ์‹œ์Šคํ…œ ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ
___๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์œ„ํ—˜
___๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€ ๊ฒ€์ฆ ํ™œ์„ฑํ™”
๊ฐ„๋‹จํ•œ ๊ฒ€์ฆ ํ”„๋ ˆ์ž„์›Œํฌ
___์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ฝ”๋“œ
___๊ฒ€์ฆ ํ…Œ์ŠคํŠธ์˜ ๊ตฌ์กฐ
___๊ฒ€์ฆ ํ…Œ์ŠคํŠธ ์‹คํ–‰
___์—์–ดํ”Œ๋กœ์šฐ DAG์—์„œ์˜ ์‚ฌ์šฉ
___ํŒŒ์ดํ”„๋ผ์ธ์„ ์ค‘๋‹จํ•ด์•ผ ํ•  ๋•Œ์™€ ๊ฒฝ๊ณ ํ•˜๊ณ  ๊ณ„์†ํ•ด์•ผ ํ•  ๋•Œ
___ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ™•์žฅ
๊ฒ€์ฆ ํ…Œ์ŠคํŠธ ์˜ˆ์ œ
___์ˆ˜์ง‘ ํ›„ ์ค‘๋ณต๋œ ๋ ˆ์ฝ”๋“œ
___์ˆ˜์ง‘ ํ›„์˜ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ํ–‰ ๊ฐœ์ˆ˜
___์ง€ํ‘œ ๊ฐ’ ๋ณ€๋™
์ƒ์šฉ ๋ฐ ์˜คํ”ˆ ์†Œ์Šค ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ํ”„๋ ˆ์ž„์›Œํฌ
์†Œ์Šค ์‹œ์Šคํ…œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ฒ˜๋ฆฌ

09์žฅ: ํŒŒ์ดํ”„๋ผ์ธ ์œ ์ง€ ๊ด€๋ฆฌ ๋ชจ๋ฒ” ์‚ฌ๋ก€

___์ถ”์ƒํ™” ๋„์ž…
___๋ฐ์ดํ„ฐ ๊ณ„์•ฝ ์œ ์ง€ ๊ด€๋ฆฌ
___Schema-on-Read์˜ ๊ณ ๋ ค์‚ฌํ•ญ
ํ™•์žฅ ๋ณต์žก์„ฑ
___๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ํ‘œ์ค€ํ™”
___๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ๋กœ์ง์˜ ์žฌ์‚ฌ์šฉ
___์ข…์†์„ฑ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ
์ค‘์š” ํŒŒ์ดํ”„๋ผ์ธ ์ง€ํ‘œ

10์žฅ: ํŒŒ์ดํ”„๋ผ์ธ ์„ฑ๋Šฅ ์ธก์ • ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง

๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค ์ค€๋น„
___๋ฐ์ดํ„ฐ ์ธํ”„๋ผ ์Šคํ‚ค๋งˆ
์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ ๋กœ๊น… ๋ฐ ์ˆ˜์ง‘
___์—์–ดํ”Œ๋กœ์šฐ์—์„œ DAG ์‹คํ–‰ ๊ธฐ๋ก ์ˆ˜์ง‘
___๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ์— ๋กœ๊น… ์ถ”๊ฐ€
์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜
___DAG ์„ฑ๊ณต๋ฅ 
___์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ DAG ๋Ÿฐํƒ€์ž„ ๋ณ€๊ฒฝ
___๊ฒ€์ฆ ํ…Œ์ŠคํŠธ ๋ณผ๋ฅจ ๋ฐ ์„ฑ๊ณต๋ฅ 
์„ฑ๋Šฅ ํŒŒ์ดํ”„๋ผ์ธ ์กฐ์ •
___DAG์˜ ์„ฑ๋Šฅ
์„ฑ๋Šฅ ํˆฌ๋ช…์„ฑ

728x90
๋ฐ˜์‘ํ˜•

+ Recent posts