Skip to content
Jiho Jeong edited this page Jan 13, 2025 · 8 revisions
image

แ„’แ…ชแ„†แ…งแ†ซ แ„€แ…ตแ„…แ…ฉแ†จ 2024-12-02 แ„‹แ…ฉแ„’แ…ฎ 5 52 03

ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

๋ฒ ํŒ…๋• ํ”„๋กœ์ ํŠธ๋Š” ๋‘ ๊ฐœ์˜ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜์— ์ฝ”์ธ์„ ๊ฑธ๋ฉฐ ๋ฒ ํŒ…์„ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

์‹ค์‹œ๊ฐ„ ๋ฒ ํŒ…, ์ฑ„ํŒ… ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Socket.IO๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ , ์ฝ”์ธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” 3D ์˜ค๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Three.js๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ๋งํฌ

โ€ฃ ํ”„๋กœ์ ํŠธ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ ์ด๋™
โ€ฃ ๋ฐฐํฌ ์‚ฌ์ดํŠธ๋กœ ์ด๋™

ํŒ€์› ๋ฐ ๊ฐœ์ธ ๋ชฉํ‘œ ์†Œ๊ฐœ

์ •๋™๊ต[BE]

โœ”๏ธ ๋‹ด๋‹น ์ž‘์—…:

  • ๋ฒ ํŒ… ์‹œ์Šคํ…œ์˜ ์ „์ฒด ํ๋ฆ„ ์„ค๊ณ„ ๋ฐ ์บ์‹œ ์ „๋žต ์ ์šฉ
  • ๋ฒ ํŒ… API ๊ตฌํ˜„
  • ๋ฒ ํŒ… ๊ด€๋ จ Socket.IO ์ด๋ฒคํŠธ ๊ตฌํ˜„
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•

โœ”๏ธ ๋ฐฐ์šด ์  ๋ฐ ๋А๋‚€ ์ :

  • ์†Œ์ผ“ IO๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋†’์˜€์Šต๋‹ˆ๋‹ค.
  • Redis๋ฅผ ์ค‘์ ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋ฉด์„œ, ๋ฐ์ดํ„ฐ ์บ์‹ฑ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์„ค์ • ์ž‘์—…์„ ํ†ตํ•ด Redis์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ์Œ“์•˜์Šต๋‹ˆ๋‹ค.
  • ํ”„๋ก ํŠธ์—”๋“œ์™€์˜ ํ˜‘์—… ๊ณผ์ •์—์„œ ๋ฌธ์„œํ™”๋ฅผ ๊ผผ๊ผผํ•˜๊ฒŒ ์ฑ™๊ธฐ์ง€ ๋ชปํ•ด ํ”„๋ก ํŠธ ํŒ€์›์—๊ฒŒ ๋ถ€์ฑ„๊ฐ€ ๋˜์—ˆ๋˜ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œํ™”์˜ ์ค‘์š”์„ฑ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์‹ค๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

โœ”๏ธ ํ•™์Šต ์ •๋ฆฌ ๊ณต์œ  ๋งํฌ:

โœ”๏ธ ์•„์‰ฌ์› ๋˜ ์ :

  • ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๋ฐ ์•ˆ์ •์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ์ถฉ๋ถ„ํžˆ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•œ ์ ์ด ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ์ง‘์ค‘ํ•ด CS ํ•™์Šต์„ ์†Œํ™€ํžˆ ํ•œ ๊ฒƒ์ด ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.

โœ”๏ธ ๋ฆฌํŒฉํ† ๋ง ๊ฐœ์ธ ๋ชฉํ‘œ:

  • ์„œ๋น„์Šค ์•ˆ์ •์„ฑ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•œ Redis Sentinel ๋„์ž…
  • Redis ๋ฉ”์‹œ์ง€ ํ๋ฅผ ๊ฐœ์„ ํ•ด๋ณด๊ธฐ

์ •์ง€ํ˜ธ[FE]

โœ”๏ธ ๋‹ด๋‹น ์ž‘์—…:

  • ๋กœ๊ทธ์ธ(ํšŒ์›, ๋น„ํšŒ์›)/ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ๋ฒ ํŒ… ์ƒ์„ฑ ํผ ๊ตฌํ˜„ + ์„ฑ๋Šฅ ๊ฐœ์„ 
  • ๋ฒ ํŒ… ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ๊ตฌํ˜„
  • ๋ฒ ํŒ… ๊ฒฐ๊ณผ ์„ ํƒ ํŽ˜์ด์ง€ ๊ตฌํ˜„
  • ๋ฒ ํŒ… ์ข…๋ฃŒ ํ›„ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€ ๊ตฌํ˜„
  • Husky ๋„์ž…ํ•ด ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€ ์ž๋™ํ™”, Lint ์ฒดํฌ ์ž๋™ํ™” ์ ์šฉ
  • UI ๊ฐœ์„ ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜: ์‚ฌ์šฉ์ž ๋Œ€์ƒ UI ํˆฌํ‘œ ์ง„ํ–‰ ๋ฐ UI ๊ฐœ์„ 

โœ”๏ธ ๋ฐฐ์šด ์  ๋ฐ ๋А๋‚€ ์ :

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

โœ”๏ธ ํ•™์Šต ์ •๋ฆฌ ๊ณต์œ  ๋งํฌ:

โœ”๏ธ ์•„์‰ฌ์› ๋˜ ์ :

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

โœ”๏ธ ๋ฆฌํŒฉํ† ๋ง ๊ฐœ์ธ ๋ชฉํ‘œ:

  • Socket.IO์˜ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ๊ณผ ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ๋ฐฉ์‹, ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๋ฃธ ๊ตฌ์กฐ ๋“ฑ์— ๋Œ€ํ•œ ์‹ฌ์ธต์ ์ธ ํ•™์Šต์„ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์˜ ์ดํ•ด๋„๋ฅผ ๋†’์ด๊ณ  Socket.IO ์‚ฌ์šฉ ์ฝ”๋“œ ๊ฐœ์„ 
  • Singleton ํŒจํ„ด์„ ์ ์šฉํ•ด Socket ์ธ์Šคํ„ด์Šค๋ฅผ ์ „์—ญ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ํŽ˜์ด์ง€ ๊ฐ„ ๊ณต์œ  ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ์ž์› ๋‚ญ๋น„ ๋ฐฉ์ง€
  • ์š”์ฒญ ๋กœ์ง ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด API ํ˜ธ์ถœ ์กฐ๊ฑด์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๊ฒ€์ฆ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ณ , ์บ์‹ฑ์„ ํ™œ์šฉํ•ด ๋™์ผ ์š”์ฒญ์˜ ์ค‘๋ณต ์ „์†ก์„ ๋ฐฉ์ง€
  • ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•œ ์—๋Ÿฌ ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜๊ณ , ์—๋Ÿฌ ํ•ธ๋“ค๋ง์„ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋„์ž…. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค๊ตญ์–ด ์ง€์›, ๋‹ค์–‘ํ•œ ์—๋Ÿฌ ์ƒํ™ฉ ์ฒ˜๋ฆฌ ๋“ฑ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•œ ์„ค๊ณ„๋กœ ๊ฐœ์„ 

์ตœ์ •๋ฏผ[FE]

โœ”๏ธ ๋‹ด๋‹น ์ž‘์—…:

  • ๋นŒ๋“œ ์‹œ๊ฐ„ ๊ฐœ์„  ๋ฐ ์บ์‹ฑ์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Vite์„ ํ†ตํ•œ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฟ, ์ž์› ๊ตฌ์กฐ ๊ณ„์ธตํ™”๋ฅผ ์ˆ˜ํ–‰
  • DX๋ฅผ ์œ„ํ•ด ๊ฐœ๋ฐœ์„œ๋ฒ„์—์„œ ์™ธ๋ถ€ ์„œ๋ฒ„ ์ ‘๊ทผ์‹œ CORS ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ํ”„๋ก์‹œ ์„œ๋ฒ„ ์„ค์ •
  • ํ˜‘์—…๊ฐ„ ๋ถˆํ•„์š”ํ•œ ์˜์‚ฌ์†Œํ†ต์„ ์ค„์ด๊ธฐ ์œ„ํ•œ API ๊ณต์šฉ ํƒ€์ž… ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑ ๋ฐ ๋ชจ๋…ธ๋ ˆํฌ ํ™˜๊ฒฝ ์„ค์ •
  • ์„œ๋น„์Šค์˜ ์ฝ”์ธ ์†Œ์œ ์˜ ์˜๋ฏธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•˜์—ฌ 3D ์˜ค๋ธŒ์ ํŠธ๋กœ ์ œ์ž‘๋œ ์˜ค๋ฆฌ ๊ตฌ๋งค ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • ํ”„๋กœ์ ํŠธ์˜ ํŽ˜์ด์ง€ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
  • ํ”„๋กœ์ ํŠธ์˜ ๋™์ /์ •์  ๋ผ์šฐํŒ… ์„ค์ • ๋ฐ ์‚ฌ์šฉ์ž ํ๋ฆ„ ์ตœ์ ํ™”
  • ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ UI ํ”ผ๋“œ๋ฐฑ๊ณผ ์š”์ฒญ ์žฌ์ „์†ก ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • FSD ํด๋” ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฝ”๋“œ ๊ตฌ์กฐ ๊ฐœ์„ 

โœ”๏ธ ๋ฐฐ์šด ์  ๋ฐ ๋А๋‚€ ์ :

  • vite์ด ์–ด๋– ํ•œ ์žฅ์ ์ด ์žˆ๊ณ  ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•ด์•ผ ํšจ์œจ์ ์œผ๋กœ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„์™€ ํ†ต์‹ ์„ ํ•  ๊ฒฝ์šฐ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์„ ๊ณ ๋ คํ•˜์—ฌ ์–ด๋–ค ์‹์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.
  • ํ˜‘์—…๊ฐ„์˜ ์˜์‚ฌ์†Œํ†ต์˜ ์ค‘์š”์„ฑ์— ๋Œ€ํ•ด์„œ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.
  • ์†Œ์ผ“ ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ์ ์— ๋Œ€ํ•ด์„œ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

โœ”๏ธ ํ•™์Šต ์ •๋ฆฌ ๊ณต์œ  ๋งํฌ:

โœ”๏ธ ์•„์‰ฌ์› ๋˜ ์ :

  • ํ”„๋กœ์ ํŠธ์˜ ์•„ํ‚คํ…์ณ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ ค๋ฅผ ๋งŽ์ด ํ•˜์ง€ ์•Š๊ณ  ์„ค๊ณ„ํ•œ ๊ฒƒ
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ํ•œ ์ค„๋„ ์ž‘์„ฑ ํ•ด๋ณด์ง€ ๋ชปํ•œ ๊ฒƒ
  • tanstack query์— ๋Œ€ํ•ด ์ž˜ ์•Œ์ง€ ๋ชปํ•˜๊ณ  ์‚ฌ์šฉํ•œ ์ 

โœ”๏ธ ๋ฆฌํŒฉํ† ๋ง ๊ฐœ์ธ ๋ชฉํ‘œ:

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

๐Ÿ  ๐‡๐จ๐ฆ๐ž

โš’๏ธ ๋ฆฌํŒฉํ† ๋ง

๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ

๐Ÿ“„ ๐๐ซ๐จ๐ฃ๐ž๐œ๐ญ ๐ƒ๐จ๐œ๐ฎ๐ฆ๐ž๐ง๐ญ๐š๐ญ๐ข๐จ๐ง

๐Ÿค ๐“๐ž๐š๐ฆ ๐‘๐ฎ๐ฅ๐ž๐ฌ

๐ŸŽ ๐“๐ž๐œ๐ก๐ง๐ข๐œ๐š๐ฅ ๐’๐ก๐š๐ซ๐ข๐ง๐ 

๐Ÿ”ซ ๐“๐ซ๐จ๐ฎ๐›๐ฅ๐ž๐ฌ๐ก๐จ๐จ๐ญ๐ข๐ง๐ 

Clone this wiki locally