인프런 커뮤니티 질문&답변

lcs님의 프로필 이미지
lcs

작성한 질문수

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

Restaurant Pagination - 5

PaginationProvider의 로직 중 이해안가는 부분이 있습니다.

작성

·

161

0

RestaurantPagination-5 2:25경에 나오는 부분입니다.

if (fetchMore) {
        final pState = state as CursorPagination<T>;

        state = CursorPaginationFetchingMore(
          meta: pState.meta,
          data: pState.data,
        );

        paginationParams = paginationParams.copyWith(
          after: pState.data.last.id,
        );
      }
      // 데이터를 처음부터 가져오는 상황.
      else {
        // 만약에 데이터가 있는 상황이라면
        // 기존 데이터를 보존한 채로 Fetch를 진행한다.
       // 여기!!
        if (state is CursorPagination && !forceRefetch) {
          final pState = state as CursorPagination<T>;

          state = CursorPaginationRefetching<T>(
            meta: pState.meta,
            data: pState.data,
          );
        } else {
          state = CursorPaginationLoading();
        }
      }

해당로직에서 "// 여기!!"로 표시한 부분에서

if(state is CursorPagination && !forceRefetch)조건문이 이해가지 않습니다.

fetchMore는 아닌데 새로고침(forceRefetch)도 아니다. 그런데 데이터를 이미 가지고 있고 새로운 데이터를 요청한다?
이게 어떤 경우를 의미하고 작성된 케이스일까요?

답변 2

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

"기존 데이터를 보존한 상태로 Fetch를 진행한다"라고 작성해뒀는데

forceRefetch의 경우 저는 캐시에서 데이터를 삭제하는편입니다.

기존 데이터를 삭제하지 않고 refresh를 진행하는 로직인 것 같네요.

refresh를 진행할때 리스트를 당겨서 윗쪽 RefreshIndicator만 돌아가게하고 리스트 데이터는 유지되도록 하는 상황과 리스트 전체를 로딩 인디케이터로 바꿔야하는 상황을 구분 할 수 있습니다.

하지만 언제까지나 "할 수 있다"이지 할 필요는 없습니다.

생각하시기에 불필요한 로직이라면 안넣으셔도 됩니다. 필요한 조건은 프로젝트별로 기획별로 다 다르니까요.

감사합니다!

lcs님의 프로필 이미지
lcs
질문자

음... 말씀하시는 것을 아래와 같이 이해했습니다.
"기존에 데이터가 존재하는 상태에서 리스트를 당겨서 새로고침하는 상황에 해당하는 로직이다.
이때, 기존 리스트 데이터가 유지되기 위해서 필요한 로직이다."

그렇다면
if (state is CursorPagination && !forceRefetch) 가 아니라
if (state is CursorPagination && forceRefetch)여야하는 것 아닌가요?

새로고침의 경우 forceRefetch가 true일 테니까요.

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

아직 제가 밥을 안먹어서 머리가 안돌아가는걸수도 있는데 질문하신 부분과 관련있는 말씀이신지 모르겠습니다.

제 기억이 맞다면 리프레시는 두가지로 정의했습니다.

1) forceRefetch: true 강제 리프레시 -> data 캐시 날리면서 처음부터 초기화. 초기 요청처럼 중앙에 크게 로딩 표시를 해줄 수 있음 (해줘야 한다는건 아닙니다. 그냥 제가 그렇게 정의 했습니다)

2) fetchMore: false, forceRefetch: false -> data 캐시는 유지하면서 초기 데이터 가져오기 (요청은 1번과 같음. 데이터가 캐시에 존재하 존재하지 않냐의 차이). 이럴경우 RefreshIndicator 로딩만 보여주고 초기데이터가 도착하기 전까지 기존 캐시 데이터 유지 할 수 있음.

 

제가 구현한 방식

1) forceRefetch: true

2) fetchMore: false, forceRefetch: false

 

구현 하고싶으신 방식

1) forceRefetch: true

2) fetchMore: false, forceRefetch: true

 

a) 왜 조건을 forceRefetch: false인 경우로 했냐는게 질문이실까요? 단순 변수이기 때문에 forceRefetch: true인 경우로 하는게 맞다고 생각드시면 그렇게 하셔도 상관 없습니다. 하지만 그렇게 한다면 상위 조건들도 다 확인 해보셔야 할겁니다. 저는 전자를 가정하고 로직을 작성 했으니까요.

 

b) 아니면 왜 UI에서 사용하지 않는 조건의 로직을 작성했는지에 대한 질문일까요? 모든 가능한 조건에 대한 로직을 풀어나간거라 실제로 사용되지 않는 로직이 존재할 수 있습니다.

 

"새로고침의 경우 forceRefetch가 true일 테니까요"라고 하셨는데 2번 조건을 실행하고 싶다면 새로고침을 forceRefetch: false로 하면 되는데 왜 꼭 true여야하는지 잘 모르겠습니다.

 

감사합니다!

일반 새로고침과 forceRefetch에 대한 정의가 헷갈리면서 발생한 문제였네요
자세한 답변 감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

lcs님의 질문에 대해 적절하게 답변드릴 수 있는 부분을 찾았습니다. 질문하신 if(state is CursorPagination && !forceRefetch) 부분은 데이터를 이미 가지고 있으면서 새로운 데이터를 요체하는 상황에서, 기존 데이터를 보존하며 새로운 데이터 요청을 처리하는 로직의 일부입니다. 여기서 fetchMore가 아닌데 forceRefetch도 아니다는 상태는 다음과 같은 상황을 의미합니다:

  • fetchMorefalse인 경우: 추가 데이터를 불러오는 ‘더보기’ 기능을 수행하지 않는 상태입니다.
  • forceRefetchfalse인 경우: 사용자가 강제로 데이터를 새로고침(refresh)하고자 하는 의도가 없는 상태입니다.

따라서, 이 조건문은 사용자가 명시적으로 새로고침을 요청하지 않았고, 추가 데이터를 요청하는 ‘더보기’를 진행하지도 않으면서, 기존에 불러온 데이터가 있다면 기존 데이터를 유지한 채 다른 작업을 수행하고자 할 때를 의미합니다. 이러한 상황에서는 기존의 데이터 상태를 보존하면서 새로운 데이터 요청을 처리하기 위해 CursorPaginationRefetching 상태를 설정합니다.

이와 관련하여 비슷한 상황에 대해 설명하는 내용이 있는 URL을 찾았습니다: CursorPaginationRefetching 상황은 구현인 안된건가요??

이 글에서는 CursorPaginationRefetching이 데이터 상태를 보존하면서도 새로운 데이터를 요청할 수 있게 하는 메커니즘에 대해 설명하고 있습니다. 언급한 forceRefetch 및 데이터 상태에 관한 로직은 데이터를 유지하면서 사용자에게 보다 유연한 데이터 관리 및 제어 기능을 제공하기 위한 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

lcs님의 프로필 이미지
lcs
질문자

"사용자가 명시적으로 새로고침을 요청하지 않았고, 추가 데이터를 요청하는 ‘더보기’를 진행하지도 않으면서, 기존에 불러온 데이터가 있다면 기존 데이터를 유지한 채 다른 작업을 수행하고자 할 때를 의미합니다"

이런 경우가 언제인지를 모르겠습니다.
데이터를 들고있는데 fetchMore가아니고 새로운 데이터를 요청한다라면 "새로고침"밖에 없는 것 아닌가요?

lcs님의 프로필 이미지
lcs

작성한 질문수

질문하기