What is 'LANG=c'?

한글이 깨져서 안보이거나, 한글이 깨질 것 같거나 여하튼 한글때문에 뭔가 불안하면 가장 쉬운 방법은 한글을 안쓰면된다. 그러면 모든 고민들이 사라진다.
하지만, 그렇지 않을때도 있다. 우리는 한국인이니까 …

상황은 이러하다.

서버확인을 요청받아서 vi로 로그를 열었는데, 깨진글자가 보였다. 습관처럼 LANG=C를 날리고 다시 vi로 로그를 열었는데도 그대로였다. 한글을 보는 것은 포기하고 로그를 보다가, WAS의 재기동이 필요할 것 같아서 강제종료 후 재기동을 하였다.
문제는 여기서 발생하였다 …..

정상적으로 서비스하다가, 몇시간 뒤에 내가 재기동한 WAS서버의 시스템에서 한글이 깨져서 파일생성이 이상하게 되고있다는 것이었다. 심지어 이 서버는 하루에 3번 배치로 jsp를 생성하고 있는데, 거기서 한글이 깨졌다고 한다. 설마 LANG=C가… ? 추호도 예상하지 못했기에 일단 history를 추적해보았다. (혹시 나때문이 아닐수도 있으니까 ㅠㅠ)
[history 일부]

2943 2019-08-23 10:49:49LANC=c
...
2950 2019-08-23 10:40:37jboot

너무 명확히 WAS 재부팅 이전에 인코딩 관련해서 한 짓은 내가 날린 LANC=C 커맨드밖에 없었다. 그리고 JVM을 부팅하는 WAS 계정에서는 .bash_profileexport LANG=ko_KR.UTF-8가 설정되어있었던 것으로 보아, 로그인 후 적용되는 기본 LANG 값으로 JVM 부팅을 하고있었던 것이다. 다시 해당 계정으로 재로그인 후 WAS를 재기동하니 정상적으로 한글이 반영되었다.
나는 한글이 깨졌을 때에 항상 LANG=C를 날렸는데, 이 명령어를 제대로 이해하지 못하고 커맨드를 날리고 있었다. 반성의 의미에서 오늘은 LANG=C 라는 명령어에 대해서 파헤칠 것이다(여기까지 서두..).

LANG 변수란?

유닉스 계열에서 LANG 변수는 locale에 속한 모든 환경변수를 설정하는 환경변수이다.

locale 이란?

locale은 언어, 국가, 인코딩 등을 지정하는 변수들의 set이라고 생각할 수 있다. 즉, locale을 변경하면 리눅스 시스템 전체에 시간/날짜의 포맷, 한 주의 첫번째 날, 숫자 등 여러 포맷이 변경될 수 있다.

C locale이란 ?

C역시 로케일인데, 아무 로케일도 설정하지 않았을 때에 glibc에서의 기본 로케일, 또는 POSIX 로케일이라 하기도 한다고 한다. POSIX locale을 사용하면 unicode가 아닌 ascii코드 베이스이며, 이말인 즉슨 한글은 애초에 지원할 수가 없는 포맷이 된다는 것이다.

다시 본론으로 돌아가보자. 나는 putty로 ssh 접속 후 쉘에서 한글이 깨진 것 같았을 때에 습관적으로 LANG=c를 쳤다. 그러면 인코딩이 깨진 것은 없어지겠지만, 사실 OS의 로케일을 디폴트인 C로 바꿔서 사실상 한글을 안보고 영어를 보겠다고 한 것이다.
그리고 vi에서 연 파일의 인코딩이 깨진 경우에는 LANG=C를 하면 당연히 한글은 보지 않겠다는 것이기에 계속 인코딩은 깨진다. 이 때에는 OS의 인코딩이 아니라 putty의 인코딩을 한글을 볼 수 있도록 설정해야한다.

-Dfile.encoding=UTF-8

jvm-option에 UTF-8 옵션을 넣자. 지금과 같이 계정에 로케일을 환경변수로 등록한 경우에는, 로그인 한 세션에서 로케일 변경한 후에 WAS를 부팅하면, 지금 설정된 로케일로 부팅이 된다. jvm-option을 넣어서 그런 일을 방지해야된다. 어플리케이션에서 필요한 설정은 어플리케이션 옵션에. 최상위가 먹힐 수 있도록 설정해야된다.(교. 훈.하지만 여전히 인코딩은 어렵다…)