JSON ํฌ๋งคํฐ & ๊ฒ์ฆ๊ธฐ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ
Q: JSON ํฌ๋งทํฐ๋ ๋ฌด์์ธ๊ฐ์?
A: JSON ํฌ๋งทํฐ๋ ๋ฌด์์ธ๊ฐ์?
JSON ํฌ๋งทํฐ๋ ์์, ์ถ์ ๋๋ ์๋ชป๋ ํ์์ JSON ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์ ์ ํ ๋ค์ฌ์ฐ๊ธฐ, ์ค ๋ฐ๊ฟ ๋ฐ ๊ฐ๊ฒฉ์ ์ ์ฉํ์ฌ ์ฌ๋์ด ์ฝ์ ์ ์๋๋ก ๋ค์ ํฌ๋งทํ ํ๋ ๋๊ตฌ์ ๋๋ค. ๋๋ถ๋ถ์ JSON ํฌ๋งทํฐ๋ ์ ํจ์ฑ ๊ฒ์ฌ, ๊ตฌ๋ฌธ ๊ฐ์กฐ, ์ค๋ฅ ๊ฐ์ง, ๊ทธ๋ฆฌ๊ณ ๋๋ก๋ ํค ์ ๋ ฌ, ์ถ์, ํธ๋ฆฌ ๋ทฐ ํ์๊ณผ ๊ฐ์ ์ถ๊ฐ ๊ธฐ๋ฅ๋ ํฌํจํฉ๋๋ค. ์ ํฌ ๋ฌด๋ฃ ์จ๋ผ์ธ JSON ํฌ๋งทํฐ๋ ํฌ๋งทํ ๊ณผ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ๋์ ๋๊ตฌ๋ก ๊ฒฐํฉํ์ฌ, ์์ธํ ์ค๋ฅ ๋ณด๊ณ ์ ํจ๊ป ์ฆ๊ฐ์ ์ด๊ณ ๊น๋ํ ์ถ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
Q: ์ ์ JSON์ด ์ ํจํ์ง ์์๊ฐ์?
A: ์ ์ JSON์ด ์ ํจํ์ง ์์๊ฐ์?
JSON์ JSON ์ฌ์์ ์๊ฒฉํ ๊ท์น์ ์๋ฐํ ๋ ์ ํจํ์ง ์์ต๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ๋ง์ง๋ง ํญ๋ชฉ ๋ค์ ํํ ์ผํ๊ฐ ์๋ ๊ฒฝ์ฐ
- ๊ฐ์ฒด ํค๋ ๋ฌธ์์ด ๊ฐ ์ฃผ์์ ํฐ๋ฐ์ดํ๊ฐ ๋๋ฝ๋ ๊ฒฝ์ฐ
- ํฐ๋ฐ์ดํ ๋์ ์์๋ฐ์ดํ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ (์์๋ฐ์ดํ๋ JSON์์ ์ ํจํ์ง ์์)
- ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๋์ง ์์ ํน์ ๋ฌธ์, ์๋ฅผ ๋ค์ด ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๋์ง ์์ ๋ฐฑ์ฌ๋์๋ ๋ฌธ์์ด ๋ด ๋ฐ์ดํ
undefined,NaN,Infinity์ ๊ฐ์ ์ ํจํ์ง ์์ ๊ฐ (JSON์ ํด๋นํ๋ ํํ์ด ์์)- ์ค๊ดํธ๋ ๋๊ดํธ๊ฐ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ
{/}๋๋[/]๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์์ ์ด๋ฃจ์ง ์์
JSON ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ๋ฌธ ์ค๋ฅ์ ์ ํํ ์์น์ ๋ด์ฉ์ ํ์ ํ์ธ์. ๋๋ถ๋ถ์ ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ ์ฒซ ๋ฒ์งธ ๋ฌธ์ ์ ๋ํด ์ค ๋ฒํธ, ์ด ๋ฒํธ ๋ฐ ์ค๋ช ์ ์ธ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ณด๊ณ ํฉ๋๋ค.
Q: JSON๊ณผ JavaScript ๊ฐ์ฒด์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
A: JSON๊ณผ JavaScript ๊ฐ์ฒด์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
JSON ๊ตฌ๋ฌธ์ JavaScript ๊ฐ์ฒด ๋ฆฌํฐ๋ด ๊ตฌ๋ฌธ์์ ํ์๋์์ง๋ง, ๋์ ์๋ก ๋ค๋ฆ ๋๋ค. ์ฃผ์ ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํค๋ ๋ฐ๋์ ํฐ๋ฐ์ดํ๋ก ๊ฐ์ธ์ผ ํฉ๋๋ค -- JSON์
{"key": "value"}๋ฅผ ์๊ตฌํ์ง๋ง, JavaScript๋{key: "value"}(๋ฐ์ดํ ์์)์{'key': 'value'}(์์๋ฐ์ดํ)๋ฅผ ํ์ฉํฉ๋๋ค. - ๋ฌธ์์ด ๊ฐ์ ํฐ๋ฐ์ดํ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค -- JSON์ ๋ฌธ์์ด์ ํฐ๋ฐ์ดํ๋ง ํ์ฉํฉ๋๋ค. JavaScript๋ ์์๋ฐ์ดํ์ ํฐ๋ฐ์ดํ๋ฅผ ๋ชจ๋ ํ์ฉํฉ๋๋ค.
- ํํ ์ผํ๊ฐ ํ์ฉ๋์ง ์์ต๋๋ค -- JSON์ ๋ง์ง๋ง ํญ๋ชฉ ๋ค์ ํํ ์ผํ๋ฅผ ๊ธ์งํฉ๋๋ค. JavaScript๋ ์ด๋ฅผ ํ์ฉํฉ๋๋ค.
- ์ ํ๋ ๋ฐ์ดํฐ ์ ํ -- JSON์ ๋ฌธ์์ด, ์ซ์, ๋ถ๋ฆฌ์ธ, null, ๊ฐ์ฒด, ๋ฐฐ์ด๋ง ์ง์ํฉ๋๋ค. JavaScript ๊ฐ์ฒด๋ ํจ์,
undefined,Date,Map,Set๋ฐ ๊ธฐํ ํน์ ์ ํ์ ํฌํจํ ์ ์์ต๋๋ค. - ์ฃผ์์ด ํ์ฉ๋์ง ์์ต๋๋ค -- JSON์ ์ฃผ์์ ์ง์ํ์ง ์์ต๋๋ค. ์์ค ์ฝ๋์ JavaScript ๊ฐ์ฒด์๋ ์ฃผ์์ ํฌํจํ ์ ์์ต๋๋ค.
์ฆ, JavaScript ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ JSON์ด๋ผ๊ณ ๋ถ๋ฅผ ์ ์์ต๋๋ค -- JSON.stringify()๋ก ์ง๋ ฌํํ๊ฑฐ๋ ์๊ฒฉํ JSON ๊ท์น์ ๋ฐ๋ผ ์์ฑํด์ผ ํฉ๋๋ค.
Q: JSON์ ์ฃผ์์ ์ฌ์ฉํ ์ ์๋์?
A: JSON์ ์ฃผ์์ ์ฌ์ฉํ ์ ์๋์?
์๋์, ๊ณต์ JSON ์ฌ์(RFC 8259)์ ์ฃผ์์ ์ง์ํ์ง ์์ต๋๋ค. JSON์ ์ต์ํ์ ์ธ์ด ๋ ๋ฆฝ์ ์ธ ๋ฐ์ดํฐ ๊ตํ ํ์์ผ๋ก ์ค๊ณ๋์์ผ๋ฉฐ, ํ์๋ฅผ ๊ฐ๋จํ๊ณ ์ฌ๋ฌ ์ธ์ด์์ ์ผ๊ด๋๊ฒ ์ ์งํ๊ธฐ ์ํด ์ฃผ์์ด ์๋์ ์ผ๋ก ์ ์ธ๋์์ต๋๋ค.
์ฃผ์์ด ํ์ํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค:
- JSONC (JSON with Comments) -- VS Code ๋ฐ ๊ธฐํ ๋๊ตฌ์์ ๊ตฌ์ฑ ํ์ผ์ ์ฌ์ฉ๋ฉ๋๋ค. JSONC๋
//์ค ์ฃผ์๊ณผ/* */๋ธ๋ก ์ฃผ์์ ํ์ฉํฉ๋๋ค. - YAML ๋๋ TOML -- ๊ธฐ๋ณธ์ ์ผ๋ก ์ฃผ์์ ์ง์ํ๋ ๋์ฒด ๊ตฌ์ฑ ํ์์ ๋๋ค.
- ๊ท์น ๊ธฐ๋ฐ ๋ฉํ๋ฐ์ดํฐ -- JSON ๊ฐ์ฒด์
"_comment"๋๋"//"์ ๊ฐ์ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋์ด ์ฝ์ ์ ์๋ ๋ฉ๋ชจ๋ฅผ ์ ์ฅํฉ๋๋ค. ์ด๋ ํ์ด๋ก๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ค๋ ์ ์ ์ ์ํ์ธ์. - ํ์ฑ ์ ์ ์ฃผ์ ์ ๊ฑฐ -- ์๊ฒฉํ ํ์์ JSON์ ์ ๋ฌํ๊ธฐ ์ ์ ์ ์ฒ๋ฆฌ ๋จ๊ณ์์ ์ฃผ์์ ์ ๊ฑฐํฉ๋๋ค.
Q: ์จ๋ผ์ธ์์ JSON์ ์ด๋ป๊ฒ ์ ํจ์ฑ ๊ฒ์ฌํ๋์?
A: ์จ๋ผ์ธ์์ JSON์ ์ด๋ป๊ฒ ์ ํจ์ฑ ๊ฒ์ฌํ๋์?
์จ๋ผ์ธ์์ JSON ์ ํจ์ฑ ๊ฒ์ฌ๋ ๊ฐ๋จํฉ๋๋ค:
- JSON ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํฉ๋๋ค
- JSON ์ ํจ์ฑ ๊ฒ์ฌ ๋๊ตฌ์ ๋ถ์ฌ๋ฃ์ต๋๋ค
- ์ ํจ์ฑ ๊ฒ์ฌ ๋๋ ํฌ๋งท ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค
- ๋๊ตฌ๊ฐ ์ ํจํ JSON์ ๋ณด๊ณ ํ๊ฑฐ๋, ๋ฌธ์ ์ ์ ํํ ์์น์ ์ค๋ช ๊ณผ ํจ๊ป ์ค๋ฅ๋ฅผ ํ์ํฉ๋๋ค
์ข์ JSON ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ ๋ค์์ ๊ฐ์ถ์ด์ผ ํฉ๋๋ค:
- ๊ณต์ JSON ์ฌ์(RFC 8259)์ ๋ฐ๋ผ ๊ตฌ๋ฌธ ์ ํจ์ฑ ๊ฒ์ฌ
- ์ค๋ฅ์ ์ค ๋ฒํธ์ ์ด ๋ฒํธ ํ์
- ๋ฌด์์ด ์๋ชป๋์๋์ง ์ค๋ช ํ๋ ์ค๋ช ์ ์ธ ์ค๋ฅ ๋ฉ์์ง ์ ๊ณต
- ์ ํ์ ์ผ๋ก ๋์์ JSON์ ํฌ๋งทํ ํ๊ณ ๋ณด๊ธฐ ์ข๊ฒ ์ ๋ฆฌ
- ๋ค์ํ ๋ฐ์ดํฐ ์ ํ์ ๋ํ ์์ ์ฝ๋ฉ์ผ๋ก ๊ตฌ๋ฌธ ๊ฐ์กฐ
๋์ฉ๋ ๋๋ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ, ๋ง์ ์จ๋ผ์ธ ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ ๋ธ๋ผ์ฐ์ ๋ด์์ ํด๋ผ์ด์ธํธ ์ธก์์ ์ํํ๋ฏ๋ก ๋ฐ์ดํฐ๊ฐ ๊ธฐ๊ธฐ๋ฅผ ๋ ๋์ง ์์ต๋๋ค.
Q: ์ถ์๋(minified) JSON์ด๋ ๋ฌด์์ ์๋ฏธํ๋์?
A: ์ถ์๋(minified) JSON์ด๋ ๋ฌด์์ ์๋ฏธํ๋์?
์ถ์๋ JSON์ ๋ชจ๋ ๋ถํ์ํ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋ JSON์ ๋๋ค -- ๊ณต๋ฐฑ, ํญ, ์ค ๋ฐ๊ฟ ๋ฐ ๋ค์ฌ์ฐ๊ธฐ๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ฌผ์ ๋จ์ผ ์ค(๋๋ ๋งค์ฐ ์ ์ ์ค)์ ์์ถ๋ ํ ์คํธ์ ๋๋ค:
{"users":[{"id":1,"name":"Alice","roles":["admin"]}],"total":1}
์ถ์๋ JSON์ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ํ๋ก๋์ ํ๊ฒฝ์์ ์ฌ์ฉ๋ฉ๋๋ค:
- ๋ ์์ ํ์ผ ํฌ๊ธฐ -- ํ์ด๋ก๋ ํฌ๊ธฐ๋ฅผ 30-50% ์ด์ ์ค์ผ ์ ์์ต๋๋ค
- ๋ ๋น ๋ฅธ ๋คํธ์ํฌ ์ ์ก -- ์ ์กํ ๋ฐ์ดํฐ๊ฐ ์ ๋ค๋ ๊ฒ์ ๋ ๋ฎ์ ์ง์ฐ ์๊ฐ์ ์๋ฏธํฉ๋๋ค
- ๋์ญํญ ๋น์ฉ ์ ๊ฐ -- ํธ๋ํฝ์ด ๋ง์ API์ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์ค์ํฉ๋๋ค
๋จ์ ์ ์ถ์๋ JSON์ด ์ฌ์ค์ ์ฌ๋์ด ์ฝ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ฒ๊น ์ด๋ ๊ฒ์ฌ๋ฅผ ์ํด ์ถ์๋ JSON์ ์ฝ์ ์ ์๋ ๊ตฌ์กฐ๋ก ๋ค์ ํฌ๋งทํ ํ๋ ค๋ฉด JSON ํ๋ฆฌํฐ ํ๋ฆฐํธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์.
Q: ๋ช ๋ น์ค์์ JSON์ ์ด๋ป๊ฒ ํ๋ฆฌํฐ ํ๋ฆฐํธํ๋์?
A: ๋ช ๋ น์ค์์ JSON์ ์ด๋ป๊ฒ ํ๋ฆฌํฐ ํ๋ฆฐํธํ๋์?
์ฌ๋ฌ ๋ช ๋ น์ค ๋๊ตฌ๋ก JSON์ ํ๋ฆฌํฐ ํ๋ฆฐํธํ ์ ์์ต๋๋ค:
jq ์ฌ์ฉ (๊ฐ์ฅ ์ธ๊ธฐ ์์, ๋ณ๋ ์ค์น ํ์):
cat file.json | jq .
Python ์ฌ์ฉ (๋๋ถ๋ถ์ ์์คํ ์ ๋ด์ฅ):
python -m json.tool file.json
Node.js ์ฌ์ฉ:
node -e "const d = require('./data.json'); console.log(JSON.stringify(d, null, 2));"
curl ์ฌ์ฉ (API ์๋ต ํ๋ฆฌํฐ ํ๋ฆฐํธ):
curl https://api.example.com/data | jq .
jq ๋๊ตฌ๋ ์์์ด ์ง์ ๋ ์ถ๋ ฅ, ์ฟผ๋ฆฌ ๊ธฐ๋ฅ ๋ฐ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ฏ๋ก ๊ถ์ฅ๋ฉ๋๋ค.
Q: JSON Schema๋ ๋ฌด์์ธ๊ฐ์?
A: JSON Schema๋ ๋ฌด์์ธ๊ฐ์?
JSON Schema๋ JSON ๋ฌธ์์ ์ฃผ์์ ๋ฌ๊ณ ์ ํจ์ฑ์ ๊ฒ์ฌํ ์ ์๋ ์ดํ์ ๋๋ค. JSON ๋ฌธ์๊ฐ ์ถฉ์กฑํด์ผ ํ๋ ๊ตฌ์กฐ, ๋ฐ์ดํฐ ์ ํ ๋ฐ ์ ์ฝ ์กฐ๊ฑด์ ์ ์ํฉ๋๋ค. ์ด๋ฅผ JSON ๋ฐ์ดํฐ์ ๋ํ ๊ณ์ฝ ๋๋ ๋ช ์ธ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
JSON Schema์ ์ฃผ์ ๊ธฐ๋ฅ:
- ์ ํ ์ ํจ์ฑ ๊ฒ์ฌ -- ๊ฐ์ด ๋ฌธ์์ด, ์ซ์, ๋ถ๋ฆฌ์ธ, ๋ฐฐ์ด, ๊ฐ์ฒด ๋๋ null์ด์ด์ผ ํ๋์ง ์ง์
- ํ์ ํ๋ -- ํน์ ์์ฑ์ ํ์๋ก ํ์
- ๊ฐ ์ ์ฝ ์กฐ๊ฑด -- ์ต์/์ต๋๊ฐ, ๋ฌธ์์ด ํจํด(regex), ํ์ฉ๋ ๊ฐ(enums) ์ค์
- ๋ฐฐ์ด ์ ํจ์ฑ ๊ฒ์ฌ -- ๋ฐฐ์ด ๊ธธ์ด, ํญ๋ชฉ ์ ํ ๋ฐ ๊ณ ์ ์ฑ ์ ์ด
- ์ค์ฒฉ ์ ํจ์ฑ ๊ฒ์ฌ -- ์ค์ฒฉ๋ ๊ฐ์ฒด ๋ฐ ๋ฐฐ์ด์ ๋ํ ์คํค๋ง ์ ์
- ์กฐ๊ฑด๋ถ ์ ํจ์ฑ ๊ฒ์ฌ -- ๋ค๋ฅธ ํ๋์ ๊ฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ท์น ์ ์ฉ
JSON Schema ์์:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["name", "email"],
"properties": {
"name": { "type": "string", "minLength": 1 },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "minimum": 0, "maximum": 150 }
}
}
JSON Schema๋ ์ผ๋ฐ์ ์ผ๋ก API ์์ฒญ ๋ณธ๋ฌธ, ๊ตฌ์ฑ ํ์ผ ๋ฐ ์๋น์ค ๊ฐ ๋ฐ์ดํฐ ๊ตํ ๊ณ์ฝ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.