์ถ์ฒ: http://j.mearie.org/post/122845365013/serialization
2015๋ ๊ธ์ด๊ธฐ๋ ํ๋ ์ง๋ ฌํ์ ๋ํ ์ข์ ๋ด์ฉ์ด๋ผ๊ณ ์๊ฐํด์ Scrap ํด ๋ก๋๋ค.
์๊ธ ์์ฑ์ผ:2015-06-30T20:05+09:00
๋ฉฐ์น ์ ํด์ปค๋ด์ค์์ โ์ธํฐ๋ท์ ๋๋ฒ๊น ๋ชจ๋๋ก ๋์๊ฐ๊ณ ์๋ค"๋ ๊ธ์ ๋ณด์๋ค. ์, ์๋ ๊ธ์ ์ฝ์ ํ์๋ ์๋ค. ๊ธ์ ๋ด์ฉ์ด๋ผ๋ ๊ฒ JSON์ด๋ XML์ ํ ์คํธ ํฌ๋งท์ธ๋ฐ ๋ฐ์ด๋๋ฆฌ ํฌ๋งท๋ณด๋ค ์ค๋ฒํค๋๊ฐ ๋ช ๋ฐฐ ์ด์ ๋๊ธฐ ๋๋ฌธ์ CPU์ ๋์ญํญ์ ๋ ๋ง์ด ์๋ชจํ๊ณ ์ด๊ฒ ๋ชจ์ฌ์ ํ๊ฒฝ ์ด์๋ฅผ ์ผ์ผํจ๋ค๋ ์๊ธฐ๋ค. ๋ฌผ๋ก ๋ ์ค๋ช ํ ํ์ ์์ด ๊ฐ์๋ฆฌ๋ค. JSON์ ์ค๋ฒํค๋์ ๋ํ ๋ชฐ์ดํด(JSON/XML์ด ๊ทธ๋ง์น ๋นํจ์จ์ ์ด์ง ์๋ค๋ ์๊ธฐ๊ฐ ์๋๊ณ , ๋ฐ๋๋ก ๊ธ์ด์ด๊ฐ ์๊ฐํ๋ ๊ฒ๋ณด๋ค๋ ๋ ๋นํจ์จ์ ์ด๋ผ๋ ์๋ฏธ์์)๋ ์ฐจ์นํ๊ณ ๋ผ๋, ์๋ ์ปดํจํฐ๋ ์์์ ์จ์ ์ฌ๋์ ํธํ๊ฒ ํ๋ ๋ฐ ๊ทธ ์์๊ฐ ์๋ ๊ฒ์ด๊ณ ๊ทธ๊ฒ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ฉ๋์ง ์์ ์ด์ ๋ ์๋ค. ํ ์คํธ ํฌ๋งท์ด ๊ทธ ๋นํจ์จ์ฑ์๋ ๋ถ๊ตฌํ๊ณ ์ด์ ๋จ๋ ๋ฐ๋ ๋น์ฐํ ํฉ๋นํ ์ด์ ๊ฐ ์๋ค. ์ฌ์ค ๊ฑฐ๊ธฐ๊น์ง ๊ฐ์ง ์์๋ ํ๋ ์ปดํจํฐ๋ ๊ณ์ฐ๊ธฐ๋ผ๊ธฐ๋ณด๋ค๋ ๋ณต์ฌ ๊ธฐ๊ณ์ ๋ ๊ฐ๊น๋ค๋ง.
์ด ๊ฐ์๋ฆฌ๋ฅผ ๊ตณ์ด ๊ธ ์๋์์ ์๊ฐํ๋ ์ด์ ๋, ์ ๊ธ์ ์๋จธ๋ฆฌ์ ์ฐ์ฌ ์๋ ํ ๊ฐ์ง๋ ์ง์ค์ด๊ธฐ ๋๋ฌธ์ด๋ค. ํ๋กํ ์ฝ์ โ์ธ์ฝ๋ฉโ๊ณผ โ์๋ฏธ๋ก โ์ ๋ค๋ฅธ ๊ฒ์ด๋ค. (์ค์ ์๋ฏธ๋ก ๋ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ์ฃผ๊ธฐ ๋๋ฌธ์โ์ด๋ฅผํ ๋ฉด ์์ ํจํท์ ๋ ์ดํด์๊ฐ ํ์ฉํ๋ ํ๋ ์์์ ๋ญ์น๊ฑฐ๋โ์ด ๋ํ ์๋ ๊ธ์ ์ถฉ๋ถํ ๋ฐ๋ก ์ด ๋๋ค.) ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์๋ฏธ๋ก ์ ๊ฒฝ์ฐ๊ธฐ์๋ ๋ฐ์๊ธฐ ๋๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ฐ๋ฆฌ๊ฐ ์ ๋ง๋ค๊ณ ์๋ ๊ฑธ ์ ๊ฐ์ ธ๋ค ์ฐ๊ณ ์ถ๋ค. ๋ค์ฐจ์์ ์๋ฃ๋ฅผ ํ์ผ๋ก ์ ์ฅํ๊ฑฐ๋ ๋คํธ์ํฌ๋ก ๋ณด๋ด๊ธฐ์ ์๋ง๊ฒ ์ผ์ฐจ์์ผ๋ก ํผ์น๊ณ ๋ค์ ์๋๋๋ก ๋๋๋ฆฌ๋ ๊ฒ์ ์ฐ๋ฆฌ๋ ์ง๋ ฌํ(serialization)๋ผ๊ณ ๋ถ๋ฅธ๋ค. ํ๋กํ ์ฝ์ ๋ฐ์ดํธ ์ธ์ฝ๋ฉ์ ์ง๋ ฌํ๊ฐ ์ฐ์ด๋ ๋ํ์ ์ธ ์์ด๋ค. ์ต๊ทผ์ ์ง๋ ฌํ์ ๊ด๋ จํด์ ์๊ฐ์ ์ฌ๋ฟ ์ ๋ฆฌํ ์ผ์ด ์์๋๋ฐ, ์ข์ ๊ธฐํ๊ฐ ๋ ๊ฒ ๊ฐ์ ์ด ์ฐธ์ ๊ธ๋ก ์ ๋ฆฌํ๋ค.
์ง๋ ฌํ์ ์ข
๋ฅ
๋ชจ๋ ์ง๋ ฌํ์๋ ์ง๋ ฌํ๋๋ ์๋ฃ๊ฐ ์ด๋ค ์ข
๋ฅ์ธ์ง๋ฅผ ๋ํ๋ด๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์ด ์๊ณ , ์ด ๋ฐ์ดํฐ ๋ชจ๋ธ์ด ์ธ์ ๊ฒฐ์ ๋๋๋์ ๋ฐ๋ผ์ ์ง๋ ฌํ๋ฅผ ๋ ์ข
๋ฅ๋ก ๋๋ ์ ์๋ค. ์ด ์ฐจ์ด๋ฅผ ์๊ฐํ์ง ์๊ณ ์ง๋ ฌํ ๋ฐฉ๋ฒ์ ์ ํํ๋ฉด ๋นํจ์จ์ ์ด๊ฑฐ๋ ํ์ฅ์ฑ์ด ๋จ์ด์ง๊ฒ ๋๋ค.
๋ฐ์ดํฐ ๋ชจ๋ธ์ด ๊ณ ์ ๋์ด ์์ด์ ๋์ค์๋ ๋ณ๋ก ๋ฐ๋์ง ์๋๋ค๋ ๊ฑธ ์๊ณ ์๋ ๊ฒฝ์ฐ, ์ง๋ ฌํ ํฌ๋งท์ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง๋ค ์์ฑํด์ ์ธ ์ ์๋๋ฐ ์ด๋ฅผ schematicํ๋ค๊ณ ๋ถ๋ฅธ๋ค. (์, ์ ํํ๊ฒ ์ด๋ ๊ฒ ๋ถ๋ฅด๋์ง ๋ชจ๋ฅธ๋ค. ์ ์ด๋ ๋๋ ์ด๋ ๊ฒ ๋ถ๋ฅธ๋ค.) ํํ ์๋ก ํ๋กํ ์ฝ ๋ฒํผ๋ Capโn Proto ๊ฐ์ ๊ฒ์ ๋ค ์ ์๋ค. Schematicํ ์ง๋ ฌํ ๋ฐฉ๋ฒ์ ์ฑ๋ฅ์ ์ฐ์ ์ํ๋๋ ๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ์ฐ์ ์ํ๋๋์ ๋ฐ๋ผ ๋ค์ ํฌ๊ฒ ๋๋ ์ ์๋๋ฐ, ์ด์ง๊ฐํด์๋ ์ด๋ ์ชฝ์ด๋ ํ์ ํ schemalessํ ์ง๋ ฌํ๋ณด๋ค๋ ํจ์จ์ ์ด๋ค. ์๋ฐํ๋ ์ง๋ ฌํ ๋ฐฉ๋ฒ ์์ฒด์ ์ฅ์ ์ ์๋์ง๋ง, ๋ฐ์ดํฐ ๋ชจ๋ธ์ด ๊ณ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ด๊ธ๋๋ ๋ฐ์ดํฐ๋ฅผ ํฌ๋งท ๋จ์์ ๋๋ถ๋ถ ๊ฑธ๋ฌ๋ผ ์ ์๋ค๋ ๊ฒ๋ ์ข์ ์ ์ด๋ค. ํ์ง๋ง ๋ฏธ๋ฆฌ ํ์ฅ์ฑ์ ๊ณ ๋ คํ์ง ์์ผ๋ฉด ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ํํํ ์ ์๋ค๋ ๊ทผ๋ณธ์ ์ธ ์ฝ์ ์ด ์์ผ๋ฉฐ, ๋ณดํต ํฌ๋งท์ ์๋ ์์ฑํ๊ธฐ ์ํ ์ปดํ์ผ๋ฌ๋ฅผ ๋ผ๊ณ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ฐ๊ธฐ๊ฐ ์ข ๊ท์ฐฎ๋ค๋ ๋จ์ ๋ ์๋ค.
๋ฐ๋๋ก, ๋๋ถ๋ถ์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ํฌํจํ๋ ๋ฒ์ฉ(universal) ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ฐ๋ ์ ๊ทผ์ด ์๋ค. ์๋ฅผ ๋ค์ด์ ์ฌ๊ท๊ฐ ์๋ ์๋ฃ๋ผ๋ฉด ์ค์นผ๋ผ๊ฐ(์ซ์๋ ๋ฌธ์์ด ๋ฑ), ์์๊ฐ ์๋ ์์ด ๋ฐ ์์๊ฐ ์๋ ์งํฉ๋ง ๊ฐ์ง๊ณ ์ด์ง๊ฐํ ๊ฑด ๋ค ๋ํ๋ผ ์ ์๋ค. ์ด๋ฌํ ์ ๊ทผ์ ๋ฐ๋ฅด๋ ๋ฐฉ๋ฒ์ schemalessํ๋ค๊ณ ํ๋ค. (์ด๊ฒ๋ ๋ด๊ฐ ๋ถ๋ฅด๋ ๋ง์ด๋ค.) ํํ ์๋ก JSON์ด๋ MessagePack ๊ฐ์ ๊ฒ์ด ์๋ค. Schemalessํ ์ง๋ ฌํ ๋ฐฉ๋ฒ์ schematicํ ๊ฒ๊ณผ ์ ๋ฐ๋๋๋ ์ฅ๋จ์ ์ ๊ฐ์ง๊ณ ์๋๋ฐ, ์๋ฃ์ ๊ฒ์ฆ์ ๋ณดํต ์๋์ผ๋ก ํด์ผ ํ๊ณ ๋ ํจ์จ์ ์ด์ง๋ง, ํด๋น ํฌ๋งท์ ๊ณตํต๋๋ ๋๊ตฌ๋ค์ ๊ณต์ ํด์ ์ธ ์ ์๊ณ , ๋ณดํต ์ ํ์คํ๋์ด ์์ผ๋ฉฐ ์ํธ์ด์ฉ์ฑ์ด ์ฌ๋ผ๊ฐ๋ค. ์๋ฅผ ๋ค์ด์ ํ์ผ ํฌ๋งท์ผ๋ก JSON์ ์ด๋ค๋ฉด ๋ฌผ๋ก ํฌ๊ธฐ๋ ์ข ์ปค์ง๊ฒ ์ง๋ง ๋์ ์ด์ง๊ฐํ ์ธ์ด์์ ๋ณ๋ ์์ ์์ด ๊ทธ ํ์ผ์ ์ฝ์ ์ ์๊ฒ ๋ ๊ฒ์ด๋ค.
๋ชฉ๋ก์์ XML์ด ๋น ์ง ๊ฒ์ ๋์น์ฑ ์ฌ๋์ด ์์ ๊ฒ์ด๋ค. XML์ ๋ด ๊ฐ์ธ์ ์ผ๋ก ์๊ฐํ๊ธฐ์๋ ์ด ๊ฐ๋ ๋ค์ด ์ ์ ์ฐฉํ๊ธฐ ์ ์ ๋ง๋ค์ด์ง ์ํ๊น์ด ๋ฌผ๊ฑด์ธ๋ฐ, XML์ด DTD๋ XML Schema ๊ฐ์ ๊ฒ๊ณผ ๊ฒฐํฉํด์ ์คํค๋ง๊ฐ ์กด์ฌํ๊ฒ ๋๋ฉด schematicํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด schemalessํ๋ค๊ณ ํ ์ ์๋ค. XML์ด ์ํ๊น์ด ์ด์ ๋, ๋ ์ค ํ๋๋ฅผ ์ ํํ์ง ๋ชป ํ๊ณ ์ด๋ ์ ๋ ์๋ ๊ณตํต ํฌ๋งท์ ์ฌ์ฉํ๊ณ ์๋ค๋ ์ ์ด๋ค(โฆ). ๊ทธ๊ฒ๋ ์์ฃผ ๋ณต์ก๋ค๋จํ, ๋ถ๋ถ์ ์ผ๋ก๋ง ๊ตฌ์กฐํ๋์ด ์๊ณ (semi-structured) ์์ฐ์ด ๋ฌธ์์ ๊ฐ๊น์ด ํฌ๋งท์ ๋ง์ด๋ค. XML์ ์ ์ผํ ์ฅ์ ์ ํฌ๋งท๊ณผ ํฌ๋งท์ ๋ค๋ฃจ๋ ๊ธฐ๋ฐ ๊ธฐ์ ๋ค์ด ์ด์จ๋ ๊ฐ์ ๋ค ํ์คํ๋์ด ์๋ค๋ ์ ์ด์๋๋ฐ, ๋ค๋ฅธ ํ์คํ๋ ํฌ๋งท๋ค์ด ๋ถ์ํ๋ฉด์ ์ด์ ๋ด์ธ์ธ๋งํ ์ฅ์ ๋ ์๋๊ฒ ๋์๋ค.
์ง๋ ฌํ์ ๋๋ถ๋ฅ ์ธ์๋ ์ง๋ ฌํ๋ฅผ ๊ท์ ์ง๋ ํน์ฑ์ ๋ช ๊ฐ์ง๊ฐ ๋ ์๋ค. ์ฐ์ ์คํธ๋ฆฌ๋ฐ ๊ฐ๋ฅํ ์ง๋ ฌํ๋ ๋ฐ์ดํฐ์ ์ ์ฒด ํฌ๊ธฐ๋ฅผ ์์ง ๋ชป ํ๊ณ ๋ ์ง๋ ฌํ๋ฅผ ํ ์ ์๋ค๋ ์๋ฏธ์ด๋ค. (ํ ๋ฒ ์ด ๋ฐ์ดํฐ๋ก ๋ค์ ๋์๊ฐ์ ํฌ๊ธฐ๋ฅผ ๋ฃ๋๋ค๊ฑฐ๋ ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ์น๋ค. ์ด๊ฒ ํญ์ ๊ฐ๋ฅํ๋ค๋ ๋ณด์ฅ์ด ์๋ค.) ๋ณดํต ์ด๋ ๋ฐฐ์ด์ด๋ ๋ฌธ์์ด ๊ฐ์ ๊ฒ์ ๊ธธ์ด๊ฐ ๋ฐ์ดํฐ ์์ ๋์ค์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋๋ฐ, ์ญ์ง๋ ฌํ๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ค๋ฉด ๊ธธ์ด๋ฅผ ๋จผ์ ์๋ ๊ฒ ์ฐ์ ์ด๊ธฐ ๋๋ฌธ์ ํ์ฐ์ ์ผ๋ก ์ง๋ ฌํ๋ฅผ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด์ ์ญ์ง๋ ฌํ ์ฑ๋ฅ์ ํฌ์ํ๋ค๊ณ ์๊ฐํ๋ฉด ์ข๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์คํธ๋ฆฌ๋ฐ์ ๋ช ์์ ์ผ๋ก ์๋ํ๊ณ ์ง์ฌ์ง ์ง๋ ฌํ ๋ฐฉ๋ฒ์ ์คํธ๋ฆฌ๋ฐํ ๊ฑฐ๋ ๋ง๊ฑฐ๋๋ฅผ ์ ํํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๋ค. ๋ํ ์คํธ๋ฆฌ๋ฐ์ด ๋๋ค ํ๋๋ผ๋ ๋ฌธ์์ด ๊ฐ์ ์์์ ๊ฐ๊น์ง๋ ์คํธ๋ฆฌ๋ฐ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ ๊ตฌ๋ถํ ํ์๊ฐ ์๋ค.
์ ๊ทํ ๊ฐ๋ฅํ ์ง๋ ฌํ๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ค์ด ์๋ ๋ชจ๋ ๋๋ ๋๋ถ๋ถ์ ๋ฐ์ดํฐ์ ๋ํด์ ์ ํํ ํ๋์ ์ ๊ทํ๋ ์ง๋ ฌํ ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ๋ฉฐ ๊ทธ ์ญ๋ ์ฑ๋ฆฝํ๋ค๋ ๋ป์ด๋ค. ์ด๋ฅผํ ๋ฉด ์์ ์๋ ์์ด(์งํฉ)์์ ๋ชจ๋ ์์๋ฅผ ํน์ ์์๋๋ก ์ ๋ ฌํด์ ํํํ๋ค๋ฉด ํ ์งํฉ์๋ ํ๋์ ์ ๋ ฌ๋ ๋ฐฉ๋ฒ๋ง ์กด์ฌํ๋ฏ๋ก ์ ๊ทํ๊ฐ ๋ ๊ฒ์ด๋ค. ์ ๊ทํ๊ฐ ์ ํ์ํ๋๊ณ ๋ฌป๋๋ค๋ฉดโฆ ์ํธํ์ ํด์๋ฅผ ๊ตฌํ๋ค๊ฑฐ๋ ํ๋ ๊ฑธ ์๊ฐํ๋ฉด ์ข๊ฒ ๋ค. ๋ฌผ๋ก ์ ๊ทํ๋ ๊ทธ๋ค์ง ์ธ์ง ์์๋ฐ, ์์ผ๋ฉด ์ข๊ธด ํ์ง๋ง ํํ ์ฐ๋ ๊ฒ ์๋๋ผ์ ๊ธฐ๋ณธ ์ง๋ ฌํ ๋ฐฉ๋ฒ๊ณผ ๋ณ๊ฐ๋ก ์ ๊ทํ๋ ๋ถ๋ถ์งํฉ์ด ์๋ ๊ฒฝ์ฐ๊ฐ ํํ๋ค. ๊ฐํน ๊ทธ๋ฐ ๊ฑฐ ์ฉ๊น๋ ์ฌ๋ก๊ฐ ์๋๋ฐ ๋์ค์ ์ ๊ทํ๊ฐ ํ์ํ ๊ฒฝ์ฐ ad-hocํ๊ฒ ์ ๊ทํ๋ฅผ ๋ถ์ด๋ ๊ผด์ฌ๋์ด ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค.
๋๋ค ์ ๊ทผ์ด ๊ฐ๋ฅํ ์ง๋ ฌํ๋ ์ง๋ ฌํ๋ ๊ฑฐ๋ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋์ฝ๋ฉํด ๋ณด์ง ์๊ณ ์ ๋ฐ์ดํฐ์ ์ผ๋ถ์ ์ ๊ทผํ ์ ์๋ค๋ ๋ป์ด๋ค. ์ค์ ๋ก๋ ์ฌ๋ฌ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ์๋๋ฐ, ๊ฐ์ฅ ๋์ ์๋ฏธ์์๋ ๊ฐ๋ณ ์์์ ๊ฐ์ ๊ธธ์ด์ ์์กดํ์ง ์๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฉด ๋๋ค ์ ๊ทผ์ด๋ผ๊ณ ํ ์ ์๋ค. (์ด๋ฅผํ ๋ฉด val[a][b][c]๋ฅผ ๊ตฌํ๋๋ฐ ๋ง์๋ด์ผ O(a+b+c) ์๊ฐ์ด ๊ฑธ๋ ค์ผ ํ๋ค.) ์ด๋ณด๋ค ๋ ๋น ๋ฅธ ๊ฒ๋ ๋ถ๊ฐ๋ฅํ์ง ์์ง๋ง (ํ์ ํ Capโn Proto์ ๊ฒฝ์ฐ ๋ฐฐ์ด๋ง ์ค์ฒฉ๋์ด ์๋ค๋ฉด n์ค ๋ฐฐ์ด์ ๋ํด์ O(n) ์๊ฐ๊น์ง ์ค์ด๋ ๋ค) ์ผ๋ฐ์ ์ผ๋ก๋ ์ง๋ ฌํ ํฌ๋งท์ ๋ฉ๋ชจ๋ฆฌ์์ ์ต๋ ์๋๋ก ์ฝ์ ๊ฒ์ ๊ฐ์ํ๊ณ ๋ง๋ค์ด์ง ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ด ์ ๋๋ง ํด๋ ๊ฐ์ง๋์ง๋ค. ์ง์ํ ์ ์๋ฏ, ์คํธ๋ฆฌ๋ฐ ๊ฐ๋ฅํ ์ง๋ ฌํ๋ ๋๋ค ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๊ฑฐ๋ ์ด๋ ต๋ค.
Schematicํ ์ง๋ ฌํ
ASN.1
์์๊ฐ ์์ผ๋ ๋น์ฐํ ์ค๋ ์ญ์ฌ๊ฐ ์์ง๋ง, ๊ทธ ์ค์์๋ ์ด์ฐฝ๊ธฐ์ ๊ฒ์ผ๋ก์ ๊ฐ์ฅ ์ ๋ช
ํ ๊ฒ์ ์ญ์ ASN.1์ผ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค. SNMP๋ ์ธ์ฆ์ ๊ด๋ จ๋ ์์
์ ํ๋ฉด ์น๋ฅผ ๋จ๋ฉด์ ์ซ์ดํ๊ฒ ๋ ๋ฐ๋ก ๊ทธ๊ฒ์ด๋ค(๋ ๋ ๋ค ํด ๋ดค๋ค). ๊ทธ๋๋ ์๊ฐ๋ณด๋จ ๋์์ง ์์ ๊ฒ, ASN.1์ ๋ฐ์ดํฐ ๋ชจ๋ธ๊ณผ ์ธ์ฝ๋ฉ์ ๊ฑฐ์ ์๋ฒฝํ๊ฒ ์ง๊ต์ ์ผ๋ก ๋ง๋ ์ฑ๊ณต์ ์ธ ์ฌ๋ก์ด๋ฉฐ, ๋จผ ํ๋ ๋ค๋ฅธ ์ง๋ ฌํ ํฌ๋งท๋ค์ด ๊ฒช์ ๋๋ถ๋ถ์ ๋ฌธ์ ๋ฅผ ์ฒซ๋น ๋ฐ๋ก ๋ง์ ๋ดค๊ธฐ ๋๋ฌธ์ ๊ฑฐ๊ธฐ์ ๋ํ ๋๋น๊ฐ ์๋นํ ๋ง์ด ๋์ด ์๋ค. ASN.1์ด ์ง์ํ๋ ํน์ดํ ์์๋ฅผ ์ดํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์์ ํฌ๊ธฐ ์ ์
8์ ๋ฐฐ์๊ฐ ์๋ ๋นํธ ์๋ฅผ ๊ฐ์ง ๋นํธ์ด
์์ ์๋ ๋ชฉ๋ก, ์ฆ ์งํฉ
ํน์ ์ํฉ์์๋ง ๋ฑ์ฅํ ์ ์๋ ํ๋
ํด์ ๋ฐฉ๋ฒ์ ๋ค๋ฅธ ํ๋์ ์์กดํ๋ ํ๋ (ANY DEFINED BY foo๋ผ๊ณ ์ฐ๋ฉด foo ํ๋์ ๊ฐ์ ๋ฐ๋ผ ํด๋น ํ๋๋ฅผ ํด์ํ๊ฒ ๋ค๋ ๋ป์ด๋ค.)
๋ช
์์ ์ธ ๋นํธ ํ๋
๋ฌธ์์ด ๋ฑ์ ๊ธธ์ด๋ฅผ ์์ง ๋ชป ํ๋ ๊ฒฝ์ฐ์๋ ์ธ์ฝ๋ฉ ๊ฐ๋ฅ (ํ๋์ ์ธ ํฌ๋งท์์ ์ด๊ฒ ๋๋ ๊ฒฝ์ฐ๋ CBOR ์ ๋ ๋ฐ์ ์๋ค)
์ ์ ์๋ ์ ๊ทํ ๊ท์น (BER/DER์ ๊ตฌ๋ถ)
(์ฝ๊ฐ) ํ์ฅ ๊ฐ๋ฅํ ์ธ์ฝ๋ฉ ๊ท์น
ASN.1์ด ์ง์ํ์ง ์๋๋ค๊ณ ํ์คํ๊ฒ ๋งํ ์ ์๋ ๊ธฐ๋ฅ์ ์ค์ ํ์
๋ฟ์ด๋ค. ๊ทธ๋๋ง ASN.1์ด ๊ทธ ์ด๋ฌํด, ์ฆ 1985๋
์ ๋์จ IEEE 754๋ณด๋ค ๋นจ๋ฆฌ ๋์์ ๊ทธ๋ฐ ๊ฑฐ์งโฆ ๋ฐ๋ฉด ํ๋์ ์ง๋ ฌํ ํฌ๋งท์์๋ ์์ ์๋ ๊ฒ ์ค ๋ฐ ์ ๋ ์ง์ํ๋ฉด ๋ง์ด ์ง์ํ๋ ํธ์ ์ํ๋ค. ์๋ฅผ ๋ค์ด์ โ์คํธ๋ฆฌ๋ฐโ์ด ๊ฐ๋ฅํ, ์ฆ ๋ฐ์ดํฐ์ ๊ธธ์ด๋ฅผ ์์ง ๋ชป ํ๋ ๊ฒฝ์ฐ์๋ ์ธ์ฝ๋ฉ์ด ๊ฐ๋ฅํ ํฌ๋งท๋ค์กฐ์ฐจ๋, ์ด๋ฅผํ
๋ฉด ํ๋์ ๋ฌธ์์ด์ ์ชผ๊ฐ์ ๋ณด๋ด๋ ๊ฒ ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ ๋๋ฌผ๋ค. 1984๋
์ ๋์จ ํ์ค์ด 30๋
๋ค์ ๋์จ ๊ฒ๋ณด๋ค ๊ธฐ๋ฅ์ด ๋ง๋ค๋ ๋๋จํ์ง ์์๊ฐ?
๊ทธ๋ฌ๋ ์ด ์์ฒญ๋ ๋ณต์ก๋๊ฐ ๊ฒฐ๊ตญ ASN.1์ ๋ฐ๋ชฉ์ ์ก์๋ค. ASN.1๋ง ๊ทธ๋ฐ ๊ฒ ์๋๋ผ, schematicํ ์ง๋ ฌํ๋ฅผ ์ ๋๋ก ๊ตฌํํ๋ ค๋ฉด ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๊ธฐ์ ํ๋ ๋ฌธ๋ฒ์ ์๋ฒฝํ๊ฒ ํด์ํด์ ๊ฑฐ๊ธฐ์ ๋ฐ๋ฅธ ์์ ํ ์ฝ๋๋ฅผ ์์ฑํด ์ฃผ๋ ์ปดํ์ผ๋ฌ๊ฐ ํ์ํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ชจ๋ธ์ด ๋๋ฌด ๋ณต์กํด์ ์ปดํ์ผ๋ฌ๋ฅผ ์ ๋ง๋ค๊ธฐ ์ด๋ ค์ ๋ค. ๋๊ตฐ๋ค๋ ASN.1 ์์ฒด๊ฐ ์ค๋๋ ํฌ๋งท์ด๊ธฐ ๋๋ฌธ์ ๋ ๊ฑฐ์๊ฐ ์๋นํ๋ฐ, ๋จ์ ์ผ๋ก ๋ฌธ์์ด ํ์ ์ด 11๊ฐ(!!!!) ์๋ค. ์ปดํ์ผ๋ฌ๋ ์ธ๋ฉฐ ๊ฒจ์๋จน๊ธฐ๋ก ์ด ๋ชจ๋ ๊ฑธ ์ง์ํด์ผ ํ๋จ ๋ง์ด๋คโฆ ๊ทธ๋์ ์ปดํ์ผ๋ฌ์ ์ง๋ฆฐ ์ฌ๋๋ค์ ์ฝ๋ ์์ฑ์ ํ์ง ์๊ณ ์์ผ๋ก(!) ASN.1 ๊ธฐ๋ฐ ํฌ๋งท์ ์๋ ํ์ฑํ๊ธฐ ์์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๋๋ ASN.1์ ์ฌ์ฉํ๋ X.509 ์ธ์ฆ์ ๊ตฌํ์์ ๋์ค๋ ์๋น์์ ๋ณด์ ๋ฒ๊ทธ๋ ์ด ์๋ ํ์ฑ ์ฝ๋์์ ์ ๋ํ๋ค๊ณ ๋ณด์๋ ๊ณผ์ธ์ด ์๋๋ค.
XDR
ASN.1๊ณผ ๋น๊ต์ ๋น์ทํ ์๊ธฐ์ ๋ฑ์ฅํ๊ณ ASN.1๋ณด๋ค ๋ ์ง์ฆ๋๋ ํฌ๋งท์ ์์ ๋ก XDR์ด ์๋ค. ASN.1์ ์ ์ธํ ๊ฑฐ์ ๋ชจ๋ schematicํ ์ง๋ ฌํ ๋ฐฉ๋ฒ๋ค์ด ๊ทธ๋ ๋ฏ, XDR์ ๆ
์ฌ ๋ง์ดํฌ๋ก์์คํ
์ฆ(โฆ)์์ ์๊ฒฉ ํ๋ก์์ ํธ์ถ(RPC) ํ๋กํ ์ฝ(์ด ๊ฒฝ์ฐ, ONC RPC)์ ์ฐ๋ ค๊ณ ๋ง๋ ๋ฐ์ด๋๋ฆฌ ํฌ๋งท์ด๋ค. XDR ๋ํ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๊ธฐ์ ํ๋ ์ธ์ด๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง, ํ์ค์ด ํจ์ฌ ์ฝ์ ๋ง ํ๊ณ (ASN.1์ ์ด๋ฐ ๋น๊ณต์ ์๋ฃ ๊ฐ์ ๊ฒ ๊ทธ๋๋ง ์ธ๋งํ๋ค๋ ๋ฌธ์์ด๋ค) ๋ณ๋์ ์ปดํ์ผ๋ฌ ์์ด ํ์๋ฅผ ๋ง๋ค๊ธฐ๊ฐ ํจ์ฌ ์ฝ๋ค. ์ค์ฃฝํ๋ฉด ํด์ปค๋ด์ค์์ โ์ 30๋
์ ์ ๋์จ XDR์ ๋๋๊ณ JSON์ ๋ฐ์ด๋๋ฆฌ ํฌ๋งท์ ๋ง๋๋์?โ๋ผ๋ ์๋์ปฌํ ๋ฐ์๊น์ง ๋์๊ฒ ๋๊ฐ. (ํ์ ํ๊ฒ ์ง๋ง ๋์ด ์๋ฒฝํ ์ผ์นํ๋ ์ญํ ์ ์๋๋ค.)
XDR ๋ํ 30๋ ์ ์ ๋ง๋ค์ด์ง ์ง๋ ฌํ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ํ๋์ ์ง๋ ฌํ ๋ฐฉ๋ฒ๊ณผ ๋น๊ตํ๋ฉด ํฅ๋ฏธ๋ก์ด ์ ์ด ๋ช ๊ฐ์ง ์๋ค. ๋ํ์ ์ผ๋ก 4๋ฐ์ดํธ ํจ๋ฉ์ด ์๋๋ฐ, ์ด ๋๋ฌธ์ XDR์๋ 8๋นํธ ์ ์๋ 16๋นํธ ์ ์ ๊ฐ์ ๊ฒ ์๊ณ , ๋ง์ ํ๋ซํผ์์ ๋น ๋ฅด๊ฒ ๋์ํ ์ ์๋ ๋์ ์์ ๊ฐ์ ๋ง์ด ์ด๋ค๋ฉด ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ์ข ์ปค์ง ์ ์๋ค. ๋ํ ๋ณดํต ๊ตฌ๋ณ๋ ๊ณต์ฉ์ฒด(discriminated union)๋ผ๊ณ ๋ถ๋ฅด๋, ์ฌ๋ฌ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ์ค ์ ํํ ํ๋๋ง์ ๊ฐ๋ฆฌํค๋ ์ข ๋ฅ์ ํ์ ๋ค์ด XDR์๋ ์๋๋ฐ, ๋ฌด์จ ๋ฐ์ดํฐ์ธ์ง๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ตฌ๋ณ๊ฐ(discriminant)์ด ๋ช ์์ ์ด๋ค. ๊ทธ๋์ ๊ตฌ๋ณ๊ฐ์ ์ํ๋ ํ์ (์ด๋ผ๊ณ ๋ ํด๋ ์ ์ ์๋๋ฉด ์ด๊ฑฐํ์ด์ง๋ง)์ผ๋ก ์ค ์ ์๋๋ฐ, ๊ฐ์ธ์ ์ผ๋ก๋ ๊ด์ฐฎ์ ์ ํ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๋ฐ๋ฉด ์คํธ๋ฆฌ๋ฐ์ ์ง์ํ์ง ์๋๋ค๋ ์ (๋ชจ๋ ๋ฐ์ดํฐ๋ ์ฌ์ ์ ํฌ๊ธฐ๊ฐ ์ ํด์ ธ ์์ด์ผ ํ๋ค)๊ณผ, ํฌ๋งท ๊ตฌ์กฐ์ ๋ฐฐ์ด ์์๋ฅผ ํ๋์ฉ ์ฝ์ง ์๊ณ ํต์งธ๋ก ์คํตํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง ์๋๋ค๋ ์ ์ ํ์ฐํ ๋จ์ ์ด๋ผ๊ณ ํ ์ ์๋ค. ํ์๋ opaque ํ์ ์ผ๋ก ์๋ฎฌ๋ ์ด์ ํ ์ ์๊ธด ํ์ง๋ง. ์ด๋ฐ ์ ์ ์ข ํฉํด ๋ณผ ๋, XDR์ ์์ธ๋ก ๋คํธ์ํฌ ํ๋กํ ์ฝ์ฉ๋ณด๋ค๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ ํฌ๋งท์ ์ค๊ณํ๋ ์ฉ๋๋ก ๋ ์ธ๋ชจ๊ฐ ์์ง ์๋ ์ถ๋ค.
XDR ๋ง๊ณ ๋ ์๊ฒฉ ํ๋ก์์ ํธ์ถ์์ ์ ๋ํ ์ง๋ ฌํ ๋ฐฉ๋ฒ์ ์ฌ๋ฟ ์๋ค. ๋ํ์ ์ธ ๊ฑธ ๊ผฝ์ผ๋ฉด ์ค๋ง ์ก๋คํ ๊ณณ์์ ์ฐ์ด๋ CORBA์๋ IDL์ ๋คํธ์ํฌ๋ฅผ ํตํด์ ๋ณด๋ด๊ธฐ ์ํ GIOP๋ผ๋ ํฌ๋งท์ด ์๊ณ , ์์ ์ํํธ์จ์ด ์ง์์์ ๋๋ฆฌ ์ฐ์ด๋ D-Bus ๊ฐ์ ๊ฒ์๋ ๋ฌผ๋ก ์ง๋ ฌํ ํฌ๋งท์ด ์๊ณ , ํ์ด์ค๋ถ๊ณผ ๊ตฌ๊ธ์ ์๊ธฐ๋ค ์ฐ๋ ค๊ณ ๊ฐ๊ฐ Thrift์ ํ๋กํ ์ฝ ๋ฒํผ๋ฅผ ๋ง๋ค์๋ค. ์ด๋ฐ ๊ฒ๋ค์ ํ๋ ํ๋ ์ค๋ช ํ์ง ์๋ ์ด์ ๋ ๊ตฌ์กฐ๊ฐ ๋๋ฌด ๋ปํ๊ณ ๋ปํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ ๋ฌผ๋ก D-Bus์ VARIANT ํ์ ์ ๋ง์ด ์ข ํน์ดํ๊ณ , ํ๋กํ ์ฝ ๋ฒํผ์๋ ์์๋๋ ๋ฒ์์ ๋ฐ๋ผ ์ธ์ฝ๋ฉ๋ ํฌ๊ธฐ๊ฐ ์ ๊ฐ๊ฐ์ธ ์ ์ ํ์ ์ด ์ฌ๋ฟ ์๊ณ ๊ฐ์ ์ข ๋ฅ์ ์ฐจ์ด๊ฐ ์๊ธด ํ์ง๋ง ๊ทผ๋ณธ์ ์ธ ์ค๊ณ๊ฐ ํฌ๊ฒ ๋ค๋ฅด์ง๋ ์๋ค๋ ์๊ธฐ๋ค. ๊ทธ๋์ ์ฌ๊ธฐ์์๋ ์ด๋ค๊ณผ ๋ค์ ๋๋จ์ด์ง ์ฑ๊ฒฉ์ ๊ฐ์ง ๋ ๊ฐ์ ํฌ๋งท๋ง ๋ ์ค๋ช ํ๊ธฐ๋ก ํ๊ฒ ๋ค.
Capโn Proto
Capโn Proto๋ ํ๋กํ ์ฝ ๋ฒํผ์ ์ ์ ์ ์ธ ํ๊ณ์๋ผ ํ ์ ์๋ค. (๊ฐ๋ฐ์๊ฐ ์๋ ๊ตฌ๊ธ์์ ํ๋กํ ์ฝ ๋ฒํผ ๋ง๋ค๋ค๊ฐ ๋์จ ์ฌ๋์ด๋ค.) ์ด ํฌ๋งท์ ์ต๋ ํน์ง์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํํ์ด๋ผ๋ ๊ฒ์ด๋ค. ์ฆ ๋์ฝ๋ฉ ์์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ค! ๊ทธ๋์ ํ๋ ๋๋ฆฝ์ด โinfinitely fasterโ์ด๋ค(โฆ). ๊ทธ๋ฅ ๋จ์ํ ์ธ ๋ฉ๋ชจ๋ฆฌ ํํ์ธ ์์ค์ด ์๋๋ผ ์จ๊ฐ ์ต์ ํ๊ฐ ๋ค์ด ์๋๋ฐ, ๋ช ๊ฐ์ง๋ฅผ ๋ค๋ฉด:
๋ง์ ์ง๋ ฌํ ํฌ๋งท๊ณผ๋ ๋ฌ๋ฆฌ (๋ฐ๋ฉด, ๋ง์ ๋ฐ์ดํฐ ํฌ๋งท๊ณผ ๋น์ทํ๊ฒ) ๊ตฌ์กฐ์ฒด ๊ฐ์ ๋ณตํฉ ์๋ฃํ์ ๊ทธ๊ฑธ ํฌํจํ๋ ์๋ฃํ์ ์ธ๋ผ์ด๋ํด์ ์ง์ด ๋ฃ์ง ์๊ณ ๋ด์ฉ๊ณผ ๊ทธ ๋ด์ฉ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก ๋๋ ์ ์ ์ฅํ๋ค. ๋จ, ๊ตฌ์กฐ์ฒด์ ๋ฆฌ์คํธ๋ spatial locality๋ฅผ ์ํด ์ธ๋ผ์ด๋ํ๋ค.
๊ธฐ๋ณธ๊ฐ์ด ์๋ ํ๋๋ ์ ์ฅ์ ๊ทธ ๊ธฐ๋ณธ๊ฐ๊ณผ XOR๋๋ค. ์ด๋ฌ๋ฉด ๊ธฐ๋ณธ๊ฐ๊ณผ ๋น์ทํ ์๋ก 0์ธ ๋ฐ์ดํธ๊ฐ ๋ง์์ง๋๋ฐ, ๊ตฌ์กฐ์ฒด ๋ฑ์์ 0์ธ ๋ฐ์ดํธ๋ ๋ค์์ ์งค๋ผ ๋ธ๋ค. ํฌ๊ธฐ๊ฐ ์ค์ด๋ฆ๊ณผ ๋์์ ๋์ค์ ํฌ๋งท์ ํ์ฅํ๋ ๋ฐ๋ ์ ๋ฆฌํ๋ค(์ถ๊ฐ๋ ํ๋๊ฐ ์ด์ ๋ฒ์ ์ ๋ฐ์ดํฐ์์๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ํด์๋๋๋ก ๋ง๋ค ์ ์๋ค).
์ฝ๊ธฐ ์ฑ๋ฅ์ ์ํด ํจ๋ฉ์ด ๋ค์ด๊ฐ์ง๋ง, ํจ๋ฉ์ ์ต์ํํ๋๋ก (๋ง์์ผ 63๋นํธ ์ดํ๊ฐ ๋๋๋ก) ํ๋์ ์์๋ฅผ ์ฌ๋ฐฐ์นํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ต์ ์ธ์ฝ๋ฉ ๋จ์๊ฐ 1๋นํธ๋ผ์ ๋นํธ ๋จ์ ํจํน๋ ๋ค์ด๊ฐ๋ค! ๊ทธ๋์ Bool์ด ์ฌ๋๊ฐ ์์ผ๋ฉด 1๋ฐ์ดํธ๋ง ์ก์ ๋จน๊ณ , List(Bool)์ ํ๋ฅญํ ๋นํธ์ด ๊ตฌํ์ด ๋๋ค.
ํฌ์ธํฐ๊ฐ ๋ค์ด๊ฐ ํ๋๋ค์ ๋ณดํต์ ๊ฐ์ด ๋ค์ด๊ฐ ํ๋๋ค๊ณผ ๊ตฌ๋ถ๋์ด ๋ท์ชฝ์ ๋ฐฐ์น๋๋ค. ํฌ์ธํฐ๊ฐ ๋ค์ด๊ฐ ํ๋๋ค์ ์คํ์
์ด ํ๋ ์์น์ ์๋์ ์ด๋ผ์ ์ด๋์ ์ฌ์ง์ ์ด ํ์ํ๋ฐ, ๊ฐ๊ณผ ์์ด์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ง์ ์ด ๋ง์ด ๊ฐ๋จํด์ง๋ค.
UTF-8 ๋ฌธ์์ด์ ๋ด๋ Text ํฌ๋งท์ ๊ธฐ์ ์ ์ผ๋ก ๋ค์ ๋ ๋ฌธ์๊ฐ ํฌํจ๋ List(UInt8) ํ์
๊ณผ ๋์ผํ๋ค. C/C++ ๋ฐ์์์ ์ฐ๋ ค๋ ์ด๋ ๊ฒ ๋์๋ค.
์ง๋ ฌํ์ ๋ฒํผ์ ์ฌํ ๋น์ ๋ง๊ธฐ ์ํด ๋ฐ์ดํฐ ํฌ๋งท ์์ฒด๊ฐ ๋
ผ๋ฆฌ์ ์ผ๋ก ์ฌ๋ฌ ๋ฒํผ๋ก ์ชผ๊ฐ์ง ์ ์๋๋ก ์ค๊ณ๋์ด ์๋ค. ๊ทธ ๊ฒฐ๊ณผ๋ก ๊ตฌ์กฐ์ฒด๋ ๋ฆฌ์คํธ์ ๋ํ ํฌ์ธํฐ๋ ๋ณดํต ํฌ์ธํฐ์ผ ์๋ ์๊ณ ๋ค๋ฅธ ๋ฒํผ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ผ ์๋ ์๋ค. ์ฐ๋ ์
์ฅ์์๋ ๋ ๋ค ๋๊ฐ์ง๋ง.
ASN.1์์ ๋ณผ ์ ์๋ฏ ์ด๋ฐ ๊ธฐ๋ฐํ ์ต์ ํ๋ค์ ์์นซํ๋ฉด ๋ณต์ก๋๋ฅผ ์ ๋ฐํด์ ๊ตฌํ์ฒด๋ฅผ ์นจ๋ชฐ์ํฌ ์ ์๋๋ฐ, ๋คํํ๋ Capโn Proto ๊ตฌํ๋ค์ ๋น๊ต์ ๊ด์ฐฎ์ ํธ์ด๋ค. ์ ๋น์ด ASN.1์ฒ๋ผ ํ์ค๋ง ๋ง๋ค๊ณ ๊ตฌํ๋ค์ ๋ง๋ค๋ผ๊ณ ํ๋ ๊ฒ ์๋๋ผ ๊ตฌํ์ฒด ์ฃผ๋์ ์ผ๋ก ํ์ค์ด ๋ง๋ค์ด์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์ํฉ์ด ๋์ ํธ์ด๊ธฐ๋ ํ๋ค. ์ง๋ ฌํ ํฌ๋งท ๋ฟ๋ง ์๋๋ผ Capโn Proto RPC์๋ ํฅ๋ฏธ๋ก์ด ์์ด๋์ด๋ค์ด ์ฌ๋ฟ ์๋๋ฐ(์๋ฅผ ๋ค์ด Promise์ ๊ธฐ๋ฐํด ์ฌ๋ฌ RPC ํธ์ถ์ ํ์ดํ๋ผ์ด๋ํ๋, ์ด๋ฅธ๋ฐ โ์๊ฐ ์ฌํโ) ์ด ๊ธ์ ๋ฒ์๋ฅผ ํ์ฐธ ๋ฒ์ด๋๋ฏ๋ก ์๋ต. Capโn Proto๊ฐ ํฅํ ๋ค๋ก ๋์ฝ๋ฉ ํ๋ก์ธ์ค ์์ฒด๋ฅผ ์๋ตํ๋ ๋ค๋ฅธ ํฌ๋งท๋ค์ด ์ฌ๋ฟ ๋์๋๋ฐ, ์ด๋ค์ ๋ํ ๋น๊ต๋ Capโn Proto ์ ์๊ฐ ์ง์ ์ด ๊ธ์ ์ฐธ๊ณ ํ์.
EBML
Capโn Proto๊ฐ ํ๋กํ ์ฝ ๋ฒํผ์ ํ๋์ ์ธ(โฆ) ๋ฒ์ ์ด๋ผ๋ฉด, EBML์ ASN.1์ ํ๋์ ์ธ ๋ฒ์ ์ด๋ผ๊ณ ํ ์ ์๋ค. EBML์ ๋ณธ๋ ๋งคํธ๋ฃ์ฌ์นด(Matroska) ๋ฏธ๋์ด ์ปจํ
์ด๋ ํฌ๋งท์์ ์ฐ๊ธฐ ์ํด ๋ง๋ , ๊ทธ๋ฌ๋๊น RPC๋ ์ ํ ์๊ด์ด ์๋ ์์ ํ์ผ ํฌ๋งท์ฉ์ผ๋ก ๋ง๋ค์ด์ง ๊ฒ์ด๋ค. ์๋ฌด๋๋ ์ปจํ
์ด๋ ์์๋ ๋ฉํ๋ฐ์ดํฐ๋ ์ด๊ฒ ์ ๊ฒ ๋ง๊ณ ๋ค์ํ ์ข
๋ฅ์ ํจํท๋ค์ด ํผ์ฌํด ์์ด์ ๋ง๋ค์ง ์์๋ ์ถ๋ค. ์ด์ ์๋ ํ์ผ ํฌ๋งท์ ์ฒด๊ณ์ ์ผ๋ก ๋ง๋ค๋ ค๋ ์๋๋ ์ฌ๋ฟ ์์๋๋ฐ, PNG์ chunk ์ค๊ณ๋ RIFF ๊ฐ์ ๊ฒ๋ค์ด ๊ทธ ์์๊ฐ ๋๊ฒ ๋ค. ํ์ง๋ง ์ง๋ ฌํ ํฌ๋งท์ผ๋ก์ ์ธ๋งํ ๊ฑด ๋ด๊ฐ ์๊ธฐ๋ก๋ EBML ์ ๋ ๋ฐ์ ์๋ ๋ฏ ์ถ๋ค.
EBML์ ASN.1์ ํ๊ทธ-๊ธธ์ด-๊ฐ(TLV) ํฌ๋งท์ ๋งค์ฐ ์ ํํ ์ค์ํ๋ค. ์ฆ ๊ธธ์ด ๋ถ๋ถ์ ์๋ตํ ์ ์๋ค. ํ์ง๋ง ASN.1์ ๋นํด ๋ณต์ก๋๋ ๋งค์ฐ ๋จ์ด์ก๋๋ฐ, ASN.1์๋ ๋ชจ๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ํ๊ทธ๋ค(universal tags)์ด ์์์ง๋ง EBML์ ๊ถ๊ทน์ ์ธ ํด์์ ๋ฐ์ดํฐ ๋ชจ๋ธ์๊ฒ ๋ชจ๋ ๋งก๊ธด๋ค. ์ฆ โ32๋นํธ ์ ์โ ๊ฐ์ ํ๊ทธ๊ฐ ์๋ ๊ฒ ์๋๋ผ ๋ช ์์ ์ผ๋ก โ์ด ํ์ผ์ด ๋ฐ๋ ์์ ์ ์ ๋์ค ํ์์คํฌํโ ๊ฐ์ ์๋ฏธ๋ก ์ผ๋ก ํ๊ทธ๋ฅผ ์ง์ผ ํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ก ๋ค๋ฅธ ์๋ฏธ๋ก ์ ๊ฐ์ง ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ํ๋๋ ์ํฉ์ ์ ๊ฑฐํ๊ธฐ ์ํด ํ ๋ฐ์ดํฐ ๋ชจ๋ธ ์์์์ ๋ชจ๋ ํ๊ทธ๋ ๋ฌ๋ผ์ผ ํ๋ค. EBML์์ 1๋ฐ์ดํธ์ง๋ฆฌ ํ๊ทธ๋ 126๊ฐ ์๋๋ฐ, ๋ฐ๋ผ์ ๋ง์ด ์ปค๋ค๋ ํฌ๋งท์์๋ ์์ฃผ ๋น๋ฒํ ๋ํ๋๋ ํ๊ทธ์ ์ข ์๋ฅผ ์ค์ผ ํ์์ฑ์ด ์์ ๊ฒ์ด๋ค. (๊ฐ์ ์ข ๋ฅ์ ํ๊ทธ๊ฐ ์ฌ๋ฌ ๋งฅ๋ฝ์์ ๋ํ๋ ์๋ ์๋ค.) ๋์ ๋ชจ๋ ํ๊ทธ์ ์ ์ผํ ์๋ฏธ๋ก ์ด ๋ถ๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊น ํ๊ฑฐ๋ ๋๋ค ์ ๊ทผ ๊ฐ์ ๊ฒ๋ค์ ํ๊ธฐ๋ ์ข์ ๊ฒ์ด๋ค.
Schemalessํ ์ง๋ ฌํ
S-expression, Netstring, XML
Schematicํ ์ง๋ ฌํ ๋ฐฉ๋ฒ๋ค์ด ๋คํธ์ํฌ ํ๋กํ ์ฝ๊ณผ ํ์ผ ํฌ๋งท์์ ์ ๋ํ๋ค๋ฉด, schemalessํ ์ง๋ ฌํ ๋ฐฉ๋ฒ๋ค์ ํ๋์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ธ ๋ชฉ์ ์ผ๋ก ์ ๋ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ค. ๊ทธ๋์ ์ด๋ป๊ฒ ๋งํ๋ฉด ๋ฆฌ์คํ์ ๋ฆฌ๋ ๋งคํฌ๋ก๊ฐ ์ต์ด์ schemalessํ ์ง๋ ฌํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์ฃผ์ฅํ ์๋ ์๋ค. ํํธ์ผ๋ก๋ ๋คํธ์ํฌ ํ๋กํ ์ฝ ์ชฝ์์๋ schemalessํ ์์๊ฐ ์๋ ๊ฒ์ ์๋๋ผ์, ๋๋ฆฌ ์ฐ์ด์ง ์์๋ค ๋ฟ์ด์ง ์ญ์ฌ์ ์ผ๋ก๋ MSDTP ๊ฐ์ ๊ฒ๋ ์์๋ค. ํ์ง๋ง ์ค์ง์ ์ผ๋ก โํ์คํโ๋๊ณ , โ์ธ์ด๋ ๊ตฌํ์ฒด์ ๋
๋ฆฝ์ โ์ด๋ฉฐ, ๊ฒฐ๊ณผ์ ์ผ๋ก ์๊ธฐ์ ์ฑ๊ณผ๋ฅผ ๊ฑฐ๋ ์ง๋ ฌํ ๋ฐฉ๋ฒ์ ๊ธฐ์ค์ผ๋ก ํ๋ค๋ฉด, ์๋ง 1997๋
์ด ์ต์ด์ ์ธ๋งํ ๋ฌด์ธ๊ฐ๊ฐ ๋์จ ๋๋ผ๊ณ ํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํฅ๋ฏธ๋กญ๊ฒ๋ ์ด ์๊ธฐ์ ์ ์๋ ์ธ๊ธํ ๊ฐ์น๊ฐ ์๋ ์ง๋ ฌํ ๋ฐฉ๋ฒ์ ์ธ ๊ฐ๋ ์๋ค.
S-expression์ ๋ฆฌ์คํ์ ๋ฐ๋ก ๊ทธ S-expression์ ์ง๋ ฌํ์ฉ์ผ๋ก ์ฐ๊ธฐ์ ์ข๋๋ก ๋ช ๊ฐ์ง ์์ ์ ๊ฐํ ๊ฒ์ด๋ค. ์ด ์ ์์ ์ํธํ ๋ถ์ผ์์ ์ฌ์ฉํ ๋ชฉ์ ์ผ๋ก ์ธํฐ๋ท ํ์ค์ผ๋ก ์ ์๋๊ธด ํ์ง๋ง ์ค์ ๋ก๋ ํ์ค์ด ๋์ง ์์๊ณ ๋๋ถ์ ๋ง์ด ์ฐ์ด์ง๋ ์๋๋ฐ, ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฉ๋(SPKI ๊ณต๊ฐํค ์ํธํ ์์คํ )๋ ๊ทธ๋ ๊ณ ์ ์(Rivest๋ RSA์ ๊ทธ R์ด๋ค)๋ ๊ทธ๋ ๊ณ ์๋นํ ์ ์ง์ฌ์ง ๋ช ์ธ๊ฐ ๋์๋ค. ์์ฆ ์ฐ์ด๋ ์ง๋ ฌํ ๋ฐฉ๋ฒ๊ณผ ๋น๊ตํ๋ฉด ๋ช ๊ฐ์ง ์ฐจ์ด๊ฐ ์๋๋ฐ, ํ ์คํธ ํฌ๋งท์ธ์ง๋ผ ๋ฌธ์์ด์ ํํํ๋ ๋ฐฉ๋ฒ์ด ์ฌ๋ฟ(base-64, 16์ง๋ฒ ํ๊ธฐ ๋ฑ) ์๋ค๋ ๊ฒ๊ณผ, ๋ชจ๋ ๊ฒ์ด ๋ฌธ์์ด ์๋๋ฉด ์์ด์ด๋ผ๋ ๊ฒ(์ซ์๋ ์๋ค), ๊ทธ๋ฆฌ๊ณ ๋ฌธ์์ด์ ์ ํ์ ์ผ๋ก ํ์ ํํธ๊ฐ ๋ถ์ ์ ์๋ค๋ ์ ์ด๋ค. ํ์ ํํธ๋ ์ผ์ข ์ ๋ฉํ๋ฐ์ดํฐ์ธ๋ฐ ๋ณดํต์ ๊ตฌํ์ฒด๊ฐ ํด์ํด์ผ ํ ๋ฌธ์์ด์ ์ถ๊ฐ์ ์ธ ํ์ ์ ์ฃผ๋ ์ญํ ์ ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด์ [image/png] "\x89PNG\r\n\x1a\n..." ๊ฐ์ ๊ฑด PNG ์ด๋ฏธ์ง๋ผ๋ ์์ผ๋ก. ๋ฐ์ดํฐ ๋ชจ๋ธ์ด ๋จ์ํ๊ธฐ ๋๋ฌธ์ ์ ๊ทํ๋ ํํ๋ ๋ง๋ค๊ธฐ ์ฝ๊ณ ๊ตฌํ๋ ์ด๋ ต์ง ์์ ํธ์ด์๋๋ฐ, ์๋ฌด๋๋ ์ด๋ฐ ํฌ๋งท์ ๋๋ฆฌ ์ฐ์ด์ง ์์ผ๋ฉด ์๋ฌด๋ฆฌ ์ข์๋ ๋ฌปํ๊ธฐ ๋๋ฌธ์ ๋ค์ ์์ฝ๋ค.
Netstring์ S-expression์ ์ข ๋ ์๊ฒ ๋ง๋ ๋ชจ์์์ด๋ค. ์ด ๋ํ ์ํธํ์์ ์ ๋ช ํ Daniel J. Bernstein(djb)์ ์ํ์ธ๋ฐ, djb๋ ์์ ๋๋๊ณ C ๊ตฌํ์ ๋งค์ฐ ๋จ์ํ๊ฒ ๋ง๋ค๊ฒ ๋ค๋ ๋ชฉํ๋ก ํฌ๋งท์ ์ต์ํ์ผ๋ก ์ค์๋ค. ๊ทธ๋์ ๋์จ ๊ฒ์ด <๊ธธ์ด>:<๋ฐ์ดํฐ>,๋ผ๋ ์ ์ผํ ๊ตฌ์กฐ. ์๋ฐํ ๋งํ๋ฉด netstring์ ์คํค๋ง๊ฐ ์์ผ๋ฉด ํ์ฑ์ด ๋ถ๊ฐ๋ฅํ๋ฐ ๋ฐ์ดํฐ๊ฐ ๋ ๋ค๋ฅธ netstring์ธ์ง ๋ค๋ฅธ ๋ฐ์ดํฐ์ธ์ง ์ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์ญ์ฌ์ ์ผ๋ก๋ S-expression์ ์๋ํ ์ฉ๋์ ๊ถค๋ฅผ ๊ฐ์ด ํ๊ณ , ์ค์ ๋ก ๋ถ๋ถ์งํฉ์ผ๋ก ์ทจ๊ธํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ๋ค๋ฃฌ๋ค.
XML์ ๋ค๋ค ์ ์์๋ ๊ทธ๊ฒ์ด๋ค. ์ฌ์ค XML์ 1997๋ ๋(์ ํํ๋ 1996~1998๋ )์ ๋ง๋ค์ด์ก๋ค๊ณ ํ๊ธฐ์๋ ์ฝ๊ฐ ๋ฌด๋ฆฌ๊ฐ ์๊ธด ํ๋ฐ, XML์ ๊ฒฐ๊ตญ SGML์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๊ทธ๋๋ก ๊ฐ์ ธ ์ค๊ณ ๋ฌธ๋ฒ์ ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ํ ๋๋ก ๋ง๋ค์ด์ก์ผ๋ฉฐ, SGML์ ์ด๋ฅธ๋ฐ ํ๊ทธ ์ํ(tag soup) ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๊ทธ ์ญ์ฌ๊ฐ ๋งค์ฐ ๊น๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ํ๊ทธ ์ํ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ฒ์์ผ๋ก ๋ฐ์ดํฐ ํฌ๋งท์ ์์ญ์ผ๋ก ๋์ด ๋น๊ธด ๊ฒ์ด XML์์ ๋ถ์ ํ ์ ์๋ค. ์ด์ ๋ค๋ฐ๋ฅด๋ XML ๊ด๋ จ ๊ธฐ์ ์ ํฅ๋ง์ฑ์ ๋, ๊ฒฐ๊ตญ XML์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ ์ดํดํ์ง ๋ชป ํ ๊ฒ์ ๊ธฐ์ธํ๋ค๊ณ ์๊ฐํ๋ค. ์ด์งธ์ XML๋ก JSON์ ๋ถํดํ๊ณ ์ฌ์ธ์ฝ๋ฉํ๋ ค ํ๋ฉฐ, ์ด์งธ์ XML์ ์คํธ๋ฆฌ๋ฐ ํฌ๋งท์ผ๋ก ์ฐ๋ ค ํ๋ฉฐ, ์ง์ง๋ก ์ด์งธ์ ๋ญ๊ฐ ์๋ชป๋์๊ธธ๋ XML๋ก ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ๋ง๋ค๊ณ ์๋๊ฐ?
Bencode, JSON
Bencode๋ ๋นํธํ ๋ฐํธ์์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๊ธฐ ์ํด์ ๋ง๋ค์ด์ง ์ง๋ ฌํ ๋ฐฉ๋ฒ์ด๋ค. ๋ฌผ๋ก ๋ชจ๋ ํ ๋ฐํธ ๋ฐ์ดํฐ๊ฐ bencode๋ฅผ ํตํ๋ ๊ฑด ์๋๊ณ (๋นํธํ ๋ฐํธ์ ํผ์ด ํ๋กํ ์ฝ์ ๋งค์ฐ ๊ฐ๋จํ ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ์ด๋ค), .torrent ํ์ผ์ด๋ ํธ๋์ปค ์๋ต์ด bencode๋ก ๋ ์ ์จ๋ค. Bencode๋ ์ ์, ๋ฌธ์์ด, ์์ด, ๊ทธ๋ฆฌ๊ณ (ํ์ด์ฌ์ ๊ด๋ก๋ฅผ ๋ฐ๋ผ โ์ฌ์ โ์ด๋ผ๊ณ ๋ถ๋ฅด๋) ์ฐ๊ด ๋ฐฐ์ด์ ์ง์ํ๋ฉฐ, ์ซ์๊ฐ ๋ค์ด ์ฌ๋งํ ๋ชจ๋ ๊ณณ์์ ๋ฐ์ด๋๋ฆฌ ์ธ์ฝ๋ฉ์ ์ฐ๋ ๋์ ์ ๊ทธ๋ฅ 10์ง๋ฒ์ ์์คํค ์ฝ๋๋ก ๋๋ ค ๋ฐ๊ธฐ ๋๋ฌธ์ ์๋์ ๋ฌธ์ ๋ฑ์์ ์์ ๋กญ๋ค๋ ํน์ง์ด ์๋ค. ๋ํ ๋น์ ๊ทํ๋ ๋ฐ์ดํฐ, ์ด๋ฅผํ
๋ฉด ์ ์ 42๋ฅผ i42e ๋์ i042e๋ก ๋ํ๋ด๊ฑฐ๋, ์ฐ๊ด ๋ฐฐ์ด์ ํค ์์๋ฅผ ๋ค์๊ฑฐ๋ ํ๋ ๊ฒ์ด ์์ฒ ์ฐจ๋จ๋์ด ์์ด์ ๋ชจ๋ bencode๋ ๋ฐ์ดํฐ๋ ์ ๊ทํ๋์ด ์๋ค. ๋ฐ๋ฉด ๋ฐฐ์ด ์์ ๋ค์ด๊ฐ๋ ์์ ์ซ์๋ ๋ฐฐ์ด์ ๋ฐ์ดํธ ๊ธธ์ด ๊ฐ์ ๊ฒ ์ ํ ์์ง๋ ์๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๊ฒ ํ์ํ๋ ๋ฐ๋ ์ ํฉํ์ง ์๊ณ , ๋ฐ๋ผ์ ๋ง ๊ทธ๋๋ก ์ ๊ทํ๋ ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ์ ์ ํฉํ ํฌ๋งท์ด๋ผ ํ ์ ์๋ค.
JSON์ ๋ฌผ๋ก ๋ชจ๋๋ค ์ ์๊ณ ๊ณ์๋ ๊ทธ๊ฒ. ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ๊ธฐ๋ฐ์ผ๋ก Douglas Crockford๊ฐ ํ์คํ๋ฅผ ์๋ํ ๊ฒ์ด ๋๋ฆฌ ํผ์ก๋ค. JSON์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก (๊ฑฐ์) ๊ทธ๋๋ก ํด์๋ ์ ์๋๋ก ์ค๊ณ๋๊ธด ํ์ง๋ง ๋ณด์ ๋ฌธ์ ๋๋ฌธ์ ์๋ฌด๋๋ ์๊ด ์๋ ์ด์ผ๊ธฐ๊ฐ ๋์๊ณ , ์ง์ง๋ก ๊ฐ์ฅ ํฐ ์์๋ ์ ๋์ฝ๋ ๋ฌธ์์ด์ ์ ๋ฉด์ ๋ด์ธ์ฐ๋ ์ฒ์์ผ๋ก ์ธ๋งํ ํฌ๋งท์ด๋ผ๋ ์ ์ด๋ค. (์ฆ, XML์ ์ธ๋ชจ๊ฐ ์๋คโฆ) ์ด ์ ํ์ ํฐ ์๋ฏธ๋ฅผ ์ง๋๋๋ฐ, ์ด ๋ค๋ก ๋์ค๋ ํฌ๋งท ์ค ์๋น์๊ฐ โ๋ฐ์ด๋๋ฆฌ ๋ฌธ์์ดโ๊ณผ โํ ์คํธ ๋ฌธ์์ดโ์ ๊ตฌ๋ถ์ ์๋ฐํ๊ฒ ํ๋ ค๊ณ ์๋ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์์์ ๋งํ bencode์กฐ์ฐจ ๋ฌธ์์ด์ ๋ฐ์ด๋๋ฆฌ์๋ค. ์๋, ์ ๊ทํ๋ฅผ ์ฐจ์นํ๊ณ ๋ผ๋ ์ด์ ์ ๋ง๋ค์ด์ง ์๋ง์ ๋ฐ์ดํฐ ํฌ๋งท๋ค์ด ์ด๋ฏธ ์ธ์ฝ๋ฉ ๋ฌธ์ ๋ก ๊ณจ๋จธ๋ฆฌ๋ฅผ ์ฉ๊ณ ์๋ ์ํฉ์ด์๋ค. ์ด๋ฐ ์ํฉ์์ ํ ์คํธ ๋ฌธ์์ด์ ์ ๋์ฝ๋๋ก ์ธ์ฝ๋ฉํด์ผ ํ๋ค๋ ์ด์ฐ ๋ณด๋ฉด ๋น์ฐํ์ง๋ง ๋ณ๋ก ์ ์ง์ผ์ง๋ ๊ท์น์ JSON์ด ํ์ด๋ฐ ์ข๊ฒ ์งํจ ์ ์ด๋ค.
Bencode์ JSON์ ๊ฑฐ์ ๊ฐ์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ฌ์ง์ด ๋ํ๋ ์๊ธฐ๋ ๊ฑฐ์ ๋น์ทํ๋ค. ์๋ง๋ ๋นํธํ ๋ฐํธ๊ฐ ์ง๊ธ ๋ง๋ค์ด์ก๋๋ผ๋ฉด bencode๋ JSON์ผ๋ก ๋ชจ์กฐ๋ฆฌ ๋์ฒด๋์์ ๊ฒ์ด๋ค. ๊ทธ๋ผ ๊ตณ์ด ์ bencode๋ฅผ ์ฌ๊ธฐ์ ์ธ๊ธํ๋๊ฐ? ์๋ํ๋ฉด ์ธ๊ฐ์ด ์ฝ์ ํ์๊ฐ ์๋ค๋ฉด bencode๋ JSON๋ณด๋ค ๊ฑฐ์ ํ์คํ๊ฒ ๋์ ํฌ๋งท์ด๊ธฐ ๋๋ฌธ์ด๋ค. JSON์ด bencode๋ณด๋ค ๋์ ๊ฒ๋ค์ ๋๋ต ์ด๋ฐ ๊ฒ ์๋ค.
ํ์ถ์ด๋ก๋ง ํํํ ์ ์๋ ๋ฌธ์๋ค์ ์ค๋ฒํค๋๊ฐ ๋ง๋ค. ์๋ฅผ ๋ค์ด์ UTF-8๋ก U+001B ํ ๋ฌธ์๋ฅผ ํํํ๋๋ฐ JSON์ 8๋ฐ์ดํธ("\u001b")๊ฒ ์ง๋ง bencode๋ 3๋ฐ์ดํธ(1: + 1๋ฐ์ดํธ)์ด๋ค. ๋ฌผ๋ก ํ ๋ฌธ์๋ง ํํํ๋ ๊ฒ ์๋๋ฉด ์ค๋ฒํค๋๋ ํจ์ฌ ๋ ๋์ ๋๋ค(์ต๋ 6:1).
๋น๋จ ํ์ถ์ด์ด ์๊ฑฐ๋ ์ ์ ๋ฌธ์์ด๋ง ์ด๋ค๊ณ ํ๋๋ผ๋, ํ์ถ์ด์ด ์กด์ฌํ๋ค๋ ๊ฒ ํ๋๋ง์ผ๋ก ์ฑ๋ฅ์ ๊ต์ฅํ ํ๋ํฐ๊ฐ ๋ถ๋๋ค. ํ๋์ ์ธ ์ง๋ ฌํ ํฌ๋งท์ ๋ณต์ฌ ์์ด ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์ ๊ทผํ ์ ์๋ ๊ฑธ ์ ํธํ๋๋ฐ(zero-copy) JSON์ ์ด๋ป๊ฒ ๊ตฌํ์ฒด๋ฅผ ์ง๋ ๋ณต์ฌ๊ฐ ํ์ํ๋ค. (์ด๊ฒ์ด ๋ด๊ฐ JSON์ด ์๊ฐ ์ด์์ผ๋ก ๋ ๋นํจ์จ์ ์ด๋ผ๊ณ ์ฃผ์ฅํ๋ ๊ทผ๊ฑฐ์ด๋ค. ๋ฌธ์์ด์ด ๋ง์ ๊ฒฝ์ฐ ์ ๊ตฌํ๋ JSON ๊ตฌํ์ฒด์ ์ ๊ตฌํ๋ ๋ค๋ฅธ ๋ฐ์ด๋๋ฆฌ ํฌ๋งท ๊ตฌํ์ฒด๋ ์๋ฐฑ๋ฐฐ ์ด์ ์ฐจ์ด๊ฐ ๋ ์ ์๋ค.) S-expression์ฒ๋ผ ํ์ถ์ด์ด ์์ด์ ๋ฐ๋ก ํด์ํ ์ ์๋ ์ข
๋ฅ์ ๋ฌธ์์ด์ด ํ๋ ๋ ์กด์ฌํ์ผ๋ฉด ์ํฉ์ด ํจ์ฌ ๋์์ ๊ฒ์ด๋ค.
JSON์ ์ผ๋จ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ๋ถ๋ถ์งํฉ์ผ๋ก ์ค๊ณ๋๊ธด ํ๊ณ ๊ทธ๋ ๊ฒ ์๊ฒจ๋จน๊ธฐ๋ ํ์ง๋ง, ์ค์ ์๋๋ค. U+2028 LINE SEPARATOR์ U+2029 PARAGRAPH SEPARATOR๋ ์ ๋์ฝ๋์์ ํ๋ซํผ์ ๋ฌด๊ดํ ๊ฐํ๋ฌธ์๋ฅผ ์ง์ํ๋ ค ๋ฃ์ ๋ฌธ์์ธ๋ฐ, ์ด ๋ฌธ์์ ์ธ๋ชจ๋ ๊ทธ๋ ๋ค ์น๋๋ผ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋ฌธ์์ด์ ์ด ๋ฌธ์๋ค์ด ๋ค์ด๊ฐ ์ ์๋ ๋ฐ๋ฉด JSON์์๋ ๋ค์ด๊ฐ ์ ์๋ค. ๋ฌผ๋ก JSON์ ์์ฑํ ๋๋ ํด๋น ๋ฌธ์๋ค์ ํ์ถ์ด๋ก ํํํ๊ณ ์ฝ๋ ์ชฝ์์๋ ์ด๋ ์ชฝ์ด๋ ํ์ฉํ๊ฒ ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ฐ (์ด์ฐจํผ ํ์ถ์ด์ ํผํ ์๋ ์์ผ๋ฏ๋ก ์ด๊ฒ ์ต์ ์ด๋ค), ์ด ๋ฌธ์ ๊ฐ ์๋ ค์ง์ง ๋ช ๋
์ด ์ง๋ฌ๋๋ฐ๋ ํ์ค์์๋ ๊ฐ๊ฐ ๋ฌด์์์ด๋ค. ๊ทธ๋ฅ ์ฉ๊น๋ ค๊ณ ํ๋ ๋ฏ.
์ซ์๋ฅผ ํ
์คํธ๋ก ํํํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ์ซ์๋ก ํด์๋์์ ๋์ ์ํธ ์ด์ฉ์ฑ์ด ์ค์ํ๋ฐ ํ์ค์์ ๋ณด์ฅํ๋ ๊ฒ ์๋ค. ๊ธฐ๊ปํด์ผ โIEEE 754 binary64 ์ ๋๋ฉด ๊ด์ฐฎ์ง ์์๊น?โ ์์คโฆ ๋๋ถ์ 64๋นํธ ์ ์๋ฅผ ์ฐ๋ ค๊ณ ํ๋ ๊ตฌํ์ฒด๋ค์ ๋๋ฌผ์ ๋จธ๊ธ๊ณ ๋์ค์ ๋ฌธ์์ด๋ก ์ฌ์ธ์ฝ๋ฉ์ ํด์ผ ํ๋ค. ์ฆ ์ฒ์์๋ ๋ชจ๋ฅด๊ณ ์ ์๋ฅผ ์ผ๋ค๊ฐ ๋์ค์ ๋ฌธ์์ด๋ก ๋ฐ๊ฟ์ผ ํ๋จ ์๊ธด๋ฐ, ์ค์ ๋ก ํธ์ํฐ๊ฐ ์์ ์ ์ด๊ฑธ๋ก ํฐ ์ฟ์ ๋จน์์๋ค. ํ์ค์ด ๋ฌด์์ด ๋ณด์ฅ๋๊ณ ๋ฌด์์ด ๋ณด์ฅ๋์ง ์๋์ง์ ๋ํด์ ๋๋ฌด ๋๊ฐ ๋์ถฉ ์ฐ๊ณ ๋์ด๊ฐ์ ์๊ธด ๋ถ์์ฌ.
์ค๋ธ์ ํธ์ ์ค๋ณต๋๋ ํค๊ฐ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋๋๊ณ โ์ด๋ป๊ฒ ๋์ํด๋ ์๊ด ์๋คโ๊ณ ์ ์ด ๋๊ณ ์๋ค. ๋ญ? (Bencode์ ๊ฒฝ์ฐ์๋ ๋ช
์์ ์ผ๋ก ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ์ง ์๋๋ค. ํ์ง๋ง ํค๊ฐ ์ ๋ ฌ๋์ด ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ค๋ณต๋๋ ํค๋ฅผ ์ผ๋ถ๋ฌ๋ผ๋ ๋ง๋ค๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๋ค.) ๋ฌผ๋ก JSON ํ์ค์ ์ต์ข
์ ์ผ๋ก๋ ๊ตฌํ์ฒด๋ค์ ์คํ๋ฅผ ํ ๋๋ก ๋ง๋ค์ด์ง ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํ์ค์ ๋๋ฃจ๋ญ์ ํ๊ฒ ๋ง๋๋ ๊ฑด ์ด์ฉ ์ ์์ ์๋ ์์ง๋ง, ๋์ค์ ๋ง๋ค์ด์ง ๊ตฌํ์ฒด๋ค์ ๋ํ ๊ฐ์ด๋๋ผ์ธ์กฐ์ฐจ ์๋ ๊ฒ์ ์ค๋ง์ค๋ฝ๋ค.
์ ๋๋ก ๋ ์ ๊ทํ ๋ฐฉ๋ฒ์ ์์ ํ์ง ์์๋ค.
๋ฐ๋ฉด bencode๊ฐ JSON๋ณด๋ค ๋์ ๊ฑด ์ด ์ ๋์ด๋ค.
true/false/null์ด ์๋ค. ๊ทผ๋ฐ true/false๋ ์๋ฏธ๋ก ์ ์ข ๋ค๋ฅด์ง๋ง i1e/i0e๋ก ๋์ฒดํ ์ ์๊ณ null์ null-likeํ ๊ฐ์ด ์ฌ๋ฟ ์๋ ํ๊ฒฝ์์ ํผ๋์ ์ผ์ผํค๊ธฐ ๋๋ฌธ์ ๋ฑํ ์๋ค๊ณ ๋์ ๊ฑด ์๋๋ค. ์ข ๊ทน์ ์ด๊ณ ์ง์ฆ๋๋ ์๋ฅผ ๋ค๋ฉด, ๋ฃจ์์์ ์ธ๋งํ JSON ๊ตฌํ์ฒด ์ค ํ๋๋ null์ ์์ ์ ๋๋ก ์ฒ๋ฆฌํ์ง ๋ชป ํ๊ณ ๋ค๋ฅธ ํ๋๋ nil๊ณผ๋ ๋ค๋ฅธ ์ด์ํ ๊ฐ(userdata 0x0)์ ์ค๋คโฆ
์ ์ ํฌ๊ธฐ์ ๋ํ ๋ณด์ฅ์ด ์๋ค. Bencode๋ ๋ณธ๋ ํ์ด์ฌ์ ๊ธฐ์ค์ผ๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ ๋ฑํ ๊ทธ๋ด ํ์๋ ์๊ธด ํ์ง๋ง, ์ฌ๋ฌ ์ธ์ด๋ก ๊ตฌํ๋ ์ ์๋ ํฌ๋งท์ธ ์ด์ ์ ํ์ ์ด๋๊ฐ์์ ๋์ผ๋ฉด ์ข์์ ๊ฒ์ด๋ค. ์ผ๋จ์ ์ฌ์ค์์ ํ์ค์ผ๋ก 64๋นํธ ๋ถํธ ์๋ ์ ์๊ฐ ์ฐ์ด๊ณ ์๋ค.
์ค์ ํ์
์ด ์๋ค. ํ์ง๋ง ์ด์ฐจํผ JSON์ ์ค์ ํ์
์ Infinity/NaN๋ ์๊ณ ๋ฑํ ๋์ฝ๋ฉ๋ ๊ฒฐ๊ณผ๊ฐ ์ ํํ ์ด๋ค ์ค์๊ฐ์ผ๋ก ๋์ฝ๋ฉ๋๋์ง์ ๋ํด์ ํ์ค์ด ์
์ ๋ซ์ ๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ ์ฌ์ฉ์์ ์ฑ
์์ผ๋ก ๋ฌธ์์ด๋ก ์ค๊ฐ๋ ๊ฒ ๋ ๋์ ์๋ ์๋ค. 0.1์ด IEEE 754 binary64์์ 0x3fb9999999999999๋ก ๋์ฝ๋ฉ๋์ด์ผ ํ ์ง 0x3fb999999999999a๋ก ๋์ฝ๋ฉ๋์ด์ผ ํ ์ง ๋ด๊ฐ ์๊ฒ ๋ญ๋? (๋ณด๋์ค ์ ์: ์ด๋ ์ชฝ์ด ์ฌ๋ฐ๋ฅธ ๋ฐ์ฌ๋ฆผ์ธ์ง ์์ ๋ง์ถฐ ๋ณด์์ค.)
์ฐ๊ด ๋ฐฐ์ด์ ํค ์์๊ฐ ๊ณ ์ ์ด๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ํ๋ํฐ๊ฐ ์ข ์๋ค. ์ด๊ฑธ ํผํ๋ต์๊ณ ํค ์์๋ฅผ ์๋์ผ๋ก(โฆ) ์ฐ๋ ์ธ๊ฐ๋ค์ด ์์ ์ ์๋๋ฐ, ์ด๋ฐ ๊ตฌํ๊ณผ ๋์ฝ๋ฉํ ๋ ํค ์์ ์ ๋๋ก ํ์ธ ์ ํ๊ณ ๋์ด๊ฐ๋ ๊ตฌํ์ด ํฉ์ณ์ง๋ฉด ์ฌ์์ด ์ผ์ด๋๋ค.
์ ๋์ฝ๋๊ฐ ๊ธฐ๋ณธ์ด ์๋๋ค. ๋ญ, ์ ์ ๋๊ฒ ์ผ๋ฉด UTF-8์ ๊ฐ์ ํ๋๋ก ํ์.
์ข
ํฉํ๋ฉด, bencode๋ ์๋ฐํ ์ฐ์ฌ์ง ํ์ค์ด ์๋๋ฐ๋ ์๊ฐ๋ณด๋ค ๋์์ง ์์ ๊ฒฐ๊ณผ๊ฐ ๋์จ ๋ฐ๋ฉด, JSON์ ํ์คํ๋์๋๋ฐ๋ ์ด ๋ชจ์ ์ด ๊ผด์ด๋ค. ์๋. ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ (์์นญ) ๋ถ๋ถ์งํฉ์ด๋ผ๋ ๋ชฉํ๋ฅผ ๊ฐ์ํด๋ JSON ํ์ค์ ์๋นํ ์์ฑํ ํธ์ด๋ค. (ECMAScript ํ์ค์ ๊ฑฐ์ ๋ชจ๋ ์ธ์ด ๋์์ ์์ ํ๋ ๊ฑธ๋ก ์ ๋ช
ํ๋ค๋ ๊ฒ๊ณผ ๋น๊ตํด ๋ณด์!) ๊ทธ๋ฌ๋ ์ด ๋ชจ๋ ๋จ์ ์๋ ๋ถ๊ตฌํ๊ณ , JSON์ ํ๋์ ์ด์ ํ๋ฅผ ์ธ์ ๋ค. ๋๊ตฌ๋ ๋ฉ๋ํ๊ณ ์ฌ์ฉํ ์ ์๋ ํ๋์ ๋ฒ์ฉ ๋ฐ์ดํฐ ๋ชจ๋ธ ๋ง์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ข์ ์ด์ ๊ฐ ์๋ค๋ฉด (๋ด ๋ง์๋ ์ ๋ค๊ธด ํด๋) JSON์ ์ฐ๋ ๊ฒ ์์ฒด๊ฐ ๋์ ๊ฑด ์๋๋ค. ๊ทธ๋ฅ JSON์ด ์ด๋ฐ ์ ๋ฐ ์ ์ฝ์ ๊ฐ๊ณ ์๋ค๋ ๊ฒ๋ง ์ดํดํ๋ฉด ๋๋ค. ํํธ JSON์ด ๋์คํ๋ ๋ค๋ก ๋ง๋ค์ด์ง ๊ฑฐ์ ๋ชจ๋ schemalessํ ์ง๋ ฌํ ๋ฐฉ๋ฒ์ JSON ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ฅํ๋ ๋ชจ์์๋ฅผ ๋ ๊ณ ์๋๋ฐ, ๊ทธ๋ผ์๋ ์ด๋ค์ด ๋ชจ๋ JSON์ด ๋ฒํ๋ ๊ธฐ์ ์ ์ธ ์ค๋ฅ๋ฅผ ํผํด ๊ฐ ๊ฑด ์๋๋ค.
MessagePack, BSON
JSON์ ๋ฌผ๋ก ๋๋ฆฌ ์ฐ์ด์ง๋ง, ํ
์คํธ ํฌ๋งท์ด๋ผ๋ ๋ฌธ์ ํ๋ ๋ง์ผ๋ก ์ ์ง ์ฐ๊ณ ์ถ์ด์ง์ง ์์ ๋๊ฐ ์๋ค. ์ ์ ํ๋ฏ bencode๋ ๋์์ด๊ธด ํ์ง๋ง JSON ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ฑ ๋ค์ด ๋ง๋ ๊ฒ์ ์๋๋ค. ๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ์ด MessagePack์ธ๋ฐ, ์๋ง๋ ํ์ฌ โ๋ฐ์ด๋๋ฆฌ JSONโ์ด ํ์ํ๋ค๊ณ ํ๋ฉด ๊ฐ์ฅ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ ์ข
๋ฅ์ ํฌ๋งท์ด ์๋๊ฐ ์ถ๋ค. ๋ํ์ ์ผ๋ก ๋ ๋์ค ๋ฃจ์ ํ๊ฒฝ์์๋ JSON๊ณผ MessagePack์ ๊ธฐ๋ณธ์ผ๋ก ์ง์ํ๋ค.
MessagePack์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ JSON๊ณผ ๊ฑฐ์ ๊ฐ์๋ฐ, ์ ์ ํ์ ๊ณผ ์ค์ ํ์ ์ด ๋ช ํํ ๋๋์ด ์๊ณ , ํ ์คํธ ๋ฌธ์์ด๊ณผ ๋ฐ์ด๋๋ฆฌ ๋ฌธ์์ด์ด ๋๋์ด ์์ผ๋ฉฐ, ๊ตฌํ์ฒด๊ฐ ์ง์ ํ๋ ํ์ฅ ํ์ ์ ์ต๋ 256์ข ๊น์ง ์ง์ด ๋ฃ์ ์ ์๋ค๋ ๊ฒ์ด ์ผ๋ง ์ ๋๋ ์ฐจ์ด์ ์ด๋ค. JSON ๋ฐ์ดํฐ ๋ชจ๋ธ๊ณผ ์ ํํ ๊ฐ์ง๋ ์์ง๋ง ๊ฑฐ์ ๋ฌด์ํด๋ ๋๋ ์ฐจ์ด๋ผ๊ณ ํ ์ ์๋ค. ์ฌ์ค ๋ฐ์ด๋๋ฆฌ ๋ฌธ์์ด์ ํ ์คํธ๊ฐ ์๋๋ผ ๋ชจ๋ ๊ฐ์ด 0~255 ์ฌ์ด์ ์ ์์ธ ๋ฐฐ์ด๋ก ๋งคํ์ํค๋ฉด ์์ ๋๊ฐ๋ค๊ณ ์ฃผ์ฅํด๋ ๋๋ค.
๋ฐ์ด๋๋ฆฌ ํฌ๋งท์ผ๋ก์ MessagePack์ ํน์ด์ ์ ์์ ์ ์๋ค(-32๋ถํฐ 127๊น์ง)์ด 1๋ฐ์ดํธ๋ก ํํ๋๋ค๋ ์ , ์งง์ ๊ธธ์ด๋ฅผ ๊ฐ์ง ๋ฌธ์์ด์ด๋ ๋ฐฐ์ด ๋ฑ์ ์ค๋ฒํค๋๊ฐ 1๋ฐ์ดํธ ๋ฐ์ ์ ๋๋ค๋ ์ , ๊ทธ๋ฆฌ๊ณ ์ข ๋ ๋์๊ฐ์ ๋ชจ๋ ํ์ ์ฝ๋๊ฐ ์ฒซ 1๋ฐ์ดํธ์ ๋ชฐ๋ ค ์๋ค๋ ์ ์ด๋ผ๊ณ ํ ์ ์๋ค. ์ค์ ๋งคํ์ ๋ณด๋ฉด 1๋ฐ์ดํธ ์์ญ์ ์ต๋ํ ์์ฐจ๊ฒ ์ฐ๋ ค๊ณ ์ต์ ์ ๋คํ ๊ฑธ ๋ณผ ์ ์๋๋ฐ, ์ด ๋๋ฌธ์ MessagePack์ ํฌ๋งท์ ํ์ฅ์ฑ์ ํฌ๊ธฐํด์ผ ํ๋ค. ๋น์ฅ ํ ๋นํ ์ ์๋ ํ์ ์ฝ๋๊ฐ 256๊ฐ ์ค ํ๋(!) ๋ฐ์ ๋จ์ ์์ง ์์ ์ํฉ์ด๋ค. (์์น์ ์๋๋ ์๋ฐ์คํฌ๋ฆฝํธ undefined๋ฅผ ์๋ํ๋ ๊ฒ ๊ฐ๋ค.) ์ด๋ฐ ๋งค์ฐ ์ธ๋ฐํ ํ ๋น์ ํ์ CBOR์ด ๊ณ์นํ๊ฒ ๋๋ฉฐ, ํํธ์ผ๋ก๋ MessagePack์ด ์ผ์ฐ๊ฐ์น ์๋ฒฝํ ๋ฐ์ด๋๋ฆฌ JSON๋ก ์๋ฆฌ์ก๋๋ฐ ๊ฑธ๋ฆผ๋์ด ๋์ด ์๋ค. ์ผ๋จ ์คํธ๋ฆฌ๋ฐ์ด ์ ๋๋ ํฐ๋ผโฆ
MessagePack๊ณผ ๋์๊ธฐ์ ๋์จ ํฌ๋งท ์ค์์ ๋ ํ๋ ์ ๋ช ํ ๊ฒ์ด BSON์ด๋ค. ์ด ํฌ๋งท์ RPC๊ฐ ์๋๋ผ MongoDB์์ ํ๋กํ ์ฝ์ ์ฐ๋ ค๊ณ ๋ง๋ ๊ฒ์ด ์์ด์ด๋ฉฐ, JSON์ด ๋นํจ์จ์ ์ด๋ผ๋ (๋น์ฐํ) ์ด์ ๋ก ๋ง๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฆ ๋ํ โBinary JSONโ์ ์ค์๋ง์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ด๋ฆ์ ํฌ๋์ ๋์ ์ด๋ฆ์ด ๋์๋ค. ๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด, ์ด ํฌ๋งท์ ์ด๋ฆ๊ฐ์ ๋ชป ํ๋ค. ์ ๊ทธ๋ฐ์ง ์ดํด ๋ณด์.
BSON์ ์ฃผ์ฅ๊ณผ๋ ๋ฌ๋ฆฌ JSON ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ฐ์ง ์๋๋ค. MongoDB๋ฅผ ์จ ๋ณด์ ๋ถ์ด๋ผ๋ฉด ์์๊ฒ ์ง๋ง BSON์ด JSON์ผ๋ก ๋งคํ๋ ๋๋ $๋ก ์์ํ๋ ํน์ํ ํค๋ฅผ ์ฌ์ฉํ๊ณ , ๋ฐ๋ผ์ โ์ผ๋ฐ์ ์ธ ์ฉ๋๋ก๋โ ์ด๋ฌํ ํค๋ฅผ ์ฌ์ฉํ ์ ์๋ค! JSON์์ ๋ณธ๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๋ฐ์ดํฐ๋ฅผ ํํํ๋๋ฐ ์ด๋ฌํ ํค๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฑธ ์๊ฐํ๋ฉดโ์๋ง๋ ์ด๊ฒ ๋ ธ๋ฆผ์๊ฒ ์ง๋ง์๋โ, ์ฌ๋ฐ๋ฅธ JSON ๋ฐ์ดํฐ์ธ๋ฐ๋ MongoDB์ ๊ทธ๋๋ก ๋ฃ์ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์์ ์๊ธฐ๊ฒ ๋๋ค. ๊ทธ๋์ ์ด๋ฐ ์ํธ ์ด์ฉ์ฑ์ ํด์น๋ฉด์ ์ง์ด ๋ฃ์๋ค๋ ํ์ ์ด 12๋ฐ์ดํธ ์ค๋ธ์ ํธ ์์ด๋, 64๋นํธ ํ์์คํฌํ, ์ ๊ท์(์๋ ๋๋์ฒด ์?), ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋(์๋ ๋๋์ฒด ์โฆ???) ๋ฐ์์ด๋ค. ์ด๋ฐ ๊ธฐ๊ดดํ ๊ตฌ์ฑ์ ์์ ํ BSON์ด MongoDB ๋ด๋ถ์ ์ฉ๋๋ก ๋ง๋ค์ด์ก๊ณ ์ผ๋ฐ์ ์ธ ์ง๋ ฌํ ํฌ๋งท์ผ๋ก ๋ง๋ค์ด์ง์ง ์์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ๋ค.
BSON์ด ์ง๋ ฌํ ํฌ๋งท์ผ๋ก์ ์ค๊ฒฉ์ธ ์ ์ ํ๋ ๋ ์๋ค. ๋๋ถ๋ถ์ ์ง๋ ฌํ ๋ฐฉ๋ฒ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ผ๋ก ์ธ์ฝ๋ฉ๋๋ ๊ฐ์ด ์์์ ๊ฐ์ด๋ค. ์ฆ ์ต์์์ ์ค์นผ๋ผ ๊ฐ(์ซ์๋ ๋ฌธ์์ด ๋ฑ)์ด๋ ์ปจํ ์ด๋(๋ฐฐ์ด์ด๋ ์ฐ๊ด ๋ฐฐ์ด ๋ฑ)๊ฐ ์ฌ ์ ์๊ณ , ์ปจํ ์ด๋ ์์ ๋ค๋ฅธ ์์์ ๊ฐ์ด ์ฌ ์ ์๋ ์์ด๋ค. JSON์ ๊ฒฝ์ฐ ๋์ค์ ๋ณด์ ๋ฌธ์ ๋๋ฌธ์ ์ฐ๊ด ๋ฐฐ์ด์ด ์๋ ๊ฐ์ ์ต์์์ ์ฐ๋ ๊ฒ์ ๊บผ๋ฆฌ๋ ๊ฒฝํฅ์ด ์์ง๋ง, ๊ทธ๊ฑฐ์ผ HTTP์์ ์ธ ๋์ ์๊ธฐ๊ณ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์๊น์ง ์ ์ฉ๋๋ ์๊ธฐ๋ ์๋๋ค. ๊ทธ๋ฐ๋ฐ BSON์ ๊ธฐ๋ณธ ๋จ์๋ โ๋ฌธ์โ, ์ฆ ์ฐ๊ด ๋ฐฐ์ด์ด๋ค. ์ค์นผ๋ผ ๊ฐ์ ์กด์ฌํ์ง ์์ผ๋ฉฐ ๋จ์ง ์ฐ๊ด ๋ฐฐ์ด์ โ์ด๋โ ํค๊ฐ โ์ด๋โ ์ค์นผ๋ผ ๊ฐ์ ๊ฐ์ง๋ค๋ ์ฌ์ค๋ง ์ธ์ฝ๋ฉ๋๋ค. ํ ์ ๋ ๋ ์ ๋ฐฐ์ด๋ ํ์ ์ฝ๋๋ง ๋ค๋ฅผ ๋ฟ ์ฐ๊ด ๋ฐฐ์ด๋ก ์ธ์ฝ๋ฉ๋์ด, [1, 3, 9]๋ {"0": 1, "1": 3, "2": 9}์ ๊ฐ์ด ์ธ์ฝ๋ฉ๋๋ค! (์ ํํ ์ฒซ ํ ๋ฐ์ดํธ๋ง ๋ค๋ฅด๋ค.) ์ด ๋๋ฌธ์ ์ฌ๋งํ BSON ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด ๊ฐ๋ ์ ์ธ ์ฐจ์ด๋ฅผ ๋ฉ๊พธ๊ธฐ ์ํด ์ด์ํ ์ฝ์ง์ ํด์ผ ํ๊ณ , ๋ฌผ๋ก ๊ตฌํ์ ํ์ง์๋ ์ํฅ์ด ๊ฐ๋ค. ์ด๋ฅผํ ๋ฉด C์ฉ BSON ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด์ฐ๋ ๋์ฐํ๋์ง ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ์ฃผ์ ์ ํ ๋ฒ ๊ต์ฒด๋ ์ ์ ์ด ์๋ค. (๋ด๊ฐ ์ง์ ์จ ๋ดค๋คโฆ)
์ ๋ฆฌํ์๋ฉด, ๋ณธ์ ์๋๊ฒ(?) ํผ์ณ์ง ์ด์ฐฝ๊ธฐ ๋ฐ์ด๋๋ฆฌ JSON ํฌ๋งท ๋๊ฒฐ์์ MessagePack์ BSON์ ํฌ๋์ ์์น์ ๊ฑฐ๋์๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ BSON์ MongoDB๊ฐ ํฅํจ๊ณผ ๋๋ถ์ด, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ด๋ฆ ๋๋ฌธ์ ์ฌ์ ํ ๊ณ ๋ ค ๋์์ด ๋ ์ ์๋ ๋ฐ์ด๋๋ฆฌ JSON ํฌ๋งท์ผ๋ก ์ธ์๋๋ ๊ฒ ์ฌ์ค์ด๋ค. ์๋ฌด์ชผ๋ก ์ด๋ฐ ์คํด๊ฐ ํ๋ฃจ ์ํ ๋ถ์๋๊ธธ ๋ฐ๋๋ค.
CBOR, UBJSON
MessagePack์ด ๋์จ ๋ค ๋ ๋์ ๋ฐ์ด๋๋ฆฌ JSON ํฌ๋งท์ ๋ง๋ค๋ ค๋ ์๋๋ ์ฌ๋ฟ ์์์ง๋ง ์์ง๊น์ง ๋๋ ทํ ์ฑ๊ณผ๋ฅผ ๋ธ ํฌ๋งท์ ์์ง ์๋ค. ํ์ง๋ง ์ด์ฉ๋ฉด ์์ผ๋ก ํฅํ ๊ฐ๋ฅ์ฑ์ด ์๋ ํฌ๋งท์ด ๋ช ์๊ธด ํ๋ฐ, CBOR๊ณผ UBJSON์ด ๋ฐ๋ก ๊ทธ๊ฒ์ด๋ค. ๋์ ๋ง์ ์ ์์ ๋น์ทํ๊ณ ๋ํ ๋ง์ ์ ์์ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํจ๊ป ์๊ฐํ๋ ๊ฒ์ด ๋น๊ต ๋ฐ ๋ถ์์ ๋์์ด ๋๋ฆฌ๋ผ ์๊ฐํ๋ค.
CBOR์ ์ฝ๊ฒ ๋งํ๋ฉด MessagePack์ ํ์ฅํ์ด๋ค. MessagePack ์์ฒด๋ ์ฌ์ค JSON ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ณด์์ ์ผ๋ก๋๋ง ํ์ฅํ๋๋ฐ, CBOR์ ์ข ๋ ๊ธ์ง์ ์ผ๋ก (ํ์ง๋ง ๊ทผ๋ณธ์ ์ผ๋ก๋ JSON๊ณผ ํฐ ๋ฌธ์ ์์ด ๋งคํ๋๋๋ก) ๋ชจ๋ธ์ ํ์ฅํ๋ค. ๊ทธ๋์ CBOR์๋ 16๋นํธ ์ค์(IEEE 754 binary16)๋, undefined ๊ฐ, ๊ทธ๋ฆฌ๊ณ S-expression ์ด๋๋ก ์ค๋๋ง์ ๋ฑ์ฅํ๋ ํ๊ทธ๋ ๊ฐ์ด ์๋ค. ์ด ํ๊ทธ๋ ๊ฐ์ MessagePack์ ํ์ฅ ํ์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง ์ญํ ์ ํ๋ฉฐ, ์ด๋ฅผํ ๋ฉด ํฐ ์ ์, ๋ ์ง/์๊ฐ ํ์ , URL ๋ฑ๋ฑ์ด ๋ชจ๋ ํ๊ทธ๋ฅผ ํตํด ํํ๋๋ค. ๋ํ ASN.1๊ณผ ์ ์ฌํ๊ฒ ์ปจํ ์ด๋ ๋ ๋ฒจ๊ณผ ๋ฐ์ดํฐ ๋ ๋ฒจ์์ ๋ชจ๋ ์คํธ๋ฆฌ๋ฐ์ด ๊ฐ๋ฅํ๋ฉฐ(๋ฌธ์์ด๋ ์ชผ๊ฐค ์ ์๋ค), ํ์ค์ JSON์ผ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ๊ณผ ์ ๊ทํ ๋ฐฉ๋ฒ์ด ๋ชจ๋ ํฌํจ๋์ด ์๋ค. ๋๋ถ์ ๊ตฌํ์ฒด๊ฐ ๊ฝค ๋ณต์กํ ๊ฒ์ผ๋ก ๋ณด์ด์ง๋ง, ์ ์ฝ์ ๋ง์ด ๊ฑด ๋๋ถ์ ๋์ฝ๋๋ ์์ธ๋ก ๋น๊ต์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค(ํ์ค์ well-formedness ์์ฌ์ฝ๋๊ฐ ํฌํจ๋์ด ์๋๋ฐ ์ค์ ๋์ฝ๋๋ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค).
UBJSON์ JSON ๋ฐ์ดํฐ ๋ชจ๋ธ์์ ์ ํ ๋ฒ์ด๋์ง ์๊ณ ์ ์ ํ ๋ฐ์ด๋๋ฆฌ ํฌ๋งท์ ๋ง๋ค๋ ค๋ ์๋์ด๋ค. CBOR์ ๋ค์ํ ๋ฐ์ดํฐ ํ์ ์ ์ง์ํ์ง๋ง ์ด ๋ฐ์ดํฐ ํ์ ์ด ๋ชจ๋ ์ธ์ด์์ ๋๋ฑํ๊ฒ ์ง์๋๋ค๋ ๋ณด์ฅ์ ์ฌ์ค ์๋ค. (binary16์ด ๋ํ์ ์ธ ์์ผ ๊ฒ์ด๋ค.) ๋ํ ํฌ๋งท์ ๋ณต์กํ๊ฒ ๋ง๋ค์ด์ ์ง๋ ฌํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ ์๊ฒ ๋ง๋ค ์๋ ์์ง๋ง ์ผ๋ฐ์ ์ธ ์์ถ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ๋ ์ ํ๊ธฐ๋ ์ด๋ ต๋ค. ๋ฐ๋ผ์ UBJSON์ ๋์ฝ๋ฉํ๊ธฐ ๋งค์ฐ ์ฝ๊ณ , โ์ ์ ํโ ์์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ฉฐ, ๊ทธ๋ผ์๋ ํ๋์ ์ธ ์ง๋ ฌํ ๋ฐฉ๋ฒ์ ์์๋ฅผ ๊ฐ๊ณ ์๋ ํฌ๋งท์ ๋ชฉํ๋ก ํ๊ณ ์๋ค. UBJSON์ ์์ง ํ์ฌ ์งํํ์ธ๋ฐ(2015๋ 6์ ํ์ฌ ์น์ฌ์ดํธ์ ์๋ ๋ช ์ธ์ Github์ ์๋ ๋ช ์ธ๊ฐ ๋ค๋ฅด๋ค!;;;), ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ i) ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ 0~255๊น์ง์ ์ ์๋ง ๋ด๊ฒจ ์๋ ๋ฐฐ์ด๊ณผ ๋๊ฐ์ด ์ฒ๋ฆฌํ๋, ์ค๋ฒํค๋ ์์ด ์ ์ฅํ ์ ์๋๋ก ํ๋ค๋ ๊ฒ๊ณผ, ii) ์ปจํ ์ด๋ ๋จ์ ์คํธ๋ฆฌ๋ฐ์ ์ง์ํ๋ ๊ฒ, ๊ทธ๋ฆฌ๊ณ iii) ๋์ฝ๋ฉ์ ์ํฅ์ ์ฃผ์ง ์๋ keep-alive ๋ช ๋ น์ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ํฌ๊ฒ ๋ณํ์ง ์์ ๋ฏ ํ๋ค.
CBOR๊ณผ UBJSON์ ๊ฐ์ ๋ฌธ์ ์ ๋ํ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ๋๋ต์ ์ ์ํ๊ณ ์๋ค. ๋์ ๊ณตํต์ ์ ์คํธ๋ฆฌ๋ฐ์ ์ง์ํ๋ค๋ ๊ฒ์ด๋ฉฐ(MessagePack์์ ๊ฐ์ฅ ๋ง์ด ์ง์ ๋ ๋ฌธ์ ์๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค), ์ฐจ์ด์ ์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ํ ์๊ฐ์ฐจ๋ก ์์ฝํ ์ ์๋ค. ๊ฐ์ธ์ ์ผ๋ก๋ UBJSON์ด ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ทจ๊ธํ๋ ๋ฐฉ๋ฒ์ด ํ๋ฅญํ๋ค๊ณ ์๊ฐํ๋ค. JSON์์๋ ์ ๋์ฝ๋๊ฐ ์๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ธ์ฝ๋ฉํ๋ ๋ฐฉ๋ฒ์ด ์ฌ๋ฟ ์์์ผ๋ฉฐ ์๋ก ์ํธ ๊ตํ์ด ๋ถ๊ฐ๋ฅํ๊ณ , ๊ทธ๋์ ํ๋ ์ ํฌ๋งท๋ค์ ์ ๋์ฝ๋ ๋ฌธ์์ด๊ณผ ๋ฐ์ด๋๋ฆฌ ๋ฌธ์์ด์ ๋๋๋ ๊ฒ์ ์ต์ฐ์ ๊ณผ์ ๋ก ์ผ์๋ค. ๊ทธ๋ฌ๋ UBJSON์ ๋์ ๋๋ฆฌ ์ฐ์ด๋ ๋ฐ์ด๋๋ฆฌ ์ธ์ฝ๋ฉ ๋ฐฉ๋ฒ๊ณผ ์ ํํ ํธํ๋๋ฉด์๋ ์ค์ ๋ก ์ธ์ฝ๋ฉํ ๋๋ ์ค๋ฒํค๋๊ฐ ์๊ธฐ์ง ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์ผ๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์๋ ํจ์จ์ ์ผ๋ก ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ์ ์๋ ๊ฒ์ด๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก, CBOR์ ํฅ๋ง์ฑ์ ๋ ์ข์ ๊ตฌํ์ด ์ผ๋ง๋ ๋ง์ด ๋ํ๋๋๊ฐ๋ก, UBJSON์ ํฅ๋ง์ฑ์ ๋ ํ์ค์ ์ผ๋ง๋ ๋ ํ์ฅํ๋๊ฐ๋ก ๊ฒฐ์ ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ค(UBJSON ์ด์ ํธ๋์ปค๋ฅผ ๋ณด๋ฉด ์ฐธ ๊ฐ๊ด์ด๋ค).
๊ฒฐ๋ก
๋ฐ์ดํฐ ์ง๋ ฌํ๋ ํ๋ฆฐ ๋ฏ ํ๋ฆฌ์ง ์์ ๋ฌธ์ ์ด๋ค. ์ง๋ 40๋
(!)๊ฐ ์ฌ๋ฌ ๋ง์ ๋ฐฉ๋ฒ์ด ์ ์๋์์์๋ ๊ณ์ ์๋ก์ด ํฌ๋งท์ด ๋ฑ์ฅํ๊ณ ํฅํ๊ณ ๋งํ๋ ๊ฑธ ๋ณด๋ฉด, ์ด ๋ฌธ์ ๋ ์ ์ผํ ๋ต์ด ์๋ค๊ธฐ๋ณด๋ค๋ ์ฉ๋์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ฐ์ง ํธ๋ ์ด๋์คํ๊ฐ ์กด์ฌํ๋ค๋ ๊ฒ์ด ์ณ์ ์๊ฐ์ผ ๊ฒ์ด๋ค. ์ด ๊ธ์์๋ ์ฌ๋ฌ ์ง๋ ฌํ ๋ฐฉ๋ฒ๋ค์ ๋น๊ตํ๋ฉด์ ์ฅ๋จ์ ์ ๋
ผ์ํ์๋๋ฐ, ๊ทธ๋๋ ๊ตณ์ด ๋ช ๊ฐ์ ํฌ๋งท์ ์ถ์ฒํ๋ค๋ฉด ๋ด ์๊ฐ์ ํ์ฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ง์ง ์๋ฌด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ด ์ฝ๊ฒ ๊ตฌํํ๋ ๊ฒ ๋ชฉํ๋ผ๋ฉด XDR์ด๋ ๊ทธ ๋ณ์ข
(XDR์์ 4๋ฐ์ดํธ ์ ๋ ฌ์ ์ฌ์ค ๋ฌด์ํด๋ ๋ฌด๋ฐฉํ๋ค๊ณ ๋ณธ๋ค)
๋ฐ์ดํฐ ๋ชจ๋ธ์ด ๋ณต์กํ์ฌ ๊ฒ์ฆ์ ์ฝ๊ฒ ํ์ผ๋ฉด ์ถ์ผ๋ฉด Capโn Proto
๊ฒ์ฆ์ด ๋ณ๋ก ํ์ ์๊ณ , ์ต๋ํ์ ์ํธ ์ด์ฉ์ฑ์ด ํ์ํ๋ฉด JSON
๊ฒ์ฆ์ด ๋ณ๋ก ํ์ ์๊ณ , ํฌ๊ธฐ/์ฑ๋ฅ์ ์ ๊ฒฝ์ ์ด๋ค๋ฉด MessagePack
๋ด ํฌ๋ง์ ์์์ 3/4๋ฒ์ด 10๋
์์ CBOR์ด๋ UBJSON ๋ฑ์ผ๋ก ํจ๊ป ๊ต์ฒด๋์์ผ๋ฉด ์ถ์ง๋ง, ์๋ ์ ๋ชจ๋ฅด๋ ๋ฒ. ๊ทธ ์ ๊น์ง๋ ํธ๋ ์ด๋์คํ์ ๋ฐ๋ผ ์ ์ ํ์ ํด์ผ ํ ๊ฒ์ด๋ค. ๋ฌผ๋ก ์๋ชป ์ ํํ๋ค๊ณ ๋ด ํ์ ์๋๋คโฆ