◀ 이전 회차: 패치노트 넣으면 리그레션 체크리스트가 자동으로 나온다고?
1. 사건의 발단 (Case Study)
🎙️ 미니 인터뷰: "중괄호 하나 빠지면 12개국에서 동시에 깨지는 세계"
Q. 현지화 검수가 왜 부담스러운 거예요? 번역은 외주사가 해주잖아요.
번역 자체는 외주사가 해주죠. 근데 변수 문법이 안 깨졌는지는 QA가 확인해야 하거든요. {player_name}이 스트링에 들어 있는 건 정상이에요 — 게임이 돌아갈 때 거기에 유저 이름이 치환되니까요.
문제는 번역하면서 중괄호가 하나 빠지거나, 변수명에 오타가 들어가거나, 따옴표 이스케이프가 안 되면... 치환이 안 돼서 유저 화면에 {player_name}이 텍스트 그대로 보이는 거예요.
Q. 변수 깨짐이 실제로 라이브에서 터진 적 있나요?
있죠... 지난번에 태국어에서 {player_name}의 닫는 중괄호가 빠져서 치환이 안 된 적 있었어요. 스킬 설명란에 유저 이름이 들어가야 하는데, 태국어만 '{player_name 님이 사용했습니다'라고 변수가 텍스트 그대로 노출된 거예요. 태국 유저들이 캡처해서 커뮤니티에 올렸고... 긴급 핫픽스 나갔어요. 중괄호 하나 때문에요.
Q. 12개 언어를 혼자 다 확인하시는 거예요?
네... 저 혼자는 아니고 QA팀에서 나눠서 하긴 하는데, 제가 맡은 것만 해도 4~5개 언어거든요. 근데 전 일본어 좀 하는 거 빼고는 다른 언어를 모르잖아요. 그래서 번역 내용이 맞는지는 못 보고, 변수 문법이 깨지지 않았는지 — 중괄호 짝, 변수명 오타, 태그 닫힘 여부 — 이런 구문 확인만 해요.
근데 {player_name}과 {player_name }이 눈으로는 똑같아 보이거든요. 그것만 해도 한 언어에 2시간씩... 네 개면 하루예요.
Q. 지금은 어떤 식으로 검수하고 계세요?
엑셀에서 한 언어 열을 펼치고, 원문이랑 한 셀씩 비교해요. {player_name}이 원문이랑 똑같이 들어 있는지, 중괄호가 빠지지 않았는지, 앞뒤에 이상한 문자 안 붙었는지... 변수 종류가 열 개면 열 번 반복이고, 이걸 12개 언어 열마다 하는 거예요.
중간에 '아까 이 행 확인했나?' 싶으면 다시 올라가서 보고... 솔직히 마지막 3~4개 언어쯤 되면 눈이 피로해서 공백 하나 차이 같은 건 놓치게 되더라고요.
2. 문제 해결을 위한 레시피 (Solution)
🩺 마스터의 진단
하은 씨의 핵심 병목은 현지화 검수 자체가 아니라 '변수 문법이 깨졌는지를 눈으로 찾아내는 과정'에 있습니다. 변수가 스트링에 들어 있는 건 정상인데, 번역 과정에서 중괄호가 빠지거나 변수명에 오타가 생기거나 따옴표 이스케이프가 빠지면 런타임에 치환이 안 돼서 유저 화면에 변수가 텍스트 그대로 노출돼요.
이런 구문 오류는 규칙이 명확해서 AI가 한 번에 스캔할 수 있고, QA의 시간을 '문법 대조'가 아닌 '문맥 판단'에 집중시킬 수 있습니다.
[Step 1] 변경된 스트링 테이블 준비하기
이번 패치에서 변경된 스트링 행만 추출합니다. 번역 관리 도구나 엑셀에서 '수정일' 기준으로 필터링하거나, 번역팀에서 받은 업데이트 파일을 사용합니다. 스트링 ID, 원문(KO), 각 언어 번역이 포함된 상태로 텍스트를 복사합니다.
⚠️ 사내 보안 주의: 스트링 테이블에는 미출시 콘텐츠명, 스킬명, 이벤트명 등 미공개 정보가 포함될 수 있습니다. AI 도구(ChatGPT, Claude)의 무료 플랜은 입력 데이터가 학습에 사용될 수 있으니, 사내 보안 정책을 먼저 확인하세요. 민감한 콘텐츠명은 'Skill_A', 'Event_B' 같은 일반 표현으로 변환한 뒤 입력하는 것을 권장합니다.
이번엔 예시로 만든 엑셀 파일을 기준으로 진행해보겠습니다.
[Step 2] ChatGPT에 1차 패턴 검수 프롬프트 입력하기
ChatGPT(chatgpt.com)에 접속해서 아래 프롬프트를 복사합니다. [스트링 테이블] 자리에 준비한 데이터를 붙여넣고 전송합니다. 행이 많으면 언어 2~3개씩 나눠서 입력해도 됩니다.
[역할]
너는 모바일 게임 현지화 QA 전문가야. 다국어 스트링 테이블에서 변수 깨짐, 빈 번역, 포맷 오류를 빠짐없이 찾아내는 데 능숙해.
[임무]
아래 스트링 테이블을 검수해서 오류가 있는 행만 골라내줘.
[검수 항목]
1. 변수 구문 깨짐: 원문의 변수({player_name} 등)가 번역에서 중괄호 누락({player_name), 변수명 오타({playr_name}), 앞뒤 공백({ player_name}) 등으로 문법이 깨져서 런타임 치환이 안 될 수 있는 경우
2. 따옴표/이스케이프 누락: MessageFormat에서 따옴표(')가 이스케이프 없이 사용되어 파싱 에러를 일으킬 수 있는 경우 (예: {player_name}'s → 정상은 {player_name}''s)
3. 빈 번역: 원문은 있는데 번역이 비어 있는 경우
4. 포맷 지정자 불일치: 원문의 %d가 %s로 바뀌는 등 포맷 타입이 변경된 경우 (타입 불일치 크래시 위험)
5. HTML/태그 불일치: 원문에 있는 <b>, </b>, <color> 등 태그가 번역에서 누락되거나 짝이 안 맞는 경우
6. 변수 개수 불일치: 원문과 번역에 들어 있는 변수(중괄호, %d 등)의 개수가 다른 경우
[출력 형식]
표로 정리해줘:
| 행번호 | 스트링 ID | 언어 | 오류 유형 | 원문(해당 부분) | 번역(해당 부분) | 수정 제안 |
오류가 없는 행은 출력하지 마.
마지막에 오류 유형별 요약표를 추가해줘:
| 오류 유형 | 건수 | 심각도(상/중/하) |
[심각도 기준]
- 상: 변수 구문 깨짐, 포맷 타입 불일치 (런타임 크래시 또는 변수가 텍스트 그대로 노출)
- 중: 빈 번역, 태그 불일치, 따옴표 이스케이프 누락 (UI 깨짐 또는 파싱 에러 가능)
- 하: 변수 개수 불일치 확인 필요 (의도적일 수 있으나 검토 대상)
[스트링 테이블]
(여기에 스트링 테이블을 붙여넣거나 파일로 제공하세요)[Step 3] Claude에 교차 검증 프롬프트 입력하기
Claude(claude.ai)에 접속해서 아래 프롬프트를 복사합니다. 같은 스트링 테이블과 ChatGPT의 검수 결과를 함께 붙여넣고 전송합니다. 서로 다른 AI가 같은 데이터를 보면 한쪽이 놓친 오류를 잡아낼 수 있습니다.
[역할]
너는 게임 현지화 QA 시니어 검수자야. 1차 검수 결과를 교차 검증하고, 놓친 오류를 추가로 찾아내는 데 전문이야.
[임무]
아래 스트링 테이블에 대한 1차 검수 결과가 있어. 이 결과가 정확한지 확인하고, 추가로 놓친 오류가 없는지 다시 검수해줘.
[확인 사항]
1. 1차 검수에서 발견한 오류가 실제로 맞는지 확인 (오탐이면 이유와 함께 표시)
2. 1차 검수에서 놓친 오류가 있는지 전체 테이블 재스캔
3. 같은 변수가 언어마다 다른 형태로 바뀌어 있는 경우 찾기 (예: {player_name}이 EN에서는 정상인데 TH에서는 {0}으로 바뀐 경우)
[출력 형식]
## 오탐 확인
1차 결과 중 오류가 아닌 것이 있으면 행번호와 이유를 적어줘
## 추가 발견 오류
| 행번호 | 스트링 ID | 언어 | 오류 유형 | 상세 내용 | 심각도 |
## 최종 요약
확정 오류 수: X건 (1차 유지 Y건 + 추가 Z건 - 오탐 W건)
[1차 검수 결과]
(ChatGPT 검수 결과를 붙여넣으세요)
[원본 스트링 테이블]
(같은 스트링 테이블을 붙여넣으세요)[Step 4] 검수 결과 취합 후 번역팀에 전달하기
두 AI의 결과를 합쳐서 중복을 제거합니다. 오류 유형별로 정리한 뒤 번역팀에 수정 요청을 전달합니다. 수정이 돌아오면 해당 행만 다시 검수 프롬프트에 넣어서 재확인합니다.
3. 결과 (Result)
핵심 수치: 12개 언어 스트링 검수 시간: 이틀(16시간) → 30분
주요 특징:
1. 변수 구문 깨짐(중괄호 누락, 오타, 공백) 자동 감지
2. 따옴표 이스케이프 누락, 포맷 타입 불일치, 빈 번역 일괄 스캔
3. 두 AI 교차 검증으로 오탐 제거 및 누락 보완
시사점: 현지화 검수에서 가장 시간을 잡아먹는 건 '언어를 이해하는 것'이 아니라 '변수 문법이 깨졌는지 대조하는 것'이었습니다. 중괄호 하나, 공백 하나 차이는 사람 눈보다 AI가 정확하게 잡아내니, QA는 구문 대조가 아닌 문맥 판단에 집중할 수 있습니다.
4. 리뷰 (Review)
📊 AI 활용 비포 & 애프터 비교
단순히 요청했을 때와, 우리의 [마스터 프롬프트]를 사용했을 때의 결과물 차이를 확인해 보세요.
💡 Master's Secret: 결정적 차이를 만드는 프롬프트의 원리
💡 Master's TIP!
💡 현지화 QA 전문가 역할을 부여하면 단순 텍스트 비교가 아니라 '이 구문 오류가 런타임에서 어떤 결과를 만드는지'를 기준으로 심각도를 판단합니다. 검수 항목을 6가지로 명시한 이유는, '알아서 확인해줘'라고 하면 빈 셀 같은 명확한 오류는 잡지만 변수 앞뒤 공백이나 따옴표 이스케이프 같은 미묘한 구문 오류는 놓치기 때문입니다. 심각도 기준을 넣으면 '크래시를 일으키는 오류'와 '표시만 어색한 오류'가 자동으로 분리돼서 번역팀에 우선순위를 바로 전달할 수 있습니다.
💡 같은 데이터를 서로 다른 AI에 넣어서 교차 검증하면, 한쪽이 놓친 패턴을 다른 쪽이 잡아낼 수 있습니다. 특히 '오탐 제거'가 중요한데, AI가 정상인 행을 오류로 잡는 경우도 있기 때문입니다. 두 번째 AI가 이를 걸러주면 번역팀에 잘못된 수정 요청을 보내는 실수를 줄일 수 있습니다. 실제 QA에서 '다른 테스터가 크로스 체크하는 것'과 같은 원리입니다.
💬 서하은 QA 테스터의 한마디
처음에 스트링 테이블 열었을 때 수천 줄이라 막막했거든요. 원문이랑 한 셀씩 비교하면서 이틀 잡아야 하나 싶었는데, AI한테 넣었더니 10분 만에 중괄호 빠진 데, 공백 들어간 데가 표로 쫙 나왔어요. 저는 눈으로 봤을 때 똑같아 보였던 건데...
두 번째 AI로 교차 검증했더니 따옴표 이스케이프 빠진 것까지 잡혀서, 반나절만에 검수 탁탁 털어내고 속으로 좀 뿌듯했어요.
▶ NEXT CHAPTER
현지화 검수 리포트를 사내 QA 게시판에 올리고 한숨 돌렸다. 슬랙 알림 — CS팀 매니저다.
CS팀 매니저: "하은 씨, CS쪽인데요. 이번 업데이트 이후 유저 VOC가 수백 건 밀려 있거든요. 버그 제보인지, 단순 문의인지, 개선 요청인지 분류해야하는데, 지금 저희가 이번 패치 대응건으로 인력이 부족해서...
QA쪽에서 데이터 정리 잘하신다고 들었는데, 혹시 1차 분류 좀 도와주실 수 있을까요?"
VOC 스프레드시트를 열어봤다. 수백 줄의 유저 메시지 — '튕겨요', '아이템 안 나와요', '밸런스 어쩌고'가 뒤섞여 있다. 하나하나 읽고 분류하면 하루가 모자란데, 패턴으로 묶을 수 있는 데이터 라면 이번에도 방법이 있지 않을까..?
▶ [다음 회] 유저 VOC 수백 건에서 진짜 버그를 골라낸다고?
📂 부록: 함께 읽으면 좋은 레시피 & 용어
◀ 이전 회차: 패치노트 넣으면 리그레션 체크리스트가 자동으로 나온다고?
▶ [게임 기획] 서브 퀘스트 30개를 2주 안에? AI로 시나리오 뼈대 10분 만에 잡기
▶ [콘텐츠 부업] "블로그 글 하나 쓰는 데 3시간... SEO 초안을 30분에 뽑는 법"
▶ [게임 기획] 서브 퀘스트 30개를 2주 안에? AI로 시나리오 뼈대 10분 만에 잡기
현지화 검수하다가 라이브에서 변수 깨져서 식은땀 흘린 경험, 다들 있으시죠? 어떤 언어가 가장 까다로운지 댓글로 남겨주시면 검수 팁을 공유해드릴게요!