알아두면 쓸데있는 신비한 Locale의 세계

Sunghoon Kang
Banksalad Tech
Published in
3 min readNov 8, 2017

얼마 전 뱅크샐러드 고객감동팀에 한 건의 버그 리포트가 도착했습니다. 내역 수정 화면에서 금액을 수정하기만 하면 무조건 0원으로 저장되는 버그였는데요. 앱 출시 이후로 그런 버그는 단 한 번도 발생한 적이 없었고, 저희가 보유한 테스트 기기로 해당 현상을 재현해보려고 해도 재현 할 수 없었습니다.

진짜 왜 이러는지 1도 모르겠다…

그러던 중, 고객님이 보내주신 스크린샷에서 이상한 점을 발견했습니다.

실제 고객님께서 보내주신 스크린샷이 아닌 보내주신 스크린샷을 재현한 화면입니다.

혹시 위 스크린샷에서 이상한 부분을 발견하셨나요?

그렇습니다! 이 고객님은 바로 독일어로 핸드폰을 사용하고 계셨습니다!

독.일.조.아 (본인 촬영)

독일어가 왜 문제인가

독일어 문제가 아닌 Locale에 대한 이해가 부족한 저희의 문제였습니다.

빠른 이해를 도와드리기 위해 예시를 하나 준비해봤습니다. 한국에서 당연히 123,456.78이라고 쓰는 숫자를 독일에서는 어떻게 쓸까요?

정답은 123.456,78입니다!

금액 표시가 다른걸 보고 그냥 그런가 보다 하고 지나쳤었는데…

좀 더 찾아보니 우리나라와 독일을 포함한 전 세계 국가들에서는 아래와 같이 크게 여섯 가지 방법으로 숫자를 표시하고 있었습니다.

다 같은 숫자입니다 ʅ(´◔౪◔)ʃ

뱅크샐러드에서는 금액을 formatting 할 때 String.format 메소드를 사용하는데, 특정 locale 을 설정하지 않고 Locale.getDefault() 로 설정하여 사용하고 있습니다.

하지만 금액 입력을 받는 EditTextformattingvalidation을 처리하기 위한 TextWatcher천 단위는 무조건 , 로 구분한다는 가정 하에 코드를 작성했기 때문에 독일 문화권에서는 올바른 표현인 1.234.567,89에 한국에서 소수점을 표현하는 기호인 . 이 여러 번 들어 있어 숫자 validation에 실패해 발생한 문제였습니다.

해결 방법

DecimalFormatSymbols 를 사용하면 쉽게 해결할 수 있습니다. 다음과 같이 DecimalFormatSymbolsInstance를 가져온 다음 decimalSeparatorgroupingSeparator를 가져와서 formatting 또는 validation을 진행하면 됩니다.

글을 맺으며

Locale에 대한 부족한 이해가 고객님의 큰 불편으로 이어져 죄송한 마음이 들었지만, 추후 개발할 때 사용자 분들의 다양한 사용 환경에 따른 변수를 고려해야 한다는 점을 깨달을 수 있는 좋은 기회였다고 생각합니다.

읽어주셔서 감사합니다 :D

끝으로 레이니스트에서 고객들의 목소리에 귀를 기울여가며 금융정보의 비대칭성을 함께 해결해 나갈 개발자를 찾습니다!

--

--

Sunghoon Kang
Banksalad Tech

Software engineer who is interested in developer productivity and happiness