Post

๐ŸฆŠ 12. System design & Scalability

12. System design & Scalability

๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•

  • ์†Œํ†ตํ•˜๋ผ
  • ์ฒ˜์Œ์—๋Š” ํฌ๊ด„์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋ผ
  • ํ™”์ดํŠธ๋ณด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ
  • ๋ฉด์ ‘๊ด€์ด ์šฐ๋ คํ•˜๋Š” ๋ถ€๋ถ„์„ ์ธ์ •ํ•˜๋ผ
  • ๊ฐ€์ •์„ ํ•  ๋•Œ ์ฃผ์˜ํ•˜๋ผ
  • ์—ฌ๋Ÿฌ๋ถ„์ด ์ƒ๊ฐํ•˜๋Š” ๊ฐ€์ •์„ ๋ช…ํ™•ํžˆ ์–ธ๊ธ‰ํ•˜๋ผ
  • ํ•„์š”ํ•˜๋‹ค๋ฉด ์–ด๋ฆผ์žก์•„ ๋ณด๋ผ
  • ๋›ฐ์–ด๋“ค๋ผ

์ตœ๊ณ ์˜ ์„ค๊ณ„๋ฅผ ํ•ด๋‚ด๋Š” ๊ฒƒ๋ณด๋‹ค ๋Œ€๊ฒŒ ๊ทธ ๊ณผ์ •์„ ์ค‘์š”ํ•˜๊ฒŒ ๋ณธ๋‹ค

์‹œ์Šคํ…œ ์„ค๊ณ„: ๋‹จ๊ณ„์  ์ ‘๊ทผ๋ฒ•

TinyURL ๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ ์„ค๊ณ„์—์„œ, ์‹ค์ œ ์„ค๊ณ„์— ๋“ค์–ด๊ฐ€๊ธฐ์ „ ํ•˜๊ณ  ์‹ถ์€ ์งˆ๋ฌธ์ด ๋งŽ์„ ๊ฒƒ์ด๋‹ค.

๋ฉด์ ‘์—์„œ๋„ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ์— ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.

1๋‹จ๊ณ„: ๋ฌธ์ œ์˜ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜๋ผ

๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ์‹œ์Šคํ…œ๊ณผ ๋ฉด์ ‘๊ด€์ด ์›ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ™์€์ง€ ํ™•์‹คํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์ œ์˜ ๋ฒ”์œ„๋ฅผ ํ•œ์ •ํ•ด๋ผ

์˜ˆ๋ฅผ ๋“ค์–ด TinyURL ์€ ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ๋‹ค.

  • URL์„ TinyURL๋กœ ์ถ•์•ฝ
  • URL์„ ๋ถ„์„
  • TinyURL๊ณผ ์—ฐ๊ฒฐ๋œ URL์„ ๊ฒ€์ƒ‰
  • ์‚ฌ์šฉ์ž ๊ณ„์ • ๋ฐ ๋งํฌ ๊ด€๋ฆฌ

2๋‹จ๊ณ„: ํ•ฉ๋ฆฌ์ ์ธ ๊ฐ€์ •์„ ๋งŒ๋“ค์–ด๋ผ

ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ฐ€์ •์„ ์„ธ์šฐ๋Š” ๊ฒƒ๋„ ๊ดœ์ฐฎ์ง€๋งŒ, ํ•ฉ๋‹นํ•ด์•ผ ํ•œ๋‹ค.

์ด๋Ÿฐ ๊ฐ€์ •์„ ํ†ตํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ณ„์‚ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์–ด๋–ค ๊ฐ€์ •์„ ์„ธ์šฐ๋ ค๋ฉด ์ œํ’ˆ์— ๋Œ€ํ•œ ๊ฐ์ด ์žˆ์–ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

3๋‹จ๊ณ„: ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ๋จผ์ € ๊ทธ๋ ค๋ผ

์‹œ์Šคํ…œ์˜ ์ฃผ์š”ํ•œ ๋ถ€๋ถ„์„ ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ๊ทธ๋ ค๋ผ.

๊ทธ ์‹œ์Šคํ…œ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๊ทธ๋ฆผ์œผ๋กœ ๊ทธ๋ ค๋ผ.

์‹œ์Šคํ…œ์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ทธ ํ๋ฆ„์„ ๋ณด์ด๋ผ

4๋‹จ๊ณ„: ํ•ต์‹ฌ ๋ฌธ์ œ์ ์„ ์ฐพ์œผ๋ผ

๊ธฐ๋ณธ์ ์ธ ์„ค๊ณ„๋ฅผ ๋งˆ์นœ ๋’ค์—๋Š” ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํ•ต์‹ฌ ๋ฌธ์ œ์— ์ง‘์ค‘ํ•ด์•ผ ํ•œ๋‹ค.

์–ด๋–ค URL์€ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ˜๋ฉด ํŠน์ •ํ•œ URL์˜ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ฐ‘์ž๊ธฐ ์น˜์†Ÿ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

5๋‹จ๊ณ„: ํ•ต์‹ฌ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์‹œ ์„ค๊ณ„ํ•˜๋ผ

ํ•ต์‹ฌ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ƒˆ๋‹ค๋ฉด ์ด์ œ๋Š” ๊ทธ์— ๋งž๊ฒŒ ์—ฌ๋Ÿฌ๋ถ„์˜ ์„ค๊ณ„๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

์•ž์„œ ๊ทธ๋ฆฐ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๋ฐ”๋€ ์„ค๊ณ„์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•˜๋ผ

๊ทœ๋ชจ ํ™•์žฅ์„ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜: ๋‹จ๊ณ„๋ณ„ ์ ‘๊ทผ๋ฒ•

์‹œ์Šคํ…œ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ์‹œ์Šคํ…œ์˜ ํ•œ ๋ถ€๋ถ„ ํ˜น์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค๊ณ„ํ•ด ๋ณด๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๋‹ค.

์ด๋•Œ๋„ ๋ฐ˜๋“œ์‹œ ๊ทœ๋ชจ ํ™•์žฅ์„ฑ์„ ์‹ ๊ฒฝ ์จ์•ผ ํ•œ๋‹ค.

1๋‹จ๊ณ„: ์งˆ๋ฌธํ•˜๋ผ

๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์งˆ๋ฌธ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค

2๋‹จ๊ณ„: ํ˜„์‹ค์  ์ œ์•ฝ์„ ๋ฌด์‹œํ•˜๋ผ

๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ์ด ์—†๊ณ , ์ปดํ“จํ„ฐ ํ•œ ๋Œ€์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๋ผ

3๋‹จ๊ณ„: ํ˜„์‹ค๋กœ ๋Œ์•„์˜ค๋ผ

๋‹ค์‹œ ์›๋ž˜ ๋ฌธ์ œ๋กœ ๋Œ์•„์™€์„œ ์ปดํ“จํ„ฐ ํ•œ ๋Œ€์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋Š” ์–ผ๋งˆ๋‚˜ ๋˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ์ชผ๊ฐฐ์„ ๋•Œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ์ง€ ์ƒ๊ฐํ•ด ๋ณด๋ผ.

4๋‹จ๊ณ„: ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ผ

๋ฐœ๊ฒฌํ•œ ๋ฌธ์ œ์ ๋“ค์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ์ง€ ์ƒ๊ฐํ•ด ๋ณด์•ผ ํ•œ๋‹ค.

์ˆœํ™˜์  ์ ‘๊ทผ๋ฒ•์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ์šฉํ•˜๋‹ค.

์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด, ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ๊ทธ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐ€๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ์ž‘์—…์ด๋‹ค.

์‹œ์Šคํ…œ ์„ค๊ณ„์˜ ํ•ต์‹ฌ ๊ฐœ๋…

์ˆ˜ํ‰์ (horizontal) vs. ์ˆ˜์ง์ (vertical) ๊ทœ๋ชจ ํ™•์žฅ

  • ์ˆ˜์ง์  ๊ทœ๋ชจ ํ™•์žฅ: ํŠน์ • ๋…ธ๋“œ์˜ ์ž์›์˜ ์–‘์„ ๋Š˜๋ฆฌ๋Š” ๋ฐฉ๋ฒ• (์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ถ”๊ฐ€)
  • ์ˆ˜ํ‰์  ๊ทœ๋ชจ ํ™•์žฅ: ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋Š” ๋ฐฉ๋ฒ• (์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ โ†’ ๋ถ€ํ•˜๋ฅผ ์ค„์ž„)

์„œ๋ฒ„ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ์žฅ์น˜(load balancer)

์„œ๋ฒ„์— ๊ฑธ๋ฆฌ๋Š” ๋ถ€ํ•˜๋ฅผ ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„์— ๊ท ์ผํ•˜๊ฒŒ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ  ์„œ๋ฒ„ ํ•œ ๋Œ€ ๋•Œ๋ฌธ์— ์ „์ฒด ์‹œ์Šคํ…œ์ด ์ฃฝ๊ฑฐ๋‚˜ ๋‹ค์šด๋˜๋Š” ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ญ์ •๊ทœํ™”(denormalization)์™€ NoSQL

RDB์˜ join ์—ฐ์‚ฐ์€ ์‹œ์Šคํ…œ์ด ์ปค์งˆ์ˆ˜๋ก ๊ต‰์žฅํžˆ ๋Š๋ ค์ง„๋‹ค.

์—ญ์ •๊ทœํ™”๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฌ๋ถ„์˜ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์ฝ๊ธฐ ์—ฐ์‚ฐ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

๋‘ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๊ธฐ๋ณด๋‹จ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ์ €์žฅํ•ด ๋” ๋น ๋ฅด๊ฒŒ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

NoSQL์€ join ์—ฐ์‚ฐ ์ž์ฒด๊ฐ€ ์—†์–ด ๊ทœ๋ชจ ํ™•์žฅ์„ฑ์ด ์ข‹๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ„ํ• (์ƒค๋”ฉ)

์ƒค๋”ฉ(sharding)์€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์ปดํ“จํ„ฐ์— ๋‚˜๋ˆ ์„œ ์ €์žฅํ•˜๋Š” ๋™์‹œ์—

์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ์ปดํ“จํ„ฐ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์ด๋‹ค.

  • ์ˆ˜์ง์  ๋ถ„ํ• : ์ž๋ฃŒ์˜ ํŠน์„ฑ๋ณ„๋กœ ๋ถ„ํ• ํ•˜๋Š” ๋ฐฉ์‹, ํŠน์ • ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๊ฐ€ ์ผ์ • ์ˆ˜์ค€ ์ด์ƒ์ด ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์žฌ๋ถ„ํ• ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ํ‚ค or ํ•ด์‹œ ๊ธฐ๋ฐ˜ ๋ถ„ํ• : mod(key, n) ์˜ ๊ฐ’์„ N๊ฐœ์˜ ์„œ๋ฒ„์— ๋ถ„ํ•  ์ €์žฅํ•œ๋‹ค. ๋‹จ ์„œ๋ฒ„์˜ ๊ฐœ์ˆ˜๊ฐ€ ์‚ฌ์‹ค์ƒ ๊ณ ์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์„œ๋ฒ„๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•  ๋•Œ ๋งˆ๋‹ค ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์žฌ๋ถ„๋ฐฐํ•ด์•ผ ํ•œ๋‹ค.
  • ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ธฐ๋ฐ˜ ๋ถ„ํ• : ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์กฐํšŒ ํ…Œ์ด๋ธ”(lookup table)์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•, ์กฐํšŒ ํ…Œ์ด๋ธ”์ด ๋‹จ์ผ ์žฅ์•  ์ง€์ ์ด ๋  ์ˆ˜๋„ ์žˆ๊ณ  ์ง€์†์ ์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์ฝ๋Š” ํ–‰์œ„๊ฐ€ ์ „์ฒด ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.

์บ์‹ฑ(caching)

์ธ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ๋ฅผ ์ด์šฉํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ๋Š” key-value ์Œ์œผ๋กœ ๊ฐ–๋Š” ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ์ด๋‹ค.

๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ & ํ

์†๋„๊ฐ€ ๋Š๋ฆฐ ์—ฐ์‚ฐ์€ ๋น„๋™๊ธฐ์‹(asynchronous)์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

๋˜๋Š” ์ด ์—ฐ์‚ฐ์„ ๋ฏธ๋ฆฌ ํ•ด ๋†“์„ ์ˆ˜๋„ ์žˆ๋‹ค.

์ด๋Ÿฐ ์›น์‚ฌ์ดํŠธ๋Š” ์–ด๋–ค ๋ถ€๋ถ„์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ์œผ๋กœ ๋ฐ”๊ฟ” ๋†“๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ์–ผ๋งˆ๋‚˜ ์†Œ์š”๋˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๋ฉฐ ์ž‘์—…์ด ๋๋‚˜๋ฉด ์•Œ๋ฆผ์„ ๋ณด๋‚ด ์ค€๋‹ค.

๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ ์ฒ™๋„

  • ๋Œ€์—ญํญ
  • ์ฒ˜๋ฆฌ๋Ÿ‰
  • ์ง€์—ฐ ์†๋„

์ง€์—ฐ ์‹œ๊ฐ„์€ ๋ฌด์‹œ๋˜๊ธฐ ์‰ฝ์ง€๋งŒ ์˜จ๋ผ์ธ ๊ฒŒ์ž„์—์„  ์ง€์—ฐ ์‹œ๊ฐ„์ด ์•„์ฃผ ์ค‘์š”ํ•˜๋‹ค.

MapReduce

๊ต‰์žฅํžˆ ์ปค๋‹ค๋ž€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

  • Map์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์€ ๋’ค <key, value> ์Œ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • Reduce ๋Š” key์™€ ๊ด€๋ จ value ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๊ฑฐ์ณ ์ƒˆ๋กœ์šด ํ‚ค๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค

์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ ๊ณ ๋ คํ•  ์ 

  • ์‹คํŒจ: ์‹คํŒจ์— ๋Œ€ํ•œ ๋Œ€๋น„์ฑ…์ด ํ•„์š”
  • ๊ฐ€์šฉ์„ฑ: ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์˜ ์‹œ๊ฐ„
  • ์‹ ๋ขฐ์„ฑ: ํŠน์ • ๋‹จ์œ„ ์‹œ๊ฐ„์— ์‹œ์Šคํ…œ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ํ™•๋ฅ 
  • ์ฝ๊ธฐ ์ค‘์‹ฌ vs. ์“ฐ๊ธฐ ์ค‘์‹ฌ: ์“ฐ๋Š” ์—ฐ์‚ฐ์ด ๋งŽ๋‹ค๋ฉด ํ, ์ฝ๋Š” ์—ฐ์‚ฐ์ด ๋งŽ๋‹ค๋ฉด ์บ์‹œ๊ฐ€ ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค
  • ๋ณด์•ˆ

์™„๋ฒฝํ•œ ์‹œ์Šคํ…œ์€ ์—†๋‹ค

์™„๋ฒฝํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์‹œ์Šคํ…œ ์„ค๊ณ„๋ž€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ชจ๋“  ์‹œ์Šคํ…œ์—๋Š” ์žฅ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.

This post is licensed under CC BY 4.0 by the author.