🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    해결됨

섹션13 마지막강의에 logout부분에서 이해가 잘 안됩니다.

22.12.01 22:51 작성 조회수 292

0

마지막 Dio CustomIntereptor의 onError 부분에, refreshtoken이 만료되었을 때 로그아웃을 하는부분이 이해가 잘 안되서 질문글을 남깁니다.

  1. ref.read(userMeProvider.notifier).logout();

  2. ref.read(authProvider.notifier).logout();

여기서 read는 실행되는 순간에만 provider를 불러오고, 실제로 전체 클래스의 디펜던시가 아니라고 하였는데,

이 말이 provider의 전체 부분(?)이 아니다, provider의 전체 instance를 가져온다는 뜻이 아니다. 라는 말과 비슷한지 궁금합니다.

 

그리고 1번의 경우는 직접 inject를 하는 경우이고, 2번의 경우는 우회를 하는 경우이며,

직접 inject를 하는 경우 userMeProvider의 값을 build time에 넣어줘야 하는데 userMeProvider에서 dio값을 참조하는 부분이 있어 circular dependency error가 발생한다..

라고 이해를 하였는데 제대로 이해를 하고 있는것인지 궁금합니다.

 

마지막으로 제가 제대로 이해한 것이라면, 2번의 경우 어짜피 authProvider의 logout이 userMeProvider를 호출하여 사용하는건데, 왜 직접 inject하는 것과 우회하는 것이 다른 결과를 도출하게 되는지 궁금합니다.

 

긴 질문 읽어주셔서 감사합니다..

 

 

 

답변 1

답변을 작성해보세요.

0

안녕하세요!

read()와 watch()의 가장 큰 차이는 상대 상태의 변화를 '감지' 하고있냐 아니냐의 차이입니다.

제 표현이 정확하진 않았던 것 같은데 read()를 하더라도 디펜던시가 맞기는 맞습니다. 의존하고 있으니까요.

watch()를 하지 않으면 변화에따라 재실행되지 않는다는 표현을 하고싶었던겁니다.

circular dependency의 경우 서로 watch()를 하게될경우 생기는 현상입니다.

예를들어서 A가 B를 watch()하고 B가 A를 watch() 하면 A가 변경될때 B가 변경되고 B가 변경됐으니 또 A가 변경되고... 이런 무한 루프가 발생하게됩니다.

 

read()를 실행하는경우 직접 디펜던시를 인젝트 해주고 호출해도 작동상은 크게 다르지 않습니다. 하지만 이렇게 코드를 짜게되면 riverpod을 사용하는 목적을 잃어버리게됩니다.

soboru1002님의 프로필

soboru1002

질문자

2022.12.05

답변 감사합니다!

좋은 답변에도 불구하고, 미묘하게 잘 안 와닿는 부분이 있어 추가질문 드립니다.

처음에 제가 의문을 가졌던 부분이 ref.read(authProvider.notifier).logout();를 할 경우,

dio -> authProvider -> userMeProvider -> dio를 통해 이 역시 무한 루프가 발생하지 않을까? 라는 생각에 사로잡혀 위와같이 질문을 남겼는데,(A->B->C->A->...)

authProvider는 dio를 watch하지 않고 있으며, userMeProvider와 dio가 서로 직접적으로 watch하지 않으므로 circular dependency는 발생하지 않는다. 정도로 이해해도 괜찮을까요?

네 맞습니다.

watch를 서로 하고있어야 무한 루프가 발생합니다.

A가 B의 변경사항을 감지하고 B가 A의 변경사항을 감지하면 A나 B중 그 어떤 하나만 변경돼도 계속 A->B->A->B..... 변화가 무한하게 이루어집니다.

하지만 read는 변화를 따로 감지하는 요소가 아니라 실행대는 순간의 프로바이더를 가져오는거라 예외라고 보시면 됩니다.

soboru1002님의 프로필

soboru1002

질문자

2022.12.08

답변 감사합니다 :)

채널톡 아이콘