Title: ๋ก๊ทธ ํ์คํ์ LogLab Author: Jeong Ju Kim
๋ก๊ทธ ํ์คํ๋? ๋ก๊ทธ ํ์คํ๋ ํ์ฌ๋ ์กฐ์ง์์ ๋ก๊ทธ์ ์์ง, ๋ถ์, ํ์ฉ์ ์ฉ์ดํ๋๋ก ์๋ก ๋ค๋ฅธ ์๋น์ค๊ฐ ๋ก๊ทธ์ ํ์์ ์ผ๊ด์ฑ์๊ฒ ํ๊ณ , ํฅํ์ ๋ณ๊ฒฝ ๋ฐ ์ถ๊ฐ ์์ ๋ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ ๋ฐ๋ฅด๋๋ก ํ์ฌ ๊ด๋ จ ๋ฆฌ์์ค ์ต์ ํ์ ๋ฐ์ดํฐ์ ๊ฐ์น๋ฅผ ๋์ด๋ ค๋ ํ๋์ ๋งํ๋ค.
๋ก๊ทธ ํ์คํ๋ ๋จ์ํ ํ ์ฐจ๋ก๋ก ์ ์ ์ผ๋ก ๋๋๋ ๊ฒ์ด ์๋๋ผ, ์ง์์ ์ธ ์๊ฒฌ ์๋ ด, ๊ฐ์ ๊ทธ๋ฆฌ๊ณ ํ์ฉ์ ํตํด ๊ด๊ณ์๋ค์ด ํจ๊ป ๋ง๋ค์ด ๋๊ฐ๋ ํ๋์ด๋ค.
๋ก๊ทธ ํ์คํ ์์ํ ๋ก๊ทธ ํ์คํ๋ ํ ๋ ์ฌ๋์ ํ์ผ๋ก ๋จ๊ธฐ๊ฐ์ ์ด๋ฃจ์ด ์ง ์ ์๊ธฐ์, ๋ก๊ทธ ํ์คํ๋ฅผ ์ํ ์์ํ๋ฅผ ์ ์ํ๋ค. ์์ํ๋ ์ฌ๋ด์ ๋ค์ํ ๋ถ์ผ์์ ๋ก๊ทธ ๊ด๋ จ ์ ๋ฌด๋ฅผ ๋งก๊ณ ์๋ ๋ด๋น์๋ค๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ์ผ์ ์ํํ๋ค.
- ๋ก๊ทธ ํ์ค์ ํ์
- ๋ก๊ทธ ํ์ค ๋ช ์ธ ์์ฑ
- ๋ก๊ทธ ํ์คํ ๊ด๋ จ ํด์ ๊ฐ๋ฐ
- ๋ก๊ทธ ํ์ค ์ ํ ๋ฐ ์๋น์ค ๋ณ ๋ด๋น์์ ์ปค๋ฎค๋์ผ์ด์
- ๊ฐ์ ์ ๋ฐ์
ํ์ค์ ๋ค์ํ ํ์์ฑ ๋ก๊ทธ ํ์คํ์ ๋ชฉ์ ์ ๋์ํ๋ ๊ฒ์ ์ด๋ ต์ง ์์ผ๋, ์กฐ์ง ๊ตฌ์ฑ์ ๊ฐ์์ ์ญํ ๋ฐ ์ ์ฅ์์ ๋ฐ๋ผ๋ณธ ๋ก๊ทธ ํ์คํ๋ ๋ค์ํ ํ์์ฑ์ ๊ฐ์ง๋ค.
์๋น์ค ๊ฐ๋ฐ์
- ์ฝ๋ฉ์ ์ฐธ๊ณ ํ ์ ์๋ ๋ก๊ทธ ๋ฌธ์๋ฅผ ์ ๊ณตํ๋๊ฐ?
- ํ์ค์ ๋ฐ๋ฅด๋, ํ์์ ๋ฐ๋ผ ๋ก๊ทธ์ ์ถ๊ฐ/๋ณ๊ฒฝ์ด ์ฉ์ดํ๊ฐ?
- ๋ด๊ฐ ์์ฑํ ๋ก๊ทธ๊ฐ ํ์ค์ ๋ง์กฑํ๋์ง ํ ์คํธํ ์ ์๋๊ฐ?
- ๊ฐ๋ฐ ์ธ์ด์์ ์ฝ๊ฒ ์ธ ์ ์๋ ๋ก๊ทธ ๊ฐ์ฒด๋ ์ถ๋ ฅ๊ธฐ๋ฅผ ์ ๊ณตํ๋๊ฐ?
์์คํ ์์ง๋์ด
- ๋ฐฐํฌ๋ ์๋ฒ ์ฆ/๊ฐ์ค์ ์ฉ์ดํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋๊ฐ?
- ๋ก๊ทธ ์ถ๋ ฅ ๋ฏธ๋์ด๊ฐ ์ค์น ๋ฐ ์ด์์ ์ฉ์ดํ๊ฐ?
๋ฐ์ดํฐ ์์ง๋์ด
- ๋ก๊ทธ์ ์ถ๋ ฅ ๋์์ด ์ ์ ํ ๋ฏธ๋์ด(ํ์ผ, RDB, ํ๋ก ๋ฑ)๋ก ๊ฐ๋ฅํ๊ฐ?
- ๋ก๊ทธ ์์ง/์ ๋ฆฌ์ ํ์ํ ๋ฌธ์ ๋ฐ ์ํ์ ์ ๊ณตํ๋๊ฐ?
- ๋ก๊ทธ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ์ฉ์ดํ๊ฐ?
๋ถ์/๋ฐ์ดํฐ ๊ณผํ์
- ๋ก๊ทธ ๋ถ์์ ํ์ํ ๋ฌธ์ ๋ฐ ์ํ์ ์ ๊ณตํ๋๊ฐ?
- ๋ถ์์ ํ์ํ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋๊ฐ?
- ๋ก๊ทธ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ์ฉ์ดํ๊ฐ?
๊ฒฝ์์ ๋ฐ ๊ด๋ฆฌ๋ถ์
- ์ ๊ท ์๋น์ค๋ฅผ ์ํ ๊ฐ์ด๋ ๋ฌธ์๊ฐ ์กด์ฌํ๋๊ฐ?
- ์ธ๋ ฅ ์ดํ์ด๋ ๊ต์ฒด์ ๋์ํ๋๋ก ์ผ๊ด๋ ํ์์ ๊ฐ๋๊ฐ?
- ์ด์ ์งํ ์ถ์ถ์ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋๊ฐ?
- ํด์ธ ์๋น์ค๋ฅผ ์ํ ๋ค๊ตญ์ด ๋ฌธ์๋ฅผ ์ง์ํ๋๊ฐ?
๋ก๊ทธ ํ์ค์ ์๊ฑด ์์์ ๋งํ ๋ค์ํ ํ์์ฑ์ ๋ง์กฑํ๊ณ , ๊ฑด๊ฐํ ํ์ค์ผ๋ก์์ ๋ก๊ทธ ์์ฑ ๋ฐ ํ์ฉ์ ์ํด์ ๋ค์๊ณผ ๊ฐ์ ์๊ฑด์ ์ ์ํ๋ค.
๋ก๊ทธ ๋ช ์ธ๋ฅผ URL์ ํตํด ๋๊ตฌ๋ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ๊ณต๊ฐ
- ๋ค์ํ ๊ด๋ จ์์ ๊ณต์ /ํ์ฉ์ ์ํด ๊ณต๊ฐ๋ ํ์์ ์ด๋ค.
- ๋ก๊ทธ์ ๋ด์ฉ๊ณผ ๋ฌ๋ฆฌ, ๋ก๊ทธ์ ๋ช ์ธ๋ ๋ณด์ ๋ฐ ๊ฐ์ธ์ ๋ณด์ ๋ฏผ๊ฐํ์ง ์๋ค.
- URL์ ํตํด ์ ๊ณตํ๋ ๊ฒ์ผ๋ก, ๋ค์ํ ๋ช ์ธ ํ์ผ์ด ์ฐ์ฌํ๋ ํผ๋์ ํผํ ์ ์๋ค.
๋ ์ ํฌ๋งท๊ณผ ๋ฐ์ด๋๋ฆฌ ํ์์ด ์๋ ๊ฒ
- ํน์ ์ ์ฒด์ ์์ฉ ์คํ๋ ๋ ์ฌํธ๋ ์๋ ํ๋ก์ธ์ค๋ก ๊ธฐ์ ๋ ๋ช ์ธ๋ ์ ๊ทผ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ๋ฐ์ด๋๋ฆฌ ํฌ๋งท์ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ์ด๋ ต๋ค.
๋ก๊ทธ ๋ช ์ธ๋ ๋ ๋ฆฝ์ ์ธ ํ์(Formulation) ์ธ์ด๋ก ๊ธฐ์ ํ ๊ฒ
- ์์ฐ์ด๋ก ๊ธฐ์ ๋ ํ์ค์ ๋ชจํธ์ฑ์ด ์์กดํ๊ธฐ์, ๋ ผ๋ฆฌ์ ์๊ฒฐ์ฑ์ ๊ฐ์ง ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
- SQL์ด๋ ํน์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์์กดํ ๊ธฐ์ ์, ๋ก๊ทธ ํ์ค์ ์ํ ๋ค์ํ ํ์์ฑ์ ๋ง์กฑ์ํฌ ์ ์๋ค.
๊ฐ๋ฐ์ธก์๋ ๋์์ด ๋๋ ๋ฐฉ๋ฒ๋ก
- ํผ๋ธ๋ฆฌ์ ์ ์ ์ฅ์ ๊ฐ์ํ๋ ํ์ค์ด ์๋๋ผ, ๊ฐ๋ฐ์ธก์ ์ค์ง์ ์ธ ๋์์ด ๋๋ ๋ฐฉ๋ฒ๋ก ์ผ๋ก์ ์๋ฆฌ๋ฉ๊น ํ ๊ฒ.
๋ก๊ทธ ํ์คํ์ ๋ฐฉํฅ ์์ ์๊ฑด์ ๋ง์กฑํ๋๋ก ์๋์ ๊ฐ์ ํ์คํ ๋ฐฉํฅ์ ์ ์ํ๋ค.
- ๋ก๊ทธ ์ ์์ฉ ์ธ์ด๋ฅผ ๋ง๋ค๊ณ , ์ด๋ฅผ ํ์ฉํ์ฌ ๋ก๊ทธ ํ์ค์์ ๊ธฐ์ ํ๋ค.
- ์์ํ๋ ํจ๊ป ํ์ค ๋ก๊ทธ ๋ช ์ธ๋ฅผ ์ค๊ณํ๊ณ , ๊ด๋ จ ํด์ ๊ฐ๋ฐํด ์ ๊ณตํ๋ค.
- ๊ฐ๋ฐ์ธก์ ์ด๊ฒ์ ์ค์/ํ์ฅํ์ฌ ์ค์ ์๋น์ค ๋ก๊ทธ๋ฅผ ๊ฐ๋ฐํ๋ค.
- ๋ก๊ทธ ํ์ค์ ๋ฐ ์ด๋ฅผ ํ์ฉํ ์๋น์ค๋ณ ๋ก๊ทธ ๋ช ์ธ์ ๊ด๋ฆฌ๋ Github์ ๊ณต๊ฐ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ค.
๋ก๊ทธ ์ค๊ณ ํ๋ ์์์ ๊ฐ๋ฐ ์์ ๋ฐฉํฅ์ ๋ง๋๋ก ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๋ก๊ทธ ์ค๊ณ ํ๋ ์์์ ๊ฐ๋ฐํ๋ค.
๊ฐ์ฒด ์งํฅ์ ๋ก๊ทธ ์ค๊ณ
- ๊ธฐ์กด ๋ก๊ทธ์ ์ ์์๋ฅผ ๋ณด๋ฉด ์ด๋ฒคํธ๋ ๋ค์ํ๋ ๋ง์ ์ค๋ณต ์์ฑ์ด ์์์ ์ ์ ์๋ค.
- ์ค๋ณต์๋ ํ์์๋ ๋น์ฉ๊ณผ ์ค๋ฅ๊ฐ ๋ฐ๋ฅด๊ธฐ ๋ง๋ จ์ด๋ค.
- ๊ฐ์ฒด ์งํฅ์ ๋ก๊ทธ ์ค๊ณ๋ก ์ด๋ฐ ๋จ์ ์ ๋ฐฉ์งํ๊ณ , ๋ก๊ทธ์ ์ ์ง ๋ณด์์ฑ์ ์ข๊ฒ ํ๋ค.
๋ก๊ทธ ๋ฌธ์ ์์ฑ
- ๋ก๊ทธ ์ ์ ์ธ์ด๋ก ๊ธฐ์ ํ ๋ก๊ทธ ๋ช ์ธ์์ ์๋์ผ๋ก ๋ค์ํ ํฌ๋งท(Text, HTML, Markdown)์ ๋ก๊ทธ ์ค๋ช ๋ฌธ์๋ฅผ ์๋ ์์ฑํ๋ค.
- ๋ก๊ทธ ๋ช ์ธ์ ๋ค๊ตญ์ด ์ค๋ช ์ด ํฌํจ๋๋ฉด ํด๋น ์ธ์ด๋ฅผ ์ํ ๋ฌธ์๋ ์์ฑํ๋ค.
์ํ ๋ก๊ทธ ์์ฑ ๋ก๊ทธ ๋ช ์ธ์๋ ์ค์ ๋ก๊ทธ์ ๊ฐ์ง ์๋๋ผ๋, ์ ์ฉํ ์ํ ๋ก๊ทธ ์์ฑ์ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค. ์ํ๋ก๊ทธ ์์ฑ ๊ธฐ๋ฅ์ผ๋ก,
- ๊ฐ๋ฐ์๋ ๋ก๊ทธ์ ์๋ฅผ ๋ณด๋ฉฐ ๋ก๊ทธ ์ฝ๋ฉ ์์ ์ ํ ์ ์๋ค.
- ๋ฐ์ดํฐ ์์ง๋์ด๋ ์๋น์ค ์คํ์ ์ ๋ฏธ๋ฆฌ ์์ง/์ฒ๋ฆฌ ๊ฐ๋ฐ์ ์งํํ ์ ์๋ค.
- ๋ฐ์ดํฐ ๊ณผํ์๋ ์ํ ๊ธฐ๋ฐ์ผ๋ก ์งํ ๋ฐ ๋ถ์์ ํ์ ๋ฏธ๋ฆฌ ์ค๋นํ ์ ์๋ค.
์ํ ๋ก๊ทธ์ ์ถ๋ ฅ์ ๋ค์ํ ํฌ๋งท(JSON, CSV/TSV, SQL)์ ์ง์ํ๋ค.
๋ก๊ทธ ๊ฒ์ฆ
- ๊ฐ๋ฐ ์ธก์์ ์์ฑ๋ ๋ก๊ทธ๊ฐ ๋ก๊ทธ ์ ์์ ๋ง๋์ง ํ ์คํธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๋ก๊ทธ ์คํค๋ง ์์ฑ
- ๋ค์ํ ๋ก๊ทธ ์ถ๋ ฅ ๋ฏธ๋์ด ์ง์์ ์ํด, ๋ก๊ทธ ์ ์์์ RDB, Parquet ๋ฑ ๋ก๊ทธ ์คํค๋ง๋ฅผ ์๋ ์์ฑ
ํ์ค ๋ก๊ทธ์ ๋ด์ฉ ์ข์ ๊ทธ๋ฆ๋ ๋์ ์์์ด ๋ด๊ฒจ ์์ผ๋ฉด ์๋ฏธ๊ฐ ์์ ๊ฒ์ด๋ค. ์์์ ๋งํ ๋ฐฉ์์ ์ฌ์ฉํด ์์ฑ๋ ๋ก๊ทธ ํ์ค ๋ช ์ธ์๋ ์ด๋ค ๋ด์ฉ์ด ๋ด๊ฒจ์ผ ํ ๊น? ๊ตฌ์ฒด์ ์ธ ๋ช ์ธ๋ ์์ผ๋ก ์ธํฐ๋ทฐ๋ฅผ ํตํด ๋ก๊ทธ ์ ์ ์ธ์ด๋ก ์์ฑ๋ ๊ฒ์ด๋ฉฐ, ์ด๊ณณ์๋ ์ด๋ค ์ข ๋ฅ์ ์ด๋ฒคํธ๋ฅผ ์ด๋ป๊ฒ ๋จ๊ฒจ์ผ ํ๋์ง์ ๋ํ ์์น์ ๊ธฐ๋กํ ์์ ์ด๋ค.
[[TODO]]
์์ ์ฐ์ถ๋ฌผ ์์์ ๋งํ ๋ฐฉํฅ์ ์๊ฑฐํ์ฌ, ์์ํ๋ ๋ค์๊ณผ ๊ฐ์ 3 ๊ฐ์ง๋ฅผ ์ฐ์ถ๋ฌผ์ ์ ๊ณตํ๋ค.
- ๋ก๊ทธ ์ ์์ฉ ์ธ์ด
- ์ด ์ธ์ด๋ก ๊ธฐ์ ๋ ํ์ฅ ๊ฐ๋ฅํ ๋ก๊ทธ ํ์ค
- ๋ก๊ทธ ๊ฐ๋ฐ ๋ฐ ํ์ฉ์ ๋์์ ์ฃผ๋ ํด
๊ฐ๋ฐ์ธก์ ์ด ์ฐ์ถ๋ฌผ์ ํ์ฉํด ๋ค์๊ณผ ๊ฐ์ 2 ๊ฐ์ง์ ์ฐ์ถ๋ฌผ์ ์์ฐํ๋ค.
- ๋ก๊ทธ ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก ์๋น์ค์ ํ์์ ๋ง๊ฒ ์์ /ํ์ฅ๋ ๋ก๊ทธ ๋ช ์ธ
- ์๋น์ค ๋ก๊ทธ ๋ช ์ธ์ ๋ง๋ ๋ก๊ทธ๋ฅผ ์์ฑํ๋ ์๋น์ค ์ฝ๋
๋ ๊ฐ์์ ์์ฉ
ํ์ฌ์๋ ์กฐ์ง ๋ด/์ธ๋ถ์์ ๊ฐ๋ฐํ ๋ค์ํ ์๋น์ค์ ๋ก๊ทธ๊ฐ ์์ฑ/ํ์ฉ ๋๊ณ ์๋ค. ์ผ๊ด๋ ํํ๋ ์๋์ง๋ผ๋, ์ด ๋ก๊ทธ๋ค์ ๋ค์ํ ๊ฒฝํ๊ณผ ์ง์์ ์ฐ๋ฌผ์ธ ๊ฒ์ด๋ค. ํ์คํ ์์ํ๋ ๋ค์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ธฐ์กด ๋ ๊ฐ์๋ฅผ ํฌ์ฉํ ์ ์๊ฒ ๋ค.
๊ธฐ์กด ๋ก๊ทธ์ ๋ ธํ์ฐ๋ฅผ ์ ํ์ค์ ๋ฐ์
- ๊ธฐ์กด ๋ก๊ทธ๋ฅผ ๋ง๋ค๊ณ ํ์ฉํ ๋ด๋น์๋ค๊ณผ ์ธํฐ๋ทฐ๋ฅผ ํตํด, ์ ๊ทธ๋ฐ ๋ก๊ทธ๊ฐ ์ ๋ง๋ค์ด ์ก๊ณ , ์ด๋ป๊ฒ ์ฌ์ฉ๋๊ณ ์๋์ง ํ์ .
- ๊ทธ ๋ ธํ์ฐ๋ฅผ ์ด๋ ค ์๋ก์ด ๋ก๊ทธ ํ์ค์ ๋ฐ์.
์ํฌํฐ๋ฅผ ํตํด ํ์ค ๋ก๊ทธ ํํ๋ก ๋ณํ
- ์คํ๋ ๋์ฌํธ๋ ์๋ํ๋ก์ธ์ค ํ์ผ๋ก ๋ ๊ธฐ์กด ๋ก๊ทธ์ ๋ช ์ธ๊ฐ ์๋ ๊ฒฝ์ฐ, ๊ทธ๊ฒ์ ๊ฐ์ ธ์ค๊ธฐ ์ํ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑ.
- ๊ธฐ์กด ๋ก๊ทธ๋ ์๋ก์ด ๋ก๊ทธ ํ์ค์ผ๋ก ๋ณํ๋ ๊ฒฝ์ฐ, ์ ์ง ๋ณด์์ฑ์ด ์ข์์ง๊ณ ํ๋ ์์์ด ์ ๊ณตํ ๋ค์ํ ํด์ ํ์ฉํ ์ ์์ ๊ฒ.
์๊ฐ์ ์ค์น
๋ก๊ทธ๋ฉ์ ๋ก๊ทธ๋ฅผ ์ค๊ณํ๊ณ ํ์ฉํ๊ธฐ ์ํ ํด์ด๋ค. ํฌ๊ฒ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค:
- ๋ก๊ทธ๋ฅผ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ค๊ณ
- ์ค๊ณ๋ ๋ก๊ทธ์ ๋ฌธ์ ์ถ๋ ฅ
- ์ค๊ณ๋ ๋ก๊ทธ์ ์ํ(๊ฐ์ง) ๋ก๊ทธ ์์ฑ
- ๋ก๊ทธ๊ฐ ์ค๊ณ์ ๋ง๊ฒ ์์ฑ๋์๋์ง ๊ฒ์ฆ
๋ก๊ทธ๋ฉ์ https://github.com/haje01/loglab ์์ ๋ฐ์ ์ ์๋ค. [[TODO]]
$ git checkout https://github.com/haje01/loglab
$ pip install -e .
์ผ๋ก ์ค์นํ์.
๋ก๊ทธ๋ฉ์ '๋ฉํํ์ผ'๋ก ๋ถ๋ฆฌ๋ JSON ํ์ผ์ ๋ก๊ทธ ๋ช ์ธ๋ฅผ ๊ธฐ์ ํ๋ ๊ฒ์ผ๋ก ๋ก๊ทธ๋ฅผ ์ค๊ณํ๋ค. ๋ฉํํ์ผ์ ๋ก๊ทธ๋ฉ์์ ์ ๊ณตํ๋ JSON ์คํค๋ง ํ์์ ๋ง์ถ์ด ์์ฑํ๋ฉฐ, ํ์ฅ์๋ .meta.json ์ ์ฌ์ฉํ๋ค. VSCode ๋ฑ JSON ์คํค๋ง๋ฅผ ์ง์ํ๋ ์๋ํฐ๋ฅผ ์ด์ฉํ๋ฉด ํธ์ง์ด ์ฉ์ดํ ๊ฒ์ด๋ค.
๊ฐ๋จํ ๋ก๊ทธ ๋ช ์ธ ๋ง๋ค๊ธฐ
๋ก๊ทธ๋ฉ์ ์ฌ์ฉ๋ฒ์ ๋น ๋ฅด๊ฒ ์ดํด๋ณด๊ธฐ์ํด, ์ ํฌ๋ฏธ(Acme)๋ผ๋ ๊ฐ์์ ๊ฒ์ ํ์ฌ์ foo ๋ผ๋ ๋ชจ๋ฐ์ผ ๊ฒ์์ ์ํ ๋ฉํํ์ผ์ ๋ง๋ค์ด ๋ณด์.
{
"events": {
"Login": {
"desc": "์ ์ ๋ก๊ทธ์ธ.",
}
}
}
events ์์ ์๋์ ์ฌ์ฉํ ๋ก๊ทธ ์ด๋ฒคํธ ์์๋ฅผ ์ ์ํ๋ฉด ๋๋ค. ์ฌ๊ธฐ์๋ Login ์ด๋ฒคํธ๋ฅผ ์ ์ํ๊ณ ์๋ค. desc ์์์ ์ด๋ฒคํธ์ ์ค๋ช ์ ๊ธฐ์ ํ๋ค.
์ด ํ์ผ์ foo.meta.json ์ด๋ผ๋ ํ์ผ๋ช ์ผ๋ก ์ ์ฅํ๊ณ , ๋ก๊ทธ๋ฉ์ ๋ฌธ์ ์ถ๋ ฅ ๊ธฐ๋ฅ์ ์ด์ฉํด ๋ณด๊ฒ ๋ค. ๋ฌธ์ ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ผ๋ก ํ๋ค.
$ loglab -m foo.meta.json doc
์ด ๋ช ๋ น์ -m ์ธ์๋ก ์ฌ์ฉํ ๋ฉํํ์ผ์ ์ง์ ํ ํ, doc ๋ถ๋ช ๋ น์ผ๋ก ๋ฌธ์๋ฅผ ์์ฑํ๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
Event : Login
Description: ์ ์ ๋ก๊ทธ์ธ.
+------------+----------+---------------+------------+
| Property | Type | Description | Required |
|------------+----------+---------------+------------+
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ | true |
| Event | string | ์ด๋ฒคํธ ํ์
| true |
+------------+----------+---------------+------------+
Login ์ ๋ํ ๋ฌธ์๊ฐ ์ถ๋ ฅ๋๋ค. ๊ฐ ์์ฑ๋ณ๋ก ํ์ด ๋์ค๊ณ , ์์ฑ ์ด๋ฆ(Property), ํ์ (Type), ์ค๋ช (Description), ํ์ ์ฌ๋ถ(Required) ์ปฌ๋ผ์ผ๋ก ์์ฑ์ ์ค๋ช ํ๊ณ ์๋ค. Required๊ฐ true์ธ ์์ฑ์ ํด๋น ์ด๋ฒคํธ์ ๊ผญ ํ์ํ ํ์ ์์ฑ์ด๋ฉฐ, false์ธ ๊ฒฝ์ฐ ์์ด๋ ๋ฌด๊ดํ ์ ํ ์์ฑ์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์์ฑ์ ํ์ ์์ฑ์ด๋ค.
์ฒซ ํ์ ๋ง๋ค์ด ์ฃผ์ง ์์ Datetime ์ด๋ผ๋ ์์ฑ์ด ๋ณด์ธ๋ค. ๋ชจ๋ ๋ก๊ทธ ์ด๋ฒคํธ๋ ์ถ๋ ฅ ์๊ฐ์ด ๊ผญ ํ์ํ๊ธฐ์, ๋ก๊ทธ๋ฉ์์ ์๋์ผ๋ก ๋ง๋ค์ด ์ฃผ๋ ์์ฑ์ด๋ค. ๋ค์์ผ๋ก Event๋ ์ด๋ฒคํธ์ ์ข ๋ฅ๋ฅผ ๋ํ๋ธ๋ค. ๋ฌธ์ ์ถ๋ ฅ์ ์ํ์ง ์๋ ์ปฌ๋ผ์ --exclude-column ์ธ์๋ก ๋ฌด์ํ ์ ์๋ค. Required๋ฅผ ์ ์ธํ๊ณ ๋ค์ ๋ฌธ์๋ฅผ ๋ณด๋ฉด,
$ loglab -m foo.meta.json doc --exclude-column required
Event : Login
Description: ์ ์ ๋ก๊ทธ์ธ.
+------------+----------+---------------+
| Property | Type | Description |
|------------+----------+---------------+
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ |
| Event | string | ์ด๋ฒคํธ ํ์
|
+------------+----------+---------------+
Required ์ปฌ๋ผ์ด ๋น ์ง ๋ฌธ์๊ฐ ์ถ๋ ฅ๋๋ค.
์ด์ ์ฌ๊ธฐ์ ๋ก๊ทธ์ธํ ์๋ฒID ์์ฑ์ ์ถ๊ฐํด ๋ณด์. ์์ฑ์ ์ด๋ฒคํธ ๊ฐ์ฒด ์๋ props ์์๋ฅผ ์ด์ฉํ๋ค. ๋ก๊ทธ๋ฉ์ ์ด๋ฒคํธ ๋ฐ ์์ฑ์ ์ด๋ฆ์ ๊ฐ ๋จ์ด์ ์์์ ๋๋ฌธ์๋ก(Pascal Case) ํ๋ค.
{
"events": {
"Login": {
"desc": "์ ์ ๋ก๊ทธ์ธ.",
"props": [
["ServerNo", "integer", "์๋ฒ ๋ฒํธ"]
]
}
}
}
props ๋ ์ด๋ ์ด ๊ฐ์ผ๋ก, ํ๋ ์ด์์ ์์ฑ์ ๊ธฐ์ ํ ์ ์๋ค. ๊ฐ ์์ฑ์ ์ด๋ ์ด ํ์ ๋๋ ๊ฐ์ฒด ํ์์ผ๋ก ๊ธฐ์ ํ ์ ์๋ค. ์ด๋ ์ด ํ์์ ๊ฐ๋จํ ์์ฑ์ ์ถ๊ฐํ ๋ ์ ์ฉํ๋ฉฐ [์์ฑ_์ด๋ฆ, ์์ฑ_ํ์ , ์์ฑ_์ค๋ช , ํ์์ฌ๋ถ(์๋ต๊ฐ๋ฅ)]์ ์์ผ๋ก ๊ธฐ์ ํ๋ค. ๊ฐ์ฒด ํ์์ ์ดํ์ ์ดํด๋ณด๊ฒ ๋ค.
๋ค์ ๋ฌธ์๋ฅผ ์ถ๋ ฅํด ๋ณด์.
$ loglab -m foo.meta.json doc
Event : Login
Description: ์ ์ ๋ก๊ทธ์ธ.
+------------+----------+---------------+-----------+
| Property | Type | Description | Required |
|------------+----------+---------------+-----------+
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ | true |
| Event | string | ์ด๋ฒคํธ ํ์
| true |
| ServerNo | integer | ์๋ฒ ๋ฒํธ | true |
+------------+----------+---------------+-----------+
ServerNo๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ์ ์ ์๋ค. ์ด์ Logout ์ด๋ฒคํธ๋ฅผ ์๋ก ์ถ๊ฐํด ๋ณด์.
"events": {
"Login": {
"desc": "์ ์ ๋ก๊ทธ์ธ.",
"props": [
["ServerNo", "integer", "์๋ฒ ๋ฒํธ"]
]
},
"Logout": {
"desc": "์ ์ ๋ก๊ทธ์์.",
"props": [
["ServerNo", "integer", "์๋ฒ ๋ฒํธ"]
]
}
}
}
๋ค์ ๋ฌธ์๋ฅผ ๋ณด๋ฉด
$ loglab -m foo.meta.json doc --skip required --exclude-column required
Event : Login
Description: ์ ์ ๋ก๊ทธ์ธ.
+------------+----------+---------------+
| Property | Type | Description |
|------------+----------+---------------|
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ |
| Event | string | ์ด๋ฒคํธ ํ์
|
| ServerNo | integer | ์๋ฒ ๋ฒํธ |
+------------+----------+---------------+
Event : Logout
Description: ์ ์ ๋ก๊ทธ์์.
+------------+----------+---------------+
| Property | Type | Description |
|------------+----------+---------------|
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ |
| Event | string | ์ด๋ฒคํธ ํ์
|
| ServerNo | integer | ์๋ฒ ๋ฒํธ |
+------------+----------+---------------+
๋ก๊ทธ์์ ์ด๋ฒคํธ๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ์ ์ ์๋ค.
์์์ ๊ฐ์ ServerNo ์์ฑ์ด ๋ก๊ทธ์ธ๊ณผ ๋ก๊ทธ์์์์ ์ค๋ณต๋๊ณ ์๋๋ฐ, ๊ฐ์ฒด ์ฐธ์กฐ ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ๋ฆฌํฉํ ๋งํด ๋ณด์.
{
"bases": {
"Common": {
"desc": "๊ณตํต ์์."
"props": [
["ServerNo", "integer", "์๋ฒ ๋ฒํธ"]
]
}
},
"events": {
"Login": {
"desc": "์ ์ ๋ก๊ทธ์ธ.",
"mixins": ["bases.Common"]
},
"Logout": {
"desc": "์ ์ ๋ก๊ทธ์์.",
"mixins": ["bases.Common"]
}
}
}
์ฐธ์กฐ๋ ๊ณตํต ์์ฑ์ bases ์์ ์๋ ๋ฒ ์ด์ค ์์ ํ์์ผ๋ก ์ ์ํ๋ฉด ๋๋ค. ๋ฒ ์ด์ค ์์๋ ์ด๋ฒคํธ์ ๋น์ทํ๋, ์ง์ ์ถ๋ ฅ๋์ง ์๊ณ , ์ด๋ฒคํธ ์์๋ ๋ค๋ฅธ Base ์์์์ ์ฐธ์กฐ๋๊ธฐ ์ํ ์ฉ๋์ด๋ค.
Login/Logout ์ด๋ฒคํธ์์๋ mixins ์์๋ฅผ ํตํด ์ฐธ์กฐํ ํ๋ ์ด์์ ๋ฒ ์ด์ค๋ ์ด๋ฒคํธ ์์๋ฅผ ๊ธฐ์ ํ ์ ์๋ค. bases.Common์ bases๋ ๋ฃจํธ ์์์ ์ด๋ฆ์ด๊ณ , Common์ ์ฐธ์กฐํ ๋ฒ ์ด์ค ์์์ ์ด๋ฆ์ด๋ค.๏ฟฝ ์ด๋ฒคํธ ์์๋ฅผ ์ฐธ์กฐํ๋ ค๋ฉด events.์ด๋ฒคํธ_์ด๋ฆ ์์ด ๋๋ค.
๋ง์ฝ mixins์ ํ๋ ์ด์์ ์์๊ฐ ์๊ณ ๊ทธ๋ค๊ฐ ๊ฒน์น๋ ์์ฑ์ด ์์ผ๋ฉด, ๋์ค์ ๋ฑ์ฅํ๋ ๊ฒ์ ์์ฑ์ด ์ฐ์ ํ๊ฒ ๋๋ค.
์ฐธ์กฐ๋๋ ์ธก๊ณผ ์ฐธ์กฐํ๋ ์ธก์ ๊ฐ์ ์์๊ฐ ๊ฒน์น๋ฉด, ์ฐธ์กฐํ๋ ์ธก์ ๊ฒ์ ์ฌ์ฉํ๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด ์์ bases.Common ๊ณผ events.Login ๋ชจ๋์ desc ์์๊ฐ ์๋๋ฐ, ์ด ๊ฒฝ์ฐ Login ์ desc ์์๊ฐ ์ฐ์ ํ๊ฒ ๋๋ค.
์์ ๋ ๋ฉํํ์ผ๋ก ๋ค์ ๋ฌธ์๋ฅผ ์ถ๋ ฅํ๋ฉด, ๋ฆฌํฉํ ๋ง ์ ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ ๊ฒ์ด๋ค.
์ํ ๋ก๊ทธ์ ์์ฑ๊ฐ ์ ์ฝํ๊ธฐ
์ค์ ๋ก๊ทธ๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง ๋ฏธ๋ฆฌ ์ดํด๋ณผ ์ ์๋ค๋ฉด, ๋ก๊ทธ๋ฅผ ๋ง๋ค๊ฑฐ๋ ์ฒ๋ฆฌํ๋ ์ ์ฅ์์ ๋์์ด ๋ ๊ฒ์ด๋ค. ๋ก๊ทธ๋ฉ์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ํ ๋ก๊ทธ๋ฅผ ์์ฑํ ์ ์๋ค.
{
"Logout": {
"Datetime": "2019-11-13T20:20:39+09:00",
"ServerNo": -1932
}
}
{
"Login": {
"Datetime": "2019-11-13T20:20:40+09:00",
"ServerNo": 94840191
}
}
{
"Login": {
"Datetime": "2019-11-13T20:20:41+09:00",
"ServerNo": -3948
}
}
{
"Logout": {
"Datetime": "2019-11-13T20:20:42+09:00",
"ServerNo": 114938
}
}
์์์ ์ด๋ฒคํธ ๋ก๊ทธ๊ฐ 4๊ฐ ์์ฑ์ด ๋์๋ค. Datetime ์์ฑ์ ํ์ฌ ์๊ฐ์์ ์ฆ๊ฐํ๋ ์์ผ๋ก ์ฑ์์ง๋ค. ๋ก๊ทธ๋ฉ์ ๋ ์ ๋ฐ ์๊ฐ ํ์์ RFC3339๋ฅผ ๋ฐ๋ฅธ๋ค. (https://json-schema.org/latest/json-schema-validation.html#RFC3339)
ServerNo ์์ฑ์ ๊ฐ์ ์ข ํน์ดํ๋ฐ, ์ง๋์น๊ฒ ํฐ ๊ฐ์ด๋ ์์ ์๊ฐ ์์ฌ์ ๋์ค๊ณ ์๋ค. ์ด๋ ์์ฑ์ ํ์ ์ธ integerํ์ ๋ง์ถฐ ์์์ ๊ฐ์ด ์ฑ์์ง๊ธฐ ๋๋ฌธ์ด๋ค. ์ข ๋ ๊ทธ๋ด๋ฏํ ์๋ฒ ๋ฒํธ๋ฅผ ์ํด ์์ฑ ๊ฐ์ ์ ์ฝ์ ์ถ๊ฐํ ์ ์๋ค. ๋จ, ์ ์ฝ์ ์ง์ ํ๊ธฐ ์ํด์๋ props ์๋ ์์ฑ๊ฐ์ ๋ฆฌ์คํธํ์ด ์๋ ๊ฐ์ฒดํ์ผ๋ก ๊ธฐ์ ํด์ผ ํ๋ค.
{
"bases": {
"Common": {
"desc": "๊ณตํต ์์."
"props": [
{
"name": "ServerNo",
"desc": "์๋ฒ ๋ฒํธ",
"type": "integer",
"minimum": 1,
"maximum": 10
}
]
}
},
"events": {
"Login": {
"desc": "์ ์ ๋ก๊ทธ์ธ.",
"mixins": ["bases.Common"]
},
"Logout": {
"desc": "์ ์ ๋ก๊ทธ์์.",
"mixins": ["bases.Common"]
}
}
}
์์ฑ์ ๊ฐ์ฒดํ์ผ๋ก ๊ธฐ์ ํ ๋๋ name, type, desc ๋ฑ์ด ํ์ ์์์ด๋ฉฐ, ํ์์ ๋ฐ๋ผ ์ ์ฝ ๋ฑ ๋ค์ํ ์ถ๊ฐ ์์๋ฅผ ๊ธฐ์ ํ ์ ์๋ค.
๋ค์ ์ํ ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด
$ loglab -m foo.meta.json sample
{
"Logout": {
"Datetime": "2019-11-13T20:20:39+09:00",
"ServerNo": 3
}
}
{
"Login": {
"Datetime": "2019-11-13T20:20:40+09:00",
"ServerNo": 9
}
}
{
"Login": {
"Datetime": "2019-11-13T20:20:41+09:00",
"ServerNo": 1
}
}
{
"Logout": {
"Datetime": "2019-11-13T20:20:42+09:00",
"ServerNo": 4
}
}
์ฌ์ ํ ์์์ ์์ฑ๊ฐ์ด๋, ์ ์ฝ์ ๋ง์ถฐ ์ข ๋ ๊ทธ๋ด๋ฏํด ๋ณด์ธ๋ค. ๋ฌธ์์์๋ ์์ฑ์ ์ ์ฝ์ ํ์ธํ ์ ์๋ค.
$ loglab -m foo.meta.json doc --exclude-column required
Event : Login
Description: ์ ์ ๋ก๊ทธ์ธ.
+------------+----------+-----------------+------------------+
| Property | Type | Description | Constraint |
|------------+----------+-----------------+------------------+
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ | |
| Event | string | ์ด๋ฒคํธ ํ์
| |
| ServerNo | integer | ์๋ฒ ๋ฒํธ | 1์ด์ 10์ดํ |
+------------+----------+-----------------+------------------+
Event : Logout
Description: ์ ์ ๋ก๊ทธ์์.
+-------------+----------+----------------+----------------+
| Property | Type | Description | Constraint |
|-------------+----------+----------------+----------------+
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ | |
| Event | string | ์ด๋ฒคํธ ํ์
| |
| ServerNo | integer | ์๋ฒ ๋ฒํธ | 1์ด์ 10์ดํ |
+-------------+----------+----------------+----------------+
์ด๋ฌํ ์์ฑ๊ฐ ์ ์ฝ์ ๋์ค์ ์ค๋ช ํ ๋ก๊ทธ ๊ฒ์ฆ์์๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์๋ค. ์์ ๊ฐ์ด ๋ก๊ทธ๋ฉ ์์์ ์์ฑ์ ์ ์ฝ์ ๊ฐํ ๋๋ JSON ์คํค๋ง์ ๋ฐฉ์์ ๋ฐ๋ฅธ๋ค. ๋ค์ํ ์ ์ฝ ๋ฐฉ๋ฒ์ด ์์ผ๋ https://json-schema.org/understanding-json-schema/reference/index.html ์ ์ฐธ๊ณ ํ์.
์ด์ , ๊ณตํต ์์์ ๋ณ๋๋ก ์ด๋ฒคํธ๋ณ ์์ฑ์ ์ฌ์ฉํด ๋ณด์. ์๋ก Login์๋ Platform ์์ฑ์, Logout์๋ PlayTime ์์ฑ์ ์ถ๊ฐํ๊ฒ ๋ค.
{
"bases": {
"Common": {
"desc": "๊ณตํต ์์."
"props": [
{
"name": "ServerNo",
"desc": "์๋ฒ ๋ฒํธ",
"type": "integer",
"minimum": 1,
"maximum": 10
}
]
}
},
"events": {
"Login": {
"desc": "์ ์ ๋ก๊ทธ์ธ.",
"mixins": ["bases.Common"],
"props": [
{
"name": "Platform",
"desc": "๋๋ฐ์ด์ค ํ๋ซํผ",
"type": "string":,
"enum": ["ios", "aos"]
}
]
},
"Logout": {
"desc": "์ ์ ๋ก๊ทธ์์.",
"mixins": ["bases.Common"],
"props": [
{
"name": "PlayTime",
"desc": "ํ๋ ์ด ์๊ฐ(๋ถ)."
"type": "integer",
"minimum": 0
}
]
}
}
}
Login์ ์ถ๊ฐ๋ Platform ์์ฑ์ ์ ์ ๊ฐ ๋ก๊ทธ์ธ์ ์ด์ฉํ ๋ชจ๋ฐ์ผ ๋๋ฐ์ด์ค์ ํ๋ซํผ์ ๊ฐ์ ํ๋ค. string ํ์ ์ด๋ enum์ผ๋ก ๋์ดํ ์ ์ฝ์ด ์๋ค. enum์ ๋ฆฌ์คํธ ๊ฐ์ ๊ฐ์ง๋ฉฐ ์ฌ๊ธฐ์ ๋ฑ๋ก๋ ๊ฐ๋ง ํ์ฉ๋๋ค. Logout์ ์ถ๊ฐ๋ PlayTime์ ์ ์ ๊ฐ ๋ก๊ทธ์ธ ํ ๋ก๊ทธ์์๊น์ง ํ๋ ์ดํ ์๊ฐ์ ์๋ฏธํ๋ฉฐ ๋ถ์ ๋จ์๋ก ํ๋ค. 0์ด์ ๊ฐ๋ง ํ์ฉํ๋ ์ ์ฝ์ด ์๋ค.
์ด์ ๋ค์ ๋ก๊ทธ ๋ฌธ์๋ฅผ ์ดํด๋ณด์.
$ loglab -m foo.meta.json doc --exclude-column required
Event : Login
Description: ์ ์ ๋ก๊ทธ์ธ.
+------------+----------+-----------------+------------------+
| Property | Type | Description | Constraint |
|------------+----------+-----------------+------------------+
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ | |
| Event | string | ์ด๋ฒคํธ ํ์
| |
| ServerNo | integer | ์๋ฒ ๋ฒํธ | 1์ด์ 10์ดํ |
| Platform | string | ๋๋ฐ์ด์ค ํ๋ซํผ | ios, aos ์ค ์ ํ |
+------------+----------+-----------------+------------------+
Event : Logout
Description: ์ ์ ๋ก๊ทธ์์.
+-------------+----------+----------------+----------------+
| Property | Type | Description | Constraint |
|-------------+----------+----------------+----------------+
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ | |
| Event | string | ์ด๋ฒคํธ ํ์
| |
| ServerNo | integer | ์๋ฒ ๋ฒํธ | 1์ด์ 10์ดํ |
| PlayTime | integer | ์ธ์
์๊ฐ(๋ถ) | 0 ์ด์ |
+-------------+----------+----------------+----------------+
์ด๋ฒคํธ๋ณ๋ก ์๋ก์ด ์์ฑ์ด ์ถ๊ฐ๋์๋ค. Login ์ด๋ฒคํธ์๋ Platform ์์ฑ์ด, Logout ์ด๋ฒคํธ์๋ PlayTime ์์ฑ์ ๋ํ ์ค๋ช ์ด ๋์ค๋ ๊ฒ์ ์ ์ ์๋ค.
๋ก๊ทธ์ ๊ฒ์ฆ
๊ฐ๋ฐ์๋ ์ ์ ์๋ ๋ช ์ธ์ ๊ฑฐ๊ธฐ์์ ์์ฑ๋ ๋ฌธ์ ๋ฐ ์ํ์ ์ฐธ๊ณ ํด ๋ก๊ทธ ์ฝ๋๋ฅผ ๋ง๋ค์๋ค ํ๋๋ผ๋, ์ฌ์ ํ ์์ฑ๋ ๋ก๊ทธ๊ฐ ํ์ค์ ์ ํฉํ์ง ํ์ธํ๊ณ ์ถ์ ์ ์๋ค. ๋ก๊ทธ๋ฉ์ ๋ก๊ทธ ๊ฒ์ฆ ๊ธฐ๋ฅ์ ์ด์ฉํ๋ฉด ์์ฑ๋ ๋ก๊ทธ์ ํ์ค ์ค์ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ , ๋ง์ฝ ๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ด๋์์ ์ด๋ค ๋ฌธ์ ๊ฐ ์๋์ง ์ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ JSON ๋ก๊ทธํ์ผ my_log.json์ด ์๋ค๊ณ ํ์.
{
"Login": {
"Datetime": "2019-11-13T20:20:41+09:00",
"ServerNo": 1,
"Platform": ios
}
}
{
"Logout": {
"Datetime": "2019-11-13T20:21:42+09:00",
"ServerNo": "1"
}
}
์๋์ ๋ช ๋ น์ผ๋ก ์ด๊ฒ์ ๊ฒ์ฆํ ์ ์๋ค.
$ loglab -m foo.meta.json verify my_log.json
Error: Not a valid JSON file.
json.decoder.JSONDecodeError: Expecting value: line 5 column 21 (char 100)
๋จผ์ ๋ฐ์ํ ๋ฌธ์ ๋ ์ด ๋ก๊ทธ ํ์ผ์ด ์ ํจํ JSON ํ์ผ์ด ์๋๋ผ๋ ๊ฒ์ด๋ค. ์์ Platform ์์ฑ์ ๊ฐ์ธ ios ์ ๋ฌธ์์ด์ ์ํ ์ฟผํ ์ด์ ๋งํฌ๊ฐ ์๊ธฐ ๋๋ฌธ. ์ด๋ฅผ "ios"๋ก ์์ ํ์ฌ ๋ค์ ๋๋ ค๋ณด์.
$ loglab -m foo.meta.json verify my_log.json
Error: Value type mismatch.
'ServerNo' is not of type 'integer'
์์์ integer ํ์ผ๋ก ๋ช ์ํ ServerNo์ ๊ฐ์ ์ ์๊ฐ ์๋ ๋ฌธ์์ด "1"์ด ์จ ๊ฒ์ด ๋ฌธ์ ์ด๋ค. ์ด๊ฒ๋ 1๋ก ์์ ํ์ฌ ๋ค์ ๋๋ ค๋ณด์.
$ loglab -m foo.meta.json verify my_log.json
Error: Required property 'PlayTime' does not exist!
Logout ์ด๋ฒคํธ์ (๊ธฐ๋ณธ์ ์ผ๋ก)ํ์๋ก ์ ์ธ๋ PlayTime ์์ฑ์ด ์กด์ฌํ์ง ์์ ๋ฐ์ํ ๋ฌธ์ ์ด๋ค. PlayTime์ ์ถ๊ฐํด ๋ค์ ๊ฒ์ฆํ๋ฉด ์ด์ ๋ชจ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ์ด๋ค.
$ loglab -m foo.meta.json verify my_log.json
`my_log.json` is a valid log file!
๊ณต์ฉ ๋ฉํํ์ผ์ ์ด์ฉ
์ง๊ธ๊น์ง๋ ๋จ์ํ ํ๋์ ์๋น์ค๋ฅผ ์ํ ๋ก๊ทธ ๋ฉํํ์ผ์ ์์ฑํด ๋ณด์๋ค. ๋ง์ฝ ์กฐ์ง์์ ์ด์ฉํ๋ ํ๋ ์ด์์ ์๋น์ค๊ฐ ์กด์ฌํ๊ณ , ๊ทธ ๋ก๊ทธ๋ค์ด ํ์ค์ ์ธ ํ์์ ์ ์งํ๋๋ก ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
๋ก๊ทธ๋ฉ์์๋ ๋ฉํํ์ผ๋ค๊ฐ ๊ณตํต์ ์ ๋ฆฌํฉํ ๋งํด ๊ณต์ฉ ๋ฉํํ์ผ์ ๋ง๋ค๊ณ , ๋ค๋ฅธ ๋ฉํํ์ผ์ด ๊ทธ๊ฒ์ ์ฐธ์กฐํ์ฌ ์ผ๊ด์ฑ์ ์งํค๋๋ก ํ ์ ์๋ค.
์์์ ์ดํด๋ณธ ๊ฐ์์ ์ ํฌ๋ฏธ ๊ฒ์ ํ์ฌ์ ๋ชจ๋ฐ์ผ ๊ฒ์ foo ์ธ์, ์๋ก์ด ์จ๋ผ์ธ ๊ฒ์ boo ๋ฅผ ๋ง๋ค๊ณ ์๋ค๊ณ ํ์.๏ฟฝ ์ด ํ์ฌ๋ ๋ ์๋น์ค๊ฐ ๊ณตํต ํ์ค์ ๋ฐ๋ฅด๊ธฐ๋ฅผ ์ํ๊ณ , ์ด์ ์ ํฌ๋ฏธ๋ฅผ ์ํ ๊ณต์ฉ ๋ฉํํ์ผ์ ์์ฑํ๊ธฐ๋ก ํ๋ค.
foo์ ๋ด์ฉ์ ๋๋ถ๋ถ ์ฐจ์ฉํด ์๋์ฒ๋ผ acme.meta.json ์ ์์ฑํ๋ค.
{
"info": {
"name": "์ ํฌ๋ฏธ ๋ก๊ทธ ํ์ค",
"desc": "์ ํฌ๋ฏธ์ ๋ก๊ทธ ํ์ค ๋ช
์ธ. ์์ธํ ๊ฒ์ https://github.com/acme/loglab ์ ์ฐธ๊ณ ํ์ธ์."""
},
"bases": {
"Common": {
"props": [
{
"name": "ServerNo",
"type": "integer",
"minimum": 1,
"maximum": 10
}
]
}
},
"events": {
"Login": {
"desc": "๋ก๊ทธ์ธ",
"mixins": ["bases.Common"],
"props": [
{
"name": "Platform",
"desc": "๋๋ฐ์ด์ค ํ๋ซํผ",
"type": "string",
}
]
},
"Logout": {
"desc": "๋ก๊ทธ์์",
"mixins": ["bases.Common"],
"props": [
{
"name": "PlayTime",
"desc": "ํ๋ ์ด ์๊ฐ(๋ถ)."
"type": "integer",
"minimum": 0
}
]
}
}
}
ํน์ง ์ ์ธ ๊ฒ์ ๊ฐ์ฅ ๋จผ์ ๋์ค๋ info ์์์ด๋ค. ์ฌ๊ธฐ์ ๋ฉํํ์ผ์ ๊ดํ ์ฌ๋ฌ ์ ๋ณด ์์๋ฅผ ๊ธฐ์ ํ ์ ์๋ค. name์ ๋ฉํํ์ผ์ ์ด๋ฆ์ด๊ณ , desc ๋ ๋ฉํํ์ผ์ ๊ดํ ์ถ๊ฐ์ ์ธ ์ค๋ช ์ด๋ค. ๋ค์ํ ๋ฉํํ์ผ์ ์ฌ์ฉํ ๋ ๋์์ด ๋ ๊ฒ์ด๋ค.
๋๋จธ์ง๋ ๊ธฐ์กด์ foo ๋ฉํํ์ผ์ ๋ด์ฉ ์ค, ๋ชจ๋ฐ์ผ ํนํ๋ ๋ด์ฉ์ธ Platform์ enum ์ ์ ์ธํ ๋๋ถ๋ถ ์์๋ฅผ ๊ฐ์ ธ์๋ค. ๋ฌธ์๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ๋์จ๋ค.
$ loglab -m acme.meta.json doc --exclude-column required
Meta : ์ ํฌ๋ฏธ ๋ก๊ทธ ํ์ค
Meta Description: ์ ํฌ๋ฏธ์ ๋ก๊ทธ ํ์ค ๋ช
์ธ. ์์ธํ ๊ฒ์ https://github.com/acme/loglab ์ ์ฐธ๊ณ ํ์ธ์.
Event : Login
Description: ์ ์ ๋ก๊ทธ์ธ.
+------------+----------+-----------------+------------------+
| Property | Type | Description | Constraint |
|------------+----------+-----------------+------------------+
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ | |
| Event | string | ์ด๋ฒคํธ ํ์
| |
| ServerNo | integer | ์๋ฒ ๋ฒํธ | 1์ด์ 10์ดํ |
| Platform | string | ๋๋ฐ์ด์ค ํ๋ซํผ | |
+------------+----------+-----------------+------------------+
Event : Logout
Description: ์ ์ ๋ก๊ทธ์์.
+-------------+----------+----------------+----------------+
| Property | Type | Description | Constraint |
|-------------+----------+----------------+----------------+
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ | |
| Event | string | ์ด๋ฒคํธ ํ์
| |
| ServerNo | integer | ์๋ฒ ๋ฒํธ | 1์ด์ 10์ดํ |
| PlayTime | integer | ์ธ์
์๊ฐ(๋ถ) | 0 ์ด์ |
+-------------+----------+----------------+----------------+
์ด์ ๊ธฐ์กด์ foo ๋ฉํํ์ผ์ด ์ด๊ฒ์ ์ฐธ์กฐํ๋๋ก foo.meta.json์ ์๋์ ๊ฐ์ด ์์ ํ๋ค.
{
"info": {
"name": "foo ๋ก๊ทธ ๋ช
์ธ",
"desc": "๋ชจ๋ฐ์ผ ๊ฒ์ foo์ ๋ก๊ทธ ๋ช
์ธ. ์์ธํ ๊ฒ์ https://github.com/acme/loglab/foo ๋ฅผ ์ฐธ๊ณ ํ์ธ์
},
"metas": [
["https://github.com/acme/loglab/aceme.meta.json", "acme"]
],
"events": {
"Login": {
"mixins": ["acme.events.Login"],
"props": [
{
"name": "Platform",
"enum": ["ios", "aos"]
}
]
}
}
}
์๋ก์ด metas ์์๊ฐ ๋ณด์ธ๋ค. ์ฌ๊ธฐ์ ์ฐธ์กฐํ๋ ๊ณต์ฉ ๋ฉํํ์ผ์ [๋ฉํํ์ผ_URL, ๋ฉํํ์ผ_๋ณ์นญ] ํ์์ผ๋ก ํ๋ ์ด์ ๋ฑ๋กํ ์ ์๋ค.
์ด๋ฐ ์์ผ๋ก ๋ค๋ฅธ ์ธ๋ถ ๋ฉํํ์ผ์ ์ฐธ์กฐํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ํจ๊ณผ๊ฐ ์๋ค.
- mixins์์ ๋ณ์นญ์ ํตํด ์ธ๋ถ ๋ฉํํ์ผ์ ๋ฒ ์ด์ค๋ ์ด๋ฒคํธ ์์๋ฅผ ์ฐธ์กฐ ํ ์ ์๋ค.
- ์ํ ๋ก๊ทธ๋ ๋ก๊ทธ ์คํค๋ง ์์ฑ์, ์ฐธ์กฐ๋ ๋ฉํํ์ผ์ ์๋ ์ด๋ฒคํธ ์์๋ ์๋์ผ๋ก ์์ฑ๋๋ค.
- ์ฐธ์กฐ๋๋ ์ธก๊ณผ ์ฐธ์กฐํ๋ ์ธก์ ๊ฐ์ ์์๊ฐ ๊ฒน์น๋ฉด, ์ฐธ์กฐํ๋ ์ธก์ ๊ฒ์ด ์ฐ์ ํ๋ค.
์ ํ์ผ์์๋ Login ์ด๋ฒคํธ์ Platform ์์ฑ์ enum ๋ง ์ง์ ํ๊ณ ์์ง๋ง, ๋ฌธ์๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด,
$ loglab -m foo.meta.json doc --exclude-column required
Meta : foo ๋ก๊ทธ ๋ช
์ธ
Meta Description: ๋ชจ๋ฐ์ผ ๊ฒ์ foo์ ๋ก๊ทธ ๋ช
์ธ. ์์ธํ ๊ฒ์ https://github.com/acme/loglab/foo ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Event : Login
Description: ์ ์ ๋ก๊ทธ์ธ.
+------------+----------+-----------------+------------------+
| Property | Type | Description | Constraint |
|------------+----------+-----------------+------------------+
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ | |
| Event | string | ์ด๋ฒคํธ ํ์
| |
| ServerNo | integer | ์๋ฒ ๋ฒํธ | 1์ด์ 10์ดํ |
| Platform | string | ๋๋ฐ์ด์ค ํ๋ซํผ | ios, aos ์ค ์ ํ |
+------------+----------+-----------------+------------------+
Event : Logout
Description: ์ ์ ๋ก๊ทธ์์.
+-------------+----------+----------------+----------------+
| Property | Type | Description | Constraint |
|-------------+----------+----------------+----------------+
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ | |
| Event | string | ์ด๋ฒคํธ ํ์
| |
| ServerNo | integer | ์๋ฒ ๋ฒํธ | 1์ด์ 10์ดํ |
| PlayTime | integer | ์ธ์
์๊ฐ(๋ถ) | 0 ์ด์ |
+-------------+----------+----------------+----------------+
๋ฉํํ์ผ ์ฐธ์กฐ๋ฅผ ์ด์ฉํ๊ธฐ ์ ๊ณผ๊ฐ์ด Login๊ณผ Logout ๋ ์ด๋ฒคํธ์ ๋ชจ๋ ์์ฑ์ด ์ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก boo์ ๋ฉํํ์ผ boo.meta.json ๋ ์๋์ ๊ฐ์ด ์์ฑํ๊ณ ,
{
"info": {
"name": "boo ๋ก๊ทธ ๋ช
์ธ",
"desc": "์จ๋ผ์ธ ๊ฒ์ boo์ ๋ก๊ทธ ๋ช
์ธ. ์์ธํ ๊ฒ์ https://github.com/acme/loglab/boo ๋ฅผ ์ฐธ๊ณ ํ์ธ์
},
"metas": [
["https://github.com/acme/loglab/aceme.meta.json", "acme"]
],
"events": {
"Login": {
"mixins": ["acme.events.Login"],
"props": [
{
"name": "Platform",
"enum": ["pc", "mac", "linux"]
}
]
}
}
}
๋ฌธ์๋ฅผ ์ถ๋ ฅํด๋ณด์.
$ loglab -m foo.meta.json doc --exclude-column required
Meta : boo ๋ก๊ทธ ๋ช
์ธ
Meta Description: ์จ๋ผ์ธ ๊ฒ์ boo์ ๋ก๊ทธ ๋ช
์ธ. ์์ธํ ๊ฒ์ https://github.com/acme/loglab/boo ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Event : Login
Description: ์ ์ ๋ก๊ทธ์ธ.
+------------+----------+-----------------+------------------------+
| Property | Type | Description | Constraint |
|------------+----------+-----------------+------------------------+
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ | |
| Event | string | ์ด๋ฒคํธ ํ์
| |
| ServerNo | integer | ์๋ฒ ๋ฒํธ | 1์ด์ 10์ดํ |
| Platform | string | ๋๋ฐ์ด์ค ํ๋ซํผ | pc, mac, linux ์ค ์ ํ |
+------------+----------+-----------------+------------------------+
Event : Logout
Description: ์ ์ ๋ก๊ทธ์์.
+-------------+----------+----------------+----------------+
| Property | Type | Description | Constraint |
|-------------+----------+----------------+----------------+
| Datetime | datetime | ์ด๋ฒคํธ ์ผ์ | |
| Event | string | ์ด๋ฒคํธ ํ์
| |
| ServerNo | integer | ์๋ฒ ๋ฒํธ | 1์ด์ 10์ดํ |
| PlayTime | integer | ์ธ์
์๊ฐ(๋ถ) | 0 ์ด์ |
+-------------+----------+----------------+----------------+
์ด๋ฐ ๋ฐฉ์์ผ๋ก ๊ธฐ๋ณธ ๋ก๊ทธ ๊ตฌ์กฐ๋ ๊ณต์ ํ๋ฉด์, ์๋น์ค๋ณ๋ก ํนํ๋ ๋ด์ฉ๋ง ์ถ๊ฐ/๊ฐฑ์ ํ ์ ์๊ฒ ๋๋ค.
[[TODO]]