개발을 하다 보면 분명 아무 것도 바꾸지 않았는데도 프로그램이 깨지고,
스크립트가 실행되지 않거나,
API 응답이 이상하게 보이고,
Git diff에 이상한 변경이 생기는 일이 있어.
이럴 때 가장 먼저 의심해야 하는 게 바로 BOM(Byte Order Mark) 이다.
BOM(Byte Order Mark)이란?
BOM은 텍스트 파일의 가장 앞부분에 붙는 특수한 3바이트(UTF-8 기준) 로,
파일이 어떤 문자 인코딩인지 표시하는 용도야.
- UTF-8 BOM → EF BB BF
- UTF-16 BOM → FF FE 또는 FE FF
문제는 이 바이트들이 눈에 보이지 않는다는 것.
그런데도 프로그램은 이 바이트들을 그대로 읽어버린다.
왜 BOM이 문제일까?
1) 쉘 스크립트, 파이썬 스크립트가 실행 실패
예: #!/bin/bash 앞에 BOM이 붙어 있으면
운영체제는 BOM + #! 를 하나의 문자열로 읽어버린다.
그러면 다음 같은 오류가 난다.
/bin/bash^M: bad interpreter
또는 파이썬에서는:
SyntaxError: invalid character in identifier
2) API 응답 JSON이 깨짐
API 서버가 JSON 초기에 BOM을 포함해버리면
클라이언트는 이걸 문자로 인식하지 못해 파싱에 실패한다.
Unexpected token in JSON
이런 식으로 뜨는 경우가 많아.
3) Git diff에 이상한 변경 발생
코드를 수정하지 않아도 파일 앞에 BOM이 붙으면
Git은 “완전히 다른 파일”로 인식해서 diff가 폭증할 수 있다.
4) CSV/Config/INI 파일 파싱 실패
서버 설정 파일(nginx, redis.conf, yaml, json, csv 등)은
파일 맨 앞의 BOM을 그대로 읽어버려 키를 잘못 읽는 문제가 발생한다.
예:
PORT=8080 → 실제로는 PORT=8080 로 저장됨 → PORT 설정 인식 실패
언제 가장 많이 발생할까?
- 윈도우에서 메모장으로 저장할 때 (기본이 UTF-8 BOM)
- Excel → CSV 저장 시
- Visual Studio, 일부 IDE 자동 저장
- 인코딩 자동 변환 도구 사용 시
BOM 문제 해결 방법
1) 파일에서 BOM 제거
리눅스:
sed -i '1s/^\xEF\xBB\xBF//' filename
2) 저장 시 “UTF-8 without BOM” 사용
VSCode → UTF-8 으로 다시 저장
Notepad++ → 인코딩 → UTF-8-BOM 제거
3) Git에서 BOM 자동 제거 옵션 사용
.gitattributes 설정
*.sh text working-tree-encoding=UTF-8
4) CI/CD에서 BOM 검사
정적 분석 스테이지에 BOM 체크를 넣기도 한다.
정리
BOM 문제는 눈에 보이지 않는 3바이트 때문에
파싱 오류, 스크립트 실행 실패, API 깨짐 등 다양한 문제를 만드는 이슈야.
파일 앞에 숨은 특수 문자 때문에 시스템 전체가 오동작하는 전형적인 케이스라서
DevOps/SRE 환경에서는 늘 주의해야 해.