알아두면 쓸데있는 신비한 Locale의 세계
얼마 전 뱅크샐러드 고객감동팀에 한 건의 버그 리포트가 도착했습니다. 내역 수정 화면에서 금액을 수정하기만 하면 무조건 0원으로 저장되는 버그였는데요. 앱 출시 이후로 그런 버그는 단 한 번도 발생한 적이 없었고, 저희가 보유한 테스트 기기로 해당 현상을 재현해보려고 해도 재현 할 수 없었습니다.
그러던 중, 고객님이 보내주신 스크린샷에서 이상한 점을 발견했습니다.
혹시 위 스크린샷에서 이상한 부분을 발견하셨나요?
그렇습니다! 이 고객님은 바로 독일어로 핸드폰을 사용하고 계셨습니다!
독일어가 왜 문제인가
독일어 문제가 아닌 Locale에 대한 이해가 부족한 저희의 문제였습니다.
빠른 이해를 도와드리기 위해 예시를 하나 준비해봤습니다. 한국에서 당연히 123,456.78이라고 쓰는 숫자를 독일에서는 어떻게 쓸까요?
정답은 123.456,78입니다!
좀 더 찾아보니 우리나라와 독일을 포함한 전 세계 국가들에서는 아래와 같이 크게 여섯 가지 방법으로 숫자를 표시하고 있었습니다.
뱅크샐러드에서는 금액을 formatting 할 때 String.format
메소드를 사용하는데, 특정 locale
을 설정하지 않고 Locale.getDefault()
로 설정하여 사용하고 있습니다.
하지만 금액 입력을 받는 EditText의 formatting과 validation을 처리하기 위한 TextWatcher를 천 단위는 무조건 ,
로 구분한다는 가정 하에 코드를 작성했기 때문에 독일 문화권에서는 올바른 표현인 1.234.567,89에 한국에서 소수점을 표현하는 기호인 .
이 여러 번 들어 있어 숫자 validation에 실패해 발생한 문제였습니다.
해결 방법
DecimalFormatSymbols
를 사용하면 쉽게 해결할 수 있습니다. 다음과 같이 DecimalFormatSymbols
의 Instance를 가져온 다음 decimalSeparator와 groupingSeparator를 가져와서 formatting 또는 validation을 진행하면 됩니다.
글을 맺으며
Locale에 대한 부족한 이해가 고객님의 큰 불편으로 이어져 죄송한 마음이 들었지만, 추후 개발할 때 사용자 분들의 다양한 사용 환경에 따른 변수를 고려해야 한다는 점을 깨달을 수 있는 좋은 기회였다고 생각합니다.
읽어주셔서 감사합니다 :D
끝으로 레이니스트에서 고객들의 목소리에 귀를 기울여가며 금융정보의 비대칭성을 함께 해결해 나갈 개발자를 찾습니다!