한글 URL 인코딩 실수로 네비게이션 오탐 유발
목차
review_blog.py에서 한글을 포함한 URL 처리 시 발생하는 인코딩 오류와, 그로 인해 연쇄적으로 터지던 네비게이션 오탐 문제를 잡았다.
URL 한글 인코딩: 쉽게 놓치는 함정
블로그 리뷰 기능은 기본적으로 각 페이지의 URL을 파싱해서 네비게이션 구조를 파악한다. 한국 제목을 가진 블로그 글들이 많다 보니, URL에 한글이 들어가는 건 흔한 시나리오인데, 이걸 제대로 처리하지 않으면 URL 디코딩 단계에서 깨진다.
구체적으로 말하면, 한글 문자가 UTF-8로 인코딩되어 URL에 들어가 있을 때—예를 들어 %ED%95%9C%EA%B8%80 같은 형태—이걸 올바르게 디코딩하지 않으면 바이트 레벨에서 문자열이 손상된다. 팀 경험상 이런 버그는 개발자 로컬 환경에서 한글 URL로 테스트할 기회가 없으면 무한정 감지 안 된다. 특히 스크립트가 다양한 환경에서 돌아가면서 문자 인코딩 기본값이 다를 수 있기 때문이다.
# 문제가 될 수 있는 패턴:
# URL이 "%ED%95%9C%EA%B8%80" 형태면
# 단순히 str() 변환이나 ASCII 가정으로는 깨짐
# 올바른 처리:
from urllib.parse import unquote
decoded_url = unquote(url, encoding='utf-8')
이번 수정에서 핵심은 인코딩 명시였다. 파이썬의 urllib.parse.unquote()에 encoding='utf-8'을 명시해야 한글 URL이 제대로 디코딩된다.
네비게이션 "노이즈 오탐": 연쇄 효과
더 흥미로운 부분은 두 번째 버그다. URL 인코딩이 깨지면, 네비게이션 로직이 같은 URL을 다른 문자열로 인식하기 시작한다. 예를 들어:
- 실제 URL:
blog.com/한글-제목 - 깨진 디코딩:
blog.com/%ED%95%9C%EA%B8%80-%EC%A0%9C%EB%AA%A9(원본 유지)
이 둘이 다르다고 판단되면서, 스크립트는 "어, 이건 새로운 페이지다"라고 생각하고 중복으로 탐지한다. 결국 네비게이션 맵에 같은 페이지가 여러 번 들어가거나, 링크 관계가 꼬이게 된다. 이게 바로 노이즈 오탐이다.
팀 리더 관점에서 보면, 이런 버그의 위험한 점은 데이터 품질을 서서히 오염시킨다는 것이다. 한두 건 오탐이면 눈에 띄지 않지만, 한글 블로그가 많은 환경에서는 누적되면서 네비게이션 분석 자체가 신뢰할 수 없게 된다.
| 문제 | 원인 | 영향 |
|---|---|---|
| URL 디코딩 실패 | 인코딩 명시 누락 | 한글 문자 손상 |
| 중복 탐지 | 깨진 문자열 ≠ 정상 문자열 | 네비게이션 노이즈 |
| 누적 효과 | 페이지 수가 많을수록 | 데이터 신뢰도 하락 |
코드 리뷰 관점에서의 배운 점
이 수정이 들어간 후, 팀과 회고하면서 몇 가지를 공유했다:
1. 국제화(i18n) 테스트는 선택사항 아님
한글 텍스트가 포함될 수 있는 모든 입출력에는 최소한 한 번은 한글 테스트 케이스가 필요하다. CI/CD에 자동화된 테스트로 넣는 게 이상적이다.
2. 문자 인코딩은 명시적으로
파이썬에서 unquote(), encode(), decode() 같은 함수 쓸 때 encoding 파라미터를 생략하지 말 것. 기본값이 시스템마다 다를 수 있기 때문이다.
3. 단일 책임 원칙과 테스트 경계
이 버그를 좀 더 빨리 잡을 수 있었던 이유는, review_blog.py의 URL 파싱 로직을 단위 테스트로 따로 분리했기 때문이다. 그 덕분에 네비게이션 오탐을 추적할 때 원인을 좁힐 수 있었다.
실제로 버그를 찾을 때는 "네비게이션이 이상하다"는 높은 수준의 증상에서 시작했는데, URL 디코딩까지 파고 내려가기까지 몇 번의 재현(reproduce) 시도가 있었다. 이런 경험이 쌓이면서 느끼는 건, 스크립트도 충분히 테스트 가능하게 설계해야 한다는 것이다.
마치며
문자 인코딩 관련 버그는 특성상 문화권에 따라 간과하기 쉽다. 영어 기반 프로젝트에서는 ASCII 범위만 봐도 되지만, 한글이 들어가는 순간 UTF-8 처리가 필수다. 이번 수정으로 팀 내에서 한 번 더 일깨운 원칙은—아무리 작은 스크립트라도, 입출력 경계에서는 인코딩을 명시하고 테스트하자는 것이다.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.