
위와 같은 콘솔창을 보고, 검색에 용이하도록 모든 한글을 영어로 다 바꾸고 싶었다. 매번 일일이 English를 선택하는 것이 귀찮아서, 콘솔을 열 때마다 기본값으로 영어가 나오게 만들고 싶었다.
나는 기본적으로 내 윈도우 컴퓨터의 System Locale 자체를 English (United States)로 설정해두고 사용한다. 윈도우도 Display Language도 영어이며, 크롬 디스플레이 언어도 영어다. 이런 상황에서 사실 H2 Database가 한글로 나오는 게 매우 신기할 따름이다.
그런데 내 컴퓨터에서 모든 한글의 흔적을 지워도 지워도, 저 한글은 사라지지 않았다. Language and Region을 US로 설정하고, 심지어 시간대를 미국/캐나다 시간대로 설정하였음에도 불구하고, 모든 설정을 지우고 (rm .h2.server.properties), 모든 h2 관련 appdata를 지우고, h2를 지우고, 컴퓨터를 재부팅하고 h2를 다시 설치해도 한글을 지울 수 없었다.
인터넷을 찾아봐도 나오는 자료가 없다. 그래서 이 블로그글을 작성하기로 결심했다.
어쩔 수 없이 최후의 방법으로 H2 데이터베이스의 소스코드를 뜯어보기로 했다.
H2 데이터베이스의 콘솔은 HTTP Request Header의 Accept-Language를 파싱해서 Locale을 결정한다...
크롬 Settings -> Languages -> Preferred Language에서 하필이면 한글이 영어보다 위에 와 있어서, 개발자 도구 -> 네트워크를 통해 Request Header를 확인해 본 결과 accept-language에서 ko-KR이 맨 앞에 있었다...
Preferred Language에서 영어를 한글 위로 올리고, H2 console을 종료했다가 재실행했더니 모든 문제가 해결되었다!
우선 C:\Program Files (x86)\H2\bin으로 들어가 h2.bat을 살펴보았다.
@java -cp "h2-2.1.214.jar;%H2DRIVERS%;%CLASSPATH%" org.h2.tools.Console %*
@if errorlevel 1 pause
org.h2.tools.Console 에서 콘솔을 실행하는 걸 확인했다.
내친김에 h2 디렉토리 자체를 vscode로 열어서 ctrl + shift + f로 프로젝트 범위 Search로 '설정', 'Preferences' 따위의 번역을 적어둔 locale 파일을 찾아보았다.
src\main\org\h2\server\web\res\에 _text_xx.prop (xx는 locale) 파일들이 다수 존재하고, 같은 폴더에 있는 login.jsp에서 text.login.goAdmin의 형태로 사용되고 있다는 사실을 알게 되었다.
해당 prop 파일들은 src\main\org\h2\server\web 폴더에 있는 WebServer.java 파일에서
void readTranslations(WebSession session, String language) {
Properties text = new Properties();
try {
trace("translation: "+language);
byte[] trans = getFile("_text_"+language+".prop");
...
}
이 함수에서 사용되고 있다는 사실을 확인하였다.
그렇다면 이 함수는 어떻게 사용되고 있는 것일까? readTranslations의 두번째 인자로 들어가는 String language는 어떻게 구해지는 걸까? 여기에 해답이 있을 것 같았다.
결과는 매우 놀라웠다.
WebThread.java 파일에서
...
else if (lower.startsWith("accept-language")) {
Locale locale = session == null ? null : session.locale;
...
headerLanguage = locale.getLanguage();
...
server.readTranslations(session, headerLanguage);
형식으로 쓰이고 있었던 것이었다.
headerLanguage를 보자마자 두 눈을 의심했다. 아니, 운영체제에서 system locale을 불러오는 것이 아니라, 헤더에서 로케일을 가져온다고?
부랴부랴 h2 콘솔이 열릴 때 request header를 확인해보았다. 아뿔싸... accept-language의 맨 앞에 ko-KR이 있었다. 크롬의 display language가 영어라서 방심하고 Preferred Language의 순서를 바꾸지 않은 나의 실수였다. 바로 크롬 설정으로 들어가 Preferred Language에서 영어를 한글의 위로 올리는 방식으로 accept-language를 수정했더니 문제가 해결되었다.

이제 편-안하게도 처음부터 영어가 나온다.
나처럼 모든 것을 영어로 바꾸고 싶은 분들을 위해 이 글을 남긴다.
복병은 시스템이 아니라 브라우저 리퀘스트 헤더의 locale이었다...
별로 중요하지도 않은 것 같은 문제에 대해 미련하고 집요하게 고민하다가, 속는 셈 치고 그냥 소스코드를 한번 확인해봤는데, 예상 외로 간단하게 문제를 해결할 수 있게 되어서 아주 신기하고 기쁜 경험이었다.