개별 캐시 데이터는 disabled 상태라 캐시를 무효화 해봤자 데이터를 다시 불러오지 않는다고 하시면서 use-upate-todo-mutation.ts 파일에서 onSettled 이벤트 핸들러를 삭제하셨습니다. 그런데 이 부분이 이해가 잘 가지 않습니다. QUERY_KEYS.todo.list를 무효화 하면 todo 목록을 가지고 오면서 개별 캐시 데이터도 todos.forEach((todo) => { queryClient.setQueryData<Todo>(QUERY_KEYS.todo.detail(todo.id), todo); }); 이렇게 다시 세팅하는거 아닌가요?
러버블에서 진행되고 있는 프로젝트를 다운로드후에 로컬로 실행한다음에, 다시 러버블로 옮기는건 안되는거죠? 추가적ㅇ로 궁금한게 러버블 클라우드(lovable cloud)를 사용하고 있는 프로젝트를 로컬로 가져와서 개발하는게 가능한걸까요? 아니면 자체적으로 supabase를 외부로 연동한 프로젝트만 가져와서 추가적인 개발이 가능한 걸까요?
선생님, 안녕하세요. 강의 잘 듣고 있습니다 🙂 프로필 수정 기능구현하기 - 기능 강좌에서 useEffect(() => { if (profile && isOpen) { setNickname(profile.nickname); setBio(profile.bio); setAvatarImage(null); } }, [profile, isOpen]); setAvatarImage(null); setAvatarImage의 인수로 null 값으로 설정한 이유를 강의에서 말씀 주셨는데 설명을 들었는데도 아직 잘 이해가 안 돼서요 ㅠㅠ 해당 부분에 대해 좀 더 부연설명 해주실 수 있나요? 감사합니다. 새해 복 많이 받으세요!
주사위 굴리기 만든부분에서 현재 오른쪽하단 실행기기를 크롬으로 실행하면 정상적으로 동작하는데 미디움폰이나 그외 모바일 기기로 실행하면 그냥 플루터 기본코드화면만 나옵니다 커서한테 질문해도 똑같은 작업만 하루종일 반복하고 그대로네요 안드로이드 스튜디오에서 뭐 따로 해야할게 있는건가여 sdk설치하고 medium phone도 설치하고 다 했는데 답답하네요 ㅠ
map 함수 안에서 자식 컴포넌트가 순회하는 코드가 있다고 할 때, 그 자식 컴포넌트 안에서 훅(ex useEditPost/useDeletePost)을 호출하는 것이 좋을까요? 아니면 부모에서 훅을 한번 호출한 뒤 자식 컴포넌트에 prop으로 내려주는 것이 좋을까요? 전자는 자식마다 호출되어 할당될 것 같아서 메모리 관리에 단점이 있을 것 같고 (추측입니다), 후자는 (훅의 함수를 받아야하는 대상 컴포넌트가 자식 내부에 더 깊은 뎁스에 있다고 할 때) Prop Drilling의 단점이 있을 것 같은데요 선생님은 어떻게 생각하시나요?
안녕하세요 선생님 선생님 리액트 기초 강의를 들었는데 제 기억에서는 그 리액트 파일명을 대문자로 써야한다? 이렇게 들었던 거 같은데 (아니면 죄송) 왜 여기에서는 파일명을 소문자로 쓸까요? 그리고 파일명하고 그 내보내는 함수를 다르게 쓰는 이유가 있나요? 그리고 왜 화살표함수로 안만들고 function으로 할까요? 그리고 export를 아래에 안쓰는 이유가 있을까요? 수업시간에 설명했는데 제가 놓친거면 죄송합니다 ㅠㅠ
지금 현재날짜 12.28 슈퍼베이스 없어지고 자체클라우드 연동인데 강의는 다 슈퍼베이스 들어가서 이것저것하는데 공부가 진행이안돼요 보면서 따라해도 계속 막히고 그냥 저 혼자 맨땅에 헤딩하는 느낌이에요... 로그인기능 구현하는데 403에러나서 강의는 슈퍼베이스로 진행하는데 저혼자 그냥 어찌저찌 해보고있는데 강의를 보면서 진행이 안되니.. 미칠거같네요
현재 12.28일 수강중인데 슈퍼베이스라는것이 없어진거같아요 방문자수기록 추가할때도 슈퍼베이스 클릭하는게 아닌 채팅창에 자체 클라우드 허용할거냐아는 allow버튼이 나와서 그거 클릭했더니 되긴했는데 크레딧이 너무 빨리 끝나버렸어요 그 해결방법 카카오톡영상도 확인 했는데 그대로 따라 들어갔는데 superbase가 보이지않아요 어떻게 해야할까요.. ㅠㅠ 벌써 막힌거같아요
안녕하세요. 먼저 강의 정말 잘 듣고 있습니다. supabase를 어떤 식으로 프로젝트에 적용할 수 있을 지 배울 수 있어 유익했습니다. 섹션 6강에 궁금한 점이 생겨서 질문 드립니다. 강의 내용에서 조금 벗어났지만, supabase에서 회원 탈퇴하기가 궁금했습니다. auth.ts에 await supabase.auth.admin. deleteUser 를 추가하고 profile 테이블의 행을 삭제하면 될까요? admin를 호출해도 되나 싶어서 여쭤보고 싶었습니다. 추후 강의에 계정 삭제하기도 포함해주시면 정말 좋을 거 같습니다! 감사합니다.
안녕하세요 선생님! 대단한 질문은 아니고 의견을 여쭙고자 질문 남깁니다. useProfileData 훅에서 queryFn에 profile 조회 실패 시 createProfile을 하는 로직을 짜주셨는데요 혹시 onError 콜백함수에 로직을 정의하지 않고 쿼리함수에 정의하신 이유가 따로 있을까요? 개인적으론 가독성상 onError에 넣는게 조금 더 명확하지않나 싶어서 의견을 여쭤보고 싶네요!
안녕하세요 선생님. 강의를 모두 수강한 후 복습을 하던 중 궁금한 점이 생겨 질문드립니다. 좋아요 기능에서 동시성 문제를 해결하기 위해 행 잠금 을 사용하는 것으로 이해했습니다. 이 경우, 첫 번째 유저의 좋아요 요청이 처리되는 동안 해당 행이 잠기게 되는데, 만약 동시에 많은 사용자(수백~수천 명)가 좋아요 버튼을 누르는 상황 이라면 요청들이 순차적으로 대기하게 되어 응답 지연이 발생되지는 않나요?? 또한 이런 이유 때문에 클라이언트 단에서는 낙관적 업데이트 를 적용하는게 맞는걸까요??
안녕하세요 강의 정말 잘 듣고있습니다. 현재 강의를 무한 중첩 댓글 구현하기까지 수강했습니다! 테스트를 위해 여러가지 사항들을 직접 체크하고있는데 Github로 로그인한 사용자의 정보들(avatar_url, name)들은 기본적으로 사용하지 않고 랜덤한 닉네임과 기본 아바타 이미지가 나오는게 정상 동작일까요? 제가 이해한 흐름은 다음과 같습니다. 1. Github(OAuth) 로그인 2. Supabase Authentication > Users에 사용자 생성 (profile 테이블에는 아직 생성 되지 않음) 3. SessionProvider에서 useProfileData 호출 export default function SessionProvider({ children }: { children: ReactNode }) { const session = useSession(); const setSession = useSetSession(); const isSessionLoaded = useIsSessionLoaded(); const { data: profile, isLoading: isProfileLoading } = useProfileData( session?.user.id, ); useEffect(() => { supabase.auth.onAuthStateChange((event, session) => { setSession(session); }); }, []); if (!isSessionLoaded) return <GlobalLoader />; if (isProfileLoading) return <GlobalLoader />; return children; } 4. fetchProfile(userId) 실행 export async function fetchProfile(userId: string) { const { data, error } = await supabase .from("profile") .select("*") .eq("id", userId) .single(); if (error) throw error; return data; } Supabase Table Editor > profile 에는 아무런 결과가 저장되어 있지 않기 때문에 PostgrestError: PGRST116 에러 발생 useProfileData catch 블록 실행 → createProfile 호출 랜덤한 닉네임 + avatar_url이 기본으로 저장 만약 제가 이해한 흐름이 맞다면 어떤 방법을 써야할까요? 제일 먼저 드는 생각은 createProfile에 session을 매개변수로 받아서 session.user.user_metadata.full_name 과 avatar_url 을 insert에 넣는걸 생각했습니다. createProfile export async function createProfile(userId: string, session?: Session) { const { data, error } = await supabase .from("profile") .insert({ id: userId, // ↓ 여기 수정 했어용 nickname: session?.user.user_metadata?.full_name || getRandomNickname(), avatar_url: session?.user.user_metadata?.avatar_url || null, }) .select() .single(); if (error) throw error; return data; } use-profile-data.ts export function useProfileData(userId?: string) { const session = useSession(); const isMine = userId === session?.user.id; return useQuery({ queryKey: QUERY_KEYS.profile.byId(userId!), queryFn: async () => { try { const profile = await fetchProfile(userId!); return profile; } catch (error) { if (isMine && (error as PostgrestError).code === "PGRST116") { return await createProfile(userId!, session!); // 여기 session 추가 했어용 } throw error; } }, enabled: !!userId, }); } 이렇게 코드를 수정하고 profile table을 삭제한 후 다시 Github로 로그인 하면 사용자의 프로필 이미지와 이름이 받아와졌습니다. 더 효율적이거나 더 좋은 방법이 있을까요? 혹은 제가 잘못 알고 있는게 있을까요?
안녕하세요, 강의 잘 듣고 있습니다! 6.2강 회원가입 구현 강의 18:06경에 설명해주시는 AuthResponse 타입의 정의?가 변경된 것인지, 제 코드 에디터에는 아래와 같이 표시됩니다. 첫 번째 객체 부분 {data: T; error: null}은 이해가 가는데요, 두 번째 객체 부분은 강의상 화면과 차이가 좀 있어서, 추가로 설명해주실 수 있으면 감사하겠습니다.
안녕하세요! 타입 스크립트부터 현재 강의까지 너무 유용하게 잘 듣고 있는 수강생입니다! 9-1 강의를 수강하다가 문득 궁금함이 생겨서 질문 남겨 봅니다. A 유저와 B 유저가 있다고 가정했을 때 A 유저가 프로필 상세 화면을 보고 있는 상태에서 B 유저가 새로운 포스트를 올렸는데, 이후에 A 유저가 메인 리스트 화면으로 이동하면 B 유저가 올린 새로운 포스트가 로드되지 않는 것으로 보입니다! (새로 고침하면 당연히 정상적으로 보이고요) 제가 코드 작성을 하면서 놓친 부분이 있어 이러한 현상이 발생하는 것인지, 아니면 이후 강의에서 해당 부분이 수정되는 것인지 여쭤보고 싶습니다. 늘 좋은 강의 감사합니다! 🙂 좋은 하루 보내세요~!