안녕하세요. 좋은 강의 잘 수강하고 있습니다! 다름이 아니라 포스트 삭제 후에 무한 스크롤이 작동하지 않는 문제가 발생했습니다. 문제 상황은 다음과 같습니다. 첫 페이지(다음 페이지의 데이터를 페칭하지 않은 상태)에서 작성한 포스트를 삭제 이후 페이지 최하단까지 스크롤 했지만 무한 스크롤 데이터 페칭이 이루어지지 않음 부족한 실력이라 AI의 도움을 받아 원인을 분석했을 때 다음과 같았습니다. 아래는 AI의 답변입니다. 무한 스크롤이 작동하지 않는 원인 분석: getNextPageParam 의 로직 useInfinitePostData 훅에서 다음 페이지를 불러올지 결정하는 로직은 다음과 같습니다: // src\hooks\queries\use-infinite-posts-data.ts // ... const PAGE_SIZE = 5; // ... getNextPageParam: (lastPage, allPages) => { if (lastPage.length < PAGE_SIZE) return undefined; // 🚫 문제의 원인 return allPages.length; }, 이 로직은 "마지막으로 불러온 페이지의 항목 개수가 PAGE_SIZE (5개)보다 적으면, 더 이상 데이터가 없으므로 undefined 를 반환하라 (즉, 다음 페이지를 불러오지 마라)"고 지시합니다. 삭제가 로직에 미치는 영향: 초기 상태: 0번 페이지에 5개의 게시글이 있습니다. ( lastPage.length = 5) 삭제 이벤트: 사용자가 0번 페이지의 게시글 1개를 삭제합니다. 캐시 업데이트: useDeletePost 의 onSuccess 에서 해당 게시글 ID를 0번 페이지의 캐시 데이터 에서 제거합니다. 결과: 0번 페이지의 항목 개수가 5개에서 4개 로 줄어듭니다. 무한 스크롤 시도: 사용자가 스크롤하여 ref ( inView )가 활성화됩니다. getNextPageParam 실행: React Query는 0번 페이지의 현재 캐시 데이터 를 확인합니다. lastPage.length 는 이제 4 입니다. 잘못된 판단: 4 < PAGE_SIZE (5) 이므로, getNextPageParam 은 즉시 undefined 를 반환 합니다. 따라서 1번 페이지(실제 서버에는 데이터가 있을 수 있음)를 불러오기도 전에, 캐시 데이터가 줄어든 것 때문에 다음 페이지 로딩이 차단 되어 무한 스크롤이 작동하지 않게 되는 것입니다. 마지막 페이지에 속한 포스트를 삭제했을 때, PAGE_SIZE보다 항상 작아지니 다음 페이지가 없다라고 판단하기에 무한 스크롤이 작동하지 않는다고 이해했습니다. 캐시를 무효화해 리페칭해서 해결하려고 하는데, 다른 대안이 있을까요? 혹여 제 실수로 잘못된 동작이 일어난 건지 GitHub Repo도 같이 첨부했습니다! https://github.com/scseong/onebite-sns
안녕하세요 멘토님, 정말 쉽게 설명해주셔서 수업 잘 듣고 있습니다. 인증 처리하기 부분에 대해서 흐름도를 자세하고 재밌게 설명해주셔서 덕분에 이해하기 수월했습니다. 다만 현재 토큰들을 localStorage에 저장하고 이 값을 zustand로 관리하고 있는 것 같은데 사실 토큰을 storage에 저장하는 방식이 일반적이지는 않은 것 같습니다. 이 부분에 대해서 찾아본 결과 supabase를 이용하기에 쿠키에 저장하는 건 무리인 것 같고, 그렇다면 그나마 토큰을 메모리에 저장하는 방식이 안전할 것 같습니다. 로그인을 진행하면 토큰이 localStorage에 저장되는 형태인데, 이때 만약 storage에 저장하지 않고 메모리에 받게하려면 어떻게 할 수 있을까요 .. ? 또한 사실 토큰 자체를 zustand에서 가지고 있는 것도 괜찮은지 의문입니다.. 전역상태로 들고 있는 것이라서 충분히 탈취위험이 있을 것이라고 생각이 되어서요.. 사실 백엔드 서버가 있었다면 쿠키에 저장하는 로직으로 진행했을 거 같은데 만약 이때는 로그인 상태를 어떻게 판별하는지에 대해서도 궁금합니다 !
강의 정말 잘 듣고있습니다! 10.6 강의 수강 중 댓글 추가 시에는 Comment 타입과 일치시키기 위해 프로필 데이터를 조회해서 author 객체를 포함시켜주었는데 수정, 삭제 시에는 왜 따로 처리를 하지 않는지 궁금합니다. 삭제 시에는 해당 데이터를 삭제하기에 불필요하다고 생각되긴하는데 수정 시에는 왜 에러가 발생하지 않나요??
강의를 다 듣지 않은 상태에서 빠르게 실행을 해보고 싶습니다. 서버 실행, 데이터베이스 연결 이런 건 잘 했는데 지도 라이브러리 다운 및 설정 등 일부 강의만 듣고 설정해서 실행하려고 하니 문제가 생기네요. 필요한 라이브러리 버전 등 실행에 필요한 정보가 한꺼번에 나와있는 글은 없나요? ❗ 질문 작성시 꼭 참고해주세요 에러 메세지에서 단서를 찾을 수 있는 경우가 많습니다. 에러 메세지를 읽고 한번 검색해보시는것을 추천드립니다. 질문글을 작성하실때는, 현재 문제(또는 에러)와 코드나 github 을 첨부해주세요. 개발중인 OS, ReactNative, Node 버전 등의 개발환경 을 알려주셔야합니다. 에러메세지는 일부분이 아닌 전체 상황을 올려주세요. 일부만 보여주시면 답변이 어렵습니다. (에러 일부만 자르거나 일부만 복사하지말아주세요 )
강의 잘 듣고 있습니다. 다름이 아니라, forget-password 로 정상적으로 처리가 되었다고 하는데요. 그러나, 등록해 둔 이메일로 reset password 메일이 오지 않네요. 혹시 Supabase 셋팅에서 어떤 부분을 확인해야 할까요? 검색을 해보니 이렇게 셋팅하라고 해서 한 상태입니다 답변 부탁드립니다.
관련 챕터: Zustand 기본 사용법 2 질문 관련 부분: 4:34 ~ 6:20 질문 내용: 역할에 따라 컴포넌트를 분리하는 과정에서, count 값 변경 시 Controller 컴포넌트까지 리렌더링되는 이유에 대해 설명해주셨는데요. 제가 맞게 이해했는지 헷갈려서 질문 드립니다. count 값이 바뀔 때마다 Viewer , Controller 컴포넌트가 동시에 리렌더링된다. 버튼 태그를 포함하는 Controller 컴포넌트까지 리렌더링되는 이유는 1. Zustand는 store 안의 state 가 바뀌면 store 를 가져다 쓴 모든 컴포넌트가 다시 그 state 값을 반영하도록 리렌더링된다. 2. Controller 는 구조분해 할당으로 increase , decrease 만 쓴다고 해도, 훅이 반환한 객체 안에 count 도 포함돼 있으므로 count 가 바뀌면 Controller 도 리렌더링된다. 제가 맞게 이해한 걸까요?
zustand 강의에서 devtools 미들웨어를 사용하여 브라우저 도구 Redux 툴에서 Action 과 State 를 살펴보는데 강의 영상에서는 Action의 이름이 setSession 으로 나오는 데... 제 Redux 툴에서는 액션 명이 anonymous로 표시됩니다. 어떻게 액션명이 표시되는 지 궁금합니다. set 함수에서 액션명 표시하려면 이름을 주어 표시했는데 . 뭔가 다른가요 ? //... set({session, isLoaded: true}, undefined, 'setSession'); //...
안녕하세요! 강의 잘 듣고 있습니다. (3.2) Zustand 기본 사용법 1 강의의 9분 21초경 에서 궁금한 점이 생겨 질문드립니다. 강의에서 get 메서드는 store(객체) 전체를 반환 한다고 설명하셨습니다. 그리고 set 메서드는 인자로 전달된 객체의 프로퍼티만을 갱신 한다고 하셨는데요. 그런데 아래 코드처럼 보면, set 내부에서는 따로 get() 을 호출하지 않아도 count 값을 바로 참조해 업데이트하고 있습니다. increase: () => { const count = get().count; // 여기서 store의 count 프로퍼티를 가져온다 set({ count: count + 1 }); // 그런데 여기서는 count를 직접 사용할 수 있다? } 제가 이해하기로는 store의 값을 변경하기 위해 프로퍼티를 참조할 때에도(여기서는 count: ) 먼저 get() 으로 현재 store의 참조를 얻은 뒤 수정해야 할 것 같은데, set({ count: count + 1 }) 처럼 직접 count를 갱신할 수 있는 이유 가 궁금합니다. 즉, set 은 내부적으로 get() 을 다시 호출해서 현재 store 상태를 알고 있는 건가요? 아니면 set 이 store 객체의 참조를 이미 가지고 있어서 가능한 건가요?
개발 환경 window node 18 기타 wifi 인터넷 환경 애뮬레이터를 띄워서 확인하고 싶은데요. npm start 안드로이드 스튜디오에서 안드로이드 애뮬레이터 실행 npm run andriod > matzip@0.0.1 android > react-native run-android info A dev server is already running for this project on port 8081. info Installing the app... > Task :app:installDebug Installing APK 'app-debug.apk' on 'Medium_Phone(AVD) - 16' for :app:debug Installed on 1 device. [Incubating] Problems report is available at: file:///C:/Users/hangy/Desktop/matzip/android/build/reports/problems/problems-report.html Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. For more on this, please refer to https://docs.gradle.org/8.13/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. BUILD SUCCESSFUL in 30s 58 actionable tasks: 9 executed, 49 up-to-date info Connecting to the development server... info Starting the app on "emulator-5554"... Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.matzip/.MainActivity } 애뮬레이터 반응 없이 아래 하면 표시함. 도움 부탁드립니다. 환경 설정이 되어야 진도를 나가는데. 애뮬레이터가 아무런 반응이 없네요. 좋은 강의 감사합니다.