Skip to content

MOAMOA Daily Sprint4

Donggyu edited this page Aug 18, 2022 · 22 revisions

8์›” 8์ผ

4์ฐจ ์Šคํ”„๋ฆฐํŠธ ๋ชฉํ‘œ

๋ ˆ๋ฒจ 4๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ์ด๋ฒˆ Sprint4 ๋ฅผ ๋๋‚ด๋Š” ์‹œ์ ์— ์‹ค์ œ ์‚ฌ์šฉ์ž๋“ค์ด ์„œ๋น„์Šค ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ์ตœ์ข… ๋ฐ๋ชจ๋ฐ์ด ๋•Œ ์ตœ์ข… ์„œ๋น„์Šค๋ฅผ ๊ณต๊ฐœํ•จ๊ณผ ๋™์‹œ์— ์šฐ๋ฆฌ ํฌ๋ฃจ๋“ค์ด ๋ ˆ๋ฒจ4 ๋™์•ˆ ํ–ˆ๋˜ ์Šคํ„ฐ๋”” ๋ชฉ๋ก๋„ ํ•จ๊ป˜ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

์Šคํ”„๋ฆฐํŠธ 4 ํ•ด์•ผ ํ•  ์ผ ์ •๋ฆฌ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-08-08 13 30 08

์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ๊ตฌํ˜„ํ•˜๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€์žฅ ํฐ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋˜๋Š” ๊ธฐ๋Šฅ๋“ค

  • ๋ฒ„๊ทธ ์ˆ˜์ • (QA)
  • ์ƒ์„ธ ํŽ˜์ด์ง€ ์ˆ˜์ • ๊ธฐ๋Šฅ
  • ๊ณต์ง€์‚ฌํ•ญ
  • ์ž๋ฃŒ์‹ค

์‚ฌ์šฉ์ž ์Šคํ† ๋ฆฌ

KakaoTalk_Photo_2022-08-08-14-12-31


8์›” 9์ผ (์ง‘์ค‘ํ˜ธ์šฐ๋กœ ๊ฒŒ๋”์—์„œ ๋ชจ์ž„)

์–ด์ œ ๊ฐ์ž ํ•œ ์ผ

  • ๋””์šฐ : ๋ ˆ๋ฒจ3 ๊ธ€์“ฐ๊ธฐ, ๊ธฐ์กด OAuth ๋ฆฌ๋งˆ์ธ๋“œ, RefreshToken ๋ฐœ๊ธ‰ ์™„๋ฃŒ
  • ๊ทธ๋ฆฐ๋ก 
    • ์ฃผ๋ง PR ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜(ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ตœ์ ํ™”)
    • ๋‚ด๊ฐ€ ์ฐธ์—ฌํ•œ ์Šคํ„ฐ๋”” ์˜ค๋ฅ˜ PR ์˜ฌ๋ฆฌ๊ธฐ
  • ๋ฒ ๋ฃจ์Šค : ์ฃผ๋ง ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ •๋ฆฌ ์™„๋ฃŒ (๋ฆฌ๋ทฐ ํ•„์š”)
  • ์งฑ๊ตฌ : '๋งํฌ ๋ชจ์Œ' ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
  • ํƒœํƒœ, ๋ณ‘๋ฏผ
    • main.js ์ตœ์ ํ™” (16MB -> 538KB -> 400KB)
    • ์—๋Ÿฌ ์ˆ˜์ • (ํฐํŠธ ๋ณ€๊ฒฝ, ๋ชจ์ง‘์ธ์› ๋ฌดํ•œ๋Œ€ ์ฒ˜๋ฆฌ, ๋”๋ณด๊ธฐ, ์Šคํ„ฐ๋”” ์ƒ์„ฑ์‹œ etc ์ˆ˜์ •)
      • etc(๊ธฐํƒ€) ํƒœ๊ทธ ์ถ”๊ฐ€ ํ•„์š”

์˜ค๋Š˜ ํ•  ์ผ

  • ๋””์šฐ : AccessToken ๋งŒ๋ฃŒ์‹œ RefreshToken ์„ ์ด์šฉํ•œ ์ฒ˜๋ฆฌ ๊ตฌํ˜„
  • ๊ทธ๋ฆฐ๋ก , ๋ฒ ๋ฃจ์Šค : ๊ณต์ง€์‚ฌํ•ญ & ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌํ˜„, ์˜ค๋Š˜์€ '์ปค๋ฎค๋‹ˆํ‹ฐ' ๋จผ์ € ๊ตฌํ˜„ ์‹œ์ž‘
  • ์งฑ๊ตฌ : ๋งํฌ ๋ชจ์Œ CRUD ๊ตฌํ˜„ ์ง„ํ–‰
  • ํƒœํƒœ, ๋ณ‘๋ฏผ
    • ๋ณ‘๋ฏผ์€ ์›นํŒฉ ์ด์šฉํ•ด์„œ ์ตœ์ ํ™” (๋นŒ๋“œ ์ตœ์ ํ™”)
    • Refresh Token ๊ตฌํ˜„
  • Refresh Token ๋™์ž‘๊ณผ์ •
    • accessToken์ด ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ์‘๋‹ต์ด ์™”์„ ๋•Œ refreshToken๊ณผ ํ•จ๊ป˜ accessToken์„ ๋ฐœ๊ธ‰ ์š”์ฒญํ•œ๋‹ค
    • ์ƒˆ๋กœ์šด accessToken์„ ๋ฐœ๊ธ‰๋ฐ›์œผ๋ฉด accessToken์„ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅํ•˜๊ณ , ๊ธฐ์กด์— ์š”์ฒญํ–ˆ๋˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค์‹œ fetch
    • refreshToken๋„ ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ์‘๋‹ต์ด ์˜ค๋ฉด ์ €์žฅ๋˜์–ด ์žˆ๋Š” accessToken์„ ์ œ๊ฑฐํ•˜๊ณ  ๋กœ๊ทธ์•„์›ƒ

8์›” 10์ผ

์–ด์ œ ํ•œ ์ผ ๊ณต์œ 

  • Refresh Token ๋งˆ๊ฐ์ธ์ค„ ์•Œ์•˜๋Š”๋ฐ, ์ข€ ๋” ์ž‘์—…ํ• ๊ฒŒ ์žˆ๋„ค...ใ… 
    • ์‹ค์ œ๋กœ ํ…Œ์ŠคํŠธํ•œ ๋ฒˆ ํ•ด๋ณด๊ณ  ์‹ถ์Œ
  • ๋ฆฐ๋ก  ๋ฒ ๋ฃจ์Šค : ์ปค๋ฎค๋‹ˆํ‹ฐ & ๊ณต์ง€์‚ฌํ•ญ ์ƒ์„ฑ ๋ถ€๋ถ„ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ๊ฒ€์ฆ ๋ชปํ•œ ๋ถ€๋ถ„ ์žˆ์Œ
  • ์งฑ๊ตฌ : ์Šคํ„ฐ๋””์›์„ ์œ„ํ•œ ๋งํฌ๋ชจ์Œ C, U, D ๊ตฌํ˜„ ์™„๋ฃŒ (Soft DELETE๋กœ ์‚ญ์ œ ๊ตฌํ˜„ํ•˜์˜€์Œ)
  • ํƒœํƒœ : Refresh Token ๋กœ์ง ๊ตฌํ˜„
  • ๋ณ‘๋ฏผ : ์ตœ์ ํ™” ์ง„ํ–‰ (๋นŒ๋“œ ์†๋„ 5๋ฐฐ)

์˜ค๋Š˜ ํ•  ์ผ ๊ณต์œ 

  • ์งฑ๊ตฌ : ์Šคํ„ฐ๋””์›์„ ์œ„ํ•œ ๋งํฌ๋ชจ์Œ R ๊ตฌํ˜„
  • ๋ฆฐ๋ก  ๋ฒ ๋ฃจ์Šค : C ๋ถ€๋ถ„ ์™„์„ฑ, ๋‚˜๋จธ์ง€ RUD ๊ตฌํ˜„ ์ง„ํ–‰
  • ๋””์šฐ : Refresh Token ๋งˆ๋ฌด๋ฆฌ ํ•˜๊ธฐ, ์‹œ๊ฐ„ ๋˜๋ฉด Flyway ์ ์šฉํ•˜๊ธฐ
  • ๋ณ‘๋ฏผ : ๊ณต์ง€์‚ฌํ•ญ UI ๊ตฌํ˜„ ์‹œ์ž‘
  • ํƒœํƒœ : Refresh Token ๋งˆ๋ฌด๋ฆฌ ๋ฐ ๋ฐฐํฌ ํ™•์ธ, ์งฑ๊ตฌ์™€ API ์ˆ˜์ • ์–˜๊ธฐ ํ•  ์˜ˆ์ •

๋งํฌ ๋ชจ์Œ

  • URL ๋งŒ ๋„˜๊ฒจ์ฃผ๋ฉด ๋งค๋ฒˆ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํ•ด์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(๋งํฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์˜ ์ œ๋ชฉ์ด๋‚˜ ํ•œ ์ค„ ์„ค๋ช… ๋“ฑ)๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผํ•˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ๊ฒƒ์ธ๊ฐ€?
    • ๋ฐฑ์—”๋“œ DB์— ํ•จ๊ป˜ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋Ÿผ UPDATE๋Š”?
    • ์บ์‹œ์„œ๋ฒ„๋ฅผ ๋‘์–ด์„œ ์ผ์ •์ฃผ๊ธฐ๋กœ UPDATE ํ•ด์ค€๋‹ค. ๊ฐ€์žฅ ๊ดœ์ฐฎ์€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ํ˜„์žฌ ์šฐ๋ฆฌํŒ€์—์„œ ์บ์‹œ ์„œ๋ฒ„๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณธ ์‚ฌ๋žŒ์ด ์—†์–ด ๋ฐ”๋กœ ๋„์ž…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

8์›” 11์ผ

์–ด์ œ ์ง„ํ–‰ ์‚ฌํ•ญ ๊ณต์œ 

  • ๋””์šฐ : Refresh Token ์™„๋ฃŒ ํ•ด์„œ ๋ฆฌ๋ทฐ ํ•„์š”
  • ์งฑ๊ตฌ : ์Šคํ„ฐ๋””์›์„ ์œ„ํ•œ ๋งํฌ ๋ชจ์Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ, ๋ฆฌํŒฉํ† ๋ง ํฌํ•จํ•ด์„œ ์™„๋ฃŒ (๋ฆฌ๋ทฐ ํ•„์š”)
  • ๋ฆฐ๋ก , ๋ฒ ๋ฃจ์Šค : ์ปค๋ฎค๋‹ˆํ‹ฐ CDR(๋‹จ๊ฑด์กฐํšŒ๋งŒ ์ง„ํ–‰ํ•œ ์ƒํƒœ)
  • ํƒœํƒœ : Refresh Token ๋ฌธ์ œ ๋ฐœ์ƒ
    • Access Token ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„ ์–ป๋Š” ํ•จ์ˆ˜๊ฐ€ ์ž˜ ์•ˆ๋˜์—ˆ์Œ
    • Backend์—์„œ ์ฃผ๋Š” ๊ฑธ๋กœ
  • ๋ณ‘๋ฏผ : Util ํ•จ์ˆ˜ ๋งŒ๋“ค์—ˆ์Œ. (์Šคํƒ€์ผ ๊ด€๋ฆฌ(์ž‘์„ฑ)๋ฅผ ๋” ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฆฌํŒฉํ† ๋ง)

์˜ค๋Š˜ ์ง„ํ–‰ ์‚ฌํ•ญ ๊ณต์œ 

  • ๋ฆฐ๋ก , ๋ฒ ๋ฃจ์Šค : ์ปค๋ฎค๋‹ˆํ‹ฐ ์ „์ฒด ์กฐํšŒ, ์—…๋ฐ์ดํŠธ
  • ํƒœํƒœ : Refresh Token ์˜ค๋Š˜๋„ ์ด์–ด์„œ ์ง„ํ–‰ํ• ๋“ฏ
  • ๋””์šฐ : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง (์‰ฝ์ง€ ์•Š๋‹ค.)
  • ์งฑ๊ตฌ : Refresh Token ๋ฆฌ๋ทฐ, ๋””์šฐ๋ž‘ ํŽ˜์–ดํ•ด์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
  • ๋ณ‘๋ฏผ : Util ํ•จ์ˆ˜ ๊ฐœ์„ 

8์›” 12์ผ

์–ด์ œ ์ง„ํ–‰ ์‚ฌํ•ญ ๊ณต์œ 

  • Refresh Token ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ˜์˜ (๋ฒ ๋ฃจ์Šค ๋ฆฌ๋ทฐ ํ•„์š” ใ… ใ… )

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง(jdbcTemplate ์ œ๊ฑฐ ๋ฐ Firxture ๊ฐœ์„ )

    • ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ•„์š”
  • ์Šคํ„ฐ๋”” ๊ฐ€์ž… ๋‚ ์งœ ๋ฐ ์Šคํ„ฐ๋”” ๊ฐœ์ˆ˜ ๊ตฌํ˜„ ์™„๋ฃŒ

    • ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ•„์š”
  • ๋ฆฐ๋ก , ๋ฒ ๋ฃจ์Šค : ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œ๊ธ€ ์™„๋ฃŒ

  • ์งฑ๊ตฌ : ์Šคํ„ฐ๋””์›์„ ์œ„ํ•œ ๋งํฌ ๋ชจ์Œ ์ˆ˜์ • ๋ฐ ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

  • ํ”„๋ก ํŠธ

    • Refresh Token ๋งˆ๋ฌด๋ฆฌ
    • ๋งํฌ ๋ชจ์Œ UI ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ• ์ง€ ์ƒ๊ฐ
    • FE ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค ๊ฐœ์„  Merge
    • ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œํŒ ์ƒ์„ฑ UI ๊ตฌํ˜„ ์‹œ์ž‘

์˜ค๋Š˜ ์ง„ํ–‰ ์‚ฌํ•ญ ๊ณต์œ 

  • RefreshToken Merge ๋˜๋ฉด ์—๋Ÿฌ ์žˆ๋Š”์ง€ ํ™•์ธ

  • ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œํŒ ์ƒ์„ฑ UI ์ด์„œ์„œ ์ง„ํ–‰

  • FE ๋งํฌ ๋ชจ์Œ UI ๊ตฌํ˜„ ์‹œ์ž‘

  • ๋ฆฐ๋ก , ๋ฒ ๋ฃจ์Šค : ๊ณต์ง€์‚ฌํ•ญ ์ด์–ด์„œ ํŽ˜์–ด๋กœ ์ž‘์—…

  • ์งฑ๊ตฌ : ์Šคํ„ฐ๋”” ์ƒ์„ธ ์ •๋ณด ์ˆ˜์ • & ์Šคํ„ฐ๋”” ๋ชจ์ง‘ ์ธ์› ์ˆ˜์ • ์ง„ํ–‰ ์˜ˆ์ •

  • ๋””์šฐ : ์Šคํ„ฐ๋”” ํƒœ๊ทธ ์ถ”๊ฐ€ & ์Šคํ„ฐ๋”” ํƒœ๊ทธ ์‚ญ์ œ ๋ฐ (์ •์  ๋ถ„์„ ๋ฆฌํฌํŠธ๋ฅผ ๊ณต์œ , CloudWatch logs ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๊ตฌ์„ฑ) ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ ํ•™์Šต


8์›” 16์ผ

์ •์  ๋ถ„์„ ๋ฆฌํฌํŠธ(Sonar Qube)

  • ๊ทธ๋ฆฐ๋ก , ์งฑ๊ตฌ

CloudWatch logs

  • ๋””์šฐ, ๋ฒ ๋ฃจ์Šค

์Šคํ”„๋ฆฐํŠธ4 ๋‚จ์€ ์ž‘์—… ์ง„ํ–‰ ์ƒํ™ฉ ๊ณต์œ 

  • ๋ณ‘๋ฏผ : ์ปค๋ฎค๋‹ˆํ‹ฐ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“œ๋Š” ์ค‘
  • ํƒœํƒœ : ์ž๋ฃŒ ๊ณต์œ  ํŽ˜์ด์ง€ ๋งŒ๋“œ๋Š” ์ค‘
  • ๊ทธ๋ฆฐ๋ก  & ์งฑ๊ตฌ : ์ •์  ๋ฌธ์„ ๋ฆฌํฌํŠธ ์ง„ํ–‰ ์ค‘

8์›” 17์ผ

์–ด์ œ ํ•œ ์ผ ๊ณต์œ 

  • ์งฑ๊ตฌ, ๋ฆฐ๋ก  : ์ •์  ๋ถ„์„ ๋ฆฌํฌํŠธ ์ƒ์„ฑ ๊นŒ์ง€ ์™„๋ฃŒ
  • ์งฑ๊ตฌ : ์Šคํ„ฐ๋””์› ํƒˆํ‡ด ๊ตฌํ˜„ ์™„๋ฃŒ
  • ๋””์šฐ : ์Šคํ„ฐ๋”” ์ƒ์„ธ ์ˆ˜์ • ๊ตฌํ˜„ ์™„๋ฃŒ
  • ๋ฒ ๋ฃจ์Šค : ์ฑ… ์ฝ๊ธฐ
  • ํƒœํƒœ : ๋งํฌ ๋ชจ์Œ ํƒญ CRUD ๊ตฌํ˜„ & ๋งํฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐฐํฌ
  • ๋ณ‘๋ฏผ : ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œํŒ ๋งŒ๋“œ๋Š” ์ค‘

์˜ค๋Š˜ ์ง„ํ–‰ํ•  ์‚ฌํ•ญ

  • ๋ฒ ๋ฃจ์Šค, ๋””์šฐ : CloudWatch Logs
  • ๊ทธ๋ฆฐ๋ก  : ์ •์  ๋ถ„์„ ๋ฆฌํฌํŠธ PR์— Summary ๋ณด์—ฌ์ฃผ๊ธฐ ์ง„ํ–‰
  • ์งฑ๊ตฌ : ์Šคํ„ฐ๋””์› ํƒˆํ‡ด PR ์˜ฌ๋ฆฌ๊ธฐ, ๋งํฌ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  • ๋ณ‘๋ฏผ : ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œํŒ ์ด์–ด์„œ ๊ตฌํ˜„
  • ํƒœํƒœ : ์Šคํ„ฐ๋””์› ํƒˆํ‡ด & ์ƒ์„ธ ํŽ˜์ด์ง€ ์ˆ˜์ •

8์›” 18์ผ

QA ์ง„ํ–‰

๋ฐœ๊ฒฌ๋œ ๋ฒ„๊ทธ

  • ๋‚ด ์Šคํ„ฐ๋””์—์„œ ์Šคํ„ฐ๋””๋ฐฉ ๋“ค์–ด๊ฐ”์„ ๋•Œ ์ž˜๋ชป๋œ ์ ‘๊ทผ์ด๋ผ๊ณ  ๋œธ

    • NON_MEMBER๋กœ ์ž˜๋ชป ์˜ด
    • ๋‚ด๊ฐ€ ๊ฐ€์ž…ํ•œ ์Šคํ„ฐ๋”” ๋ชฉ๋ก์—๋Š” ๋œธ
  • ํ•ด๊ฒฐ

    • Participant ์— LocalDate ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด์„œ LocalDate(๊ฐ€์ž…๋‚ ์งœ)๊นŒ์ง€ eq & hc ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์—ˆ์Œ. memberId ๋งŒ์œผ๋กœ ๋น„๊ตํ•˜๋„๋ก ์ˆ˜์ •
  • ๋งํฌ ๋ชจ์Œ ๋“ฑ๋กํ•˜๋Š” ์‚ฌ๋žŒ: PERSON์œผ๋กœ ๋˜์–ด ์žˆ์Œ

  • ๋งํฌ ๋ฐ์ดํ„ฐ ์ฆํญ ๋ฌธ์ œ [ํ•ด๊ฒฐ]

    • ๋งํฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์•„๋ž˜๋กœ ๋‚ด๋ฆฌ๋ฉด ๊ณ„์† ์ฆ๊ฐ€๋จ
    • hasNext : ๊ณ„์† true
    • Limit, offset ์—†์Œ

Front ๊ตฌํ˜„ํ•ด์•ผํ•  ๋‚ด์šฉ

  • ์ปค๋ฎค๋‹ˆํ‹ฐ (๊ฒŒ์‹œํŒ)
  • ์Šคํ„ฐ๋”” ๊ฐ€์ž… ๋‚ ์งœ ๋ฐ ๊ฐ€์ž…ํ•œ ์Šคํ„ฐ๋”” ๊ฐœ์ˆ˜
Clone this wiki locally