JSON YAML 차이: 들여쓰기 규칙과 흔한 실수

설정 파일을 열었는데 어떤 파일은 중괄호와 큰따옴표, 콤마가 촘촘히 박혀 있고, 어떤 파일은 문장 부호 없이 줄바꿈과 들여쓰기만으로 구조가 보일 때가 있습니다. 앞의 것은 JSON이고 뒤의 것은 YAML입니다. 둘 다 같은 데이터를 표현할 수 있는데, 구두점의 양이 이렇게까지 다른 이유가 있습니다.
이 차이는 취향의 문제가 아니라, 데이터의 "경계"(어디서 값이 끝나고 다음 값이 시작하는지)를 표시하는 방식 자체가 다르기 때문입니다. 그리고 이 설계 차이가 YAML을 설정 파일에서 선호하게 만드는 이유이면서, 동시에 YAML 파일이 유독 자주 깨지는 이유이기도 합니다.
요약 ① JSON은 중괄호·대괄호·콤마·따옴표로 데이터의 경계를 표시하고, YAML은 줄바꿈과 들여쓰기 칸 수로 경계를 표시합니다. ② 구두점을 최소화한 덕분에 YAML은 사람이 읽고 쓰기 편해서 설정 파일(config)에서 널리 채택됩니다. ③ 같은 이유로 들여쓰기 공백 수가 하나만 어긋나거나 탭 문자가 섞이면 YAML 파일 전체 구조가 깨집니다.
JSON은 괄호로, YAML은 줄바꿈으로 경계를 표시합니다
JSON에서 객체는 중괄호로 시작하고 끝나며, 그 안의 각 항목은 콤마로 구분됩니다. 문자열 값은 반드시 큰따옴표로 감싸야 하고, 키도 마찬가지입니다. 이 구두점들이 있어야만 파서가 "여기까지가 하나의 값"이라는 경계를 정확히 알 수 있습니다.
YAML은 이 구두점들을 줄바꿈과 들여쓰기로 대신합니다. 같은 들여쓰기 칸 수를 가진 줄들은 같은 계층에 속하고, 더 깊이 들여쓴 줄은 바로 위 줄의 하위 항목이 됩니다. 중괄호도 콤마도 없이 오직 공백의 개수만으로 계층 구조를 표현하는 방식입니다.
왜 YAML이 설정 파일에서 더 많이 선택될까
설정 파일은 사람이 직접 열어서 값 하나를 고치는 일이 잦은 파일입니다. 이런 용도에서는 중괄호와 콤마가 줄마다 반복되는 JSON보다, 들여쓰기만으로 구조가 한눈에 보이는 YAML이 눈으로 훑기 훨씬 편합니다.
특히 값이 많고 계층이 깊어질수록 이 차이는 더 벌어집니다. JSON은 괄호를 닫는 위치를 맞추는 데도 신경을 써야 하지만, YAML은 들여쓰기 깊이만 맞으면 항목을 추가하거나 순서를 바꾸기가 상대적으로 수월합니다. 그래서 사람이 자주 손으로 편집하는 설정 파일 쪽에서 YAML을 선호하는 경향이 있습니다.
그 "편리함"이 흔한 실수의 원인이 되는 이유
그런데 이 편리함의 근거였던 바로 그 지점, 즉 "공백의 개수로 구조를 표현한다"는 특징이 YAML에서 가장 흔한 오류의 원인이기도 합니다. JSON은 괄호와 콤마가 명시적이라 들여쓰기를 안 맞춰도 파싱 자체는 됩니다. YAML은 들여쓰기 자체가 문법이라 공백 수가 한 칸만 어긋나도 다른 계층으로 해석되거나 아예 오류가 납니다.
탭 문자도 마찬가지입니다. YAML 명세는 들여쓰기에 탭 문자를 허용하지 않습니다. 에디터마다 탭을 화면에 몇 칸으로 보여주는지가 달라서, 탭 하나가 스페이스 몇 개와 같은지 파서가 정할 수 없기 때문입니다. 스페이스로만 들여쓴 줄과 탭이 섞인 줄이 겉보기엔 똑같이 정렬돼 보여도, 파서는 이 둘을 다른 들여쓰기로 처리합니다.
JSON과 YAML을 양방향으로 즉시 변환하고, 들여쓰기·따옴표 규칙을 자동으로 맞춰주는 JSON YAML 변환기

이 도구가 경계 표시 규칙을 대신 처리하는 방식
JSON YAML 변환기는 "JSON → YAML" 탭에서 입력창에 JSON을 붙여넣으면, 방금 설명한 경계 표시 규칙을 자동으로 적용해 들여쓰기 기반 YAML로 바꿔 보여줍니다. 들여쓰기 칸 수를 손으로 맞추거나 탭과 스페이스를 구분할 필요가 없습니다.
이 변환 과정에서 흥미로운 부분은 어떤 문자열에 따옴표를 남기고 어떤 문자열은 벗기는지입니다. 문자열 값이 true·false·null·yes·no처럼 예약어로 보이거나 숫자처럼 보이면, 따옴표 없이 그대로 두었을 때 YAML 파서가 불리언이나 숫자로 오인할 수 있습니다. 이 도구는 이런 경우와 콜론·대괄호 같은 특수문자가 섞인 경우에 큰따옴표를 남기고, 나머지 평범한 문자열은 따옴표 없이 출력해 YAML 특유의 간결함을 살립니다.
반대 방향(YAML → JSON)에서도 같은 경계가 기준이 됩니다
"YAML → JSON" 탭으로 바꾸면 반대 작업도 확인할 수 있습니다. 들여쓰기로 표현된 YAML을 입력창에 넣으면, 도구가 각 줄의 들여쓰기 칸 수를 읽어 계층을 다시 중괄호·대괄호·콤마 형태로 펼쳐 보여줍니다.
이 방향에서 특히 도움이 되는 부분은, 들여쓰기가 실제로 몇 칸 밀렸는지 눈으로 세지 않아도 된다는 점입니다. 사람이 보기엔 비슷해 보이는 들여쓰기라도 도구가 계층을 다르게 읽었다면, 결과로 나온 JSON 구조를 보고 어느 줄의 들여쓰기가 의도와 다르게 처리됐는지 바로 확인할 수 있습니다.
정리
- JSON은 중괄호·대괄호·콤마·따옴표로, YAML은 줄바꿈과 들여쓰기 칸 수로 데이터의 경계를 표시합니다.
- 들여쓰기 기반 문법은 사람이 읽고 쓰기 편하지만, 같은 이유로 공백 수가 하나만 어긋나도 구조가 깨지는 약점이 있습니다.
- YAML은 명세상 들여쓰기에 탭 문자를 허용하지 않으며, 탭과 스페이스가 섞이면 파서가 계층을 다르게 해석합니다.
- 문자열 값이 예약어나 숫자처럼 보이는 경우에만 따옴표가 필요하고, 나머지는 따옴표 없이 표현하는 것이 YAML의 방식입니다.
- 두 형식을 오가며 구조가 맞게 변환됐는지 확인하고 싶다면, 직접 변환기에 넣어보는 편이 눈으로 공백을 세는 것보다 정확합니다.
JSON과 YAML을 양방향으로 즉시 변환하고, 들여쓰기·따옴표 규칙을 자동으로 맞춰주는 JSON YAML 변환기
자주 묻는 질문
YAML에서 탭 문자를 쓰면 왜 오류가 나나요?
YAML 명세는 들여쓰기에 스페이스만 허용하고 탭 문자는 허용하지 않습니다. 에디터마다 탭 하나를 화면에 몇 칸으로 표시하는지가 다르기 때문에, 탭이 스페이스 몇 개와 같은 들여쓰기인지 파서가 일관되게 정할 수 없기 때문입니다. 화면에서는 정렬돼 보여도 파일 안에 탭이 섞여 있으면 파싱 단계에서 오류가 날 수 있습니다.
JSON에는 왜 항상 따옴표를 붙여야 하나요?
JSON은 들여쓰기가 아니라 중괄호·대괄호·콤마 같은 구두점으로 값의 경계를 표시하는 형식입니다. 문자열 앞뒤에 따옴표가 없으면 파서가 그 값이 어디서 끝나는지, 다음에 오는 콤마나 콜론이 문자열의 일부인지 문법 기호인지 구분할 수 없습니다. 그래서 문자열 값과 키는 예외 없이 큰따옴표로 감싸야 합니다.
YAML에서 들여쓰기 칸 수를 꼭 통일해야 하나요?
네, 같은 계층에 속한 항목들은 반드시 같은 들여쓰기 칸 수를 가져야 합니다. 한 항목만 칸 수가 다르면 그 항목이 다른 계층으로 옮겨진 것처럼 해석되거나, 파서가 아예 구조를 읽지 못해 오류를 내는 경우가 있습니다. 보기에 비슷해 보이는 정렬이라도 실제 칸 수가 다르면 결과가 달라집니다.
JSON을 YAML로 바꾸면 항상 더 짧아지나요?
항상 그런 것은 아닙니다. 값이 몇 개 없는 단순한 구조에서는 두 형식의 줄 수 차이가 크지 않을 수 있습니다. 다만 계층이 깊고 항목이 많은 설정 데이터일수록, 중괄호와 콤마·따옴표를 반복해서 적어야 하는 JSON보다 들여쓰기만으로 구조를 표현하는 YAML이 대체로 더 짧고 읽기 편한 형태가 됩니다.
