관련 섹션: 42. (6.2) 회원가입 구현하기 질문 내용 회원가입 요청을 보냈을 때 반환되는 data 객체 안에 user 값은 있는데, session 값이 null입니다. 강의에서 알려주신 대로 진행했고, 한 가지 다르게 진행한 부분은 Supabase 이메일 세부옵션에 'Confirm email'이 존재하지 않아 이 부분만 off 처리를 하지 못했습니다. 회원가입 요청을 보내면 반드시 data 객체 안에 session값까지 포함되어야 할까요?
안녕하세요. 섹션 3 퀴즈에서 5번 문제 관련 질문 드립니다. 질문: persist 미들웨어 사용 시, 액션 함수가 기본적으로 저장되지 않는 이유는 무엇일까요? 해설: persist 미들웨어는 상태를 JSON 형태로 저장하기 때문에, JSON으로 직렬화할 수 없는 함수는 저장하지 않아요. 따라서 serialize 옵션으로 상태만 저장하는 것이 좋습니다. 강의에서 serialize 가 아닌 partialize 로 설명해주셨는데, 이 부분 확인 부탁드립니다.
안녕하세요. 좋은 강의 잘 수강하고 있습니다! 다름이 아니라 포스트 삭제 후에 무한 스크롤이 작동하지 않는 문제가 발생했습니다. 문제 상황은 다음과 같습니다. 첫 페이지(다음 페이지의 데이터를 페칭하지 않은 상태)에서 작성한 포스트를 삭제 이후 페이지 최하단까지 스크롤 했지만 무한 스크롤 데이터 페칭이 이루어지지 않음 부족한 실력이라 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에서 가지고 있는 것도 괜찮은지 의문입니다.. 전역상태로 들고 있는 것이라서 충분히 탈취위험이 있을 것이라고 생각이 되어서요.. 사실 백엔드 서버가 있었다면 쿠키에 저장하는 로직으로 진행했을 거 같은데 만약 이때는 로그인 상태를 어떻게 판별하는지에 대해서도 궁금합니다 !
💬 좋은 질문 예시 [진도] 1주차 5강 웹사이트 만들기 [질문] Lovable 에 자체 클라우드가 생기면서 supabase를 연동하기 힘들어 졌습니다. Lovable유료결제 까지 하면서 원인을 찾아보려고 했는데 일주일 동안 찾지 못 했습니다. 전에 같은 질문을 하신분의 답변에 다른 분의 영상을 봤는데도, 그것으로는 해결이 되지 않는 상황입니다. 아예 베이스가 없기 때문에 supabase가 뭔지도 모르는 상황이고 이 둘을 어떻게 연결해야 할지도 모르는 상황입니다. 현재 바뀐 상황을 들여다 본 후 답변 주셨으면 좋겠습니다. 혹은, supabase 연동 없이 Lovable 자체 클라우드를 활용해서 강의를 진행해도 괜찮을지 알려주시면 supabese 없이 Lovable 클라우드로 진행해 보겠습니다. 제가 변화에 대처하질 못하는 상황이지만, 항상 질 높은 강의 감사드립니다.
강의 정말 잘 듣고있습니다! 10.6 강의 수강 중 댓글 추가 시에는 Comment 타입과 일치시키기 위해 프로필 데이터를 조회해서 author 객체를 포함시켜주었는데 수정, 삭제 시에는 왜 따로 처리를 하지 않는지 궁금합니다. 삭제 시에는 해당 데이터를 삭제하기에 불필요하다고 생각되긴하는데 수정 시에는 왜 에러가 발생하지 않나요??
강의 잘 듣고 있습니다. 다름이 아니라, 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'); //...
강의 잘 보고 있습니다! 좋은 강의 만들어 주셔서 감사해요 강의 보다가 그냥 좀 어색한 부분이 있는거 같아서 공유드립니다~ 65. Supabase로 공지사항 다이얼로그 띄우기 (2) 수업중 아래 파일의 코드에서 하나 확인 부탁드립니다. lib/widget/announcement_dialog.dart 3번의 prefs.setStringList 가 2번의 if 문 안으로 들어가는게 맞을거 같아요. static Future<void> _setViewed(int announcementId) async { final prefs = await SharedPreferences.getInstance(); // 1. 기존의 공지사항 아이디를 가져온다. final viewedIds = prefs.getStringList(_viewedAnnouncementsKey) ?? []; // 2. 가져온 아이디에 포함여부 확인. if (!viewedIds.contains(announcementId.toString())) { viewedIds.add(announcementId.toString()); } // 3. 포함되어 있지 않다면 새로 추가한다. await prefs.setStringList(_viewedAnnouncementsKey, viewedIds); }