묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
강의 예제 관련해서 질문이 있습니다.
2.14) 비동기 작업 처리하기 3. Async&Awat 강의 예제 질문 async function getData() { return new Promise((resolve, reject) => { setTimeout(() => { resolve({ id: "Lu75", username: "Lu", }); }, 1500); }); } async function printData() { const data = await getData(); console.log(data, "...?"); return data; // 아마도 저 await 동작을 기다리기 전에 반환 처리가 먼저 되는 것일까? } console.log(printData()); // Promise 객체가 콘솔에 찍힙니다.질문 요약: printData()를 호출한 값을 console.log()로 출력할 때, 왜 Prmise 객체가 찍히는 걸까요? 예제 코드에서 printData() 함수에서 data 라는 변수에 getData() 함수의 실행 결과? Promise 객체에서 resolve 값이 담기는 거로 이해하고 있어서 data 변수를 return을 해서 console.log()로 출력을 해봤는데 제가 예상한 값이 나오지 않았습니다. 강의에서 나온 내용으로 제가 이해하기로는 await 키워드는 비동기의 작업을 기다려준다고 하여 data 변수에 당연히 getData()에서 Promise 객체가 resolve한 결과 값이 담기고 그 후에 return을 하는 줄 알았거든요! printData()를 호출한 값이 data의 값이 아닌 Promise 객체가 출력되어 이해가 되지 않아 질문을 합니다.getData() 함수에서 Promise의 executor 함수 부분에서 setTimeout()을 사용하여 1500ms를 기다리기 전에 printData()가 실행이 종료되어 그런걸까요..? 실행 순서가 잘 이해가 되지 않아 질문 남깁니다...!
-
미해결한 입 크기로 잘라먹는 실전 프로젝트 - SNS 편
(3.7)
todo.ts에서 26번째줄에 사진과 같이 뜨는데 왜 이렇게 뜨는지 궁금합니다.
-
미해결AI와 함께 배우는 Next.js
퀴즈 질문에 불필요한 문자들이 있어요
퀴즈에 1., 2. 이런 문자들이 있어서 보기가 조금 불편합니당 ..! 그래도 이해는 가능합니다 ..ㅎㅎ
-
미해결[Live 챌린지] 6주 완성! 개발 실무를 위한 고농축 바이브코딩 (Cursor AI, Figma)
Rules와 Commands의 차이가 뭘까요?
Cursor를 업데이트하고 기능을 확인하던 중에 Rules 말고도 Commands 라는 기능을 있는걸 봤어요. 설명을 읽어보고, 몇 번 실행해 보긴 했는데 Rules 를 배우고 적용해보는게 이번이 처음이라서 그런지 두 개가 비슷해보이고 차이점을 잘 모르겠네요. 제가 이해할 수 있는건 Rules는 코드를 바꿀 수 있고, Commands 바꿀 수 없다 정도인 것 같아요. Commands를 잘 쓰면 팀에서 쓰기도 좋을 것 같은데, 혹시 현재 쓰고 계신다면 라이브 강의에서 간단하게 라도 설명해주실 수 있나요? 아래는 Commands 관련 공식 링크 입니다:https://cursor.com/ko/docs/agent/chat/commands
-
해결됨[자바스크립트 GUI 개발 #1] Electron + React로 만드는 타이머 앱 (+ Zustand)
일렉트론 패키징 및 배포 관련 질문
질문 내용안녕하세요! 강의 너무 잘 들었습니다.회사에서 electron으로 앱을 만들어야 해서 참고하게 되었는데 많은 도움이 되었습니다.추가로 질문이 있는데, 강의에서 loadURL 방식으로 앱을 가져와서 돌리게 되어있는데,혹시 해당 강의에서 loadFile로 빌드된 파일을 가져와서 동작시키지 않은 이유가 있으실까요?찾아보니 빌드를 해서 사용하면 offline 지원이 가능하다, 대신 파일 경로를 수정해주어야 한다는 차이가 있던데, 관련해서 혹시 추가 차이점이나 주의사항이 있는지 궁금합니다.좋은 강의 감사합니다!
-
미해결한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
리액트는 전부 CSR인가요?
안녕하세요. vue.js를 사용하다 리액트를 배우고 있습니다.현재 회사에서 진행중인 프로젝트에서 일부는 뷰, 일부는 뷰+nuxt.js를 사용합니다. 뷰만 사용하는 페이지는 SSR이고, nuxt.js는 CSR라고 합니다.(상사의 설명) 질문 // 리액트는 무조건 CSR로 되는건가요? next.js를 사용하면 크게 어떤점이 다른가요?(이 프로젝트 후 한입next 수강예정입니다..간단하게 먼저 질문드립니다.) 프로젝트와 뷰js를 완벽하게 이해하지 못해서 질문이 명확하지 못해 죄송합니다.
-
미해결한 입 크기로 잘라먹는 실전 프로젝트 - SNS 편
섹션 3 퀴즈 5번 문제 해설 관련 질문
안녕하세요.섹션 3 퀴즈에서 5번 문제 관련 질문 드립니다. 질문: persist 미들웨어 사용 시, 액션 함수가 기본적으로 저장되지 않는 이유는 무엇일까요?해설: persist 미들웨어는 상태를 JSON 형태로 저장하기 때문에, JSON으로 직렬화할 수 없는 함수는 저장하지 않아요. 따라서 serialize 옵션으로 상태만 저장하는 것이 좋습니다. 강의에서 serialize가 아닌 partialize로 설명해주셨는데, 이 부분 확인 부탁드립니다.
-
해결됨한 입 크기로 잘라먹는 실전 프로젝트 - SNS 편
(7.14) 포스트 삭제 후 무한 스크롤이 작동하지 않는 문제
안녕하세요. 좋은 강의 잘 수강하고 있습니다!다름이 아니라 포스트 삭제 후에 무한 스크롤이 작동하지 않는 문제가 발생했습니다.문제 상황은 다음과 같습니다.첫 페이지(다음 페이지의 데이터를 페칭하지 않은 상태)에서 작성한 포스트를 삭제이후 페이지 최하단까지 스크롤 했지만 무한 스크롤 데이터 페칭이 이루어지지 않음 부족한 실력이라 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
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
Next.js 마치며.. 강의 피드백 폼 링크 연결 문제가 있습니다.
안녕하세요. 좋은 강의로 Next.JS 수강을 마쳤습니다.그런데 수업노트에 있는 강의 피드백 폼 링크가 엉뚱한 곳으로 연결 됩니다. https://forms.gle/MhvAagJvttQCtS1f6 링크 주소를 치고 들어가면 제대로 들어 접근하는데..링크를 클릭하면 다른 곳으로 연결됩니다. 수정이 필요합니다.
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
이강의 듣고 소화시켰다면 몇년차 정도 개발자라고 할수 있을까요?
그냥 갑자기 궁금해서 선생님의 개인적인 의견 궁금합니다.
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
revalidateTag 에서 매개 변수가 하나 더 늘어서 질문합니다.
안녕하세요. next.js 16 버전으로 해당 강의를 보며 달리고 있는데요.revalidateTag 설정에서 파라미터 값이 하나 더 늘어나 있습니다.revalidateTag(tag: string, profile: string | { expire?: number }): void; tag 파라미터 뒤에 profile 파라미터를 넣어야 하네요.기본적으로는 'max' 값을 넣었고, expire로 사용자 지정 만료 동작을 위한 값을 지정하게 되어 있습니다.이것이 구체적으로 어떤 매개변수인지 궁금합니다.그리고 이전의 tag 파라미터만 있을 경우 와 같은 조건의 매개변수 값은 어떻게 되는지 알고 싶습니다.
-
해결됨한 입 크기로 잘라먹는 실전 프로젝트 - SNS 편
토큰 관리에 대해 질문을 드리고 싶습니다.
안녕하세요 멘토님, 정말 쉽게 설명해주셔서 수업 잘 듣고 있습니다.인증 처리하기 부분에 대해서 흐름도를 자세하고 재밌게 설명해주셔서 덕분에 이해하기 수월했습니다. 다만 현재 토큰들을 localStorage에 저장하고 이 값을 zustand로 관리하고 있는 것 같은데 사실 토큰을 storage에 저장하는 방식이 일반적이지는 않은 것 같습니다.이 부분에 대해서 찾아본 결과 supabase를 이용하기에 쿠키에 저장하는 건 무리인 것 같고, 그렇다면 그나마 토큰을 메모리에 저장하는 방식이 안전할 것 같습니다.로그인을 진행하면 토큰이 localStorage에 저장되는 형태인데, 이때 만약 storage에 저장하지 않고 메모리에 받게하려면 어떻게 할 수 있을까요 .. ?또한 사실 토큰 자체를 zustand에서 가지고 있는 것도 괜찮은지 의문입니다.. 전역상태로 들고 있는 것이라서 충분히 탈취위험이 있을 것이라고 생각이 되어서요..사실 백엔드 서버가 있었다면 쿠키에 저장하는 로직으로 진행했을 거 같은데만약 이때는 로그인 상태를 어떻게 판별하는지에 대해서도 궁금합니다 !
-
미해결한 입 크기로 잘라먹는 실전 프로젝트 - SNS 편
fetch api의 상태값 유지
안녕하세요..강의 잘 보고 있습니다. 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.js) : 기초부터 실전까지
함수나 변수 작성(선언?) 위치 선택 기준
아래의 코드를 기준으로 했을때, getMonthlyData함수는 Home 컴포넌트의 바깥에서 작성해주고 있고, 그외에 onIncreaseMonth같은 것은 Home 내부에 작성해주고 있는데, 매번 이런 작성 위치가 헷갈리더라고요. 작성 위치를 정하는 명확한 기준이 따로 있을까요??import { useState, useContext } from "react"; import { DiaryStateContext } from "../App"; import Header from "../components/Header"; import Button from "../components/Button"; import DiaryList from "../components/DiaryList"; const getMonthlyData = (pivotDate, data) => { const beginTime = new Date( pivotDate.getFullYear(), pivotDate.getMonth(), 1, 0, 0, 0 ).getTime(); const endTime = new Date( pivotDate.getFullYear(), pivotDate.getMonth() + 1, 0, 23, 59, 59 ).getTime(); return data.filter( (item) => beginTime <= item.createdDate && item.createdDate <= endTime ); }; const Home = () => { const data = useContext(DiaryStateContext); const [pivotDate, setPivotDate] = useState(new Date()); const monthlyData = getMonthlyData(pivotDate, data); const onIncreaseMonth = () => { setPivotDate(new Date(pivotDate.getFullYear(), pivotDate.getMonth() + 1)); }; const onDecreaseMonth = () => { setPivotDate(new Date(pivotDate.getFullYear(), pivotDate.getMonth() - 1)); }; return ( <div> <Header title={`${pivotDate.getFullYear()}년 ${pivotDate.getMonth() + 1}월`} leftChild={<Button onClick={onDecreaseMonth} text={"<"} />} rightChild={<Button onClick={onIncreaseMonth} text={">"} />} /> <DiaryList /> </div> ); }; export default Home;
-
미해결한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
one과 two의 값지정
🚨 필독) 질문하시기 전에 꼭 읽어주세요 (10초 소요)제목을 구체적으로 작성해 주세요✅ 좋은 예 : 감정일기장 Home 구현중 xx 이슈가 발생합니다.⛔️ 나쁜 예 : 이거 왜 안되나요?, 오류나요 도와주세요 등비슷한 궁금함을 갖고 계신 분들께 도움이 될 수 있어요! 코드의 이슈는 전체 프로젝트를 "링크 형태"로 올려주셔야 원인을 파악할 수 있습니다.깃허브, 구글드라이브 등의 수단을 통해 링크 형태로 전달해주세요직접 실행해보며 원인을 파악해야 하기 때문에 텍스트 형태로 붙여넣는건 삼가해주세요 🥲 답변이 도움이 되셨다면 답글 or 해결완료 버튼을 클릭해주세요비슷한 궁금함을 갖고 계신 분들께 도움이 될 수 있어요!제 답변이 여러분께 도움이 되었는지 저도 알고 싶어요 🥲 강의 내용에 궁금한 점이 있다면 몇 챕터의 몇 분 몇 초인지 알려주시면 더 좋아요더 빠른 답변이 가능합니다!2.4 강의 중rest매개변수 부분에서 // 2. Rest 매개변수 // -> Rest는 나머지, 나머지 매개변수 function funcB(one,two,...rest) { console.log(rest); } funcB(...arr1); 여기서 혹시 one과 two에 값을 지정할 수 있는 방법도 있을까요?? one = 10, two =20 해서 console.log()로 찍어봤을 때 10, 20 ,...이 되게 하는 방법이 있는 지 궁금합니다.
-
해결됨React Native with Expo: 제로초에게 제대로 배우기
혹시 해당 강의 보면서 테스트용으로 사용할 맥북을 구매할 예정인데 어느정도 스펙 이상으로 사야 할지 의견 받아볼수있을까요?
혹시 해당 강의 보면서 테스트용으로 사용할 맥북을 구매할 예정인데 어느정도 스펙 이상으로 사야 할지 의견 받아볼수있을까요?
-
미해결React Native with Expo: 제로초에게 제대로 배우기
[TypeError: Cannot read property 'find' of undefined] 문제
제로초님 안녕하세요!! 강의에 나온대로 top tabs 적용중인데, withLayoutContext에 제네릭 타입까지 강의와 같이 적용하려고 했으나import type { TabNavigationState, ParamListBase } from '@react-navigation/native';위 코드에서 '"@react-navigation/native"' 모듈에 내보낸 멤버 'ParamListBase'이(가) 없습니다.ts(2305)ParamListBase를 불러오지 못해서 우선 타입스크립트 적용하지 않고 아래 코드와 같이 테스트했습니다.import { withLayoutContext } from 'expo-router'; import { createMaterialTopTabNavigator } from '@react-navigation/material-top-tabs'; import { Text, View } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; const { Navigator } = createMaterialTopTabNavigator(); export const MaterialTopTabs = withLayoutContext(Navigator); const GitCallbackLayout = () => { const insets = useSafeAreaInsets(); return ( <View style={{ paddingTop: insets.top }}> <Text>Callback Layout</Text> <MaterialTopTabs> <MaterialTopTabs.Screen name="index" options={{ title: 'GitHub' }} /> <MaterialTopTabs.Screen name="gitlab" options={{ title: 'GitLab' }} /> <MaterialTopTabs.Screen name="bitbucket" options={{ title: 'Bitbucket' }} /> <MaterialTopTabs.Screen name="devops" options={{ title: 'DevOps' }} /> </MaterialTopTabs> </View> ); }; export default GitCallbackLayout; 폴더 구조는 아래와 같고 index, gitlab, devops, bitbucket 컴포넌트는 모두 default export 돼있는 상태입니다.이 상태에서 페이지에 /settings/manage-git/verify 경로로 접근하면 ERROR [TypeError: Cannot read property 'find' of undefined] Code: _layout.tsx 31 | <View style={{ paddingTop: insets.top }}> 32 | <Text>Callback Layout</Text> > 33 | <MaterialTopTabs> | ^ 34 | <MaterialTopTabs.Screen name="index" options={{ title: 'GitHub' }} /> 35 | <MaterialTopTabs.Screen name="gitlab" options={{ title: 'GitLab' }} /> 36 | <MaterialTopTabs.Screen name="bitbucket" options={{ title: 'Bitbucket' }} />이렇게 에러가 나는 상황인데,, 계속 해결이 안되네요ㅠ 어떤 문제인지 아시면 도움 부탁드려요
-
미해결Next + React Query로 SNS 서비스 만들기
import 파일 경로를 찾지 못 해서 에러가 발생합니다.
안녕하세요. 에러가 발생해서 질문드립니다.경로는 아무리 봐도 맞게 쓴거 같은데 찾지를 못 합니다.Build ErrorModule 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
-
미해결한 입 크기로 잘라먹는 실전 프로젝트 - SNS 편
댓글 수정, 삭제 시 캐시 수정
강의 정말 잘 듣고있습니다!10.6 강의 수강 중 댓글 추가 시에는 Comment 타입과 일치시키기 위해 프로필 데이터를 조회해서 author 객체를 포함시켜주었는데 수정, 삭제 시에는 왜 따로 처리를 하지 않는지 궁금합니다.삭제 시에는 해당 데이터를 삭제하기에 불필요하다고 생각되긴하는데 수정 시에는 왜 에러가 발생하지 않나요??
-
해결됨한 입 크기로 잘라먹는 실전 프로젝트 - SNS 편
forget-password 이후 reset password 이메일이 오지 않네요.
강의 잘 듣고 있습니다. 다름이 아니라, forget-password 로 정상적으로 처리가 되었다고 하는데요. 그러나, 등록해 둔 이메일로 reset password 메일이 오지 않네요. 혹시 Supabase 셋팅에서 어떤 부분을 확인해야 할까요? 검색을 해보니 이렇게 셋팅하라고 해서 한 상태입니다답변 부탁드립니다.