← 모두의 툴

{{변수}}는 되는데 [변수]는 왜 안 되나

가이드 · 2026.08.21 최종 확인

프롬프트 템플릿을 여기저기서 긁어 쓰다 보면 변수 표기법이 도구마다 제각각이라는 걸 알게 됩니다. 어떤 곳은 {{변수}}, 어떤 곳은 {변수}, 또 어떤 문서는 [변수]로 표시합니다. 프롬프트 변수 추출기에 대괄호로 쓴 템플릿을 넣으면 아무것도 추출되지 않는데, 이건 버그가 아니라 의도된 설계입니다. 왜 하필 대괄호만 빠졌는지, 실제 정규식 구조를 뜯어보면서 그 이유를 정리했습니다.

1. 변수 문법이 도구마다 다른 이유

프롬프트 변수 표기법은 표준이 정해진 적이 없습니다. 각 생태계가 자기 언어의 문자열 치환 문법을 그대로 가져다 썼을 뿐입니다. {{변수}}(이중 중괄호)는 LangChain의 PromptTemplate, Jinja2, Handlebars.js가 표준으로 쓰고, {변수}(단일 중괄호)는 파이썬의 str.format()과 f-string 계열에서 흔합니다. $변수는 파이썬 string.Template과 셸 스크립트 파이프라인에서, {% for %} 같은 퍼센트 구문은 반복·조건이 필요한 Jinja2 고급 템플릿에서 사용됩니다. 즉 "어떤 문법을 쓰느냐"는 그 프롬프트가 어느 프레임워크를 거쳐 왔는지를 보여주는 흔적이기도 합니다.

2. 실제 정규식으로 확인하는 지원 범위

이 도구가 변수를 찾는 로직은 아래 두 정규식뿐입니다.

실제 코드
/\{\{(\w+)\}\}/g — 이중 중괄호 캡처
/\{(\w+)\}/g — 단일 중괄호 캡처

정규식 자체에 대괄호 [ ]를 다루는 패턴이 아예 존재하지 않습니다. 즉 "인식률이 낮다"가 아니라 "애초에 검사 대상이 아니다"가 정확한 설명입니다. 흥미로운 점은 두 정규식이 서로 겹친다는 것입니다. {{역할}}이라는 문자열은 이중 중괄호 정규식에도 걸리지만, 단일 중괄호 정규식이 안쪽의 {역할} 부분도 별도로 매칭합니다. 결과가 중복되지 않는 이유는 추출된 값을 배열이 아니라 Set(중복 제거 집합)에 담기 때문입니다. 두 정규식이 겹쳐도 최종 결과에는 "역할" 하나만 남습니다.

3. 대괄호가 빠진 진짜 이유: 마크다운과의 충돌

대괄호 문법 [변수]를 넣지 않은 이유는 기술적으로 불가능해서가 아니라, 지원하는 순간 오작동 위험이 훨씬 커지기 때문입니다. 대괄호는 이미 두 가지 흔한 텍스트 문법에서 쓰이고 있습니다.

만약 [변수]를 변수 문법으로 지원했다면, GPT 답변을 그대로 붙여넣은 프롬프트에 있는 [출처](https://example.com)[1] 같은 멀쩡한 텍스트까지 전부 "변수"로 오인식됩니다. 사용자가 원치 않는데도 값을 입력하라는 입력창이 생기고, 최악의 경우 링크의 표시 텍스트 부분이 통째로 다른 내용으로 치환되어 버립니다. 즉 대괄호 미지원은 성능상의 한계가 아니라, 실제 텍스트를 잘못 건드리지 않기 위한 의도적인 선택입니다.

4. 숫자로 보는 오작동 시나리오

아래는 실제로 자주 쓰이는 회의 안내 프롬프트 예시입니다. 대괄호까지 변수로 인식했다고 가정했을 때 어떤 문제가 생기는지 정리했습니다.

원문현재(대괄호 미지원) 결과대괄호를 지원했다면
{{이름}}님, 회의 안내변수 1개: 이름변수 1개: 이름 (동일)
자세한 내용은 [회의록](https://x.com/notes)변경 없음, 링크 그대로 유지변수로 오인식 → "회의록" 입력창 생성, 값 입력 시 링크 텍스트가 깨짐
참고문헌은 [1]을 확인변경 없음, 각주 번호 유지변수 "1"로 오인식 → 입력하지 않으면 원문 그대로 남아 사용자가 혼란

이 표에서 보듯, 실제 변수는 1개뿐인데 대괄호까지 인식했다면 오탐이 2건 추가로 발생합니다. 프롬프트 한 건에서 오탐률이 66%(3건 중 2건)까지 치솟는 셈이니, 지원하지 않는 쪽이 합리적인 기본값입니다.

5. 안전하게 변수 이름 짓는 법

캡처 그룹이 \w+인데, 자바스크립트 정규식에서 \w[A-Za-z0-9_], 즉 영문 알파벳·숫자·언더스코어만 의미합니다. 한글이나 공백, 하이픈(-)은 포함되지 않습니다. 그래서 {{사용자 이름}}처럼 띄어쓰기가 들어가면 정규식이 그 지점에서 끊어져 통째로 인식에 실패하고, {{역할}}처럼 순수 한글로만 이루어진 변수명도 \w가 한글 문자를 매치하지 않기 때문에 추출되지 않습니다. 실제로 {{역할}}에 정규식을 그대로 적용하면 매칭 결과가 0건입니다. 안전하게 쓰려면 변수명을 {{role}}, {{user_name}}처럼 영문·숫자·언더스코어 조합으로 짓거나, 한글을 꼭 써야 한다면 {{role1}}처럼 영문 접두사를 붙이는 방식을 권장합니다.

확인 방법: 브라우저 콘솔에서 [..."{{역할}}".matchAll(/\{\{(\w+)\}\}/g)]을 실행하면 빈 배열 []이 반환됩니다. 반면 [..."{{role}}".matchAll(/\{\{(\w+)\}\}/g)]은 정상적으로 "role"을 캡처합니다.

자주 묻는 질문

Q. [변수]를 꼭 써야 한다면 어떻게 해야 하나요?

붙여넣기 전에 [변수]{{변수}}{변수}로 미리 바꿔두는 방법이 가장 간단합니다. 템플릿을 직접 새로 만드는 경우라면 처음부터 중괄호 문법을 쓰는 것을 권장합니다.

Q. {{변수}}와 {변수}를 한 템플릿에 섞어 써도 되나요?

네. 두 정규식이 독립적으로 동작하고 결과가 Set으로 합쳐지기 때문에 섞어 써도 정상적으로 모두 추출됩니다. 다만 가독성을 위해 한 프로젝트 안에서는 한 가지 문법으로 통일하는 것을 권장합니다.

Q. $변수나 {% %} 같은 문법도 지원되나요?

지원하지 않습니다. 이 도구의 추출 로직은 {{변수}}, {변수} 두 정규식만 사용하며, 달러 기호나 Jinja2 제어 구문(반복·조건)은 애초에 검사 대상이 아닙니다. 다른 문법으로 작성된 템플릿은 중괄호 형태로 먼저 변환해야 합니다.

Q. 같은 변수가 여러 번 나오면 입력창도 여러 개 생기나요?

아니요. Set으로 중복이 제거되므로 입력창은 한 번만 생성되고, 값을 입력하면 템플릿 안의 모든 위치에 동시에 반영됩니다.