다국어를 못찾는 에러
- 자바에서
new Location("en_US")
등으로 로케일 설정을 했을 때message_en_US.properties
파일을 정상적으로 찾지 못했다.- 대신
message_en_us.properties
파일을 찾아냈다.
- 대신
아래 원인을 보면 알겠지만, 대소문자 일반화에 대해서
Locale.defaultLocale()
과new Locale("ko_KR")
의 결과가 달라서 발생했다.
원인
근본적 원인
Locale
클래스의Locale.defaultLocale()
이라는 정적메서드의 미묘한 동작 때문에 발생했다.- 운영체제에 있는 로케일 정보를 가져올 때는
ko_KR
과 같이 대소문자에 대한 일반화를 안하고 가져오고, 내가 직접 생성자로new Locale("ko_KR")
과 같이 생성하면 대소문자에 대한 일반화를 수행한다. - 그래서
Locale.defaultLocale()
은 예상한대로ko_KR
을 가져오는데,new Locale("ko_KR")
은 예상한대로ko_KR
을 가져오지 않고,ko_kr
을 가져온다.
나의 케이스
- 나는 영문이 기본 로케일로 설정된 톰캣을 썼다.
- 그래서
Locale.defaultLocale()
은en_US
가 뜨고,ko_KR
을 반환받으려면new Locale("ko_KR")
을 사용해야 했다. 이 과정에서 계속ko_kr
을 응답받아서 예상과 다른 결과가 나왔다.
에러를 확인한 방법
- 디버깅 브레이크 포인트 걸기
try ... catch
문으로 익셉션 스택 트레이스 확인- 테스트 환경과 운영 환경에서는 정상적으로 동작했다.
- 테스트 환경과 운영 환경이 다른 점이 무엇인지 생각해봄
조치
- 일단 운영에서
Locale.defaultLocale()
을ko_KR
으로 쓰고 있으니 내가 운영 환경에 맞추는게 무조건 맞다.- 그래야 프로덕션에서 내 코드가 돈다고 그나마 조금 더 확신할 수 있으니까.
- 그런데 추후에 이러한 문제가 또 생길지도 모르니 어디서든 잘 돌게 고쳐놓을 것이다.
이후 재확인
다시 보다가 뭔가 이상한 걸 발견했다. 여태까지 추측했던 가설이 전부 틀렸다.
Locale
의 파라미터는 2개인데, 첫번째가language
고 두번째가country
였던 것이다.ko_KR
은 결국language_COUNTRY
였던 것이다.language
부분에ko_KR
을 주면 대소문자 일반화를 수행하지만,country
부분에KR
을 따로 주면 대소문자 일반화를 수행하지 않는다.- 아래는 이해를 돕기 위한 테스트코드이다.
@Test
public void getMessage() {
Locale wrongLocale = new Locale("ko_KR");
Locale correctLocale = new Locale("ko", "KR");
Assertions.assertEquals("ko_kr", wrongLocale.toString());
Assertions.assertEquals("ko_KR", correctLocale.toString());
}
추가적인 편의 상수 확인
Locale
클래스 내부에는 아래와 같이 편의를 위한 상수가 존재했다.- 처음부터 이 사실을 알았다면 당연히 존재했을 것이라 생각했을텐데 그러지 못했다.
static public final Locale KOREA = createConstant("ko", "KR");
static public final Locale US = createConstant("en", "US");
Locale.KOREA; // ko_KR 과 같다.
Locale.US; // en_US 와 같다
반응형
'회고 > 주간 회고' 카테고리의 다른 글
스프링 초기 세팅 시 뜬 에러 메세지 관련 회고 (Invalid bean definition with name 'xxx' defined in null) (0) | 2023.04.17 |
---|---|
JS 에서 selector 를 이용할 때 NPE 를 늦게 캐치하는 문제에 대한 회고 (0) | 2023.04.14 |
AWS 타겟 그룹 헬스체크 설정으로 인한 장애 회고 (0) | 2023.03.03 |
2023년 2월 3.5주차 회고 (0) | 2023.02.22 |
쿠키와 Iframe 으로 인한 트러블 슈팅 회고 (0) | 2023.02.14 |