우테코 방학이 시작되어 몹시 설레는 개발자 꿈나무 김조현입니다.
방학인데 무엇을 공부해볼까 고민하다가 찾게 된 것이 "안드로이드 학습 튜토리얼 실습을 따라해보자!"였다.
우매함의 봉우리에 있어서 어렵지 않겠지~라는 가벼운 마음으로 들어갔지만, 모르는 것들이 생각보다 많아서 학습하기 좋다고 생각이 들었다!
그 학습 과정에서 몰랐던? 궁금해서 찾아본 내용을 정리하는 방식으로 이 글을 풀어보고자 한다.
이 튜토리얼을 진행하는 과정에서 Roll이라는 문자열을 Text에 넣기 위해 Text(”Roll”)이 아닌 Text(stringResource(R.string.roll))이라는 형식으로 사용했다.
이를 위해 res/values/strings.xml에 Roll을 추가도 하였다.
나는 지금까지 Text에 공통된 문자열을 넣기 위해 싱글톤을 사용하였는데, 왜 이렇게 하는지가 궁금해졌다.
내가 지금까지 Text(”Roll”)로 작성한 것처럼 하드코딩을 한다면 이 앱에서 이 텍스트는 영원히 바꿀 수 없게 된다. 지금 이 문자열이 영어지만 한국어로 변경하기 위해 “굴리다”로 변경하려면 앱 자체를 뜯어야 한다.
하지만 strings.xml을 사용하면 안드로이드 시스템이 이를 해결해준다.
그리고 코드에서는 R.string.roll이라는 id를 가져오도록만 적어두면 앱이 실행될 때 안드로이드 시스템이 현재 스마트폰 언어 설정을 파악해 알맞은 언어의 문자열을 자동으로 넣어준다.
왜 이런 생각이 들었나면 안드로이드 시스템이 알아서 해준다. 라는 마법같은 문장으로 이해하고자 했지만, 안드로이드 시스템은 어떻게 이를 구분할까?
설정된 언어를 안드로이드 시스템이 알고 있는건 이해가 되지만, 프로젝트 안에서 언어를 알맞게 적용하는 것은 별도의 문제라는 생각이 들었다.
안드로이드 시스템과 프로젝트의 values를 연결해 주는 핵심 원리는 구성 한정자(Configuration Qualifiers)와 대체(Fallback) 알고리즘이라고 한다.
구성 한정자란 폴더 이름 뒤에 붙는 -ko, -en, -land(가로 모드), -night(다크 모드) 꼬리표들을 의미한다.
이처럼 안드로이드 스튜디오에서 values나 values-ko라는 폴더를 만들 때, 이 이름들은 우리가 편하게 보기 위해 이렇게 짓는 것이 아니라 안드로이드 OS와 약속된 규칙인 것이다.
만약 프랑스어를 사용하는 유저가 앱을 다운받았다고 가정해보자. 근데 우리 프로젝트에는 values-fr이 없는 것이다. 그러면 우리 앱이 프랑스어를 지원해주지 않는데, 프랑스어를 가져오려고 하면 터지는걸까?
이런 문제를 해결해주는게 대체 알고리즘이다. 리소스 매니저는 이러한 대체 시스템을 가지고 있다.
즉, 아무 구성 한정자가 존재하지 않는 values는 해당 언어 폴더가 없을 때 기본 폴더의 역할을 하는 것이다.
하드코딩을 했다면 같은 문자열이 들어간 모든 부분을 수정하기 위해 코드를 이곳 저곳 돌아다니며 수정해야 한다. 그러다보면 어쩔 수 없이 실수가 발생할 수도 있다.
하지만 strings.xml에 문자열을 지정해놓으면 문자열이 있는 strings.xml 파일의 특정 문자열만 수정하면 이 문자열 id를 사용하는 모든 곳에 변경이 적용된다.
이는 싱글톤을 사용하는 것과 비슷한 개념이라고 생각한다. 하지만 그럼에도 싱글톤이 아닌 strings.xml을 사용하는 이유는 1번과 같은 이유가 크지 않을까? 라는 생각이 든다.
이 또한 상황에 따라서 알맞게 사용해야 한다. 위에서 설명한 것처럼 주사위를 굴리라는 “Roll”같은 문자열이 만약 한국어로 번역되어야 한다. 라고 하면 이는 싱글톤보단 strings.xml이 편할 것이다.
서버 API 주소 또는 키값 같은 경우도 공통으로 사용되니까 strings.xml에 넣어 사용하는게 좋을까? 이건 아닐 것이다. strings.xml에 넣었을 때 키값이 번역되어 버린다면 이 키에 해당하는 값을 영원히 찾지 못할 것이다.
즉, 공통된 문자열을 정리하되 읽는 주체에 따라 다르게 관리해야 한다는 것을 알 수 있다.
- 읽는 주체가 ‘사용자’일 때 → strings.xml
- 읽는 주체가 ‘로직’일 때 → 싱글톤(object / const val)
이전에는 문자열을 사용할 때 무조건 싱글톤으로 상수를 만들어 관리했었지만, strings.xml로 UI에 나타나는 문자열을 관리할 수 있다는 사실을 알게 되었다. 그 뿐만 아니라 다국어 지원의 경우 더 관리하기 편하다는 사실을 알고 이제부터는 UI에 나타나는 문자열을 관리할 때는 strings.xml을 통해 관리할 것 같다.
읽어주셔서 감사합니다! 🙇
튜토리얼 실습
https://developer.android.com/codelabs/basic-android-kotlin-compose-build-a-dice-roller-app?hl=ko#0