당근마켓 웹서버는 Ruby On Rails로 개발되어있고 배포에는 capistrano를 사용하는데요. 처음에는 문제가 없었는데 whenever에 사용되는 schedule.rb 파일에 한글을 적으면서 배포 과정에서 다음과 같은 오류가 발생했습니다.
ArgumentError : invalid byte sequence in US-ASCII
오류가 나는 시점도 서버에 whenever 명령어를 실행해서 crontab에 등록하는 과정이었는데요. 이에 대한 문제점을 찾다 보면 LC_TYPE, LANG 등을 서버에서 알맞게 설정하라는 이야기들이 있었습니다.
일리가 있는 말이었지만 제가 받아들이지 못한건 저를 제외한 나머지 2명의 개발자의 컴퓨터에서는 아무 문제없이 배포가 성공했다는것 때문이었습니다.
capistrano 특성상 배포 과정의 명령어 실행은 서버에서 실행되는데 똑같은 서버에서 실행되는 같은 명령어가 배포 컴퓨터에 따라 달라진다? 이해 할 수 없었죠.
원인을 검색하다가 일본어로된 좋은글을 발견했습니다. 원인과 현상, 해결방법에 대해 정확히 설명해주었고 문제를 해결하는데 도움이 되었습니다.
원인은 Mac에서 원격 서버로 SSH 원격 접속할때 LC_CTYPE을 Mac에 설정된 것으로 서버에 적용하기 때문이었습니다. 실제로 문제가 발생한 제 컴퓨터와 다른 컴퓨터에서 SSH 접속후 설정된 환경변수를 보면 아래와 같이 다르게 표시됩니다.
# 문제가 발생한 컴퓨터에서 원격 서버 접속후 실행
$ env | grep -e LANG -e LC_CTYPE
LANG=en_US.UTF-8
LC_CTYPE=ko_KR.UTF-8# 문제가 발생하지 않은 컴퓨터에서 원격 서버 접속후 실행
$ env | grep -e LANG -e LC_CTYPE
LANG=en_US.UTF-8
LC_CTYPE=
차이를 보면 문제가 발생한 컴퓨터에서는 SSH 접속시 LC_CTYPE 값이 `ko_KR.UTF-8`로 설정되어 있습니다.
해결 방법은 `ko_KR.UTF-8`에 해당하는 언어팩을 서버에 설치하거나, 좀더 깔끔하게 하기위해 Mac에서 SSH 접속시 로컬 컴퓨터의 로케일을 서버에 적용하지 않도록 하면됩니다.
저는 두번째 방법인 Mac에서 SSH 접속시 로케일을 전송하지 않도록 설정해서 해결했습니다. iTerm에서는 프로필 설정에 가서 Terminal 탭 선택후 하단의 “Set locale variables automatically” 를 체크 해제합니다.
맥의 기본 터미널을 사용하는 경우 환경설정 > 프로파일 > 고급 에서 “시작시의 Locale 환경 변수를 설정”을 체크 해제 합니다.
로케일 설정이 자동으로 전송되면서 발생하는 여러 문제들에 같은 해결방법을 적용 할 수 있을듯합니다.
해결 방법을 알아내서 수정은 했지만 찜찜한 구석은 여전히 남아있습니다. 다른 개발자들의 컴퓨터에서는 위에 체크 해제 했던 옵션들이 켜져 있어도 LC_CTYPE이 전송되지 않았다는거죠. 제 컴퓨터의 env에도 설정되어 있지 않은 LC_CTYPE이 어째서 전송되었는지는 아직 풀리지 않은 문제입니다 ~