inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

input 입력시 리스트 리렌더링 질문입니다.

미해결

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

말그대로 input 입력시 리스트가 리렌더링 되는거로 데브툴에서 보이는데 리스트 리렌더링이 안되게 하려면 어떻게 해야 하나요? 일전 한입리액트에서는 contextApI를 사용해서 그런가 생각을 하고 넘어갔었는데 지금도 동일하네요.

  • react
  • typescript
  • react-query
  • supabase
  • zustand
조민영 댓글 2 좋아요 1 조회수 77

tailwind css 클래스 네임 오타인가요?

미해결

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

강의 28:25 정도에 컨텐츠 부분 테일윈드 클래스 설정에 오타인지 확인해 주세요. break-words 가 word-break 를 표기한 건 가요? 아니면 테일윈드 버전에 따른 클래스 네임 변경인가요? {/* 2-1. 컨텐츠 */} <div className="line-clamp-2 break-words whitespace-pre-wrap"> {post.content} </div> 그리고 좋아요 버튼, 댓글 버튼 부분 에서 border-1 도 border 로 수정해야 할 듯 합니다. border 의 1은 단위를 생략하는 것으로 압니다.

  • react
  • typescript
  • react-query
  • supabase
  • zustand
Codingbear 댓글 2 좋아요 1 조회수 128

SQL Shell의 역할이 무엇인가요?

미해결

맛집 지도앱 만들기 (React Native & NestJS)

강의에서 비밀번호 입력하는 SQL Shell은 무슨 역할을 하는 건가요? SQL Shell을 켜서 비밀번호 입력을 하는데 이렇게 비밀번호까지 입력을 함으로써 어떤 일이 일어나는 건가요?? 해당 부분을 생략하면 어떤 일이 생기는 건가요 그리고 매번 서버를 킬 때 SQL Shell도 켜야하는 건가요? 안키고도 서버 동작은 잘 됩니다!

  • react-native
  • typescript
  • nestjs
  • react-query
  • zustand
oridori2705 댓글 1 좋아요 0 조회수 128

[5-2] 글 목록 무한스크롤 구현하기 with InfiniteQuery 10:40/ useScrollTop(ref) 사용관련

미해결

아바타 커뮤니티앱 만들기 (React Native Expo)

18번째 줄에서 useEffect 같은 훅에서 호출한 게 아닌데 useScrollToTop()은 어떻게 트리거되어 동작하는지 궁금합니다. 6번째 줄에서 useScrollToTop() 훅은 "@react-navigation/native"에서 가져오고 있는데, "expo-router"와 같이 사용해도 되나요?

  • react-native
  • typescript
  • expo
  • react-hook-form
  • react-query
Jena Kim 댓글 2 좋아요 0 조회수 135

제공 코드 eslint.config.js 파일 질문

미해결

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

선생님 제공 자료 eslint.config.js 파일에서 아래 코드로 작성되어 있는데 no-explicit-any 규칙이 오타난 걸까요? 강의는 2:40 쯤입니다 "@typescript-eslint/no-explicity-any": "off",

  • react
  • typescript
  • react-query
  • supabase
  • zustand
우잉 댓글 1 좋아요 2 조회수 83

중복 회원가입

미해결

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

이미 가입된 이메일로 다시 회원가입 시도하면 강의에서는 400 오류?가 발생하는데 저는 오류는 발생하지 않고 response에서 session 부분만 null 로 오는데 빠진 설정이 있을까요?

  • react
  • typescript
  • react-query
  • supabase
  • zustand
댓글 2 좋아요 0 조회수 104

'쿼리키 관리의 필요성' 도입부 설명에 대한 보충설명 필요

미해결

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

안녕하세요, 선생님. 강의 너무 잘 듣고 있습니다! 강의 수강 중 이해가 되지 않는 부분이 있어 질문남깁니다. 질문부분: (4.7) 캐시 데이터 다루기 1 (8:05~) 질문내용: " ['todos'] 에 대해 쿼리 무효화할 경우 ['todos', id] 쿼리키에 대해서도 불필요하게 리페칭이 수행된다." 부분이 잘 이해가 가질 않습니다. 구글링하고 챗지피티에 물어본 결과, 두 개는 각각 다른 쿼리키 배열로 판정될 거라고 생각했습니다. 따라서 앞선 내용의 '리페칭'은 수행되지 않을 것이라고 예상했습니다. 제가 어느 부분을 놓치고 있는지 보충 설명 해주시면 감사하겠습니다:)

  • react
  • typescript
  • react-query
  • supabase
  • zustand
wonza4372 댓글 2 좋아요 0 조회수 90

회원가입 구현 관련 질문

미해결

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

관련 섹션: 42. (6.2) 회원가입 구현하기 질문 내용 회원가입 요청을 보냈을 때 반환되는 data 객체 안에 user 값은 있는데, session 값이 null입니다. 강의에서 알려주신 대로 진행했고, 한 가지 다르게 진행한 부분은 Supabase 이메일 세부옵션에 'Confirm email'이 존재하지 않아 이 부분만 off 처리를 하지 못했습니다. 회원가입 요청을 보내면 반드시 data 객체 안에 session값까지 포함되어야 할까요?

  • react
  • typescript
  • react-query
  • supabase
  • zustand
댓글 3 좋아요 1 조회수 113

useInfiniteQuery promise와 react use 사용시 페이지 무한 로딩

미해결

Next + React Query로 SNS 서비스 만들기

리액트 쿼리의 suspense 스트리밍 기능 구현 중 버그가 발생해 인사이트를 얻고자 질문드립니다. 상위 컴포넌트에서 useInfiniteQuery 로 promise를 반환하고, 해당 promise를 자식 컴포넌트의 props로 넘긴 뒤 React의 use hook으로 감싸서 data를 반환하도록 구현했습니다. 그리고 promise를 throw하는 자식 컴포넌트를 Suspense로 감싸서 promise를 캐치하도록 했는데요. 페이지 렌더링 자체는 정상적으로 되는데, request가 완료되지 않는 문제가 있습니다. 크롬 개발자도구의 Network 탭에서 document를 확인하면 "Caution: request is not finished yet"이라는 경고가 표시됩니다. TanStack Query 공식 문서에도 useInfiniteQuery 의 promise 사용 시 "This can be used with React.use() to fetch data"라고 명시되어 있어 React use 와 함께 사용하라고 안내하고 있는데, 혹시 이 문제의 원인을 알 수 있을까요? 참고로 prefetch는 안했습니다. 그리고 prefetch 안하는 방법으로 suspense 스트리밍을 구현하고 싶습니다. 코드는 아래와 같습니다. 감사합니다! export default function DetailReviewWrapper({ pid, userId }: DetailReviewProps) { const { infoData, observerRef, isFetchingNextPage, refetch, promise } = useReviewListInfinity({ userId, pid, }) return ( <Suspense fallback={<DetailReviewLoading />}> <DetailReview pid={pid} userId={userId} promise={promise} refetch={refetch} isFetchingNextPage={isFetchingNextPage} observerRef={observerRef} /> </Suspense> ) } export default function DetailReview({ pid, userId, promise, refetch, isFetchingNextPage, observerRef, }: DetailReviewProps) { const data = use(promise) return ( <> <section> <ReviewListView userId={userId} pid={pid} data={data?.list || []} className={cn('review-list')} refetch={refetch} showPoint /> {isFetchingNextPage && <Loading />} <div ref={observerRef} /> </section> export function useReviewListInfinity(params: UseReviewListInfinityProps) { const section = useSearchParams().get('contentType') as SectionType const orderType = useRecoilValue(commentOrderState) const filterType = useRecoilValue(filterTypeState) const { fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, refetch, promise } = useInfiniteQuery({ queryKey: [REVIEW_LIST_KEY, params, orderType, filterType, section], queryFn: ({ pageParam = 1 }) => getReviewApi({ uid: params.userId, pid: params.pid, section, pageInfo: { curPage: pageParam, pageSize: 20, }, orderType: orderType === 'RECOMMENDED' ? 'like' : 'date', filterType, }), select: (data) => { return { list: data.pages.flatMap((page) => page.data.list), info: data.pages[0].data.info, } }, getNextPageParam: (lastPage) => { const nextPage = lastPage.data.pageInfo.curPage + 1 return nextPage <= lastPage.data.pageInfo.pageCount ? nextPage : undefined }, initialPageParam: 1, }) const { observerRef } = useIntersectionObserver({ onScroll: () => { if (hasNextPage && !isFetchingNextPage) { fetchNextPage() } }, }) return { isLoading, isFetchingNextPage, observerRef, refetch, promise, } } const getQueryClient = (): QueryClient => new QueryClient({ defaultOptions: { queries: { refetchOnWindowFocus: false, refetchInterval: false, refetchOnReconnect: true, refetchOnMount: true, staleTime: Infinity, gcTime: Infinity, retry: false, experimental_prefetchInRender: true, }, }, }) 무한 로딩 시 개발자 도구 캡쳐이미지입니다.

  • react
  • next.js
  • react-query
  • next-auth
  • msw
변재정 댓글 1 좋아요 0 조회수 137

혹시 해당 강의에서invalidateQueries를 사용한 이유가 있을까요?

미해결

맛집 지도앱 만들기 (React Native & NestJS)

invalidateQueries와 setQueryData 이전 강의 영상에서는 네트워크 요청을 최소화의 목적으로 setQueryData를 사용했는데 이번 강의 영상에서는 invalidateQueries를 사용한 이유가 있을까요? 단순히 궁금해서 입니다!

  • react-native
  • typescript
  • nestjs
  • react-query
  • zustand
oridori2705 댓글 2 좋아요 0 조회수 123

(3.7)

해결됨

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

todo.ts에서 26번째줄에 사진과 같이 뜨는데 왜 이렇게 뜨는지 궁금합니다.

  • react
  • typescript
  • react-query
  • supabase
  • zustand
딩딩딩 댓글 3 좋아요 0 조회수 107

섹션 3 퀴즈 5번 문제 해설 관련 질문

해결됨

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

안녕하세요. 섹션 3 퀴즈에서 5번 문제 관련 질문 드립니다. 질문: persist 미들웨어 사용 시, 액션 함수가 기본적으로 저장되지 않는 이유는 무엇일까요? 해설: persist 미들웨어는 상태를 JSON 형태로 저장하기 때문에, JSON으로 직렬화할 수 없는 함수는 저장하지 않아요. 따라서 serialize 옵션으로 상태만 저장하는 것이 좋습니다. 강의에서 serialize 가 아닌 partialize 로 설명해주셨는데, 이 부분 확인 부탁드립니다.

  • react
  • typescript
  • react-query
  • supabase
  • zustand
춘식이 댓글 2 좋아요 0 조회수 79

(7.14) 포스트 삭제 후 무한 스크롤이 작동하지 않는 문제

해결됨

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

안녕하세요. 좋은 강의 잘 수강하고 있습니다! 다름이 아니라 포스트 삭제 후에 무한 스크롤이 작동하지 않는 문제가 발생했습니다. 문제 상황은 다음과 같습니다. 첫 페이지(다음 페이지의 데이터를 페칭하지 않은 상태)에서 작성한 포스트를 삭제 이후 페이지 최하단까지 스크롤 했지만 무한 스크롤 데이터 페칭이 이루어지지 않음 부족한 실력이라 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

  • react
  • typescript
  • react-query
  • supabase
  • zustand
seong2 댓글 1 좋아요 4 조회수 132

토큰 관리에 대해 질문을 드리고 싶습니다.

해결됨

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

안녕하세요 멘토님, 정말 쉽게 설명해주셔서 수업 잘 듣고 있습니다. 인증 처리하기 부분에 대해서 흐름도를 자세하고 재밌게 설명해주셔서 덕분에 이해하기 수월했습니다. 다만 현재 토큰들을 localStorage에 저장하고 이 값을 zustand로 관리하고 있는 것 같은데 사실 토큰을 storage에 저장하는 방식이 일반적이지는 않은 것 같습니다. 이 부분에 대해서 찾아본 결과 supabase를 이용하기에 쿠키에 저장하는 건 무리인 것 같고, 그렇다면 그나마 토큰을 메모리에 저장하는 방식이 안전할 것 같습니다. 로그인을 진행하면 토큰이 localStorage에 저장되는 형태인데, 이때 만약 storage에 저장하지 않고 메모리에 받게하려면 어떻게 할 수 있을까요 .. ? 또한 사실 토큰 자체를 zustand에서 가지고 있는 것도 괜찮은지 의문입니다.. 전역상태로 들고 있는 것이라서 충분히 탈취위험이 있을 것이라고 생각이 되어서요.. 사실 백엔드 서버가 있었다면 쿠키에 저장하는 로직으로 진행했을 거 같은데 만약 이때는 로그인 상태를 어떻게 판별하는지에 대해서도 궁금합니다 !

  • react
  • typescript
  • react-query
  • supabase
  • zustand
이헨 댓글 2 좋아요 0 조회수 146

fetch api의 상태값 유지

미해결

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

안녕하세요..강의 잘 보고 있습니다. import { ITodoInfo } from "@/utils/types"; export async function fetchTodos(blngCoCd:string, userId:string) { const respose = await fetch( `${process.env.NEXT_PUBLIC_API_SERVER_URL}/todo/list?blngCoCd=${blngCoCd}&userId=${userId}` ); if (!respose.ok) { throw new Error("Fetch Todo Error"); } const data: ITodoInfo[] = await respose.json(); console.log('todo data=',JSON.stringify(data, null, 2)); return data; } import { fetchTodos } from "@/api/todo/fetch-todos"; import useUserInfoStore from "@/store/user-info-store"; import { ILoginUserInfo } from "@/utils/types"; import { useQuery } from "@tanstack/react-query"; export function UserTodosData() { const loinData: ILoginUserInfo = useUserInfoStore((state) => state.userInfo); return useQuery({ queryFn: () => fetchTodos(loinData.blngCoCd, loinData.userId) , queryKey: ["todos"], }); } 이런식으로 zustand의 유저 정보를 가져와 훅에서 api를 호출을 하면 처음은 정보를 가져오는데. refresh를 하면 다시 가져 올때 blngCoCd와 userId가 null이 되면서 리스트를 가져오지 못하네요. zustand의 정보는 localstorage로 보관하고 있고... const loinData: ILoginUserInfo| null = useUserInfoStore((state) => state.userInfo); const blngCoCd = loinData?.blngCoCd; const userId = loinData?.userId; // blngCoCd와 userId가 모두 존재할 때만 쿼리를 활성화합니다. const enabled = !!blngCoCd && !!userId; return useQuery({ queryFn: () => fetchTodos(blngCoCd, userId) , queryKey: ["todos", blngCoCd, userId], enabled: enabled, }); 이렇게 변경을 했는데... api에 파라미터를 넘겨야 하는경우 새로고침을 할 경우 이런식으로 하는게 일반적인가요?

  • react
  • typescript
  • react-query
  • supabase
  • zustand
shoncg 댓글 2 좋아요 0 조회수 115

import 파일 경로를 찾지 못 해서 에러가 발생합니다.

미해결

Next + React Query로 SNS 서비스 만들기

안녕하세요. 에러가 발생해서 질문드립니다. 경로는 아무리 봐도 맞게 쓴거 같은데 찾지를 못 합니다. Build Error Module not found: Can't resolve '@/app/(afterLogin)/_component/FollowRecommend' ./Desktop/FRONT/z-com/src/app/(afterLogin)/layout.tsx (10:1) Module not found: Can't resolve '@/app/(afterLogin)/_component/FollowRecommend' 8 | import LogoutButton from "@/app/(afterLogin)/_component/LogoutButton"; 9 | import TrendSection from "@/app/(afterLogin)/_component/TrendSection"; > 10 | import FollowRecommend from "@/app/(afterLogin)/_component/FollowRecommend"; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 11 | 12 | export default function AfterLoginLayout({ children }: { children: ReactNode }) { 13 | return ( Import map: aliased to relative './src/app/(afterLogin)/_component/FollowRecommend' inside of [project]/Desktop/FRONT/z-com/src https://nextjs.org/docs/messages/module-not-found

  • react
  • next.js
  • react-query
  • next-auth
  • msw
김영제 댓글 2 좋아요 0 조회수 180

댓글 수정, 삭제 시 캐시 수정

미해결

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

강의 정말 잘 듣고있습니다! 10.6 강의 수강 중 댓글 추가 시에는 Comment 타입과 일치시키기 위해 프로필 데이터를 조회해서 author 객체를 포함시켜주었는데 수정, 삭제 시에는 왜 따로 처리를 하지 않는지 궁금합니다. 삭제 시에는 해당 데이터를 삭제하기에 불필요하다고 생각되긴하는데 수정 시에는 왜 에러가 발생하지 않나요??

  • react
  • typescript
  • react-query
  • supabase
  • zustand
rladbstjd96 댓글 3 좋아요 0 조회수 125

빠르게 실행해보고싶습니다.

미해결

맛집 지도앱 만들기 (React Native & NestJS)

강의를 다 듣지 않은 상태에서 빠르게 실행을 해보고 싶습니다. 서버 실행, 데이터베이스 연결 이런 건 잘 했는데 지도 라이브러리 다운 및 설정 등 일부 강의만 듣고 설정해서 실행하려고 하니 문제가 생기네요. 필요한 라이브러리 버전 등 실행에 필요한 정보가 한꺼번에 나와있는 글은 없나요? ❗ 질문 작성시 꼭 참고해주세요 에러 메세지에서 단서를 찾을 수 있는 경우가 많습니다. 에러 메세지를 읽고 한번 검색해보시는것을 추천드립니다. 질문글을 작성하실때는, 현재 문제(또는 에러)와 코드나 github 을 첨부해주세요. 개발중인 OS, ReactNative, Node 버전 등의 개발환경 을 알려주셔야합니다. 에러메세지는 일부분이 아닌 전체 상황을 올려주세요. 일부만 보여주시면 답변이 어렵습니다. (에러 일부만 자르거나 일부만 복사하지말아주세요 )

  • react-native
  • typescript
  • nestjs
  • react-query
  • zustand
batch sarm 댓글 1 좋아요 0 조회수 116

forget-password 이후 reset password 이메일이 오지 않네요.

해결됨

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

강의 잘 듣고 있습니다. 다름이 아니라, forget-password 로 정상적으로 처리가 되었다고 하는데요. 그러나, 등록해 둔 이메일로 reset password 메일이 오지 않네요. 혹시 Supabase 셋팅에서 어떤 부분을 확인해야 할까요? 검색을 해보니 이렇게 셋팅하라고 해서 한 상태입니다 답변 부탁드립니다.

  • react
  • typescript
  • react-query
  • supabase
  • zustand
억수 댓글 2 좋아요 0 조회수 150

[staleTime 설정] 새로고침 시 로딩 중 대신 에러 메세지 출력

미해결

한 입 크기로 잘라먹는 React.js 실전 프로젝트 - SNS 편

staleTime 을 5초로 설정하고 slow4G 로 설정한 다음 /todos/1 페이지 에서 새로고침을 했는데 로딩중입니다.. 가 아니라 오류가 발생했습니다. 가 잠깐 나오고 페이지가 정상적으로 랜더링 되어서 아래와 같이 error 조건문을 수정하고 data?.content 로 바꾸니까 강사님께서 알려주신대로 로딩중입니다.. 가 잠깐 나오고 페이지가 정상적으로 랜더링 됩니다. 혹시 이렇게 해도 상관이 없는건지 여쭤봅니다

  • react
  • typescript
  • react-query
김성빈 댓글 2 좋아요 0 조회수 114

인기 태그

인프런 TOP Writers

주간 인기글