inblog logo
|
KooLog

    앱 진입 시 긴 로딩 이슈

    유저들이 종종 로딩이 길다는 VoC를 보낸다...
    구주애's avatar
    구주애
    Apr 21, 2024
    앱 진입 시 긴 로딩 이슈

    이전에 무한로딩까지는 아니지만 종종 특정 구간에서 유저들이 오랜 대기를 겪는 상황이 있었다.

    우리 프로젝트는 mobX를 사용 중이며, 앱 진입 시 각 Store가 직렬/순차적으로 초기화된 뒤에 진입하고있다. 현재 store들 간 연관관계가 없음(일부 제외)에도 불구하고 직렬로 처리되고 있어 병목을 겪고 있는 것으로 보였다!

    유저에 따라 다르지만 어떤 유저는 A스토어, 또 어떤 유저는 B스토어에서 적게는 200ms, 많게는 15s 이상 대기하는 경우도 보였다. 디버깅모드에서는 일반적으로 모든 스토어초기화 과정을 통과하는 데에 1000~3000ms 내외로 소요되었다.

    다음과 같은 단계로 해결을 시도해봤다.

    1. await를 제거해 store가 동시에 초기화되도록 함

      ❗문제발생

      스토어 초기화 이후 로딩스크린에서 실행되는 함수는 일부 store의 데이터를 사용하는데, 이 값이 초기화되지 않은 상태였다.

      → 전체 스토어 초기화 자체는 동기적으로 처리되어야하기 때문에 전체 스토어초기화는 동기적으로 처리될 필요가 있었다. 즉 스토어 초기화 함수가 완료되기 전에 로딩스크린으로 넘어가버린 케이스로 볼 수 있다.

    2. 각 스토어는 연관이 없으므로 독립적인 관계로 볼 수 있어 Promise.all을 사용한다.

      1. Promise.all 내부에서 실행되는 함수가 여러개라면 그 함수들간에는 호출순서가 다를 수 있다.

      2. Promise.all은 동기적으로 실행되므로, Promise.all를 만나게 되면 이 내부 함수가 모두 실행된 후 다음으로 넘어간다. 즉 내가 바라는 상황인 전체 스토어 초기화가 완료된 뒤에 로딩스크린이 실행될 수 있다.

    try {
      await Promise.all([
        this.CustomFistStore.initialize(),
        this.CustomSecondStore.initialize(),
        this.CustomThirdStore.initialize(),
      ]);
    } catch (e) {
      console.error(e);
    }

    위와 같이 Promise.all로 병렬처리 결과 1000ms 정도 앱 진입속도가 단축되는 효과를 얻을 수 있었다!

    Share article

    KooLog

    RSS·Powered by Inblog