JSON ํ๋ฆฌํฐ ํ๋ฆฐํธ: ๊ฐ๋ ์ฑ์ ์ํ JSON ํฌ๋งทํ ๋ฐฉ๋ฒ
JSON ํ๋ฆฌํฐ ํ๋ฆฐํ ์ด๋?
JSON ํ๋ฆฌํฐ ํ๋ฆฐํ ์ ์์์ ์์ถ๋(์ถ์๋) JSON ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์ ์ ํ ๋ค์ฌ์ฐ๊ธฐ, ์ค ๋ฐ๊ฟ ๋ฐ ๊ฐ๊ฒฉ์ ์ ์ฉํ์ฌ ์ฌ๋์ด ์ฝ์ ์ ์๋๋ก ๋ค์ ํฌ๋งทํ ํ๋ ๊ณผ์ ์ ๋๋ค. ํ๋ฆฌํฐ ํ๋ฆฐํธ๋ JSON ๋ฌธ์๋ ์ค์ฒฉ๋ ๊ฐ์ฒด์ ๋ฐฐ์ด์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋๋ฌ๋ด๋ ์ผ๊ด๋ ๋ค์ฌ์ฐ๊ธฐ์ ๋ช ํํ ๊ตฌ์กฐ์ ํฌ๋งทํ ์ ์ฌ์ฉํฉ๋๋ค.
๋์ผํ ๋ฐ์ดํฐ์ ๋ ๊ฐ์ง ํํ์ ๋น๊ตํด ๋ณด์ธ์:
์ถ์๋จ (์ฝ๊ธฐ ์ด๋ ค์):
{"users":[{"id":1,"name":"Alice","roles":["admin","editor"]},{"id":2,"name":"Bob","roles":["viewer"]}],"total":2}
ํ๋ฆฌํฐ ํ๋ฆฐํธ๋จ (์ฝ๊ธฐ ์ฌ์):
{
"users": [
{
"id": 1,
"name": "Alice",
"roles": ["admin", "editor"]
},
{
"id": 2,
"name": "Bob",
"roles": ["viewer"]
}
],
"total": 2
}
ํ๋ฆฌํฐ ํ๋ฆฐํธ vs ์ถ์๋ JSON
ํ๋ฆฌํฐ ํ๋ฆฐํธ๋ JSON๊ณผ ์ถ์๋ JSON ์ฌ์ด์ ์ ํ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค:
| ์ธก๋ฉด | ํ๋ฆฌํฐ ํ๋ฆฐํธ | ์ถ์๋จ | |--------|-------------|----------| | ๊ฐ๋ ์ฑ | ๋์ -- ๋ช ํํ ๊ตฌ์กฐ | ๋ฎ์ -- ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ํ ์ค์ | | ํ์ผ ํฌ๊ธฐ | ๋ ํผ (๊ณต๋ฐฑ์ด ๋ ๋ง์) | ๋ ์์ (๊ณต๋ฐฑ ์ค๋ฒํค๋ ์์) | | ๋คํธ์ํฌ ์ ์ก | ๋์ฉ๋ ํ์ด๋ก๋์ ๊ฒฝ์ฐ ๋ ๋๋ฆผ | ๋ ๋น ๋ฆ, ๋ ์ ์ ๋์ญํญ | | ๋๋ฒ๊น | ๊ฐ๋ฐ์ ์ด์์ | ๊ฒ์ฌ์ ์ค์ฉ์ ์ด์ง ์์ | | ํ๋ก๋์ ์ฌ์ฉ | ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ | API ์๋ต์ ํ์ค |
ํ๋ก๋์ API๋ ์ผ๋ฐ์ ์ผ๋ก ๋์ญํญ์ ์ค์ด๊ธฐ ์ํด ์ถ์๋ JSON์ ์ ๊ณตํ๋ ๋ฐ๋ฉด, ๊ฐ๋ฐ์๋ ๊ฐ๋ฐ ๋ฐ ๋๋ฒ๊น ์ค์ JSON์ ํ๋ฆฌํฐ ํ๋ฆฐํธํฉ๋๋ค.
๋ค์ฌ์ฐ๊ธฐ ์คํ์ผ
๋๋ถ๋ถ์ ํฌ๋งทํฐ๋ ๋ ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋ค์ฌ์ฐ๊ธฐ ์คํ์ผ์ ์ง์ํฉ๋๋ค:
2-๊ณต๋ฐฑ ๋ค์ฌ์ฐ๊ธฐ (๊ฐ์ฅ ์ผ๋ฐ์ )
{
"name": "Alice",
"age": 30,
"address": {
"city": "New York"
}
}
๊ถ์ฅ ๋์: JavaScript/TypeScript ํ๋ก์ ํธ, ํ๋ ์น ๊ฐ๋ฐ ๋ฐ ๋๋ถ๋ถ์ ์ผ๋ฐ์ ์ธ ์ฉ๋.
4-๊ณต๋ฐฑ ๋ค์ฌ์ฐ๊ธฐ
{
"name": "Alice",
"age": 30,
"address": {
"city": "New York"
}
}
๊ถ์ฅ ๋์: Python ํ๋ก์ ํธ(PEP 8 ์คํ์ผ) ๋ฐ ๋ช ํ์ฑ์ ์ํด ๋ ๋์ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ์ ํธํ๋ ํ.
ํญ ๋ค์ฌ์ฐ๊ธฐ
์ผ๋ถ ๊ฐ๋ฐ์๋ ํนํ ์ฌ์ฉ์๊ฐ ํธ์ง๊ธฐ์์ ํญ ๋๋น๋ฅผ ์กฐ์ ํ๋ ์ ๊ทผ์ฑ ์ค์ฌ ์ํฌํ๋ก์ฐ์์ ํญ ๊ธฐ๋ฐ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ์ ํธํฉ๋๋ค.
์ ์ ํ ๋ค์ฌ์ฐ๊ธฐ ์ ํํ๊ธฐ
๋๋ถ๋ถ์ ํ์ ๊ฐ๋ ์ฑ๊ณผ ์ํ ๊ณต๊ฐ ํจ์จ์ฑ์ ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํด 2-๊ณต๋ฐฑ์ผ๋ก ํ์คํํฉ๋๋ค. JavaScript ์ํ๊ณ(Node.js, React, Vue)๋ ์๋์ ์ผ๋ก 2-๊ณต๋ฐฑ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. Python ์ค์ฌ ํ๊ฒฝ์์ ์์ ํ๋ ๊ฒฝ์ฐ 4-๊ณต๋ฐฑ ๋ค์ฌ์ฐ๊ธฐ๊ฐ ๋ ์์ฐ์ค๋ฝ๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค. ํต์ฌ์ ์ผ๊ด์ฑ์ ๋๋ค -- ํ๋์ ์คํ์ผ์ ์ ํํ๊ณ Prettier๋ EditorConfig์ ๊ฐ์ ๋๊ตฌ๋ก ํ๋ก์ ํธ ์ ์ฒด์ ์ ์ฉํ์ธ์.
๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์์ JSON ํ๋ฆฌํฐ ํ๋ฆฐํธ
JavaScript / Node.js
const formatted = JSON.stringify(data, null, 2);
console.log(formatted);
Python
import json
formatted = json.dumps(data, indent=2)
print(formatted)
Java
import com.fasterxml.jackson.databind.ObjectMapper;
ObjectMapper mapper = new ObjectMapper();
String formatted = mapper.writerWithDefaultPrettyPrinter()
.writeValueAsString(data);
Go
import "encoding/json"
formatted, _ := json.MarshalIndent(data, "", " ")
fmt.Println(string(formatted))
Ruby
require 'json'
puts JSON.pretty_generate(data)
JSON ํ๋ฆฌํฐ ํ๋ฆฐํธ ๋ฐฉ๋ฒ
์จ๋ผ์ธ JSON ํฌ๋งทํฐ ์ฌ์ฉํ๊ธฐ
๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ๋ฌด๋ฃ ์จ๋ผ์ธ JSON ํฌ๋งทํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค -- JSON์ ๋ถ์ฌ๋ฃ์ผ๋ฉด ๊ตฌ๋ฌธ ๊ฐ์กฐ ๋ฐ ์ค๋ฅ ๊ฐ์ง์ ํจ๊ป ์ฆ์ ํฌ๋งท๋ ์ถ๋ ฅ์ ์ป์ ์ ์์ต๋๋ค.
๋ช ๋ น์ค ๋๊ตฌ ์ฌ์ฉํ๊ธฐ
jq ์ฌ์ฉ (๊ฐ์ฅ ์ธ๊ธฐ ์์):
cat file.json | jq .
Python ์ฌ์ฉ:
python -m json.tool file.json
Node.js ์ฌ์ฉ:
node -e "const d = require('./file.json'); console.log(JSON.stringify(d, null, 2));"
๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ
๋ชจ๋ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ ๋คํธ์ํฌ ํญ์์ JSON ์๋ต์ ์๋์ผ๋ก ํฌ๋งทํ ํฉ๋๋ค:
- Chrome DevTools: ๋คํธ์ํฌ ํญ์ด JSON ์๋ต์ ์๋์ผ๋ก ํ๋ฆฌํฐ ํ๋ฆฐํธํฉ๋๋ค
- Firefox ๊ฐ๋ฐ์ ๋๊ตฌ: JSON ์๋ต์ด ์ ์ ์ ์๋ ํธ๋ฆฌ ๋ทฐ๋ก ํ์๋ฉ๋๋ค
- Safari Web Inspector: JSON ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ์๋ ํฌ๋งทํ ์ด ํฌํจ๋ฉ๋๋ค
JSON ํฌ๋งทํ ์ ์ํ IDE ํ๋ฌ๊ทธ์ธ
VS Code
VS Code๋ ๋ฐ์ด๋ ๋ด์ฅ JSON ์ง์์ ์ ๊ณตํฉ๋๋ค. Shift+Alt+F(Windows/Linux) ๋๋ Shift+Option+F(macOS)๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ JSON ํ์ผ์ ํฌ๋งทํ
ํ ์ ์์ต๋๋ค. ์ถ๊ฐ ํ์ฅ ๊ธฐ๋ฅ์ด ๊ฒฝํ์ ํฅ์์ํต๋๋ค:
- Prettier -- JSON, JSONC ๋ฐ ๊ธฐํ ์ฌ๋ฌ ์ธ์ด๋ฅผ ์ผ๊ด๋๊ฒ ํฌ๋งทํ ํฉ๋๋ค
- JSON Tools -- ํค๋ณด๋ ๋จ์ถํค๋ก JSON ์ ๋ ฌ, ์ถ์ ๋ฐ ํฌ๋งทํ
- JavaScript Booster -- ๊ณ ๊ธ JSON ์กฐ์ ๊ธฐ๋ฅ
JetBrains IDE (IntelliJ, WebStorm, PyCharm)
- ๋ด์ฅ ํฌ๋งทํฐ:
Ctrl+Alt+L(Windows/Linux) ๋๋Cmd+Option+L(macOS) - ๋ถ์ฌ๋ฃ๊ธฐ ์ ์๋ JSON ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ ํฌ๋งทํ
Vim / Neovim
" JSON์ ์ ์๋ฆฌ์์ ํฌ๋งทํ
:%!jq .
๊ณ ๊ธ JSON ํฌ๋งทํ ์ต์
ํ๋ JSON ํฌ๋งทํฐ๋ ๊ธฐ๋ณธ ๋ค์ฌ์ฐ๊ธฐ ์ด์์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค:
- ํค ์ ๋ ฌ -- ์ผ๊ด๋ ์ถ๋ ฅ์ ์ํด ๊ฐ์ฒด ํค๋ฅผ ์ํ๋ฒณ์์ผ๋ก ์ ๋ ฌ
- ๊ตฌ๋ฌธ ๊ฐ์กฐ -- ํค, ๋ฌธ์์ด, ์ซ์, ๋ถ๋ฆฌ์ธ์ ์์ ์ฝ๋ฉ
- ์ ์ ์ ์๋ ํธ๋ฆฌ -- ๋ ์ฌ์ด ํ์์ ์ํด ์ค์ฒฉ ๊ตฌ์กฐ ํ์ฅ ๋ฐ ์ถ์
- ์ค ๋ฒํธ -- ๋๋ฒ๊น ์ค ํน์ ์์น ์ฐธ์กฐ
- ์ค๋ฅ ๊ฐ์กฐ -- ์์ธํ ๋ฉ์์ง์ ํจ๊ป ๊ตฌ๋ฌธ ์ค๋ฅ๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์
JSON ๊ฐ๋ ์ฑ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ํฌ๋งทํ ์ ์ ํญ์ ์ ํจ์ฑ ๊ฒ์ฌ -- ํฌ๋งทํฐ๋ ์ ํจํ์ง ์์ JSON์ ์์ ํ ์ ์์ต๋๋ค. JSON ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ๋จผ์ ์ฌ์ฉํ์ฌ ๊ตฌ๋ฌธ ์ค๋ฅ๋ฅผ ์ก์๋ด์ธ์.
- ํ ํ์ค ์ค์ -- ๋ค์ฌ์ฐ๊ธฐ์ ํฉ์ํ๊ณ (2-๊ณต๋ฐฑ์ด ์ ๊ณ ํ์ค) Prettier๋ ๋ฆฐํฐ๋ก ์ ์ฉํ์ธ์.
- ์ค์ฒฉ์ ์๊ฒ ์ ์ง -- ๊น๊ฒ ์ค์ฒฉ๋ JSON(4๋จ๊ณ ์ด์)์ ํฌ๋งทํ ๊ณผ ๊ด๊ณ์์ด ์ฝ๊ธฐ ์ด๋ ต์ต๋๋ค. ๊ฐ๋ฅํ๋ฉด ๊ตฌ์กฐ๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- ์๋ฏธ ์๋ ํค ์ฌ์ฉ -- ์ค๋ช ์ ์ด๊ณ ๊ฐ๊ฒฐํ ํค ์ด๋ฆ์ ์ด๋ค ํฌ๋งทํฐ๋ณด๋ค ๊ฐ๋ ์ฑ์ ๋ ํฅ์์ํต๋๋ค.
- ํํ ์ค ๋ฐ๊ฟ ์ถ๊ฐ -- POSIX ํ์ค์ ์ค์ํ๊ณ diff ๋ ธ์ด์ฆ๋ฅผ ํผํ๊ธฐ ์ํด JSON ํ์ผ์ ์ค ๋ฐ๊ฟ ๋ฌธ์๋ก ๋๋ด์ธ์.
์ ํฌ ๋ฌด๋ฃ ์จ๋ผ์ธ JSON ํ๋ฆฌํฐ ํ๋ฆฐํธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ ๋ค์ฌ์ฐ๊ธฐ์ ๊ตฌ๋ฌธ ๊ฐ์กฐ๋ก JSON ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ํฌ๋งทํ ํ๊ณ ๋ณด๊ธฐ ์ข๊ฒ ์ ๋ฆฌํ์ธ์.