← 모두의 툴

JSON→YAML 변환기가 문자열에 멋대로 따옴표를 씌우는 이유

가이드 · 2026.08.25 최종 확인

JSON을 YAML로 변환했더니 원래 없던 따옴표가 특정 문자열에만 붙어서 나오는 걸 본 적이 있을 겁니다. 버그처럼 보이지만 사실은 정반대로, 변환기가 원래 문자열의 의도를 보존하기 위해 일부러 하는 일입니다. 이 가이드는 YAML이 왜 이런 안전장치를 필요로 하는지, 그리고 실제 변환기가 이 규칙을 코드로 어떻게 구현하는지 확인합니다.

1. YAML의 두 얼굴: 따옴표 없는 문자열의 편리함과 위험

YAML은 JSON과 달리 문자열에 따옴표를 강제하지 않습니다. name: Alice처럼 따옴표 없는 값(plain scalar)도 그대로 문자열로 해석됩니다. 이 유연함이 YAML을 설정 파일 형식으로 사람이 읽기 편하게 만들어주는 핵심 특징이지만, 동시에 함정이기도 합니다. YAML 파서는 따옴표 없는 값을 볼 때 "이게 문자열인지, 아니면 boolean·null·숫자 같은 다른 타입인지"를 값의 생김새만 보고 스스로 판단해야 하기 때문입니다.

2. 예약어처럼 생긴 문자열이 진짜로 타입을 바꿔버리는 순간

YAML 1.1 스펙에서는 true, false뿐 아니라 yes, no, on, off, null, ~ 같은 값도 대소문자 구분 없이 boolean이나 null로 해석됩니다. 만약 원본 데이터가 "yes"라는 사용자의 응답 문자열이었는데 따옴표 없이 그대로 YAML로 출력되면, 이를 다시 읽어들이는 YAML 파서는 이걸 문자열 "yes"가 아니라 boolean true로 해석해버립니다. 원본 JSON에서는 명확히 문자열이었던 값이 YAML을 거치면서 타입이 바뀌어버리는 것입니다. 이는 이미 널리 알려진 "YAML 노르웨이 문제"(노르웨이 국가 코드 NO가 boolean false로 잘못 해석되는 사례)와 같은 종류의 함정입니다.

3. 변환기가 취해야 할 방어 전략: 자동 따옴표 씌우기

이 문제를 막는 방법은 간단합니다. 문자열 값이 예약어와 똑같이 생겼거나, 숫자로 시작하거나, 콜론·특수문자를 포함해 YAML 문법과 충돌할 소지가 있다면 변환기가 자동으로 따옴표를 씌워 명시적으로 "이건 문자열이다"라고 표시하면 됩니다. 안전한 변환기라면 이 판단을 사용자에게 맡기지 않고 변환 시점에 자동으로 처리해야, 결과 YAML을 다시 파싱했을 때 원본 JSON의 값과 타입이 100% 일치하는 왕복(round-trip) 안전성이 보장됩니다.

4. 모두의 툴 JSON to YAML 변환기가 실제로 이렇게 동작하는가

JSON to YAML 변환기는 내부적으로 js-yaml 라이브러리의 dump() 함수를 사용합니다. js-yaml의 기본 동작 자체가 값이 true/false/null처럼 보이거나 숫자로 오인될 수 있는 문자열을 자동으로 따옴표로 감싸도록 되어 있고, 이 도구는 별도의 커스텀 로직 없이 라이브러리 기본 동작을 그대로 사용합니다. 즉 사용자가 옵션을 켜지 않아도 기본값 자체가 안전하게 설정돼 있는 구조입니다.

직접 확인하는 방법: JSON to YAML 변환기{"status":"yes","code":"no","flag":"true","value":"null"}를 입력해보세요. 결과 YAML에서 값 4개 모두 따옴표로 감싸져 출력되면, 이 도구가 예약어 유사 문자열을 정확히 방어하고 있다는 뜻입니다.

5. 실전 예시: 어떤 문자열이 따옴표를 얻는가

원본 JSON 값변환 없이 그대로 출력하면실제 변환 결과(따옴표 자동 적용)이유
"yes"yes (boolean true로 오독 위험)'yes'YAML 1.1 예약어와 동일
"no"no (boolean false로 오독 위험)'no'YAML 1.1 예약어와 동일
"123"123 (숫자로 오독 위험)'123'숫자로 보이는 문자열
"hello"hellohello (따옴표 불필요)예약어·숫자와 무관한 일반 문자열

마지막 줄처럼 예약어나 숫자와 무관한 평범한 문자열은 따옴표 없이 그대로 출력됩니다. 즉 무조건 모든 문자열에 따옴표를 씌우는 게 아니라, 오독 위험이 있는 문자열만 선별적으로 감싸는 것이 핵심입니다. 반대 방향으로 YAML을 JSON으로 되돌리는 도구를 쓸 때도 이 규칙이 지켜진 YAML이라야 원본 타입을 정확히 복원할 수 있습니다.

자주 묻는 질문

Q. 모든 문자열에 따옴표가 붙나요?

아닙니다. true/false/null/yes/no처럼 예약어와 동일하거나 숫자로 시작하는 등 오독 위험이 있는 문자열만 자동으로 따옴표가 붙고, 일반 문자열은 따옴표 없이 그대로 출력됩니다.

Q. YAML 노르웨이 문제와 정확히 어떤 관계인가요?

노르웨이 문제는 국가 코드 "NO"가 YAML 1.1 규격상 boolean false로 잘못 해석되는 유명한 사례입니다. 이 가이드가 다루는 자동 따옴표 씌우기는 바로 이런 사례를 변환 단계에서 미리 막기 위한 안전장치입니다.

Q. YAML 2.0에서는 이 문제가 해결되나요?

YAML 1.2는 boolean으로 인식하는 리터럴 범위를 true/false로 좁혀 yes/no/on/off 문제를 줄였지만, 실무에서 널리 쓰이는 파서(PyYAML 기본 등)가 여전히 YAML 1.1 규칙을 따르는 경우가 많아 자동 따옴표 처리는 여전히 안전한 관행입니다.

Q. 숫자로 시작하지만 실제로는 문자열인 값(예: 우편번호)은 어떻게 되나요?

"01234"처럼 숫자로만 이루어진 문자열도 그대로 두면 정수로 오인될 수 있어 자동으로 따옴표가 붙습니다. 앞자리 0이 사라지는 사고를 막아주는 것도 이 안전장치의 역할입니다.