top of page

ETL? AWS Glue๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ! (๋‚œ์ด๋„:๋งค์šฐ ์‰ฌ์›€)

ETL? AWS Glue๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ! (๋‚œ์ด๋„: ๋งค์šฐ ์‰ฌ์›€) - AWS Glue Studio ์ฐ๋จนํ•˜๊ธฐ

ETL? AWS Glue๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ! (๋‚œ์ด๋„: ๋งค์šฐ ์‰ฌ์›€) - AWS Glue Studio ์ฐ๋จนํ•˜๊ธฐ


Written by Minhyeok Cha


์ตœ๊ทผ ํŒ€์žฅ๋‹˜๊ป˜์„œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์— ๋Œ€ํ•ด ๋งŽ์€ ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ๊ณ„์‹ ๋ฐ, ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ์ž๋™ํ™”์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•  ๋•Œ๋งˆ๋‹ค ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋Œ์•„๊ฐ€๋Š”์ง€ ์–ด๋ ต๋‹ค๊ณ  ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ณ ๊ฐ์œผ๋กœ๋ถ€ํ„ฐ AWS Glue๋ฅผ ์ถ”์ฒœ๋“œ๋ ค๋„ ์–ด๋ ค์›Œ์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๊บผ๋ ค์ง„๋‹ค๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์€ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์•ผ๊ธฐ๋ฅผ ๋“ฃ๊ณ  AWS๋ฅผ ์ด์šฉํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด Glue์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋ฌด๊ฒ๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๊ณ ์ž ์ด๋ฒˆ ๋ธ”๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


ย 
ย 

AWS Glue

์„œ๋น„์Šค ์†Œ๊ฐœ

AWS Glue๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•ด ETL ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์ด๋ผ๊ณ  ํ•ด์„œ ์ข…์‚ฌ์ž๋ถ„๋“ค์ด ์•„๋‹Œ ๋ถ„๋“ค์€ ๋ฌด์กฐ๊ฑด ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋Š”๋ฐ ๋ฐ˜์€ ๋งž๊ณ  ๋ฐ˜์€ ํ‹€๋ ธ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.


AWS Glue์—์„œ๋Š” Script๋ฅผ Visualizing ํ•˜์—ฌ ์„ค์ •์ด ํŽธํ•˜๊ณ  ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ AWS ์„œ๋น„์Šค์ด๊ธฐ์— ๋‹ค๋ฅธ AWS ์„œ๋น„์Šค์™€์˜ ์—ฐ๋™์„ฑ๋„ ๋›ฐ์–ด๋‚˜๋ฉฐ S3, RDS, DynamoDB ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๋ฐ›์•„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


์™œ AWS Glue๋ฅผ ์„ ํƒํ•˜๋Š”๊ฐ€

ETL์˜ ๊ธฐ๋Šฅ์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ณ ๊ฐ์ด ์žˆ๋Š”๋ฐ ์˜คํ”ˆ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•œ ETL ๊ณผ์ •์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์ฒ˜์Œ๋ถ€ํ„ฐ ์•„ํ‚คํ…์นญ์„ ํ•ด์•ผ ํ•˜๋ฉฐ ๊ทธ ํˆด์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ตํžˆ๊ธฐ๊นŒ์ง€ ๋งŽ์€ ์‹œ๊ฐ„์ด ๋“ญ๋‹ˆ๋‹ค.


์˜ˆ์‹œ๋กœ ElasticStack ์‚ฌ์šฉํ•œ ETL ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

ElasticStack์„ ์‚ฌ์šฉํ•œ ETL ๊ตฌ์กฐ
ElasticStack์„ ์‚ฌ์šฉํ•œ ETL ๊ตฌ์กฐ
๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์€ ์‚ฌ์šฉ์ž์˜ ๋ชฉ์ ์„ฑ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ์‚ฌํ•ญ์€ ์ฐธ๊ณ ์šฉ์œผ๋กœ๋งŒ ๋ด์ฃผ์„ธ์š”.
  1. ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์„ ์œ„ํ•œ API๋‚˜ ํฌ๋กค๋ง ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์„ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘

  2. logstash๋กœ ์ •๊ธฐ์ ์œผ๋กœ ๊ฐ€์ ธ์™€ ํ†ตํ•ฉ์‹œํ‚จ ํ›„ Elasticsearch์— ์ €์žฅ

  3. ์ดํ›„ ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•ด Elasticsearch API๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์ง„ํ–‰ ํ›„ ๋‹ค์‹œ export


ElasticStack flow๋ฅผ ๋ณด๋ฉด ์‚ฌ์‹ค Glue์™€ ๋น„๊ตํ•  ๋งŒํ•œ ์„œ๋น„์Šค๋Š” logstach์ž…๋‹ˆ๋‹ค.

elastic ํ™ˆํŽ˜์ด์ง€์—์„œ ๋ฐœ์ทŒํ•œ Logstach์˜ ETL
elastic ํ™ˆํŽ˜์ด์ง€์—์„œ ๋ฐœ์ทŒํ•œ Logstach์˜ ETL

Logstash๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์„œ๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ์„œ๋ฒ„๋ฅผ ์—ด์–ด ์ดˆ๊ธฐ ์„ธํŒ…์ด ํ•„์š”ํ•˜๋‹ค ๊ฒƒ์ด ๋‹จ์ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ Filter์—์„œ ์ง€์›ํ•˜๋Š” Plugin์ด๋‚˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ๋“ฑ ๋งŽ์€ ๋‚ด์šฉ์„ ๊ณต๋ถ€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์— ์ต์ˆ™์ง€ ์•Š๋‹ค๋ฉด ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๊ทธ๋Ÿฌ๋‚˜ AWS Glue๋Š” ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค๋กœ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„๋‚˜ ์ธํ”„๋ผ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  Filter ๊ณผ์ •์ด ์ •ํ˜•ํ™” ๋˜์–ด์žˆ๋Š” ํŽธ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โ€ป ์œ„์—์„œ ์„œ์ˆ ํ•œ ๋‹จ์ ๋งŒ ์™ธ์— ์—ฌ๋Ÿฌ ์žฅ์ ๋„ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ป๊ฒŒใƒป์–ด๋–ค ๋ชฉ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ์‚ฌ์šฉ๋˜๋Š” ํˆด์„ ๋‹ฌ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



AWS Glue Studio ๋ฐ ์ฐ๋จนํ•ด๋ณด๊ธฐ

AWS Glue๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— ์•ž์„œ Glue Studio๋ผ๋Š” ๋…€์„์„ ์•Œ๊ณ  ๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์•ŒํŒŒ์ด์ž ์˜ค๋ฉ”๊ฐ€์ž…๋‹ˆ๋‹ค.

์™œ๋ƒ๋ฉด ETL์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  Glue๋ฅผ ์“ฐ๋Š”๋ฐ AWS Glue Studio๊ฐ€ ์„ค์น˜ ๋ฐ ์„ธํŒ… ๊ณผ์ •์„ ์ „๋ถ€ ์ •ํ˜•ํ™” ์‹œ์ผœ๋‘์–ด ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉ๋งŒ ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


๊ทธ๋ž˜๋„ ๊ธฐ๋Šฅ์„ ์“ฐ๊ธฐ ์œ„ํ•ด์„  ์•Œ์•„์•ผ ํ•  ๊ฒƒ์ด ์žˆ์œผ๋‹ˆ ์•„์ฃผ ์กฐ๊ธˆ๋งŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


์ฐ๋จนํ•ด๋ณผ ์•„ํ‚คํ…์ฒ˜
์ฐ๋จนํ•ด๋ณผ ์•„ํ‚คํ…์ฒ˜

์‚ฌ์ „ ์ค€๋น„

1. S3์— ๋ฐ์ดํ„ฐ ์…‹ ๋„ฃ๊ธฐ

๋ฐ์ดํ„ฐ ์…‹ S3์— ๋„ฃ๊ธฐ: Raw ๋ฒ„ํ‚ท์— ๋ฐ์ดํ„ฐ ์…‹์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ Data Source์™€ Target Data์— ์†ํ•œ ๋ฒ„ํ‚ท์ž…๋‹ˆ๋‹ค.

Raw ๋ฒ„ํ‚ท์— ๋ฐ์ดํ„ฐ ์…‹์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. (์ด๋•Œ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ‰๊ฐ€ํ•œ ๋น„๋””์˜ค ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค)


2. Data Catalog ๋ฐ Crawlers ์ƒ์„ฑ

Glue Crawler๋Š” ์Šคํ† ๋ฆฌ์ง€๋‚˜ DB๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ์˜ ์Šคํ‚ค๋งˆ๋ฅผ ์ œ์•ˆํ•˜๊ณ , ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์ดํ„ฐ๋กœ ํ•˜์—ฌย Data Catalog์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.


Data Catalog์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ
Data Catalog์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ

๋‹น์žฅ์€ ๊ป๋ฐ๊ธฐ์ธ DB์ž…๋‹ˆ๋‹ค.


Crawlers ์ƒ์„ฑ
Crawlers ์ƒ์„ฑ: S3 ๋ฒ„ํ‚ท ์ง€์ •
Crawlers ์ƒ์„ฑ: Target DB ์ง€์ •

์‚ฌ์ „์— ๋งŒ๋“ค์–ด๋‘” S3 ๋ฒ„ํ‚ท๊ณผ DB๋ฅผ ์ง€์ •ํ•ด ์ค๋‹ˆ๋‹ค.


ํฌ๋กค๋Ÿฌ ์ƒ์„ฑ ํ›„ ์‹คํ–‰ ์‹œ, S3 ๋ฒ„ํ‚ท ์•ˆ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์…‹์„ ํฌ๋กค๋งํ•˜์—ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ DB์— ์ ์žฌํ•ฉ๋‹ˆ๋‹ค.

ํฌ๋กค๋Ÿฌ ์ƒ์„ฑ ํ›„ ์‹คํ–‰์„ ํ•˜๋ฉด, S3 ๋ฒ„ํ‚ท ์•ˆ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์…‹์„ ํฌ๋กค๋งํ•˜์—ฌ ๋ฉ”ํƒ€ํ…Œ์ดํ„ฐ๋ฅผ DB์— ์ ์žฌํ•ฉ๋‹ˆ๋‹ค.


Glue Studio

์‚ฌ์ „ ์ค€๋น„๋Š” ๋๋‚ฌ์œผ๋‹ˆ ์ง„์งœ Glue๋ฅผ ํ™•์ธํ•˜๋Ÿฌ ๊ฐ€๋ด…๋‹ˆ๋‹ค.

AWS Glue Studio
  1. ๊ฐ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ETL์„ ๊ตฌ์ถ•

    1. ๊ฐ ์†Œ์Šค์™€ ํƒ€๊ฒŸ์ด ๋˜๋Š” ์—”๋“œํฌ์ธํŠธ ์ง€์ •

    2. ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋ฐ ETL ์ž‘์—…์„ ์œ„ํ•œ ๋ณต์žกํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ์—†์ด๋„ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•

  2. ์ง€์ •ํ•œ ๋…ธ๋“œ ์ด๋ฆ„, ์—”๋“œํฌ์ธํŠธ ๊ฐ’, ๋ณ€ํ™˜ ์ž‘์—… ๋‚ด์šฉ ๋“ฑ ๊ธฐ์ž…

  3. ETL Workflow ํ™•์ธ ํ›„ ์ €์žฅ - ์‹คํ–‰


 apache spark script

์œ„์—์„œ ์ž‘์—…ํ•œ ๋ชจ๋“  ๊ณผ์ •์€ apache spark scriptํ™” ๋˜์–ด ๊ธฐ๋ก์ด ๋˜๊ณ  ์ถ”๊ฐ€๋กœ visual node์—์„œ ์—†๋Š” ๋ณ€ํ™˜ ๊ธฐ๋Šฅ์„ ์ฝ”๋”ฉ์œผ๋กœ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค



๊ฒฐ๊ณผ

์œ„ ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ์‚ฌ์šฉํ•œ ๋ณ€ํ™˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


DynamicFrame์„ DataFrame์œผ๋กœ ๋ณ€ํ™˜ โ†’ DataFrame์—์„œ ๊ฒฐ์ธก๊ฐ’(null)์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

DynamicFrame์„ DataFrame์œผ๋กœ ๋ณ€ํ™˜ โ†’ DataFrame์—์„œ ๊ฒฐ์ธก๊ฐ’(null)์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. (์ง€์›๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— PySpark ์ฝ”๋“œ๋ฅผ ์ฝ”๋“œ ๋ธ”๋ก์— ์ž‘์„ฑํ•˜์—ฌ ์ง„ํ–‰)


Filter๋ฅผ ํ†ตํ•ด user score ์ ์ˆ˜๊ฐ€ 8์  ์ด์ƒ์ธ ๊ฒŒ์ž„ ๋ชฉ๋ก๋งŒ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Filter๋ฅผ ํ†ตํ•ด user score ์ ์ˆ˜๊ฐ€ 8์  ์ด์ƒ์ธ ๊ฒŒ์ž„ ๋ชฉ๋ก๋งŒ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์— 200๊ฐœ์˜ ๊ฒŒ์ž„ ๋ชฉ๋ก์—์„œ Null ๊ฐ’์„ ์ œ์™ธํ•ด 162๊ฐœ๋กœ ์ค„์ด๊ณ , 8์  ์ด์ƒ์˜ ๊ฒŒ์ž„์„ ์กฐํšŒํ•˜์—ฌ ์ด 30๊ฐœ์˜ ๊ฒŒ์ž„์„ ์ฐพ๋Š” ๋ฐ ์„ฑ๊ณตํ•˜์˜€์Šต๋‹ˆ๋‹ค.



Target ๋ฒ„ํ‚ท์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Target ๋ฒ„ํ‚ท์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.



๋งˆ๋ฌด๋ฆฌ

์œ„์—์„œ๋„ ๋”ฑ ํ•œ ๋ฒˆ ์–ธ๊ธ‰์€ ํ–ˆ์ง€๋งŒ Glue๋Š” Apache Spark ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์–ด ์žˆ์œผ๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.


๋ฐ์ดํ„ฐ์˜ ETL์€ ๋ชฉ์ ์„ฑ์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋กœ ๋ฐ์ดํ„ฐ ์…‹์ด ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ด๋ฅผ ์ปฌ๋Ÿผ๋ผ๋ฆฌ ๋ฌถ์œผ๋ ค๊ณ  ํ•˜๋ฉด ๊ท€์ฐฎ์•„์ง€๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด ๋ถ€๋ถ„๋„ ์ž์„ธํ•˜๊ฒŒ ๋ณด์—ฌ๋“œ๋ฆฌ๊ณ  ์‹ถ์—ˆ์œผ๋‚˜ ์ œ๊ฐ€ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ด ๋‹จ์ผ ๋ฐ์ดํ„ฐ ์…‹์ด๋ผ ์ ‘๋ชฉํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ํž˜๋“ค์–ด ํŒจ์Šคํ–ˆ์Šต๋‹ˆ๋‹ค.


์ด๋ฒˆ ๋ธ”๋กœ๊ทธ์˜ ์ปจ์…‰์€ ์ฐ๋จน์ด๋ผ Glue์˜ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๊ธฐ๋Šฅ๋งŒ ์†Œ๊ฐœํ•˜๋ ค ํ–ˆ์ง€๋งŒ, Apache Spark์— RDD, Dataframe, Data set ์ •๋„๋Š” ์•Œ์•„๋‘๋ฉด ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™์•„ ์ผ๋ถ€ ์ž‘์—…์— ๋„ฃ์–ด ๋ดค์Šต๋‹ˆ๋‹ค.

7 views0 comments
bottom of page