자동화 봇 출력에 섞이던 중복 기호 버그 두 번 만에 완전히 잡기
목차
자동화 봇 코드에서 문자열 앞에 +가 두 개씩 붙어 나오는 버그를 잡았다.
버그 발생 배경
bot/generate.py 안에 문자열을 이어붙이는 로직이 있는데, Python literal 형태로 '+'가 중복으로 들어가 있었다. 코드 리뷰 때 눈으로 흘겨보면 그냥 concat 연산자처럼 보이기 때문에 묻혀 있기 쉬운 케이스다. 실제로 실행해야만 출력 결과에서 ++ 이 튀어나오는 걸 확인할 수 있는 종류의 버그다.
이런 류의 문제는 보통 두 가지 경로로 생긴다. 하나는 리팩토링하면서 concat 방식을 바꿀 때 — f-string이나 .join() 으로 전환하다가 기존 + 연산자 잔재를 미처 못 치운 경우. 다른 하나는 템플릿 문자열을 복붙하면서 구분자로 쓴 '+'가 literal로 박혀버리는 경우다. 이번엔 후자에 가까웠다.
# before: literal '+' 가 두 번 들어간 상태
result = prefix + '+' + '+' + body
# after: 불필요한 literal 제거
result = prefix + body
단순해 보이지만, 자동화 봇이 생성하는 텍스트에서 ++ 가 나오면 다운스트림에서 받아 파싱하는 쪽이 조용히 깨진다. 에러를 뱉지 않고 그냥 이상한 값을 통과시키는 게 더 위험하다.
이런 버그가 왜 끈질긴가
Python에서 +는 연산자이기도 하고 문자열 literal 안에 들어가는 그냥 문자이기도 하다. IDE 하이라이팅을 보면 두 상황이 색깔이 달라서 구분되지만, diff 리뷰에서는 맥락 없이 한 줄만 보면 헷갈린다.
팀원들이 코드리뷰를 할 때 이런 케이스에서 놓치는 패턴이 있다.
- 변경 라인 수가 적어서 "별거 아니겠지" 하고 빠르게 approve 하는 경우
- concat 체인이 길게 이어질 때 중간의 literal이 연산자로 착각되는 경우
- 자동화 봇처럼 "어차피 텍스트 생성이니까" 하고 출력 검증을 느슨하게 보는 경우
자동화 봇 코드는 특히 유닛 테스트에서 출력 문자열을 스냅샷으로 고정해두는 게 좋다. 이번처럼 오타성 버그는 로직 테스트가 아니라 출력 fixture 비교에서 잡힌다.
# 스냅샷 방식 예시
def test_generate_output():
result = generate(...)
assert result == "expected_prefix_body" # literal 고정
# assert "++" not in result # 방어적 검증 추가도 유효
고치고 나서 든 생각
커밋 메시지에 "진짜 fix"라고 붙인 건 그냥 한 번 더 확인했다는 뜻이다. 처음 수정할 때 +를 하나만 지웠는데, 실제론 두 곳에 있었다. 반쪽 픽스를 머지하고 나서 다시 재현됐을 때 그 찜찜함이 있어서 "진짜"를 붙였다.
이런 상황이 팀 입장에서 의미하는 건 — 수정 전에 재현 케이스를 코드로 고정하지 않았다는 것이다. 버그를 고치기 전에 실패하는 테스트를 먼저 쓰는 흐름이었다면 반쪽 픽스로 머지되는 일이 없었을 거다. 작은 자동화 스크립트라도 출력 검증 테스트 하나는 박아두는 게 맞다는 걸 다시 확인했다.
| 단계 | 상태 |
|---|---|
| 최초 커밋 | + 하나 제거 → 여전히 + 하나 남음 |
| 재현 확인 | 출력에서 + 여전히 노출 |
| 이번 커밋 | 두 번째 + 제거, 실제 출력 검증 후 머지 |
작은 버그일수록 "다 됐겠지" 하고 검증을 건너뛰게 된다. 그게 결국 두 번 고치게 만든다.
끝.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.