기기 언어는 영어, 앱에서 고른 언어는 한국어. 이런 상태에서 VidDish를 열면 처음에는 영어 화면이 나타나고, 저장된 설정이 반영된 뒤에야 한국어로 바뀌는 문제가 있었습니다. 레시피 목록도 영어로 먼저 요청했다가 한국어로 다시 읽어야 했습니다.
처음 화면에는 또 다른 문제가 있었습니다. 아직 레시피를 가져오지도 않았는데 ‘곧 레시피가 보여요’라는 빈 목록 안내가 나타날 수 있었습니다. 사용자가 보기에는 설정도 제대로 반영되지 않고, 레시피도 없는 앱처럼 보이는 셈입니다.
수정할 부분은 두 곳이었습니다. 목록을 읽기 전에 저장된 언어부터 알아야 했고, 그동안 화면에는 아직 준비 중이라는 사실을 보여줘야 했습니다.
저장된 값은 맞았는데, 읽는 순서가 어긋났다
설정을 불러오는 작업은 있었지만 화면이 그 작업을 기다리지는 않았습니다. 설정을 읽는 동안 앱은 기기 언어를 기본값으로 사용했습니다. 레시피 화면이 그 값을 읽어 영어 레시피를 요청하고 나면, 뒤늦게 한국어 설정을 복원해도 이미 보낸 요청은 영어 요청으로 남습니다.
여기에 앱 버전 정보를 읽는 작업까지 얽혀 있었습니다. 기존 설정 로딩은 버전 라벨을 읽은 뒤 변경을 알렸습니다. 한국어 설정을 알아냈어도 화면에 알리는 시점은 더 늦어질 수 있었습니다. 언어를 결정하는 데 필요하지 않은 버전 정보가 첫 화면에 영향을 주고 있던 것입니다.
설정을 먼저 불러오라고 호출한 것과, 불러온 설정으로 화면을 시작하는 것은 달랐습니다. Dart의 비동기 실행 안내에서 설명하는 것처럼, 비동기 작업이 진행되는 동안 다른 작업은 계속 실행될 수 있습니다. 이 사례에서도 저장 값 자체보다 첫 조회가 시작된 시점의 언어가 문제였습니다.
목록을 읽기 전에 언어부터 정했다
목록을 조회하는 쪽이 언어 준비를 기다리도록 바꿨습니다. 저장된 언어를 읽었다는 신호가 오면, 그때 언어 값을 읽어 레시피를 요청합니다. 기다리기 전에 영어라는 값을 따로 기억해 뒀다가 그대로 사용하면 같은 문제가 남기 때문입니다.
이미 초기화된 설정 저장소를 사용할 수 있을 때는 설정 객체를 만들면서 언어를 바로 읽게 했습니다. 버전 정보도 언어 준비와 분리했습니다. 화면은 언어를 아는 즉시 반영하고, 버전 라벨은 나중에 받아도 됩니다.
모든 초기 작업이 끝난 뒤 홈을 열면 순서 문제를 피하기는 쉽습니다. 하지만 그러면 버전 정보처럼 목록 조회에 필요하지 않은 작업이 늦어져도 홈이 함께 기다리게 됩니다. 그래서 첫 조회에 필요한 언어를 기다리는 데 범위를 맞췄습니다.
일정 시간 뒤에 조회를 시작하는 방법도 안정적이지 않습니다. 어떤 실행에서는 설정이 빨리 준비되고, 어떤 실행에서는 늦게 준비됩니다. 시간을 넉넉히 잡으면 불필요하게 기다리고, 짧게 잡으면 다시 기본 언어로 요청할 수 있습니다. 준비가 끝났다는 신호를 쓰면 이런 추측을 줄일 수 있습니다.
여기서 한 가지 주의할 점이 있습니다. VidDish는 메뉴 언어와 레시피 언어를 따로 설정할 수 있습니다. 메뉴는 한국어로 쓰면서 일본어 레시피를 보고 싶을 수도 있습니다. 따라서 목록은 메뉴가 어느 언어로 표시되는지가 아니라, 사용자가 정한 레시피 언어를 따라야 합니다.
읽기 전의 0개를 빈 목록으로 보여주지 않았다
화면도 함께 바꿔야 했습니다. 첫 조회 전에는 카드가 0개입니다. 조회가 끝났는데 결과가 없을 때도 0개입니다. 카드 개수만 보면 둘을 구분할 수 없습니다.
‘곧 레시피가 보여요’라는 안내는 조회가 끝난 뒤 결과가 없을 때 쓸 수 있는 문구입니다. 아직 조회를 시작하지 않았거나 언어를 준비하는 동안에 보여주면, 기다리는 상황을 제대로 전달하지 못합니다.
그래서 현재 언어로 보여줄 내용을 준비하는 동안에는 로딩을 표시하게 했습니다. 결과가 도착한 뒤에 빈 안내나 실패 안내를 판단합니다.
| 목록 상태 | 화면에서 전달할 내용 |
|---|---|
| 아직 읽기 전이거나 읽는 중 | 준비 중 |
| 읽기에 성공했지만 결과가 없음 | 현재 조건에 맞는 결과가 없음 |
| 읽기에 실패함 | 목록을 가져오지 못함 |
이렇게 하면 영어 기기에서도 한국어 설정을 읽고 한국어 목록으로 첫 조회를 시작할 수 있습니다. 영어 목록을 먼저 받은 뒤 다시 한국어 목록을 읽던 흐름을 줄이는 것입니다.
로딩이 보이면 더 느려진 것처럼 느껴질 수도 있습니다. 실제로 첫 요청은 언어가 준비될 때까지 기다립니다. 다만 영어 화면이 빨리 뜨는 것과 사용자가 원한 한국어 목록이 준비되는 것은 다른 시점입니다. 속도를 비교하려면 로딩 표시가 사라지는 시간뿐 아니라, 원하는 언어의 내용을 사용할 수 있게 된 시간도 봐야 합니다. 이 수정만으로 체감 속도가 얼마나 나아졌는지는 별도 측정이 필요합니다.
언어를 바꿨는데 이전 요청이 돌아오면
앱을 처음 열 때만 순서가 어긋나는 것은 아닙니다. 영어 목록을 읽는 도중 한국어로 바꾸면 영어 요청은 여전히 진행 중입니다. 설정은 한국어인데 도착한 카드는 영어인 상태가 됩니다.
수정에서는 조회 도중 언어가 바뀌었는지 확인하고, 바뀌었다면 조회가 끝난 뒤 새 언어로 다시 읽게 했습니다. 화면도 이전 언어의 카드가 남아 있다는 이유만으로 준비가 끝났다고 보지 않게 했습니다. 영어 카드를 한국어 조건으로 걸러 놓고 ‘맞는 레시피가 없다’고 안내하는 일을 피하기 위해서입니다.
그렇다고 모든 영역이 끝날 때까지 화면 전체를 가릴 필요는 없습니다. 현재 VidDish는 선택한 언어의 추천 묶음이 먼저 준비되면 그 내용을 보여주고, 아직 읽는 중인 목록 영역에는 로딩을 남길 수 있습니다. 이미 보여줄 수 있는 내용이 있는지를 영역별로 보는 방식입니다.
언어를 빠르게 여러 번 바꾸는 경우도 생각해야 합니다. 늦게 도착한 결과를 지금 화면에 넣어도 되는지 알려면 요청 당시 언어를 알아야 합니다. 첫 실행에서 설정을 기다리는 처리만으로 실행 중의 모든 전환까지 해결되는 것은 아닙니다.
설정을 못 읽었을 때의 다음 행동
설정을 기다리게 했다면 실패했을 때도 기다림을 끝낼 방법이 있어야 합니다. 현재 구현은 저장소 읽기가 실패로 끝나더라도 언어 대기 신호를 종료합니다. 저장 값을 복원하지 못하면 기본 언어로 진행할 수 있습니다. 그러므로 대기가 끝났다는 사실과 저장된 설정을 제대로 읽었다는 사실은 구분해야 합니다.
다만 이 처리는 읽기 작업이 성공이나 실패로 끝난 경우를 다룹니다. 작업이 끝없이 기다리는 상황에 대한 시간 제한과 복구는 별도로 마련해야 합니다. 로딩 화면을 넣는 것만으로 모든 실패 상황을 처리했다고 볼 수는 없습니다.
비슷한 증상을 만났다면 첫 요청에 어떤 언어가 들어갔는지부터 확인해 보세요. 그 값이 틀렸다면 설정을 읽는 순서와 조회 시작 시점을 봐야 합니다. 요청은 맞는데 빈 안내가 먼저 보인다면 화면이 ‘아직 못 읽음’과 ‘읽었지만 없음’을 어떻게 구분하는지 살펴보면 됩니다. VidDish에서는 이 두 부분을 함께 고쳐야 첫 화면의 언어와 안내가 맞아떨어졌습니다.