- ๋ชฉ์ : ์ ๋ฌํ๋ ์ ๋ณด์ ํ๋น์ฑ ๊ฒํ ๋ฐ ์ง์ ํฅ์
- ์ ์ฉ ๋์: GitHub pull request๋ก ์ฌ๋ผ๊ฐ ๊ธฐ์ ๋ธ๋ก๊ทธ ํฌ์คํธ
- ๋ฐฉ๋ฒ: GitHub pull request ์ฝ๋ฉํธ ๋๋ ์ฌ๋ด ๋ฉ์ ์ ๋ฅผ ํตํด ์ ๋ฌ
- ์คํ์, ๋ฌธ๋ฒ, ๋ฌธ๋งฅ ์ค๋ฅ.
- ์ ๋ฌํ๋ ๋ด์ฉ์ด ๊ฒํ ์ ๋ณธ์ธ์ด ์๊ณ ์๋ ์์์ด๋ ๊ธฐ์ ์ ์ง์๊ณผ ์์ดํ์ง ์์์ง.
- ์ด๋ค ๊ธฐ์ ์ ๊ฐ๋ ์ ๋ํ ์ค๋ช ์ด ์ถฉ๋ถํ์ง ์์ ๋ถ๊ฐ์ ์ธ ์ค๋ช ์ด ํ์ํ์ง.
- ์ด๋ค ๊ธฐ์ ์ ๊ฐ๋ ์ ๋ํ ์์๊ฐ ์ ์ ํ์ง.
- ์ต๊ทผ ๋ํฅ์ผ๋ก ์ค๋ช ๋๊ณ ์๋ ๋ถ๋ถ์ด ๋ณธ์ธ์ด ์๊ณ ์๋ ๊ฒ๊ณผ ์์ดํ์ง.
- ๋ฌธ์ฅ์ ํํ ๋ฐ ์์ ๋ฐฉ์์ด ์ด์ํ๊ฑฐ๋ ์ ๋ฌธ ๋ถ์ผ์ ๋ฌธ์ฒด์ ํฌ๊ฒ ์์ดํ์ง ์์์ง.
- ๊ฐ๋ ๋ฐ ๋ํฅ์ ๋ํ ์ค๋ช ์ ๋ณด์กฐํ๊ธฐ ์ํด ์ถ๊ฐ๋ ๊ทธ๋ฆผ์ด๋ ํ๊ฐ ์ ์ ํ์ง.
- ๋จ๋ฝ, ํ, ๊ทธ๋ฆผ์ ์ ๋ชฉ์ด ๋ด์ฉ๊ณผ ์์ถฉํ์ง ์๊ฑฐ๋ ์ ์ ํ์ง ์์์ง.
- ๊ธฐํ ๋ณด์ ๋ฐ ์์ ์ฌํญ ์ ๋ฌ.
๋ชฉํ
๊ธ๋ฃจ์์ค ๊ธฐ์ ๋ธ๋ก๊ทธ๋ ๊ธ๋ฃจ์์ค ์์ง์์ ๊ธฐ์ ์ญ๋์ ํฌ์คํธ์ ๋ด์๋ด ์ธ๋ถ์ ์ดํํ๋ ์จ๋ผ์ธ ์ฑ๋๋ก, ๋ค์๊ณผ ๊ฐ์ ๋ชฉํ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ์ ๊ณต ์ฝํ ์ธ ์ ๋ํ ๋์ ์ ๋ฌธ์ฑ ๋ฐ ๊ฐ๊ด์ฑ์ ๋ถ๊ฐํด ๊ธฐ์ ๊ณผ ์ ํ ๊ธฐ์ ์ ๋ํ ๋์ ์ ๋ขฐ ํ์ฑ์ ๋ชฉํ
- ๊ด๋ จ ๋ถ์ผ์ ๊ด์ฌ์ด ์๋ ๊ด๋ จ ์ ๊ณ ์ข ์ฌ์, ์ ์ฌ๊ณ ๊ฐ, ๊ตฌ์ง์ ๋์์ผ๋ก ์ธ์ง๋ ํ๋ณด๋ฅผ ๋ชฉํ
๊ด๋ฆฌ
๊ธ๋ฃจ์์ค ๊ธฐ์ ๋ธ๋ก๊ทธ๋ ๊นํ๋ธ(GitHub)๋ก ๊ด๋ฆฌ๋๋ฉฐ, ์ฐ๊ตฌ์ ๊ฐ๋ฐ 3ํ์ ๊น์งํ ์ฐ๊ตฌ์์ด ๋ด๋น์์ ๋๋ค.
- ๊ธ๋ฃจ์์ค ๊ธฐ์ ๋ธ๋ก๊ทธ ๊นํ๋ธ ์ฃผ์: https://github.com/gluesys/tech-blog
์ ๋ก๋ ์๊ธฐ
๋ธ๋ก๊ทธ ํฌ์คํธ๋ ๋งค์ ์ฐ๊ตฌ์์์ 1๊ฑด, ๊ธฐ์ ๋ถ์ ๋ง์ผํ ํ์์ 1๊ฑด์ผ๋ก ๋งค์ 2๊ฑด์ฉ ์ ๋ก๋ํ๋ ๊ฒ์ด ๋ชฉํ์ด๋ฉฐ, ๋งค์ 3~4์ฃผ ์ฐจ(๋๋ต 19์ผ~25์ผ ์ฌ์ด) ๋ง์ผํ ํ์ ์ธ๋ถ ๋ด์ค๋ ํฐ ์๊ธฐ์ ๋ง์ถ์ด ์ ๋ก๋ํ ํ์๊ฐ ์์ต๋๋ค.
ย
๊ธ๋ฃจ์์ค์์๋ ๊ธฐ์ ๋ธ๋ก๊ทธ ํฌ์คํธ ์์ฑ ์ ๋ค์๊ณผ ๊ฐ์ ์ธ์ผํฐ๋ธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ฐ๊ธฐ๋ณ ํฌ์ ์ ๋
- ์ง๊ธ ์๊ธฐ: ๊ธฐ๋ณธ ์ธ์ผํฐ๋ธ๋ ์ ๋ก๋ ์ ์ ๊ณต, ํฌ์์ ์๋ฐ๊ธฐ์ ํ๋ฐ๊ธฐ ์ํฌ์ต ๋๋ ์๋กํ์ ๋ ์ ๊ณต
- ๊ธฐ๋ณธ ์ธ์ผํฐ๋ธ: ์์ฑ ํฌ์คํธ ๋น ์ํ๊ถ 3๋ง ์
| ํฌ์ | ๋ด์ฉ | ๊ธ์ก |
|---|---|---|
| ์ธ๊ธฐ ํฌ์คํธ์ | ์ ๊ท ํฌ์คํธ ์ค ๊ธฐ๊ฐ ๋ด ๋ฐฉ๋ฌธ ์ ๋ฐ ์ฌ๋ฐฉ๋ฌธ ์๊ฐ ๊ฐ์ฅ ๋ง์ ํฌ์คํธ ๋์ | 10๋ง ์ |
| ์ฐ์ ํฌ์คํธ์ | ์ ๊ท ํฌ์คํธ ์ค ๊ธฐ๊ฐ ๋ด ํ๊ท ์ฒด๋ฅ์๊ฐ์ด ์์ ์์น์ ๊ทผ์ , ์ดํ๋ฅ ๋ฐ ์ข ๋ฃ์จ์ด ๊ฐ์ฅ ๋ฎ์ ํฌ์คํธ ๋์ | 10๋ง ์ |
| ๋ ธ๋ ฅ์ | ๊ธฐ๊ฐ ๋ด ํฌ์คํธ ์์ฑ ์๊ฐ ๊ฐ์ฅ ๋ง์ ์ฌ์ ๋์ (๋๋ฅ ๋ฐ์ ์ ๋ถํ ์ง๊ธ) | 10๋ง ์ |
- ํฌ์คํธ ์ ๋ก๋ ํ 2๋ฌ ํ์ ์ธก์ . ์ค์ง์ ์ผ๋ก ์๋ฐ๊ธฐ๋ ์ ๋ ๋ 12์~5์, ํ๋ฐ๊ธฐ๋ 6์~11์์ ์์ฑ๋ ํฌ์คํธ๋ง ์ธก์ ๊ฐ๋ฅ.
- ์ํํ ํต๊ณ ์ง๊ณ๋ฅผ ์ํด์๋ ์์ด ์ ๋ก๋๋ฅผ ์งํฅ.
- ํฌ์คํธ ์ ๋ก๋๋ ๋งค์ 1๋ฒ๊น์ง๋ง ๊ฐ๋ฅํ๋ฉฐ, ์ฐ์ ์ ๋ก๋๋ 2๋ฒ๊น์ง๋ง ๊ฐ๋ฅ.
ย
๊ธฐ์ ๋ธ๋ก๊ทธ ํฌ์คํธ๋ฅผ ์์ฑํ๊ธฐ๋ก ์
๋ฌด์ ํ ๋น๋์๋ค๋ฉด, ์ฐ์ ํฌ์คํธ์ ์ฃผ์ ๋ฅผ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
๊ธ๋ฃจ์์ค ๊ธฐ์ ๋ธ๋ก๊ทธ๋ ๋ค์๊ณผ ๊ฐ์ด 6๊ฐ์ง ์ ํ์ ํฌ์คํธ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ธ๋ก๊ทธ์ ๋ชฉ์ ์ ๋ง๊ฒ ํด๋น ์ ํ๋ค์ ๊ธฐ๋ฐ์ผ๋ก ๋ธ๋ก๊ทธ ํฌ์คํธ์ ์ฃผ์ ๋ฅผ ์ ์ ํ ํ์๊ฐ ์์ต๋๋ค.
์๋ ์ ํ๋ค์ ์ ์ธํ ๋ค๋ฅธ ์ ํ์ ํฌ์คํธ๋ฅผ ์์ฑํ๊ณ ์ถ์ ๊ฒฝ์ฐ, ๊ธฐ์ ๋ธ๋ก๊ทธ ๋ด๋น์์ ๋
ผ์ ํ ๊ฒฐ์ ํ ํ์๊ฐ ์์ต๋๋ค.
| ํฌ์คํธ ์ ํ | ์ฃผ ๋ด์ฉ | ํ๊ฒ ๋ ์ |
|---|---|---|
| ๊ธฐ์ด ์ง์ | ๊ธฐ๋ณธ์ด ๋๋ ๊ธฐ์ ์ ๊ฐ๋ , ํ์ ๋ฐฐ๊ฒฝ, ์ธ๋ถ ๋ถ๋ฅ, ์ฐ๊ด ๊ธฐ์ , ๊ธฐ์ ๋น๊ต, ์ ์ฉ ๋ถ์ผ ๋ฑ ์ต์ํ์ IT ๋ฐฐ๊ฒฝ์ง์์ด ์๊ตฌ๋๋ ์์ค์ ๋ด์ฉ์ผ๋ก ๊ตฌ์ฑ. | ํด๋น ๊ธฐ์ ๋ถ์ผ์ ๊ด์ฌ ์๋ ๋น์ ๋ฌธ๊ฐ |
| ์ฌํ ์ง์ | ๊ธฐ์ ์ ์ ์ฉ ๋ฐฉ๋ฒ ๋ฐ ์ ์ฐจ, ํน์ ํ๊ฒฝ์์์ ์ฌ์ฉ, ํน์ ๊ฒฝ์ฐ์ ๋์ฒ, ์ค์ ์ฌ๋ก ์๊ฐ ๋ฑ ์์ฉ์ ์ธ ์์ ์ค์ฌ์ผ๋ก ๊ตฌ์ฑ. ๊ธฐ์ด์ง์ ํฌ์คํธ์ ์ฐ๊ณํด์ ์๋ฆฌ์ฆ๋ก ๊ตฌ์ฑ ๊ฐ๋ฅ. | ๊ธฐ์ ์ ์์ฉ ๋ฐฉ๋ฒ์ ๊ด์ฌ ์๋ ๋น์ ๋ฌธ๊ฐ |
| ๊ธฐ์ ๋ํฅ | ์ต์ ๊ธฐ์ ํธ๋ ๋์ ๊ด๋ จ ํค์๋๋ฅผ ์๊ฐํ๊ณ , ํน์ ์ฐ์ ๋ฐ ๋ถ์ผ์ ํน์ฑ๊ณผ ์ด์ ์๊ตฌ๋๋ ๊ธฐ์ ์ ๋ํ ์๊ฐ๋ฅผ ์์ฃผ๋ก ๊ตฌ์ฑ. ๊ธฐ์ด์ง์ ํฌ์คํธ์๋ ๋ฌ๋ฆฌ ์ต์ ๊ธฐ์ ์์ฃผ๋ก ์ฃผ์ ์ ์ . | ์ต์ ๊ธฐ์ ํธ๋ ๋์ ๊ด์ฌ ์๋ ์ ๊ณ ์ข ์ฌ์ |
| ์ด๋ฒคํธ ํ๊ธฐ | ๊ธฐ์ ์ธ๋ฏธ๋, ์ ์ํ, ๊ฐ์ฐ ๋ฑ์ ์ด๋ฒคํธ ์ฐธ๊ฐ ํ ์ ๊ณ ์ข ์ฌ์ ๋ฐ ์ ๋ฌธ๊ฐ ์ ์ฅ์์ ์ต์ ๊ธฐ์ ํธ๋ ๋, ํ์ฌ ๋ํฅ ๋ฑ ๊ฒฝํํ ๋ด์ฉ์ ์์ ๊ณผ ๊ทธ์ ๋ํ ๊ฒฌํด ์์ฃผ๋ก ๊ตฌ์ฑ. | ์ต์ ๊ธฐ์ ํธ๋ ๋์ ๊ด์ฌ ์๋ ์ ๊ณ ์ข ์ฌ์ |
| ํ ์คํธ ๋ฐ ํด๊ฒฐ | ํน์ ํ๊ฒฝ์์์ ์ฑ๋ฅ, ๊ฐ์ฉ์ฑ ๋ฑ์ ์ฆ๋ช ํ๊ฑฐ๋ ํน์ ์ด์ ๋ฐ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ํ ๋ด์ฉ๋ค๋ก ์์ฑ. ํ ์คํธ๋ ํด๊ฒฐ์ฑ ์ ๋ํ ๋ฐฉ๋ฒ๋ก ์ ์ ์ํ๊ณ ๊ทธ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ์ค๋ช . | ํด๋น ํ ๋ง ๊ด๋ จ ์ ๋ฌด๋ฅผ ์ํํ๋ ์ ๋ฌธ๊ฐ |
| ์ ํ ์ฌ์ฉ๊ธฐ | ์ ๊ณ๋ ์ ๋ฌด์ ๊ด๋ จ ์๋ ์ ํ ๋ฐ ํด์ ๋ํ ๊ฐ์, ์ฉ๋, ์ญ์ฌ, ๊ตฌ์กฐ, ์ฌ๋ก ๋ฑ์ ์๊ฐํ๊ณ , ์ค์น๊ณผ์ , ๊ธฐ๋ฅ ๋ฑ์ ์ค๋ช ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ. ์ ํ ๋ฆฌ๋ทฐ ๋๋์ผ๋ก ์์ . | ํด๋น ์ ํ ๋ฐ ํด์ ์ฌ์ฉํ๊ณ ์ ํ๋ ์ค๋ฌด์ |
ย
๊ธฐ์ ๋ธ๋ก๊ทธ ํฌ์คํธ์ ์ฃผ์ ๊ฐ ์ ์ ๋์๋ค๋ฉด, ํฌ์คํธ์ ์ฃผ์ ์ ์์ฑ ์งํ ์ผ์ ์ ๋งคํฐ๋ชจ์คํธ๋ ์ด๋ฉ์ผ๋ก ํ ๋ด๋ถ์ ๋ง์ผํ
ํ์ ์ ๋ฌํด์ผ ํฉ๋๋ค.
๋ง์ผํ
ํ์ ์ผ์ ์ ๊ณต์ ํ๋ ์ด์ ๋ ๋ง์ผํ
ํ์ ๋ด์ค๋ ํฐ ๋ฐฐํฌ ์ผ์ ์ ์ ์์ฑ์ด ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์์ฑ๋ ํฌ์คํธ๊ฐ ์ต์ข ์ ์ผ๋ก ๋ธ๋ก๊ทธ์ ์ ๋ก๋๋๋๋ฐ๊น์ง ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋, ์ฐธ๊ณ ํ ์ผ์ ์ ์กฐ์ ํ๊ธฐ ๋ฐ๋๋๋ค.
- ํฌ์คํธ ์์ฑ
- ์์ฑ๋ ํฌ์คํธ๋ฅผ ๊นํ๋ธ์ ํ ๋ฆฌํ์คํธ ์ฌ๋ฆฐ ํ ํผ๋๋ฐฑ ๋๊ธฐ
- ํผ๋๋ฐฑ ๋์
ย
๋ธ๋ก๊ทธ ํฌ์คํธ๋ ๋งํฌ๋ค์ด(.md) ํ์ผ๋ก ์
๋ก๋๋๋ฉฐ, ๋งํฌ๋ค์ด ํ์ผ์ ์์ ํ ์ ์๋ ํด์ ํ์ฉํด ์์ฑํด์ผ ํฉ๋๋ค.
์ด๋ค ํด์ ์จ์ผํ ์ง ๋ชจ๋ฅด๋ ๋ถ๋ค์๊ฒ๋ Notepad++๋ฅผ ์ถ์ฒํฉ๋๋ค. Notepad++๋ ํด๋น ๋งํฌ ์์ ๋ค์ด๋ก๋ ํ ์ ์์ต๋๋ค.
ย
๊ธ๋ฃจ์์ค ๊ธฐ์ ๋ธ๋ก๊ทธ์ ํฌ์คํธ๋ ๋งํฌ๋ค์ด ํ์ผ๋ก ์์ฑ๋๋ฉฐ, HTML๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋งํฌ๋ค์ด ๋ฌธ๋ฒ๊ณผ ๊ด๋ จํด์๋ ๋ค์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๊ธฐ ๋ฐ๋๋๋ค: https://gist.github.com/ihoneymon/652be052a0727ad59601
ย
๊ธ๋ฃจ์์ค ๊ธฐ์ ๋ธ๋ก๊ทธ ๊นํ๋ธ์ ๊ธฐ์กด์ ์์ฑ๋ ๋ธ๋ก๊ทธ ํฌ์คํธ ๋ค์ ํ
ํ๋ฆฟ ์ผ์ ํฌ์คํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
ํฌ์คํธ ํ์ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์์์ ๋ฐ๋ผ์ผ ํฉ๋๋ค:
- ํ์ผ๋ช
:
ํ์ผ๋ช์ ๋ ์ง์ ํฌ์คํธ ์ฃผ์ ์์ฝ(์๋ฌธ)์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค(์: 2022-09-21-TrueNAS). - ๋ฌธ์ ์ ๋ณด:
๋ฌธ์ ์ ๋ณด๋ ํฌ์คํธ ๋ด์ฉ์ ์ต์๋จ์ ์์นํ๋ฉฐ,layout,title,date,categories,author,tags,cover,main์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.layout: ๋ฌธ์์ ์ ํ์ ํ์ํ๋ ๋ถ๋ถ์ด๋ ํ ํ๋ฆฟ๋๋ก ๋๋๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.title: ํฌ์คํธ์ ์ ๋ชฉ์ ์ ๋ ๋ถ๋ถ์ผ๋ก, ํฐ๋ฐ์ดํ("") ์์ ๋ด์ฉ์ ๋ฃ์ด์ผ ํฉ๋๋ค.date: ํฌ์คํธ ์ ๋ก๋ ๋ ์ง๋ฅผ ์ ๋ ๋ถ๋ถ์ผ๋ก,ํ์ผ๋ช์ ๋ ์ง์ ๋์ผํ๊ฒ ์์ฑํด์ผ ํฉ๋๋ค. ๋ ์ง ํฌ๋งท์yyyy-mm-dd์ ๋๋ค.categories: ๋ธ๋ก๊ทธ ์ฌ์ดํธ์ ์๋จ ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ถ์ผ๋ก, ํ์ฌ๋ก๋ ํ ํ๋ฆฟ๋๋ก ๋๋๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.author: ์์ฑ์๋ฅผ ๋งํ๋ฉฐ, ํฌ๋งท์์ด๋ฆ (์ด๋ฉ์ผ ์ฃผ์)์ ๋๋ค.tags: ํฌ์คํธ ๋ด์ฉ๊ณผ ๊ด๋ จ๋ ํ๊ทธ๋ฅผ ๋งํฉ๋๋ค. ํ๊ทธ๋ ํ๊ตญ์ด์ ์์ด๋ฅผ ๋ณํํด ์์ฑํด์ผ ํ๋ฉฐ, ํฌ๋งท์[ํ๊ทธ1, tag1, ํ๊ทธ2, tag2, ...]์ ๋๋ค. ์์ด ํ๊ทธ๋ ๋ณดํต๋ช ์ฌ๋ผ๋ ์ฒซ ๊ธ์๋ ๋๋ฌธ์๋ก ์จ์ผ ํฉ๋๋ค.cover: ํฌ์คํธ ์๋จ์ ๋ฐฐ๋ ์ด๋ฏธ์ง๋ฅผ ๋งํ๋ฉฐ, ํฐ๋ฐ์ดํ("") ์์ ์ด๋ฏธ์ง์ ์์น๋ฅผ ๋ฃ์ด์ผ ํฉ๋๋ค(์: "/assets/SPDK_maincover.jpg"). ๋ฐฐ๋๋ ํ๋ฉด ํญ ์ ์ฒด๋ก ์๋ ค ํ์๋๊ณ ๊ทธ ์์ ๋จ์ ๋ง๊ณผ ์ ๋ชฉ์ด ์ฌ๋ผ๊ฐ๋ฏ๋ก, ๊ฐ๋ก๋ก ๊ธด ์ฌ์ง์ด๋ ์ถ์ ์ด๋ฏธ์ง๊ฐ ์ ์ด์ธ๋ฆฝ๋๋ค. ๋งํฌ ๊ณต์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ด๋ฏธ์ง๋ก๋ ์ฐ์ ๋๋ค. ํฌ์คํธ์ ์ฐ์ผ ์ด๋ฏธ์ง ์์น๋static/assetsํด๋์ ๋ฃ์ด์ผ ํ๋ ์ฐธ๊ณ ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ๋ฃ์ง ์์ผ๋ฉด ๋ฐฐ๋ ์์ด ํ์๋ฉ๋๋ค.main: ๊ธ ๋ชฉ๋ก๊ณผ ๊ฒ์ ๊ฒฐ๊ณผ์ ํ์๋๋ ์ธ๋ค์ผ ์ด๋ฏธ์ง๋ฅผ ๋งํ๋ฉฐ, ํฐ๋ฐ์ดํ("") ์์ ์ด๋ฏธ์ง์ ์์น๋ฅผ ๋ฃ์ด์ผ ํฉ๋๋ค(์: "/assets/SPDK_maincover.jpg").cover์๋ ๋ณ๊ฐ์ด๋ฉฐ, ๋ฃ์ง ์์ผ๋ฉด ์ธ๋ค์ผ ์์ด ํ์๋ฉ๋๋ค. ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ์จ๋ ๋์ง๋ง, ๋ฐฐ๋์ฉ ์ด๋ฏธ์ง๊ฐ ์ธ๋ค์ผ๋ก ์ฐ๊ธฐ์ ๋๋ฌด ๋๊ฑฐ๋ ๋ณต์กํ๋ฉด ๋ฐ๋ก ์๋ผ ๋ง๋ ์ด๋ฏธ์ง๋ฅผ ๋ฃ์ต๋๋ค.
- ํฌ์คํธ ๋ณธ๋ฌธ: ํฌ์คํธ์ ์ฃผ ๋ด์ฉ์ ๋งํ๋ฉฐ,
๋ฌธ์ ์ ๋ณด์๋์ ์์นํฉ๋๋ค. ํฌ์คํธ ๋ณธ๋ฌธ์ ํฌ๊ฒ ์ ๋ชฉ, ๋ด์ฉ, ์ฒจ๋ถ ์ด๋ฏธ์ง, ์ฐธ๊ณ ๋ฌธํ, ๊ฐ์ฃผ ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.- ์ ๋ชฉ: ๊ฐ ์ ๋ชฉ์ ๊ณ ์ ๋ช
์ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ ์ด์ ํ๊ตญ์ด๋ก ์์ฑํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ์ต์์ ์ ๋ชฉ์
##์ ๋์ค๋ถํฐ ์์ํ๋ฉฐ, ํน์๋ฌธ์ ์ฌ์ฉ ์ HTML ํน์๋ฌธ์ ๋ฅผ ์จ์ผ ํ๋ ์ฐธ๊ณ ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. - ๋ด์ฉ: ํฌ์คํธ์ ๋ด์ฉ์ ๊ตฌ์ด์ฒด๋ก ์์ฑํ๋, ๊ฒฉ์์ฒด๋ฅผ ์ ์งํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค(์: ~์
๋๋ค, ~์ต๋๋ค ๋ฑ). ์์ด ์ฝ์ด๋ ๋ด์ฉ์ ํต์ฌ์ด ๋๋ ๊ณ ์ ๋ช
์ฌ์๋ ์ฝ์ด ๋๋ ํ๊ตญ์ด ํ๊ธฐ ๋จ์ด ๋ค์ ๊ดํธ ์์ ์ ์ ์์ด ํ๊ธฐ๋ฅผ ๋ฃ์ด์ผ ํฉ๋๋ค. ์ดํ ์์ด ์ฝ์ด๋ฅผ ํ์ฉํ ๊ฒฝ์ฐ์๋ ๊ดํธ ์์
์ดํ '์์ด ์ฝ์ด'๋ฅผ ๋ฃ์ด์ผ ํฉ๋๋ค(์: ์ํํธ์จ์ด ์ ์ ์คํ ๋ฆฌ์ง(Software Defined Storage, ์ดํ SDS)). - ์ฒจ๋ถ ์ด๋ฏธ์ง: ๋ด์ฉ ์ค๋ช ์ ๋ณด์กฐํ ์ฒจ๋ถ ์ด๋ฏธ์ง๋ ์ค๊ฐ ์ ๋ ฌ ๋ฐ ๋์ด๋ฅผ 700์์ 800ํฝ์ ๋ก ๋ง์ถ๊ณ , ํ๋จ์ ์บก์ ์ ๋ฃ์ด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ์์ฑ ๋ฐฉ๋ฒ์ ํ ํ๋ฆฟ์ ์ฐธ๊ณ ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
- ์ฐธ๊ณ ์๋ฃ: ํด๋น ํฌ์คํธ๋ฅผ ์์ฑํ๋๋ฐ ์ฐธ๊ณ ํ ์๋ฃ์ ๋งํฌ๋ ๋ ํผ๋ฐ์ค๋ฅผ ๋ถ๋ฆฟ ํ์์ผ๋ก ๋ณธ๋ฌธ ๋ฐ๋ก ๋ค์ ๊ธฐ์ฌํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
- ๊ฐ์ฃผ: ๋ด์ฉ ์ค ๋ณด์ถฉ ์ค๋ช ์ด ํ์ํ ๊ธฐ์ ๊ฐ๋ ์ด๋ ์ฐธ์กฐ ๋งํฌ๋ฅผ ์ฐธ๊ณ ์๋ฃ ๋ค์ ๊ธฐ์ฌํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ๊ฐ์ฃผ ํ์ฉ ๋ฐฉ๋ฒ์ ํ ํ๋ฆฟ์ ์ฐธ๊ณ ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
- ์ ๋ชฉ: ๊ฐ ์ ๋ชฉ์ ๊ณ ์ ๋ช
์ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ ์ด์ ํ๊ตญ์ด๋ก ์์ฑํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ์ต์์ ์ ๋ชฉ์
ย
ํฌ์คํธ ์์ฑ์ ๋ง๋ฌด๋ฆฌํ๋ค๋ฉด ํผ๋๋ฐฑ์ ์์ฒญํ๊ธฐ ์ ์ ์ต์ ํ ๋ฒ์ด๋ผ๋ ๋ค์ ์ฝ์ด๋ณด๊ณ ๋ด์ฉ์ ๊ฐ์ฐ์ฑ์ด๋ ๊ธฐ์ ์ ์ค๋ฅ, ๋ฌธ๋ฒ ์ค๋ฅ, ์คํ์๊ฐ ์๋์ง๋ฅผ ๋ฐ๋์ ๊ฒํ ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
์ด ๊ณผ์ ์ด ์๋ต๋๋ค๋ฉด ๋์ค์ ํผ๋๋ฐฑ์ ๋์ํ๋ ๊ณผ์ ์ด ๊ธธ์ด์ง๊ณ ์ผ์ ์ ๋ง์ถ์ง ๋ชปํ ์๋ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ฌธ๋ฒ ๋ฐ ์คํ์ ํ์ธ์ ๋ค์ ๋งํฌ ์์ ๋น ๋ฅด๊ฒ ํ์ธ ๊ฐ๋ฅํ๋ ์ ๊ทน์ ์ผ๋ก ํ์ฉํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
ย
๊ธ๋ฃจ์์ค ๊ธฐ์ ๋ธ๋ก๊ทธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊นํ๋ธ์์ ๊ด๋ฆฌ๋๊ณ , ๊นํ๋ธ๋ฅผ ํตํด ํผ๋๋ฐฑ ๋์์ ํ๊ธฐ ๋๋ฌธ์ ๊นํ๋ธ๋ฅผ ํ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค.
๊นํ๋ธ๋ฅผ ํ์ฉํ๊ธฐ ์ํด์๋ ์ฐ์ ๋ค์๊ณผ ๊ฐ์ ์์๋ค์ด ์ค๋น๋์ด์ผ ํฉ๋๋ค:
- ๊น(Git) ์ค์น: ์ฌ์ฉํ๋ PC์ ๊น ์ค์น๊ฐ ํ์ํฉ๋๋ค. ๊น ์ค์น ๋ฐ ๊ธฐ๋ณธ์ ์ธ ํ์ฉ ๋ฐฉ๋ฒ์ ๋งํฌ ๋ฅผ ์ฐธ๊ณ ๋ฐ๋๋๋ค.
- ๊นํ๋ธ ๊ณ์ ๋ง๋ค๊ธฐ: ๊นํ๋ธ ๊ณ์ ์ด ์๋ ๊ฒฝ์ฐ๋ ๋งํฌ ์์ ๊ณ์ ์์ฑ์ด ํ์ํฉ๋๋ค.
- ๊ธ๋ฃจ์์ค ๊ธฐ์ ๋ธ๋ก๊ทธ ์ ์ฅ์ ํฌํฌํ๊ธฐ: ๊ธ๋ฃจ์์ค ๊ธฐ์ ๋ธ๋ก๊ทธ ๊นํ๋ธ ํ์ด์ง์ ์ฐ์ธก ์๋จ์
Fork๋ฅผ ํด๋ฆญํด ์๊ฒฉ ์ ์ฅ์๋ฅผ ์์ฑํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. - ๋ก์ปฌ ์ ์ฅ์ ๋ง๋ค๊ธฐ: ์์ฑ์ PC์ ์ ์๊ฒฉ ์ ์ฅ์์ ๋ก์ปฌ ์ ์ฅ์๋ฅผ ์์ฑํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ์์ธํ ๋ด์ฉ์ ๋งํฌ ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
- ์ต์ ๋ด์ฉ์ผ๋ก ๋๊ธฐํํ๊ธฐ: ๋ธ๋์น๋ฅผ ์์ฑํ๊ธฐ ์ ์ ๋ก์ปฌ ์ ์ฅ์๋ฅผ ์ต์ ์ผ๋ก ์ ๋ฐ์ดํธ ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ๋ก์ปฌ ์ ์ฅ์๊ฐ ํ์ฌ ๊ธฐ์ ๋ธ๋ก๊ทธ ์ ์ฅ์์ ๋ด์ฉ์ด ๊ฐ๊ฑฐ๋ ์์ ๋ ๋ถ๋ถ์ด ์์ด์ผ ์ถฉ๋ ์์ด ๋จธ์ง๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๋ธ๋์น ๋ง๋ค๊ธฐ: ๋ก์ปฌ ์ ์ฅ์๋ฅผ ๋ง๋ค์์ผ๋ฉด ๋ธ๋ก๊ทธ ํฌ์คํธ๋ง์ ์ํ ๋ธ๋์น๋ฅผ ๋ง๋ค์ด ์ฃผ์๋ฉด ์ข์ต๋๋ค. ๋ง์คํฐ ๋ธ๋์น์ ๊ตฌ๋ถํด ๋์์ผ ๊ด๋ฆฌ๊ฐ ํธํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ย
์์ ๊ธฐ๋ณธ ์ธํ ์ด ์๋ฃ๋์๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ผ๋ก ๊นํ๋ธ์ ์ฌ๋ ค ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค:
- ๋ก์ปฌ ์ ์ฅ์์ ๋ด์ฉ ์์ ๋ฐ ์
๋ฐ์ดํธ: ์์ฑํ ๋งํฌ๋ค์ด ํ์ผ์ ๋ก์ปฌ ์ ์ฅ์์
_posts/blog๊ฒฝ๋ก์ ์ฌ๋ ค ์ ์ฅํ๊ณ ,static/assets/<ํฌ์คํธ๋ช >/ํด๋์ ์ปค๋ฒ ๋ฐ ์ต์๋จ ์ด๋ฏธ์ง, ์ฒจ๋ถ ์ด๋ฏธ์ง๋ฅผ ๋ฃ์ด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. - ์๊ฒฉ ์ ์ฅ์์ ์์ ๋ด์ฉ ํธ์: ํ์ผ์ ์ปค๋ฐ ํ ์๊ฒฉ ์ ์ฅ์์ ํธ์ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ์ปค๋ฐ ๋ฉ์์ง๋ ๋ฐ๋์ ์์ฑํด์ผ ํ๋ฉฐ ์๋ฌธ์ผ๋ก ์ปค๋ฐ ๋ด์ฉ์ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋งํฌ ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
- ๊ธฐ์ ๋ธ๋ก๊ทธ ์ ์ฅ์์ ํ๋ฆฌํ์คํธ ์์ฑ: ์๊ฒฉ ์ ์ฅ์์ ํธ์๊ฐ ์ฑ๊ณตํ๋ค๋ฉด ์๊ฒฉ ์ ์ฅ์ ํ์ด์ง์ ๋ํ๋
Create pull request๋ฒํผ์ ํด๋ฆญํด ํ๋ฆฌํ์คํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ํฌ์คํธ ์ ๋ชฉ๊ณผ ์์ฝ ๋ด์ฉ์ ์์ฑํด์ ํ๋ฆฌํ์คํธ๋ฅผ ์ฌ๋ ค ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. - ํผ๋๋ฐฑ ์์ฒญ: ๋งคํฐ๋ชจ์คํธ์
์์คํ >๋ฆฌ๋ทฐ์ ํ๋ฆฌํ์คํธ ํ์ด์ง์ URL๊ณผ ํจ๊ป ๋ฆฌ๋ทฐ๋ฅผ ์์ฒญํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
ย
ํ๋ฆฌํ์คํธ์ ํผ๋๋ฐฑ ์์ฒญ์ด ์๋ฃ๋์๋ค๋ฉด, ๊ด๊ณ์๋ค๋ก๋ถํฐ ํ๋ฆฌํ์คํธ ํ์ด์ง์ ๋๊ธ๋ก ํผ๋๋ฐฑ์ด ์ฌ๋ผ์ฌ ๊ฒ์
๋๋ค.
ํผ๋๋ฐฑ ๋์์ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค:
- ํผ๋๋ฐฑ ์ฝ๋ฉํธ์ ๋ด์ฉ ๊ฒํ ํ๊ธฐ.
- ํผ๋๋ฐฑ ๋ด์ฉ์ ๋ก์ปฌ ์ ์ฅ์์์ ์์ ํ ์๋ฌธ์ผ๋ก ์์ฑ๋ ์ปค๋ฐ ๋ด์ฉ๊ณผ ํจ๊ป ํธ์ํ๊ธฐ.
- ํผ๋๋ฐฑ ์ฝ๋ฉํธ์ ์์ ๋ด์ฉ์ ๋๊ธ๋ก ๋ฌ๊ณ , ๋งคํฐ๋ชจ์คํธ ๋ฆฌ๋ทฐ ์ฑ๋์๋ ์๋ฆฌ๊ธฐ.
- ํผ๋๋ฐฑ์ ์ค ์ฌ๋์ ์์ ๋ด์ฉ ํ์ธ ํ ์ฝ๋ฉํธ๋ฅผ ๋ฆฌ์กธ๋ธ(resolve)ํ๊ณ , ์ ๋ถ ํด๊ฒฐ๋๋ฉด ์ดํ๋ฃจ๋ธ(approve)ํ๊ธฐ.
- ์ดํ๋ฃจ๋ธ๋ฅผ 3๋ฒ ์ด์ ๋ฐ์ผ๋ฉด, ์ต๊ณ ๊ด๋ฆฌ์์๊ฒ ๋จธ์ง ์์ฒญํ๊ธฐ.
- ๋จธ์ง๊ฐ ์๋ฃ๋์ด ์ ๋ก๋๋ ํฌ์คํธ๋ฅผ ๋ธ๋ก๊ทธ ํ์ด์ง์์ ์ต์ข ์ ์ผ๋ก ํ์ธํ๊ธฐ.
ย
์ด์์ผ๋ก ๊ธฐ์ ๋ธ๋ก๊ทธ ํฌ์คํธ ์์ฑ๊ณผ ๊ด๋ จํ์ฌ ๊ถ๊ธํ์ ์ ์ด๋ ์ถ๊ฐ ์๊ฒฌ์ด ์์ผ์ ๋ถ์ ์๊ธฐ ๊ธฐ์ ๋ธ๋ก๊ทธ ๋ด๋น์๋ ๊ฐ์ด๋๋ผ์ธ ์์ฑ์์ ๋ฌธ์ ๋ฐ๋๋๋ค.
The site is built with Hugo (extended) and searched with Pagefind. No JavaScript package manager is used anywhere in this repository or its CI.
tools/install_tools.sh .bin # downloads pinned Hugo and Pagefind into .bin/, verifies SHA-256
.bin/hugo server # live preview at http://localhost:1313/
node --test assets/ts/tests/*_test.ts # TypeScript tests (Node 22.18+ runs .ts directly)
Versions and checksums live in tools/versions.env. Search needs the index, so for the search page run .bin/hugo --minify --environment development && .bin/pagefind --site build and serve build/. A plain hugo build is the production build and emits the Google Analytics snippet, so use --environment development for local builds to keep test visits out of the production property.
Until the cutover is verified, new posts still go to _posts/blog/ in the Jekyll format described above and are converted with tools/convert_posts.py. That script regenerates content/blog/ from _posts/ and fails on any .md there that has no source, so do not hand-add files to content/blog/ yet.
After _posts/ is deleted, author posts directly as content/blog/YYYY-MM-DD-slug.md:
---
title: "..."
author: "์ด๋ฆ (name@gluesys.com)"
tags: ["NVMe", "์คํ ๋ฆฌ์ง"]
cover: "/assets/slug/cover.jpg"
main: "/assets/slug/cover.jpg"
summary: "one sentence (optional)"
series: "NVMe" # optional, see below
---- Normally do not set
url,slugordate. The date and the URL slug come from the file name:content/blog/2026-12-01-new-post.mdis built as/blog/2026/12/01/new-post.html(a plain file, like Jekyll). Ifdateis set, Hugo keeps the date prefix in the slug andtools/verify_site.pyfails ("slug keeps the date prefix");slugorurlcan override the slug when needed. Converted posts keep their expliciturlanddate. - Authors:
data/authors.yamlholds one entry per email (name spelling, optionalavatar,github,gravatar: false,former: truefor people who have left). The picture is the first of:avatarin the personal page (a site path, or an image file next to it in a page bundle),avatarinauthors.yaml, the GitHub picture ofgithub: <account>(in either place), the author's Gravatar (not for former colleagues), else the first letter of the name. GitHub and Gravatar pictures are downloaded while the site builds and served from the site itself, so readers never contact those services; a change of picture shows up with the next deploy. Every author has a page at/authors/<name>/(picture, name, all their posts), generated bycontent/authors/_content.gotmpl; the about page cards and bylines link to it. A personal introduction is optional: createcontent/authors/<name>.md(use the same name so the address stays), setemail, and write Markdown. It replaces the generated page, and its first paragraph also appears on the about page. - Use canonical tags from
data/tag_aliases.yaml.python3 tools/check_tags.py content/blogwarns about unknown or non-canonical tags. - A series is defined by
data/series.yaml: add the post slug (file name without the date prefix) to the series list in reading order. Membership and order come from that file;series_orderis not required. Also setseries: "<series name>"in front matter so the post shows its series box. - Images go under
static/assets/and are referenced as/assets/.... Images never grow past the 720px body column; one shown smaller than its file gets a magnifier on mouse hover and opens full-window on click. To align a Markdown image, end its path with#left,#centeror#right(); an image alone in its paragraph is centred by default, while one inside running text or sharing a paragraph with another image stays inline. For diagrams with text, export at 1440px wide with text at least 28px tall so it stays readable (about 14px on screen). - Diagrams and math need no images:
- A
```mermaidcode block is drawn by pele (Mermaid syntax) in the site colours, light and dark. The script loads only on posts that have one. pele is vendored as a single file instatic/third-party/pele-<version>/(no npm); to upgrade, takedist/pele.global.jsfrom the npm tarball after checking itsdist.integrity, and update the path inlayouts/_default/baseof.html. - A
```plantumlcode block is drawn as SVG by the public PlantUML server (www.plantuml.com), so its source leaves the site; do not put anything confidential in it. - Math goes between
$...$or\(...\)inline and$$...$$on its own lines. Hugo renders it to MathML at build time (KaTeX), so readers load nothing extra. A math error fails the build and names the file. Write a literal dollar sign as\$.
- A
- Code blocks can show line numbers:
```bash {linenos=true}numbers from 1, and```bash {linenos=true linenostart=120}starts at 120. Numbers are off by default, and the copy button never copies them. - Do not add a hand-written table of contents: every post gets one from its h2/h3 headings (the sidebar on wide screens, a collapsed ๋ชฉ์ฐจ block on phones).
On pull requests and pushes to master the workflow installs the pinned tools, runs the Python tests (unittest) and the TypeScript tests (node --test, Node 26 runs .ts directly; no npm packages), builds with hugo --minify --environment production, builds the Pagefind index, then runs verify_migration.py, verify_site.py and check_tags.py. verify_search.py is a non-blocking report. verify_migration.py and the snapshot-based part of verify_site.py run only while migration/snapshot exists. Pull requests upload build/ as an artifact; pushes to master and manual workflow_dispatch runs on master deploy to GitHub Pages.
Until the cutover, verify_migration.py compares the body text and headings of every migrated post with the live-site snapshot in migration/snapshot, so a typo fix in a migrated post fails CI. Add a narrow entry with a reason to migration/allowlist.yaml (see the existing entries) instead of loosening the checker. Such edits live only in content/blog/: tools/convert_posts.py pairs headings with the snapshot, so do not re-run it over an edited post (the allowlist entries would then go unused and the verifier fails, which is how CI catches it). New posts are not affected: the feed check only requires the 10 newest posts and unchanged links for the migrated items still in the feed.
The snapshot and everything that depends on it are removed together: delete migration/snapshot/, and the workflow then skips the "Verify migration" step and runs "Verify site (snapshot absent)" by itself (both are conditioned on migration/snapshot/urls.txt). Delete tools/verify_migration.py, its tests and the snapshot steps from pages.yml in the same change. The remaining checks (aliases, feed, post files, static files, tag map, links, images) do not need the snapshot.
tools/convert_posts.py: Jekyll_posts/blogtocontent/blog(kramdown to Goldmark, front matter rewrite, tag canonicalization).tools/verify_migration.py: compares each built post against the live-site snapshot inmigration/snapshot.tools/verify_site.py: checks URLs, feeds, redirects, sitemap and page structure of the built site.tools/verify_search.py: runs the acceptance queries intools/search_cases.txtagainst the index.tools/check_tags.py: warns about tags missing fromdata/tag_aliases.yaml.