๐Ÿ“‹
โ† ๊ฐ€์ด๋“œ ๋ชฉ๋ก์œผ๋กœ

JSON ํ”„๋ฆฌํ‹ฐ ํ”„๋ฆฐํŠธ: ๊ฐ€๋…์„ฑ์„ ์œ„ํ•œ JSON ํฌ๋งทํŒ… ๋ฐฉ๋ฒ•

ยท ํƒœ๊ทธ: json, pretty-print, json-formatter, json-indentation, developer-tools

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 ๊ฐ€๋…์„ฑ์„ ์œ„ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€

  1. ํฌ๋งทํŒ… ์ „์— ํ•ญ์ƒ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ -- ํฌ๋งทํ„ฐ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ JSON์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. JSON ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ๋จผ์ € ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋ฅผ ์žก์•„๋‚ด์„ธ์š”.
  2. ํŒ€ ํ‘œ์ค€ ์„ค์ • -- ๋“ค์—ฌ์“ฐ๊ธฐ์— ํ•ฉ์˜ํ•˜๊ณ (2-๊ณต๋ฐฑ์ด ์—…๊ณ„ ํ‘œ์ค€) Prettier๋‚˜ ๋ฆฐํ„ฐ๋กœ ์ ์šฉํ•˜์„ธ์š”.
  3. ์ค‘์ฒฉ์„ ์–•๊ฒŒ ์œ ์ง€ -- ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ JSON(4๋‹จ๊ณ„ ์ด์ƒ)์€ ํฌ๋งทํŒ…๊ณผ ๊ด€๊ณ„์—†์ด ์ฝ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ๊ตฌ์กฐ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์„ธ์š”.
  4. ์˜๋ฏธ ์žˆ๋Š” ํ‚ค ์‚ฌ์šฉ -- ์„ค๋ช…์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•œ ํ‚ค ์ด๋ฆ„์€ ์–ด๋–ค ํฌ๋งทํ„ฐ๋ณด๋‹ค ๊ฐ€๋…์„ฑ์„ ๋” ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  5. ํ›„ํ–‰ ์ค„ ๋ฐ”๊ฟˆ ์ถ”๊ฐ€ -- POSIX ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•˜๊ณ  diff ๋…ธ์ด์ฆˆ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด JSON ํŒŒ์ผ์„ ์ค„ ๋ฐ”๊ฟˆ ๋ฌธ์ž๋กœ ๋๋‚ด์„ธ์š”.

์ €ํฌ ๋ฌด๋ฃŒ ์˜จ๋ผ์ธ JSON ํ”„๋ฆฌํ‹ฐ ํ”„๋ฆฐํŠธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ๋“ค์—ฌ์“ฐ๊ธฐ์™€ ๊ตฌ๋ฌธ ๊ฐ•์กฐ๋กœ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ํฌ๋งทํŒ…ํ•˜๊ณ  ๋ณด๊ธฐ ์ข‹๊ฒŒ ์ •๋ฆฌํ•˜์„ธ์š”.

JSON ํ”„๋ฆฌํ‹ฐ ํ”„๋ฆฐํŠธ: ๊ฐ€๋…์„ฑ์„ ์œ„ํ•œ JSON ํฌ๋งทํŒ… ๋ฐฉ๋ฒ• - CoolTool