JSON 이스케이프 변환 원리: 한 줄로 바꾸기

여러 줄짜리 JSON을 CLI 인자나 .env 파일 값에 그대로 붙여넣으면 깨지는 이유는 백슬래시·큰따옴표·줄바꿈이라는 몇 개 문자가 그 목적지의 문법과 충돌하기 때문입니다.

이 문자들을 각각 정해진 이스케이프 시퀀스로 바꾸면 원본 내용을 그대로 담은 한 줄짜리 안전한 문자열이 됩니다. 이 글은 그 치환 규칙을 문자 단위로 설명합니다.

요약 ① JSON을 CLI 인자·.env 값에 그대로 넣으면 백슬래시·큰따옴표·줄바꿈이 목적지 문법과 충돌해 깨집니다. ② "JSON 이스케이프" 모드는 JSON.parse로 유효성을 검증한 뒤 한 줄로 압축하고, "Raw 텍스트 이스케이프" 모드는 검증 없이 입력을 그대로 이스케이프합니다. ③ 큰따옴표·줄바꿈·탭은 기본으로 켜져 있고 작은따옴표는 기본 꺼져 있어, 체크박스를 바꾸면 같은 입력도 다른 문자열로 나옵니다.

CLI 인자나 .env 값에 JSON을 그대로 넣으면 왜 깨지나

API 응답이나 설정 파일에서 받은 JSON을 .env 파일에 APP_CONFIG= 뒤에 그대로 붙여넣는 상황을 생각해 보겠습니다. 원본 JSON은 사람이 보기 좋으라고 줄바꿈과 들여쓰기가 들어간 여러 줄짜리 텍스트입니다.

이 텍스트를 한 줄짜리 값이 필요한 자리에 그대로 넣으면 세 지점에서 깨집니다.

  • 줄바꿈: .env 파일이나 셸 변수는 한 줄을 하나의 값으로 읽습니다. 값 중간에 실제 줄바꿈이 있으면 그 줄에서 값이 끊깁니다.
  • 큰따옴표: 값 전체를 큰따옴표로 감싸는 게 관례인데, JSON 내부에도 큰따옴표가 잔뜩 들어 있습니다. 파서는 안쪽 따옴표를 만나는 순간 값이 끝난 것으로 해석합니다.
  • 작은따옴표로 감싼 CLI 인자: JSON 문자열 값 안에 아포스트로피(')가 있으면, POSIX 셸은 작은따옴표 안에서 작은따옴표를 이스케이프할 방법이 없어 그 지점에서 인자가 닫혀버립니다.

그래서 JSON을 한 줄짜리 문자열로 담아야 하는 목적지—CLI 인자, .env 값, 다른 JSON 안에 중첩되는 문자열 필드, 소스코드의 문자열 리터럴—는 공통적으로 같은 규칙을 요구합니다.

줄바꿈·탭 같은 제어 문자는 눈에 보이는 시퀀스로 바꾸고, 구분자로 쓰이는 따옴표와 이스케이프 자체에 쓰이는 백슬래시 앞에는 백슬래시를 하나 더 붙여 "이 문자는 문법 기호가 아니라 그냥 데이터"라고 표시해야 합니다.

도구 없이 손으로 이스케이프하는 방법

이스케이프 규칙은 특정 프로그램만 아는 비밀이 아니라, JSON.stringify를 비롯해 대부분의 언어가 따르는 공통 문자 치환표입니다.

브라우저 개발자 도구 콘솔에서 아래 코드를 실행하면 이 문서가 설명하는 도구와 같은 결과를 손으로 재현할 수 있습니다.

JSON 문법을 검증하면서 압축까지 하려면 이렇게 합니다.

// 1단계: JSON 문법 검증 + 한 줄로 압축 (들여쓰기·줄바꿈 제거)
const minified = JSON.stringify(JSON.parse(rawInput));

// 2단계: 문자 치환. 백슬래시를 가장 먼저 바꿔야 뒤에 추가하는
// 백슬래시까지 다시 치환되는 걸 막을 수 있습니다.
const escaped = minified
  .replace(/\\/g, "\\\\")  // 백슬래시 → \\
  .replace(/"/g, '\\"')     // 큰따옴표 → \" (옵션)
  .replace(/\n/g, "\\n")    // 줄바꿈 → \n (옵션)
  .replace(/\t/g, "\\t");   // 탭 → \t (옵션)

rawInput이 유효한 JSON이 아니어도 되는 경우, 즉 로그 조각이나 일반 텍스트를 그대로 이스케이프하고 싶다면 1단계를 건너뛰고 원본 문자열에 바로 2단계 치환 체인만 적용하면 됩니다.

이게 "Raw 텍스트 이스케이프" 모드가 하는 일 전부입니다.

이렇게 얻은 결과를 큰따옴표로 감싸 CLI 인자나 .env 값 자리에 붙여넣으면, 원본 JSON의 의미를 그대로 유지한 채 한 줄로 전달됩니다.

저희 도구로 확인하기.

JSON 직렬화 및 이스케이프

JSON은 파싱 검증 후 한 줄로 압축하고, 일반 텍스트는 검증 없이 그대로 이스케이프합니다. 설치·회원가입 없이 무료로 사용합니다.

자주 헷갈리는 부분

두 모드의 차이를 표로 정리하면 이렇습니다.

항목JSON 이스케이프 모드Raw 텍스트 이스케이프 모드
JSON.parse 검증합니다 (실패 시 에러 표시)하지 않습니다
압축(줄바꿈·들여쓰기 제거)JSON.stringify로 압축됩니다원본 그대로 유지됩니다
유효하지 않은 JSON 입력"올바른 JSON 형식이 아닙니다" 에러에러 없이 그대로 처리
적용 대상유효한 JSON 텍스트만어떤 텍스트든

체크박스가 켜고 꺼도 결과가 안 바뀌는 이유

이스케이프 옵션 체크박스 네 개 중 실제로 결과를 바꾸는 조합은 모드에 따라 다릅니다.

JSON 이스케이프 모드에서는 입력이 먼저 JSON.stringify를 한 번 거치는데, 이 단계에서 JSON 문법 자체가 문자열 값 안의 줄바꿈·탭을 이미 \n, \t 같은 두 글자짜리 시퀀스로 바꿔 둡니다.

그래서 뒤에 이어지는 "줄바꿈 이스케이프"와 "탭 문자 이스케이프" 체크박스는 JSON 모드에서는 켜고 꺼도 결과가 달라지지 않습니다. 바꿀 실제 줄바꿈·탭 문자가 이미 남아 있지 않기 때문입니다.

큰따옴표·작은따옴표·Raw 모드는 다르게 동작합니다

반대로 "큰따옴표 이스케이프"는 JSON 모드에서도 효과가 있습니다. 키와 값을 감싸는 구조적인 큰따옴표는 JSON.stringify가 그대로 남겨 두기 때문입니다.

"작은따옴표 이스케이프" 역시 JSON 문법에 없는 문자라서 JSON.stringify가 손대지 않으므로, 값 안에 아포스트로피가 있다면 체크박스 상태에 따라 결과가 달라집니다.

Raw 텍스트 이스케이프 모드에서는 JSON.stringify를 거치지 않고 입력 문자를 그대로 훑으므로, 네 옵션 모두 켜고 끄는 대로 결과에 반영됩니다.

덧붙여 JSON 모드는 JSON.parse가 만든 값을 다시 JSON.stringify로 직렬화하는 방식이라 1.0처럼 의미 없는 소수점이 1로 바뀌는 등 원본 표기가 살짝 달라질 수 있습니다. 글자 그대로의 표기를 보존해야 한다면 Raw 모드를 쓰는 편이 안전합니다.

"올바른 JSON 형식이 아닙니다" 에러가 뜨는 경우

JSON.parse가 입력을 JSON 문법으로 해석하지 못했을 때 이 에러가 나타납니다. 흔한 원인은 다음과 같습니다.

  • 마지막 항목 뒤에 쉼표가 남아 있는 경우 (trailing comma)
  • 키나 문자열 값을 작은따옴표로 감싼 경우 (JSON은 큰따옴표만 허용)
  • 키를 따옴표 없이 쓴 경우
  • JSON에는 없는 주석(//, /* */)이 섞인 경우
  • 여는 괄호와 닫는 괄호 개수가 맞지 않는 경우

이 중 하나라도 해당하면 JSON 모드는 결과를 만들지 않고 에러만 보여줍니다. 문법을 고치고 싶지 않다면 Raw 텍스트 이스케이프 모드로 전환하면 검증 없이 그대로 이스케이프됩니다.

정리

  • 백슬래시는 항상, 큰따옴표·줄바꿈·탭은 기본값으로, 작은따옴표는 옵션을 켜야 이스케이프됩니다.
  • JSON 이스케이프 모드는 JSON.parse로 검증하고 압축까지 하지만, 이 과정에서 문자열 값 안의 줄바꿈·탭이 이미 \n, \t로 바뀌어 있어 해당 체크박스는 JSON 모드에서 효과가 없습니다.
  • Raw 텍스트 이스케이프 모드는 검증도 압축도 없이 입력 문자를 그대로 훑으므로, 네 옵션 모두 결과에 반영되고 JSON이 아닌 텍스트에도 쓸 수 있습니다.
  • "올바른 JSON 형식이 아닙니다" 에러는 트레일링 쉼표, 작은따옴표, 따옴표 없는 키처럼 JSON 문법 위반이 원인입니다.
  • 같은 규칙은 JSON.stringify와 정규식 치환 체인만으로 직접 재현할 수 있습니다.
JSON 직렬화 및 이스케이프

JSON은 파싱 검증 후 한 줄로 압축하고, 일반 텍스트는 검증 없이 그대로 이스케이프합니다. 설치·회원가입 없이 무료로 사용합니다.

자주 묻는 질문

JSON 이스케이프와 Raw 텍스트 이스케이프 중 뭘 써야 하나요?

입력이 유효한 JSON이고 문법이 맞는지 확인하면서 압축까지 하고 싶다면 JSON 이스케이프 모드를 씁니다.

유효한 JSON이 아니거나(로그 조각, 코드 일부, 문법이 깨진 JSON) 원본 줄바꿈·들여쓰기를 압축 없이 이스케이프만 하고 싶다면 Raw 텍스트 이스케이프 모드를 씁니다.

결과에 백슬래시가 두 개씩 겹쳐 나오는데 오류인가요?

오류가 아닙니다. 이스케이프 시퀀스 자체가 백슬래시()로 시작하기 때문입니다.

원본에 이미 백슬래시가 있었다면 그 백슬래시도 이스케이프 대상이라 \\로 바뀌고, 뒤따르는 문자(예: 큰따옴표)까지 이스케이프되면 백슬래시가 연달아 보일 수 있습니다. 각 백슬래시는 각각 하나의 이스케이프를 나타내는 정상적인 결과입니다.

작은따옴표는 왜 기본적으로 이스케이프되지 않나요?

JSON 문법 자체가 문자열을 큰따옴표로만 감싸고 작은따옴표에는 아무 의미를 주지 않기 때문입니다.

그래서 큰따옴표·줄바꿈·탭은 기본으로 켜져 있지만, 작은따옴표는 값을 작은따옴표로 감싸는 셸 스크립트 등 특정 목적지에서만 필요해 기본은 꺼져 있습니다. 필요하면 체크박스를 켜면 됩니다.

변환된 결과를 .env나 CLI 인자에 넣을 때 따옴표를 직접 붙여야 하나요?

네. 이 도구는 문자열 내부의 문자만 치환하며, 값 전체를 감싸는 바깥쪽 따옴표는 추가하지 않습니다. .env 파일이나 CLI 인자에 넣을 때는 변환된 결과를 큰따옴표(또는 작은따옴표)로 직접 감싸야 하나의 값으로 인식됩니다.

가격 보기카톡 무료 상담