Design Ad Click Event Aggregation System

์š”๊ตฌ์‚ฌํ•ญ

  • ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋กœ๊ทธ ํŒŒ์ผ์˜ ๋์— ์ถ”๊ฐ€๋˜๋Š” ๋กœ๊ทธ ํŒŒ์ผ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž…๋ ฅ๋จ

  • ์„ธ ๊ฐ€์ง€ ์งˆ์˜ ์ง€์›

    • ํŠน์ • ๊ด‘๊ณ ์— ๋Œ€ํ•œ ์ง€๋‚œ M๋ถ„๊ฐ„์˜ ํด๋ฆญ ์ด๋ฒคํŠธ ์ˆ˜

    • ํŠน์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ฐ€์žฅ ๋งŽ์ด ํด๋ฆญ๋œ ๊ด‘๊ณ  N๊ฐœ

    • ip / user_id / country ๋“ฑ ์†์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ์œ„ 2๊ฐœ์˜ ์งˆ์˜ ๊ฒฐ๊ณผ ํ•„ํ„ฐ๋ง

  • ์—ฃ์ง€ ์ผ€์ด์Šค ์กด์žฌ

    • ๋Šฆ๊ฒŒ ๋„์ฐฉํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ

    • ์ค‘๋ณต๋œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ

    • ์‹œ์Šคํ…œ ์ผ๋ถ€ ๋‹ค์šด ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ

  • ์ง‘๊ณ„ ์ฒ˜๋ฆฌ๋Š” ์ˆ˜ ๋ถ„ ๋‚ด์— ์™„๋ฃŒ ํ•„์š”

๋งค์ผ 10์–ต ๊ฐœ์˜ ๊ด‘๊ณ  ํด๋ฆญ ๋ฐœ์ƒ๊ณผ ๋งค์ผ 200๋งŒ ํšŒ์˜ ๊ด‘๊ณ  ๊ฒŒ์žฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๊ด‘๊ณ  ํด๋ฆญ QPS = 10์–ต / (24 * 3600) = 11574

  • ์ตœ๋Œ€ QPS = 11574 * 5 = 57870

  • ์ผ์ผ ์ €์žฅ์†Œ ์š”๊ตฌ๋Ÿ‰ = 0.1KB * 10์–ต = 100GB(๊ด‘๊ณ  ํด๋ฆญ ์ด๋ฒคํŠธ ํ•˜๋‚˜๋‹น 0.1KB๋ผ๊ณ  ๊ฐ€์ •)

์งˆ์˜ API ์„ค๊ณ„

์œ„์—์„œ ์–ธ๊ธ‰ ๋œ ์„ธ ๊ฐ€์ง€ ์งˆ์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์ผ์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ฐ ad_id๋ฐ ๋ฐœ์ƒํ•œ ํด๋ฆญ ์ˆ˜ ์ง‘๊ณ„

  • ์ผ์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ฐ€์žฅ ๋งŽ์ด ํด๋ฆญ๋œ N๊ฐœ์˜ ad_id ๋ชฉ๋ก ๋ฐ˜ํ™˜

  • ๋‹ค์–‘ํ•œ ์†์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ์ง‘๊ณ„ ๊ฒฐ๊ณผ ํ•„ํ„ฐ๋ง

์œ„ ์„ธ ๊ฐ€์ง€ ์งˆ์˜๋Š” ๋‘ ๊ฐœ์˜ API๋กœ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค.(ํ•„ํ„ฐ๋ง์€ ํ˜ธ์ถœ ์ธ์ž๋ฅผ ํ†ตํ•ด ์ง€์›)

API 1: ํŠน์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ad_id๋ณ„ ํด๋ฆญ ์ˆ˜ ์ง‘๊ณ„

  • endpoint: GET /ads/{:ad_id}/aggregated_count

  • ์ธ์ž

    • from: ์ง‘๊ณ„ ์‹œ์ž‘ ์‹œ๊ฐ„

    • to: ์ง‘๊ณ„ ์ข…๋ฃŒ ์‹œ๊ฐ„

    • filter: ํ•„ํ„ฐ๋ง ์ „๋žต ์‹๋ณ„์ž

  • ๋ฐ˜ํ™˜ ์‘๋‹ต

    • ad_id: ๊ด‘๊ณ  ์‹๋ณ„์ž

    • count: ์ง‘๊ณ„๋œ ํด๋ฆญ ํšŸ์ˆ˜

API 2: ํŠน์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ฐ€์žฅ ๋งŽ์ด ํด๋ฆญ๋œ N๊ฐœ์˜ ad_id ๋ชฉ๋ก ๋ฐ˜ํ™˜

  • endpoint: GET /ads/popular

  • ์ธ์ž

    • count: ์ƒ์œ„ N๊ฐœ ์ˆ˜

    • window: ๋ถ„ ๋‹จ์œ„๋กœ ํ‘œํ˜„๋œ ์ง‘๊ณ„ ์œˆ๋„ ํฌ๊ธฐ

    • filter: ํ•„ํ„ฐ๋ง ์ „๋žต ์‹๋ณ„์ž

  • ๋ฐ˜ํ™˜ ์‘๋‹ต

    • ad_ids: ๊ด‘๊ณ  ์‹๋ณ„์ž ๋ชฉ๋ก

๋ฐ์ดํ„ฐ ๋ชจ๋ธ

๊ด‘๊ณ  ํด๋ฆญ ์ด๋ฒคํŠธ ์ง‘๊ณ„ ์‹œ์Šคํ…œ์ด ๋‹ค๋ฃจ๋Š” ๋ฐ์ดํ„ฐ๋Š” ์›์‹œ ๋ฐ์ดํ„ฐ์™€ ์ง‘๊ณ„ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  • ์›์‹œ ๋ฐ์ดํ„ฐ

    • ad_id / click_timestamp / user_id / ip / country ๋“ฑ ํด๋ฆญ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์†์„ฑ

    • ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋กœ๊ทธ ํŒŒ์ผ์˜ ๋์— ์ถ”๊ฐ€๋˜๋Š” ํ˜•ํƒœ๋กœ ์ž…๋ ฅ๋จ

  • ์ง‘๊ณ„ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ

    • ad_id / click_minute / count / filter_id ๋“ฑ ์ง‘๊ณ„ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์†์„ฑ

    • ์›์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋งค๋ถ„ ์ง‘๊ณ„ํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ €์žฅ๋จ

์›์‹œ ๋ฐ์ดํ„ฐ๋Š” ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ง‰๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์šฉ๋Ÿ‰์„ ์ฐจ์ง€ํ•˜๊ฒŒ ๋˜์–ด ๋น„์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์›์‹œ ๋ฐ์ดํ„ฐ์™€ ์ง‘๊ณ„ ๋ฐ์ดํ„ฐ ๋‘˜ ๋‹ค ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์›์‹œ ๋ฐ์ดํ„ฐ๋กœ ๋””๋ฒ„๊น… ๋ฐ ๋ณต๊ตฌ ๊ฐ€๋Šฅ

  • ์ง‘๊ณ„ ๋ฐ์ดํ„ฐ๋Š” ๋น ๋ฅธ ์งˆ์˜๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ

  • ์˜ค๋ž˜๋œ ์›์‹œ ๋ฐ์ดํ„ฐ๋Š” ๋ƒ‰์ข… ์ €์žฅ์†Œ(cold storage)๋กœ ์˜ฎ๊ฒจ ๋น„์šฉ ์ ˆ๊ฐ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ ํƒ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ ํƒ ์‹œ์—” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜์—ฌ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ(๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ / ๋ฌธ์„œ ๋ฐ์ดํ„ฐ / ์ด์ง„ ๋Œ€ํ˜• ๊ฐ์ฒด(BLOB) ๋“ฑ)

  • ์ฝ๊ธฐ ์ค‘์‹ฌ / ์“ฐ๊ธฐ ์ค‘์‹ฌ / ๋‘˜ ๋‹ค

  • ํŠธ๋žœ์žญ์…˜ ์ง€์› ์œ ๋ฌด

  • ์งˆ์˜ ๊ณผ์ •์—์„œ SUM / COUNT ๊ฐ™์€ ๋ถ„์„ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜์˜ ์žฆ์€ ์‚ฌ์šฉ ์—ฌ๋ถ€

์›์‹œ ๋ฐ์ดํ„ฐ์™€ ์ง‘๊ณ„ ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ์„ ๊ณ ๋ คํ•  ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์›์‹œ ๋ฐ์ดํ„ฐ: ์“ฐ๊ธฐ ๋ฐ ์‹œ๊ฐ„ ๋ฒ”์œ„ ์งˆ์˜์— ์ตœ์ ํ™”๋œ ์‹œ์Šคํ…œ์ธ ์นด์‚ฐ๋“œ๋ผ(Cassandra) ์‚ฌ์šฉ

    • ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์—์„  ์›์‹œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์งˆ์˜๊ฐ€ ํ•„์š” ์—†์œผ๋‚˜, ์‚ฌ์šฉ์ž ๋ถ„์„ ๋“ฑ์„ ์—ฐ๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ

    • ์ตœ๋Œ€ QPS๊ฐ€ 57870์˜ ์“ฐ๊ธฐ ์ค‘์‹ฌ ์‹œ์Šคํ…œ

  • ์ง‘๊ณ„ ๋ฐ์ดํ„ฐ: ์“ฐ๊ธฐ ๋ฐ ์‹œ๊ฐ„ ๋ฒ”์œ„ ์งˆ์˜์— ์ตœ์ ํ™”๋œ ์‹œ์Šคํ…œ์ธ ์นด์‚ฐ๋“œ๋ผ(Cassandra) ์‚ฌ์šฉ

    • ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ

    • ์ฝ๊ธฐ ์—ฐ์‚ฐ / ์“ฐ๊ธฐ ์—ฐ์‚ฐ ๋‘˜ ๋‹ค ๋งŽ์ด ์‚ฌ์šฉ

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์›์‹œ ๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ ์ด์œ ๋กœ ์นด์‚ฐ๋“œ๋ผ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐœ๋žต์  ์„ค๊ณ„

๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜๋Ÿฌ๊ฐ€๊ฒŒ ๋œ๋‹ค.

  1. ์ž…๋ ฅ: ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ์˜ ๋กœ๊ทธ ํŒŒ์ผ๋“ค์ด ์ง‘๊ณ„

  2. ํ”„๋กœ์„ธ์Šค: ์›์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘๊ณ„ํ•˜์—ฌ ์ €์žฅ

  3. ์ €์žฅ: ์ง‘๊ณ„๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ

  4. ์งˆ์˜: API๋ฅผ ํ†ตํ•ด ์งˆ์˜

์œ„ ํ๋ฆ„์„ ๋™๊ธฐ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๊ธ‰์ž‘์Šค๋Ÿฌ์šด ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€์— ๋Œ€์‘ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์‹œ์ง€ ํ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

ad-click-event-aggregation-system

์œ„ ์„ค๊ณ„์•ˆ์„ ๋ณด๋ฉด ๋‘ ๊ฐœ์˜ ๋ฉ”์‹œ์ง€ ํ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ”๋กœ ๊ธฐ๋กํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์ •ํ™•ํ•˜๊ฒŒ ํ•œ ๋ฒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

์ƒ์„ธ ์„ค๊ณ„

์‹œ๊ฐ„

์ง‘๊ณ„๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„  ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํƒ€์ž„์Šคํƒฌํ”„๋Š” ๋‘ ๊ฐ€์ง€ ์œ„์น˜์—์„œ ๋งŒ๋“ค์–ด ์งˆ ์ˆ˜ ์žˆ๋‹ค.

  • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ๊ฐ: ๊ด‘๊ณ  ํด๋ฆญ์ด ๋ฐœ์ƒํ•œ ์‹œ๊ฐ

  • ์ฒ˜๋ฆฌ ์‹œ๊ฐ: ์ง‘๊ณ„ ์„œ๋ฒ„๊ฐ€ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•œ ์‹œ์Šคํ…œ ์‹œ๊ฐ

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

์‹œ๊ฐ
์žฅ์ 
๋‹จ์ 

์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ๊ฐ

๊ด‘๊ณ  ํด๋ฆญ ์‹œ์ ์„ ๋” ์ •ํ™•ํžˆ ํŒŒ์•… ๊ฐ€๋Šฅ

ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑ ํƒ€์ž„์Šคํƒฌํ”„์— ์˜์กดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ ์„ค์ • ์‹œ๊ฐ์ด ์ž˜๋ชป๋˜๊ฑฐ๋‚˜ ์•…์„ฑ ํด๋ผ์ด์–ธํŠธ์— ์˜ํ•ด ์กฐ์ž‘๋  ์ˆ˜ ์žˆ์Œ

์ฒ˜๋ฆฌ ์‹œ๊ฐ

ํด๋ผ์ด์–ธํŠธ ์„ค์ • ์‹œ๊ฐ์— ์˜์กดํ•˜์ง€ ์•Š์Œ

๋„คํŠธ์›Œํฌ ์ง€์—ฐ์ด๋‚˜ ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ ํ™˜๊ฒฝ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ๋‹ฌ๋ผ ์ง‘๊ณ„ ๊ฒฐ๊ณผ๊ฐ€ ๋ถ€์ •ํ™•ํ•ด์ง

์ „๋‹ฌ ๋ณด์žฅ

์ง‘๊ณ„ ๊ฒฐ๊ณผ๋Š” ๊ณผ๊ธˆ ๋“ฑ์— ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์–ด ๋ฐ์ดํ„ฐ ์ •ํ™•์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ์ด ์•„์ฃผ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜ ๋‘ ๊ฐ€์ง€๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.

  • ์ด๋ฒคํŠธ ์ค‘๋ณต ์ฒ˜๋ฆฌ ํšŒํ”ผ ๋ฐฉ๋ฒ•

  • ๋ชจ๋“  ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ณด์žฅ ๋ฐฉ๋ฒ•

์นดํ”„์นด์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€ ํ๋Š” ์ตœ๋Œ€ ํ•œ ๋ฒˆ / ์ตœ์†Œ ํ•œ ๋ฒˆ / ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ์ „๋‹ฌ ๋ฐฉ์‹์„ ์ง€์›ํ•˜๋ฉฐ, ์ด ์ค‘ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ์ „๋‹ฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋ฐ์ดํ„ฐ ์ค‘๋ณต ์ œ๊ฑฐ

๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์Šˆ ๊ฐ€์šด๋ฐ ํ•˜๋‚˜๋Š” ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๋กœ, ์•„๋ž˜ ๋‘ ๊ฐ€์ง€ ์ƒํ™ฉ์—์„œ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์•…์„ฑ ํด๋ผ์ด์–ธํŠธ: ํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ ์•…์˜์ ์ธ ์˜๋„๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์ „์†ก

    • ์ค‘๋ณต ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ด‘๊ณ  ์‚ฌ๊ธฐ / ์œ„ํ—˜ ์ œ์–ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‘์–ด ์ด๋ฅผ ๋ฐฉ์ง€

  • ์„œ๋ฒ„ ์žฅ์• : ์ง‘๊ณ„ ๋„์ค‘ ์ง‘๊ณ„ ์„œ๋น„์Šค ๋…ธ๋“œ์—์„œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•ด ์‘๋‹ต ๋ฐ›์ง€ ๋ชปํ•˜์—ฌ ๋‹ค์‹œ ์ „์†กํ•˜์—ฌ ์žฌ์ฐจ ์ง‘๊ณ„

    • ์˜คํ”„์…‹์„ ์ €์žฅํ•˜์—ฌ ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ์ด๋ฒคํŠธ๋ฅผ ์ถ”์ ํ•˜๊ณ , ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

์ฐธ๊ณ ์ž๋ฃŒ

Last updated

Was this helpful?