Common/์„ธ๋ฏธ๋‚˜

๋ฐ•์ •๊ตญ CTO๊ฐ€ ์•Œ๋ ค์ฃผ๋Š” ‘์„œ๋ฒ„ ์„ฑ๋Šฅ ์ธก์ • ๋ฐฉ๋ฒ•’ (ํฌ๋ธŒ์Šค ์„ ์ •, ์‹ ์ž… ๊ฐœ๋ฐœ์ž, API, ๋ฐฑ์—”๋“œ)

Seyun(Marco) 2024. 5. 6. 18:39
728x90

๐Ÿ’ก ์˜์ƒ

https://www.youtube.com/watch?v=HSNyJnobBws

์„ธ๋ฏธ๋‚˜ ๋‚ด์šฉ

  • ์ด๋ฒˆ์— API ์„œ๋ฒ„๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, “์„ฑ๋Šฅ์ด ์•„์ฃผ ๋นจ๋ผ / ์•ˆ์ •์ ์ด์•ผ / ์ข‹์•„ / ๋†’์•„” ๋ผ๋Š” ๋ง์„ ๋งŽ์ด ํ•œ๋‹ค. ๊ทธ๋Ÿผ ์ด๊ฒŒ ์–ด๋–ค ์˜๋ฏธ์ผ๊นŒ?
  • ์ด๋Ÿฐ๋ง์ด ์žˆ๋‹ค. “๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•ด๋„ API ์‘๋‹ต ์‹œ๊ฐ„์ด ์งง๊ณ  ์•ˆ์ •์ ์ด๋‹ค.
  • ๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ ์˜๋ฌธ์ ์ด ์ƒ๊ธด๋‹ค. ๋งŽ์€์‚ฌ๋žŒ? ์‘๋‹ต์‹œ๊ฐ„์ด ์งง๊ณ ? ์•ˆ์ •์ 
  • ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ? ์–ด๋Š์ •๋„ ์‹œ๊ฐ„์ด๋ฉด ์งง์€๊ฑฐ์•ผ? ๋งˆ์Œ์˜ ์•ˆ์ •์ด๋ผ๋Š”๊ฑฐ์•ผ?

๋‘๊ฐ€์ง€ ์ƒํ™ฉ

  • 10๋ช…์ด ๋™์‹œ์— ํ˜ธ์ถœํ–‡์„ ๋•Œ 1์ดˆ ์•ˆ์— ๋ชจ๋‘๊ฐ€ ์‘๋‹ต์„ ๋ฐ›์Œ vs 100๋ช…์ด ๋™์‹œ์— ํ˜ธ์ถœํ–ˆ์„ ๋•Œ 10์ดˆ ์•ˆ์— ๋ชจ๋‘๊ฐ€ ์‘๋‹ต์„ ๋ฐ›์•˜๋‹ค.
    • ๋‘˜์ค‘์— ์–ด๋–ค๊ฒŒ ๋” ๋น ๋ฅธ๊ฐ€? ์ •๋‹ต์ด ์—†๋‹ค.
    • 1์ดˆ๋™์•ˆ 5๊ฐœ์˜ ์ฒ˜๋ฆฌ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ํ• ์ˆ˜๋„ ์žˆ๊ณ , 1์ดˆ๋™์•ˆ ๋ณ‘๋ ฌ๋กœ 5๊ฐœ๋ฅผ ์ฒ˜๋ฆฌํ• ์ˆ˜๋„ ์žˆ๋‹ค.
    • ํ‰๊ท ์ด 1์ดˆ๋ผ๊ณ  ํ• ๋•Œ, ๊ฐ ์š”์ฒญ์ด ๋ณ‘๋ ฌ๋กœ ํ–ˆ์„๋•Œ 1์ดˆ์ผ์ˆ˜๋„ ์žˆ๊ณ , 5๊ฐœ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰๋˜๋ฉด์„œ 1์ดˆ์ผ์ˆ˜๋„ ์žˆ๋‹ค.
    • ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ‰๊ท ์€ ์• ๋งคํ•ด์ง€๋Š”๊ฑฐ ์•„๋‹ˆ๋ƒ?

Latency vs Throughput

  • Latency๋ž€ ์š”์ฒญ์ž์˜ ์ž…์žฅ์—์„  ์‘๋‹ต๊นŒ์ง€ ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆฌ๋Š”๊ฐ€?
  • Throughput์€ ์ž‘์—…์ž ์ž…์žฅ์—์„œ ์‹œ๊ฐ„๋‹น ์–ผ๋งˆ๋‚˜ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€?
  • ๊ณ ์†๋„๋กœ๋กœ ๋น„์œ ๋ฅผ ๋“ค์–ด๋ณด๋ฉด, Latency๊ฐ€ ๋‚ฎ๋‹ค๋Š”๊ฒƒ์€ ์ œํ•œ์†๋„๊ฐ€ ๊ต‰์žฅํžˆ ๋นจ๋ผ์„œ ์ฐจ๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋‹ค๋‹์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๊ณ , Throughput์ด๋ž€ ์ฐจ์„ ์ด ๋งŽ์•„์„œ ํ•œ๋ฒˆ์— ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ฐจ๋Ÿ‰์ด ๋งŽ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
  • ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ํ• ๋•Œ ๋‘˜์ค‘์— ์ ์ ˆํ•œ ์„ ํƒ์„ ํ•จ์œผ๋กœ์จ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒŒ ์ค‘์š”ํ•˜๋‹ค.

wrk / wrk2

  • https://github.com/wg/wrk
    • wrk๋Š” ํ˜„๋Œ€์ ์ธ HTTP ๋ฒค์น˜๋งˆํ‚น ๋„๊ตฌ๋กœ, ๋‹จ์ผ ๋‹ค์ค‘ ์ฝ”์–ด CPU์—์„œ ์‹คํ–‰๋  ๋•Œ ์ƒ๋‹นํ•œ ๋ถ€ํ•˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
    • ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.
    • wrk -t12 -c400 -d30s http://localhost:8080/hello
    • ๋ช‡๊ฐ€์ง€ ์˜ต์…˜์„ ์‚ดํŽด๋ณด์ž.
      • -c(—connections): ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” HTTP ์—ฐ๊ฒฐ์˜ ์ด ์ˆ˜
      • -d(—duration): ํ…Œ์ŠคํŠธ์˜ ์ง€์†์‹œ๊ฐ„
      • -t(—threads): ์‚ฌ์šฉํ•  ์Šค๋ ˆ๋“œ์˜ ์ˆ˜
      • -s(—script): LauJIT ์Šคํฌ๋ฆฝํŠธ
      • -H(—header): ์š”์ฒญ์— ์ถ”๊ฐ€ํ•  HTTP ํ—ค๋”
      • —latency: ์ž์„ธํ•œ Latency ํ†ต๊ณ„ ์ถœ๋ ฅ
      • —timeout: ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ•  ๊ฒฝ์šฐ ์‹œ๊ฐ„ ์ œํ•œ
      • cf) LauJIT์Šคํฌ๋ฆฝํŠธ๋ž€ HTTP ์š”์ฒญ ์ƒ์„ฑ, ์‘๋‹ต ์ฒ˜๋ฆฌ, ์‚ฌ์šฉ์ž ์ •์˜ ๋ณด๊ณ ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํŠน์ • ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ ์ปค์Šคํ…€ ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ทธ๋Ÿผ ํ•œ๋ฒˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๋ณด์ž.
      • ๊ฐ„๋‹จํ•˜๊ฒŒ Spring์œผ๋กœ ์‚ฌ์šฉ์ž๋“ค์ค‘์— ๋žœ๋ค์œผ๋กœ ํ•˜๋‚˜ ๋ฆฌํ„ดํ•˜๋Š” API๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
      • ์ฝ”๋“œ๋Š” ๋”ฐ๋กœ ๊ณต๊ฐœํ•˜์ง„ ์•Š์„ํ…๋ฐ, ์‹ค์ œ Service๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ „์ฒด user๋ฅผ ๋‹ค ๊ฐ€์ ธ์™€์„œ random์„ ๋Œ๋ฆฌ๋Š” ํ’€ํ…Œ์ด๋ธ” ์Šค์บ”์„ ์ด์šฉํ•˜๋ ค๋Š” ๋ชฉ์ ์œผ๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
      • fun random(): User { return userRepository.findAll() .random() }
      • ๊ฒฐ๊ณผ
      • 12๊ฐœ์˜ ์Šค๋ ˆ๋“œ์—์„œ 400๊ฐœ์˜ ์—ฐ๊ฒฐ์„ ํ–ˆ๋˜ ๊ฒฐ๊ณผ latency๋Š” ํ‰๊ท  42.32ms์ด๋ฉฐ, 1์ดˆ๋‹น 10577๊ฐœ๋ฅผ ์ฒ˜๋ฆฌํ•œ๊ฒƒ์„ ์•Œ์ˆ˜ ์žˆ๋‹ค.
      • ๋‹จ์ˆœํžˆ Latency๋งŒ ๋‚˜์˜ค๊ธฐ ๋–„๋ฌธ์— ์ข€๋” ํšจ๊ณผ์ ์œผ๋กœ ์ถœ๋ ฅ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด wrk2๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • wrk2
    • https://github.com/giltene/wrk2
    • wrk2๋Š” wrk๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ HTTP ๋ฒค์น˜๋งˆํ‚น ๋„๊ตฌ๋กœ ์ผ์ •ํ•œ ์ฒ˜๋ฆฌ๋Ÿ‰ ๋ถ€ํ•˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„๋™์•ˆ ์‹คํ–‰๋  ๊ฒฝ์šฐ ๋†’์€ ์ •ํ™•๋„์˜ Latency๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.
    • wrk2 -t2 -c100 -d30s -R2000 --latency http://localhost/hello
    • –R์„ ์ด์šฉํ•ด ์ผ์ •ํ•œ ์š”์ฒญ์œจ์„ ์ง€์ • ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ๋‹ค๋ฅธ ์  ์ž…๋‹ˆ๋‹ค.
    • Mac M ์‹œ๋ฆฌ์ฆˆ ๋งฅ๋ถ์—์„œ ์ด๊ฒŒ ๋™์ž‘์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์‹œ๋ฅผ ํ• ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค ใ… ใ… 
  • API ์„œ๋ฒ„๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ๊ฐœ์„ ํ•˜๋ ค๋ฉด?
  • ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์„œ๋ฒ„๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.
    • ์›น์„œ๋ฒ„ - WAS - DB
    • ์ด๋ ‡๊ฒŒ ์žˆ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค.
    • ์ด๋•Œ ์›น์„œ๋ฒ„์— ์›น์„œ๋ฒ„์˜ ์š”์ฒญ์€ 12๊ฐœ, WAS๋Š” 3๊ฐœ, DB๋Š” 6๊ฐœ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค.
    • ๊ทธ๋ ‡๋‹ค๋ฉด ํ•œ๋ฒˆ ์ฒ˜๋ฆฌํ• ๋•Œ 3๊ฐœ์”ฉ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์ž‡์„๊ฒ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด WAS๊ฐ€ 3๊ฐœ๋งŒ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ˆ๊น์š”. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋•Œ ๋ณ‘๋ชฉ์ง€์ ์€ WAS์ž…๋‹ˆ๋‹ค. WAS๊ฐ€ 6๊ฐœ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค๋ฉด ๋‹ค๋ฅธ๊ณณ ์—†์ด ๋” ๋Š˜๋ฆด์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ์š”? ๋”ฐ๋ผ์„œ WAS๋ฅผ ๋Š˜๋ฆฐ๋‹ค๋ฉด 6๊ฐœ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ• ๊ฒ๋‹ˆ๋‹ค.
    • ๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ 12๊ฐœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค. ๋ผ๊ณ  ํ• ๋•Œ ์›น์„œ๋ฒ„๋Š” 12๊ฐœ์”ฉ ๊ฐ€๋Šฅํ• ๊บผ์—์š”. ๊ทธ๋Ÿฌ๋‚˜ ์•„์ง WAS๋Š” 6๊ฐœ๋ฅผ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด 2๊ฐœ๋ฅผ ๋” ๋Š˜๋ฆฌ๋ฉด 12๊ฐœ๊ฐ€ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒ ์ฃ . ๊ทธ๋Ÿฌ๋‚˜ DB์—์„œ๋Š” 6๊ฐœ๋งŒ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ 6๊ฐœ๋งŒ ์ฒ˜๋ฆฌํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด DB๋ถ€ํ•˜๊ฐ€ ์ƒ๊ธธํ…Œ๋‹ˆ, DB๋„ ํ•œ๊ฐœ ๋” ๋Š˜๋ฆฝ๋‹ˆ๋‹ค.
    • ์ด๋ ‡๊ฒŒ ๊ฐ ์ƒํ™ฉ์„ ๋ณด๊ณ  ์„œ๋ฒ„๋ฅผ ๋Š˜๋ฆฌ๋Š”๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ํšจ์œจํ™” ํ•œ๋‹ค.
    • ์ฒ˜๋ฆฌํ•˜๋Š” ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, 6๊ฐœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒƒ์„ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ 12๊ฐœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฑฐ์ฃ .
    • ๊ทธ๋Ÿฐ๊ฑธ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ WAS(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์—์„œ๋Š” ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค๊ฑฐ๋‚˜, N+1์„ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋กœ์ง์„ ๋ฆฌํŒฉํ†จ์ดํ•œ๋‹ค๊ฑฐ๋‚˜.
    • DB๋„ ์ค„์ผ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ์ ์ ˆํ•œ DB ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ฑฐ๋‚˜, Denormalization์„ ํ•œ๋‹ค๊ฑฐ๋‚˜.

๊ฒฐ๋ก 

  • ์„œ๋ฒ„ ์„ฑ๋Šฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ๋Š” ๋‹ค์–‘ํ•˜๋ฉฐ, ์ •๋‹ต์ด ์—†๋‹ค.
  • ์„ฑ๋Šฅ ์ธก์ • ์‹œ, ๋ช‡ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋Š ์ •๋„์˜ ๋ฐ€๋„๋กœ API ์š”์ฒญ์„ ํ•  ๋•Œ ์„œ๋ฒ„์˜ ์‘๋‹ต์†๋„ ๋ถ„ํฌ๋Š”~ ์˜ ํ˜•ํƒœ๊ฐ€ ํ˜„์‹ค์ ์ด๋‹ค
  • ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์„ ์ƒํ™ฉ์— ๋”ฐ๋ผ scale-out ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ํšจ์œจํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

ํ›„๊ธฐ

  • ์„ฑ๋Šฅ์ด๋ผ๋Š” ๊ฒƒ์„ ๋ช…ํ™•ํžˆ ๋นจ๋ผ์•ผ ํ•œ๋‹ค. ์ข‹์•„์•ผ ํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„์ˆ˜ ์žˆ์„๊นŒ? ์–ด๋–ค ์ง€ํ‘œ๋ฅผ ๋ด์•ผ ํ• ๊นŒ? ๋“ฑ๋“ฑ ์ด๋Ÿฐ ๊ณ ๋ฏผ๋“ค์„ ํ•ด๋ณผ์ˆ˜ ์žˆ์—ˆ๋˜๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‚ด๊ฐ€ ๋งŒ๋“  API์˜ ์„ฑ๋Šฅ์€ ์–ด๋–จ๊นŒ? ์–ผ๋งˆ๋‚˜ ๋ฒ„ํ‹ธ์ˆ˜ ์žˆ์„๊นŒ?์— ๋Œ€ํ•œ๊ฒƒ์„ ์•Œ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด์˜€๋˜๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ๊ต‰์žฅํžˆ ๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ์ด์ง€๋งŒ, ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‚ด์šฉ๋“ค์„ ๋‹ด์€ ์˜์ƒ์ด ์•„๋‹ˆ์˜€์„๊นŒ ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค.
  • ์‚ฌ์‹ค ๊ฐ€์žฅ ์ค‘์š”ํ•œ๊ฑด ์šฐ๋ฆฌ์˜ ์„œ๋น„์Šค๊ฐ€ ํ˜„์žฌ ์–ผ๋งˆ๋‚˜ ๋ฒ„ํ‹ธ์ˆ˜ ์žˆ๋Š”๊ฐ€?๋ฅผ ์•Œ์•„๊ฐ€๋Š”๊ฒŒ ์ข‹์„๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ / ์ผ์ •๋™์•ˆ ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊พธ์ค€ํžˆ ์ฒดํฌํ•˜๋Š”๊ฒŒ ์ข‹์„๊ฑฐ ๊ฐ™๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„๋“ค์„ ์ฐจํ›„์—” ๊ทธ๋ผํŒŒ๋‚˜๋ฅผ ํ†ตํ•ด์„œ ์ฒ˜๋ฆฌํ•ด๋ณด๊ณ  ์‹ถ๊ธด ํ•˜๋„ค์š”!
728x90
728x90