(6.11) 회원가입시 프로필 정보 자동 생성하기 Q. 호출 순서 문의
22
投稿した質問数 4
안녕하세요 6.11 회원가입시 프로필 정보 자동 생성하기 강의중18:17 분 쯤에
아래처럼 useProfileData(session?.user.id) -> useEffect 훅을 선언하는데
처음에는 session?.user.id이 값이 없는데 useProfileData 훅을 먼저 부르는게 맞나요?
저는 useEffect -> useProfileData 이 순서가 맞다고 생각해서요
원본
export default function SessionProvider({ children }: { children: ReactNode }) {
const session = useSession();
const setSession = useSetSession();
const isSessionLoaded = useIsSessionLoaded();
const {
data: profile,
isLoading: isProfileLoading,
isPending,
} = useProfileData(session?.user.id);
useEffect(() => {
supabase.auth.onAuthStateChange((event, session) => {
setSession(session);
});
}, []);
if (!isSessionLoaded) return <GlobalLoader />;
if (isProfileLoading) return <GlobalLoader />;
return children;
}
내 생각
export default function SessionProvider({ children }: { children: ReactNode }) {
const session = useSession();
const setSession = useSetSession();
const isSessionLoaded = useIsSessionLoaded();
useEffect(() => {
supabase.auth.onAuthStateChange((event, session) => {
setSession(session);
});
}, []);
const {
data: profile,
isLoading: isProfileLoading,
isPending,
} = useProfileData(session?.user.id);
if (!isSessionLoaded) return <GlobalLoader />;
if (isProfileLoading) return <GlobalLoader />;
return children;
}
回答 1
0
안녕하세요 이민진님 이정환입니다.
결론부터 말씀드리면, useEffect를 useProfileData보다 위에 두든 아래에 두던 동작에는 전혀 차이가 없습니다.
useEffect는 코드 위치가 아니라 라이프사이클에 맞춰 동작합니다. 따라서 어떤 위치에 작성되어 있던, 다음과 같이 의존성 배열(deps)가 빈 배열로 설정되어 있다면 이 컴포넌트가 마운트 된 이후에 실행됩니다.
PS. 이 내용은 선수 강의인 한 입 크기로 잘라먹는 리액트에서 다룹니다.
useEffect(() => {
supabase.auth.onAuthStateChange((event, session) => {
setSession(session);
});
}, []);
useProfileData 역시 코드 위치가 아니라 React의 렌더링 사이클에 맞춰 동작합니다.
컴포넌트가 렌더링될 때마다 호출되긴 하지만, 내부적으로는 React Query(TanStack Query)의 enabled 옵션을 활용해 인자로 전달된 userId 값이 유효할 때에만 실제 데이터 fetching이 일어나도록 구현되어 있습니다.
PS. 이 내용은 이전 섹션인 Tanstack Query 섹션에서 다룹니다
// (... 중략)
export function useProfileData(userId?: string) {
const session = useSession();
const isMine = userId === session?.user.id;
return useQuery({
queryKey: QUERY_KEYS.profile.byId(userId!),
queryFn: async () => {
// (... 중략)
},
enabled: !!userId, // <- userId가 있을 때 실행 된다
});
}
따라서 실행 순서는 이렇게 됩니다
1. 첫 렌더 → session이 아직 null이므로 useProfileData(undefined)로 호출됨
→ 그러나 enabled: !!userId가 false이기 때문에 실제 fetch는 일어나지 않음
2. 렌더링이 끝난 직후 useEffect의 콜백이 실행되어 onAuthStateChange 리스너가 등록됨
3. Supabase가 세션을 복구해 콜백을 호출 → setSession이 실행되어 세션 상태가 갱신됨
4. 세션 갱신으로 SessionProvider가 리렌더 → 이번엔 유효한 id로 useProfileData(session.user.id)가 호출됨
5. enabled가 true가 되면서 그제서야 React Query가 실제 프로필 데이터를 fetch 하기 시작함
명시적 타입 선언(콜론 타입 선언)과 as 타입 단언 차이
0
28
2
useMutation 적용 후 새로운 글 등록시 content가 안보여요
0
41
2
6.8 zustand 세션 질문입니다.
0
89
2
next.js 강의에서도 리액트 라이브러리들을 다뤄주시나요?
0
73
2
shadcn에서 radix ui와 base ui 차이는 뭔가요?
1
281
2
updateTodo 함수 생성시 화살표 함수 사용 안하는 이유
0
72
2
4.11 바로 투두 삭제가 안됨 질문
0
80
3
매개변수 updatedTodo 관련 질문
0
62
3
인증 정보가 만료되었을 때 라우트 가드 처리가 궁금합니다!
0
77
2
supabase를 사용하지 않을 경우 세션 데이터의 변경을 감지하고 스토어에 보관하는 방법이 궁금합니다!
0
66
2
4.6 id를 string으로 변경시 오류
0
63
2
리액트 타입스크립트 관련 질문있습니다.
0
58
1
소셜 로그인 구현하기 관련하여 질문이 있습니다!
0
94
2
ui 파일 질문드립니다.
0
73
1
tanstack query devtools에서 질문있습니다!
0
64
2
댓글 삭제 시 isPending 질문
0
60
2
두번째 예외상황에 대해 질문있습니다!
0
62
1
리액트 쿼리 질문입니다
1
68
2
개발자도구에서 components 가 안보입니다.
0
91
3
state 관리에 대한 정리
0
75
3
[(2.4) Shadcn/ui를 소개합니다] 강의 Shadcn 세팅 관련 질문 있습니다.
0
173
3
like 테이블에서 왜 create_at이 필요한지 궁금합니다.
0
74
1
삭제가 바로 안되네요ㅠ
0
62
2
access 토큰은 꼭 소셜서버로부터 받아서 사용해야만하나요?!
0
77
2

