[Next.js] Error: Rendered more hooks than during the previous render.

์ •๋‹ค๋กฑยท2024๋…„ 10์›” 24์ผ

๐Ÿ’ฅ Error: Rendered more hooks than during the previous render.


๋ฌธ์ œ ๋ฐœ์ƒ
๋งˆ์ด ํŽ˜์ด์ง€ ์ œ์ž‘ ์ค‘, ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด tanstackQuery ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ user์ •๋ณด์™€ post ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ–ˆ์Œ
usePostByUser(user.id) post๋ฅผ ์š”์ฒญํ•  ๋•Œ user id๊ฐ€ ํ•„์š”ํ•ด์„œ useSession์œผ๋กœ ๋จผ์ € user ์ •๋ณด๋ฅผ ๋ฐ›๊ณ  user.id๋ฅผ ๋„ฃ์œผ๋ ค๊ณ  ํ–ˆ์Œ

๊ทธ๋Ÿฐ๋ฐ

const {data: user} = useSession();
const {data: posts} = usePostByUser(user.id);

์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ๊นŒ Cannot read properties of undefined (reading 'getUser') ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•จ
user ๋ฐ›์•„์˜ค๊ธฐ ์ „์— posts ์š”์ฒญ์ด ๊ฐ€์„œ user๊ฐ€ ์—†๋‹ค๊ณ  ๋‚˜์˜ด

๊ทธ๋Ÿผ user๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ posts ์š”์ฒญ์„ ๋ฐ›์•„์•ผํ•˜๋‚˜ ์‹ถ์–ด์„œ

const {data: user, isLoading, isError} = useSession();

if (!user || isLoading || isError) {
  return ;
}

const {data: posts} = usePostByUser(user.id);

์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ–ˆ๋”๋‹ˆ ํ•ด๋‹น ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค~

๋ฌธ์ œ ์›์ธ
React๋Š” Hook์ด ํ˜ธ์ถœ๋˜๋Š” ์œ„์น˜๋ฅผ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š”๋ฐ, ๊ทœ์น™์„ ์–ด๊ธธ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค!

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€ํ‘œ ์ƒํ™ฉ
1. ์กฐ๊ฑด๋ถ€๋กœ Hooks ํ˜ธ์ถœ
2. ๋ฐ˜๋ณต๋ฌธ ๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ Hooks ํ˜ธ์ถœ
3. ์กฐ๊ฑด์— ๋”ฐ๋ผ Hook ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๊ผญ ์ตœ์ƒ๋‹จ์— ๋‘๊ฐœ๋ฅผ ์—ฐ๋‹ฌ์•„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์ฒ˜๋ฆฌํ•ด์•ผํ•œ๋‹ค๋Š” ๋ง.

๋ฌธ์ œ ํ•ด๊ฒฐ
์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  user, post ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• enabled, useEffect, ์ƒ์œ„์—์„œ ์š”์ฒญํ•˜๊ณ  props ๋‚ด๋ฆฌ๊ธฐ ๋“ฑ ์ค‘์—์„œ enabled ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค.

export const usePostByUser = (userId: string | undefined) => {
  return useQuery({
    queryKey: ["post", userId],
    queryFn: () => fetchPostByUser(userId),
    retry: 1,
    enabled: !!userId, // userId๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์š”์ฒญ ์‹คํ–‰
  });
};

  const { data: user } = useSession();
  const { data: posts, isLoading } = usePostByUser(user?.id);

0๊ฐœ์˜ ๋Œ“๊ธ€