inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

학습 자료 rest-api도 사용 가능한가요?

해결됨

[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스

Swagger 사용 가능한 건지 문의드립니다.

  • react
  • node.js
  • seo
  • graphql
  • next.js
thekrjm 댓글 2 좋아요 0 조회수 150

OneScroll Layout 질문 드립니다!

해결됨

웹 애니메이션을 위한 GSAP 가이드 Part.03

안녕하세요 만들었던 예제를 살펴보는 와중에 section1, section4에서 약간의 문제(?)가 발생하여 질문드립니다. section1에서 스크롤을 올려버리면 다시 스크롤을 아래로 내려도 반응이 없고 아예 먹통이 되어버립니다 section4에서는 스크롤을 아래로 내리면 먹통이 됩니다 혼자 해결해보려고 했으나 감이 오질않아서.. 어떻게 코드를 수정하면 좋을지 질문드립니다!

  • javascript
  • 애니메이션
  • 인터랙티브-웹
  • gsap
  • scrolltrigger
김세진 댓글 2 좋아요 1 조회수 191

Viewer.css관련 질문

해결됨

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

강의에서 보여주시는 코드와 같이 작성하면 모양이 사진과 같이 나와요 emotion_img_wrapper영역 background-color영역에 emotionName이 안들어가는거 같아요. height를 300으로 늘리면 포함이 되긴해요. width도 같이 300으로 늘리면 다시 안들어가고요

  • javascript
  • react
  • node.js
이윤기 댓글 2 좋아요 0 조회수 99

2 - H 수학문제

해결됨

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

https://www.acmicpc.net/source/85152489 BigInt로 정렬해서 풀었는데 틀렸다고 나오더라구요 ㅜ 3%에서 틀리는데 왜 틀리는지를 모르겠습니다 ㅜ

  • 코딩-테스트
  • javascript
teyun03 댓글 2 좋아요 0 조회수 92

10-08 숙제 정답 질문입니다.

해결됨

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

타입 문제라고 해서 dto랑 product.entity에 타입이 서로 각각 string[] , ProductTag[] 로 서로 다른 타입으로 설정 했더라구요 그래서 그냥 똑같이 ProductTag[] 으로 똑같이 설정 했더니 오류는 사라졌습니다 근데 이게 정답이 맞나요? 수정 전 dto @Field(() => [String]) productTags: string[]; product.entity.ts @Field(() => [ProductTag]) productTags: ProductTag[]; 수정후 dto @Field(() => [ProductTag]) productTags: ProductTag[];

  • javascript
  • node.js
  • docker
  • rest-api
  • nestjs
댓글 2 좋아요 0 조회수 237

deleteReviewAction 에서 _: 타입 질문

해결됨

한 입 크기로 잘라먹는 Next.js

안녕하세요! 강의를 듣다가 deleteReviewAction 에서 _: any 타입에 질문이 있습니다. 타입스크립트를 배울 때 되도록이면 any 는 쓰지 말아야 한다고 알고 있는데 만약 팀원끼리 any 를 쓰지 말자고 약속을 한다면 any 말고 unknown, never 라는 타입을 써야 하는지 궁금합니다.

  • react
  • typescript
  • next.js
박찬영 댓글 2 좋아요 0 조회수 179

useFormState, useFormStatus 관련 질문

미해결

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

[섹션4-4 클라이언트 컴포넌트에서 ServerActions 사용하기] 제가 사용하고있는 라이브러리 버전입니다. "next": "^15.0.0-canary.181", "next-auth": "^5.0.0-beta.22", "react": "^18", "react-dom": "^18" useFormState 현재 공식문서 에선 useFormState from 'react-dom' 이 아닌 useActionState from 'react` 로 사용하도록 되어있더라구요. 그래서 해당 변경사항대로 사용해도 문제가 없을지 궁금합니다. useFormStatus 공식문서 를 읽어보는데 " useFormStatus 는 동일한 컴포넌트에서 렌더링한 <form> 에 대한 상태 정보를 반환하지 않습니다." 라고 명시가 되어있더라구요. 그런데 현재 제로초님의 코드는 동일한 컴포넌트의 form에 대해서 pending 값을 받고 있는데, 문제가 발생하지 않는 이유에 대해서 궁금합니다.

  • react
  • next.js
  • react-query
  • next-auth
  • msw
  • react-dom
정현 댓글 2 좋아요 0 조회수 395

axios 에러가 뜹니다.

미해결

Vue.js 끝장내기 - 실무에 필요한 모든 것

강의 그대로 따라했는데 무슨문제인지 모르겠네요,,,, 검색해도 안나와서 질문드립니다. npm i axios 한 상태입니다

  • javascript
  • vue.js
  • vuex
댓글 2 좋아요 1 조회수 277

타 사이트 강의 관련 문의 입니다.

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

패x트x퍼x에 Nest 강의가 새로 출시 되었더라구요~ class1 class2 묶음 강의에 지금 현재 [코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core 이 강의랑 중복되는 부분이 얼마나 될까요?? 답변이 곤란할까요??

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
ajrfyd 댓글 1 좋아요 0 조회수 237

css 파일 작성시 > 표시 여부

해결됨

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

안녕하세요. 투두리스트 ui 구현 중 질문이 생겨 댓글 남깁니다 "Header.css" 파일은 h1 태그에 접근 시 ".Header > h1" 과 같이 > 표시를 사용하는데 "Editor.css" 파일은 > 표시 없이 그냥 ".Editor input" 로 작성하시더라구요 이 둘의 차이가 뭔가요? 좋은 강의와 친절한 답변 항상 감사드립니다 :) 🚨 아래의 가이드라인을 꼭 읽고 질문을 올려주시기 바랍니다 🚨 질문 하시기 전에 꼭 확인해주세요 - 질문 전 구글에 먼저 검색해보세요 (답변을 기다리는 시간을 아낄 수 있습니다) - 코드에 오타가 없는지 면밀히 체크해보세요 (Date와 Data를 많이 헷갈리십니다) - 이전에 올린 질문에 달린 답변들에 꼭 반응해주세요 (질문에 대한 답변만 받으시고 쌩 가시면 속상해요 😢) 질문 하실때 꼭 확인하세요 - 제목만 보고도 무슨 문제가 있는지 대충 알 수 있도록 자세한 제목을 정해주세요 (단순 단어 X) - 질문의 배경정보를 제공해주세요 (이 문제가 언제 어떻게 발생했고 어디까지 시도해보셨는지) - 문제를 재현하도록 코드샌드박스나 깃허브 링크로 전달해주세요 (프로젝트 코드에서 문제가 발생할 경우) - 답변이 달렸다면 꼭 확인하고 반응을 남겨주세요 - 강의의 몇 분 몇 초 관련 질문인지 알려주세요! - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

  • javascript
  • react
  • node.js
황유나 댓글 1 좋아요 0 조회수 297

로컬스토리지

해결됨

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

import { Route, Routes } from "react-router-dom"; import { useReducer, useRef, createContext, useEffect, useState } from "react"; import Home from "./pages/Home"; import New from "./pages/New"; import Diary from "./pages/Diary"; import Notfound from "./pages/Notfound"; import Edit from "./pages/Edit"; const mockData = [ { id: 1, createdDate: new Date("2024-10-01").getTime(), emotionId: 1, content: "1번일기 내용", }, { id: 2, createdDate: new Date("2024-10-10").getTime(), emotionId: 2, content: "2번일기 내용", }, { id: 3, createdDate: new Date("2024-09-09").getTime(), emotionId: 3, content: "3번일기 내용", }, { id: 4, createdDate: new Date("2024-10-04").getTime(), emotionId: 3, content: "3번일기 내용", }, ]; function reducer(state, action) { let nextState; switch (action.type) { case "INIT": { return action.data; } case "CREATE": { nextState = [...state, action.data]; break; } case "UPDATE": { nextState = state.map((item) => item.id === action.data.id ? action.data : item ); break; } case "DELETE": nextState = state.filter((item) => item.id !== action.id); break; default: return state; } localStorage.setItem("diary", JSON.stringify(nextState)); return nextState; } export const DiaryStateContext = createContext(); export const DiaryDispatchContext = createContext(); function App() { const [isLoading, setIsLoading] = useState(true); const [data, dispatch] = useReducer(reducer, []); const idRef = useRef(0); useEffect(() => { const storedData = localStorage.getItem("diary"); if (!storedData) { setIsLoading(false); return; } const persedData = JSON.parse(storedData); if (!Array.isArray(persedData)) { setIsLoading(false); return; } let maxId = 0; persedData.forEach((item) => { if (Number(item.id) > maxId) { maxId = Number(item.id); } }); idRef.current = maxId + 1; dispatch({ type: "INIT", data: persedData, }); setIsLoading(false); }, []); const onCreate = (createdDate, emotionId, content) => { dispatch({ type: "CREATE", data: { id: idRef.current++, createdDate, emotionId, content, }, }); }; if (isLoading) { return <div>데이터 로딩중입니다...</div>; } const onUpdate = (id, createdDate, emotionId, content) => { dispatch({ type: "UPDATE", data: { id, createdDate, emotionId, content, }, }); }; const onDelete = (id) => { dispatch({ type: "DELETE", id, }); }; return ( <> <DiaryStateContext.Provider value={data}> <DiaryDispatchContext.Provider value={{ onCreate, onUpdate, onDelete }}> <Routes> <Route path="/" element={<Home />} /> <Route path="/new" element={<New />} /> <Route path="/diary/:id" element={<Diary />} /> <Route path="/edit/:id" element={<Edit />} /> <Route path="*" element={<Notfound />} /> </Routes> </DiaryDispatchContext.Provider> </DiaryStateContext.Provider> </> ); } export default App; 질문폭탄 죄송합니다ㅠㅠㅠ 왜 저는 새로고침하면 빈배열로 화면에 나타날까요? 로컬스토리지에 저장은 되더라구요 그리고 let nextState; 이렇게 저장하면 state값이 바뀔 때 nexState도 초기화 되지 않나요? 초기화 되고 나서 값을 저장한 후 사용해서 상관이 없는건가요?

  • javascript
  • react
  • node.js
2145007 댓글 2 좋아요 0 조회수 256

다크모드 적용

해결됨

손에 익는 Next.js - 블로그 만들기

선생님 혹시 next-theme 사용 안 하시는 이유가 있을까요? 궁금합니다...!!

  • react
  • 블로그
  • next.js
youre8090 댓글 2 좋아요 1 조회수 404

undefined일 경우

해결됨

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

const Diary = () => { const params = useParams(); const nav = useNavigate(); const currentDiaryItem = useDiary(params.id); if (!currentDiaryItem) { return <div>데이터로딩중</div>; } const { createdDate, emotionId, content } = currentDiaryItem; const Edit = () => { const nav = useNavigate(); const { onDelete, onUpdate } = useContext(DiaryDispatchContext); const params = useParams(); const currentDiaryItem = useDiary(params.id); Diary컴포넌트와 Edit컴포넌트 둘 다 useDiary로부터 currentDiaryItem을 받아오고 있는데, Diary는 undefined일 때경우를 처리해주고 있는데, Edit컴포넌트는 그렇지 않습니다. useEffect(() => { if (initData) { // undefined일 때 setInput({ ...initData, createdDate: new Date(Number(initData.createdDate)), }); } }, [initData]); 위코드는 Editor컴포넌트 안의 코드입니다. 여기서 undefined룰 걸려주기 때문에 Edit컴포넌트에서 처리를 안해도 되는 건가용?

  • javascript
  • react
  • node.js
2145007 댓글 2 좋아요 0 조회수 234

Diary.jsx

해결됨

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

import { useContext, useState, useEffect } from "react"; import { DiaryStateContext } from "../App"; import { useNavigate } from "react-router-dom"; const useDiary = (id) => { const data = useContext(DiaryStateContext); const [currentDiaryItem, setCurrentDiaryitem] = useState(); const nav = useNavigate(); useEffect(() => { const currentDiaryItem = data.find( (item) => String(item.id) === String(id) ); if (!currentDiaryItem) { window.alert("존재하지 않는 일기입니다."); nav("/", { replace: true }); } setCurrentDiaryitem(currentDiaryItem); }, [id, data]); //data는 왜쓰는지? return currentDiaryItem; }; export default useDiary; 강의 내용코드입니다. 현재의 일기를 가져오는 커스텀훅입니다. 여기서 문제는 "존재하지 않는 일기입니다"라는 경고창이 2번뜹니다. http://localhost:5173/diary/1234 처럼 아무숫자나 입력했을 때 그리고 http://localhost:5173/ 으로 이동한 후에 경고창이 한번 더 뜹니다. useEffect가 id가 변함에 따라 계속 실행되어서라는 이유로 알고 있습니다. 그러면 왜 선생님코드에서는 경고창이 2번 뜨지 않았을까용? 그리고 의존성 배열에 [id, data] 2가지를 담는 이유가 궁금합니다. 현재 prams.id가 바뀔 때만 작동하게 해도 되지 않을까요? 사용자가 data를 수정하면서 페이지의 파라미터가 바뀌는 상황이 동시에 일어나지 않을 거 같아서요

  • javascript
  • react
  • node.js
2145007 댓글 1 좋아요 0 조회수 134

new Date()

해결됨

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

const Editor = ({ onSubmit, initData }) => { const nav = useNavigate(); const [input, setInput] = useState({ createdDate: new Date(), // 여기서 그냥 getTime하면 안되나요? emotionId: 8, content: "", }); useEffect(() => { if (initData) { setInput({ ...initData, createdDate: new Date(Number(initData.createdDate)), }); } input의 createdDate와 initData의 createdDate 비교 기준이 new Date() 과 new Date().getTime() 로 달라서 useEffect안에서 createdDate: new Date(Number(initData.createdDate)), 이렇게 한다는 건 이해가 갑니다. 다만 처음부터 input의 createdDate를 new Date().getTime()으로 만들면 되지 않을까요?

  • javascript
  • react
  • node.js
2145007 댓글 2 좋아요 0 조회수 161

강의 1.3) 실습용 백엔드 서버 세팅하기에서 module not found

해결됨

한 입 크기로 잘라먹는 Next.js

패키지 매니저를 pnpm으로 사용하고 pnpm i 후 pnpm run build && pnpm run start 시 validator 모듈이 없다고 나와서 rm -rf node_modules pnpm-lock.yaml 후 npm으로 모듈들 설치 및 빌드, 서버 실행이 됩니다. npm이 유령 의존성 이슈가 있다고 들어서 pnpm 또는 yarn을 이용하려 한 건데, 오히려 npm을 사용해야만 문제없이 돌아가는 상황에 대해, 이게 어떤 상황인지 알 수 있을까요?

  • react
  • typescript
  • next.js
monkey-k 777 댓글 2 좋아요 0 조회수 241

input의 value속성이 꼭 필요한가요?

해결됨

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

<input value={getStringedDate(input.createdDate)} name="createdDate" onChange={onChange} type="date" className="bg-[rgb(236,236,236)] font-xl rounded-md px-[20px] py-[10px]" /> 새로운 일기를 만들때 날짜 input에서 value속성을 'getStringedDate(input.createdDate)'이렇게 설정하고 있는데요 저는 value속성을 넣지 않고도 작동을 합니다. value속성 꼭 적어야 할까요? 단순히 초기값을 설정하기 위함일까요? 아니라면 value속성을 적는 것이 권장되는 이유는 뭘까용?

  • javascript
  • react
  • node.js
2145007 댓글 1 좋아요 0 조회수 318

prefetch 질문

미해결

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

안녕하세요! 저는 fetch를 사용하지않고 axios를 사용해봤는데요! 서버에서 prefetch한 데이터가 초기에 useQuery에 값이 없는 이슈가 있어서 디깅을 해보다가 ReactQueryProvider에서 선언한 queryClient와 Home.tsx에서 선언한 queryClient가 달라 캐시한 값을 가져오지 못한다고 생각하는데 혹시 맞을까요? "use client"; import { useState } from "react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; import { isProduction } from "@/app-src/shared/env"; export const ReactQueryProvider = ({ children }: React.PropsWithChildren) => { const [queryClient] = useState( () => new QueryClient({ defaultOptions: { queries: { staleTime: Infinity, gcTime: Infinity, }, }, }) ); return ( <QueryClientProvider client={queryClient}> {children} {!isProduction && <ReactQueryDevtools initialIsOpen={false} />} </QueryClientProvider> ); }; import { PostIndex } from "@/app-src/post/[slug]"; import { API_PATH } from "@/app-src/shared/apis"; import { getPost } from "@/app-src/shared/apis/post/get-post"; import { dehydrate, HydrationBoundary, QueryClient, } from "@tanstack/react-query"; const PostPage = async ({ params }: { params: { slug: string } }) => { const { slug } = params; const queryClient = new QueryClient(); // 서버에서 미리 데이터를 패칭 await queryClient.prefetchQuery({ queryKey: [API_PATH.POST(slug)], queryFn: () => getPost(slug), }); const a = queryClient.getQueryData([API_PATH.POST(slug)]); console.log(a, "a"); // 데이터 직렬화 const dehydratedState = dehydrate(queryClient); return ( <HydrationBoundary state={dehydratedState}> <PostIndex /> </HydrationBoundary> ); }; export default PostPage; "use client"; import { API_PATH } from "@/app-src/shared/apis"; import { getPost } from "@/app-src/shared/apis/post/get-post"; import { useQuery } from "@tanstack/react-query"; import { useParams } from "next/navigation"; export const PostIndex = () => { const { slug } = useParams<{ slug: string }>(); const { data } = useQuery({ queryKey: [API_PATH.POST(slug)], queryFn: () => getPost(slug), }); // 초기에 없음 -> 패칭 -> 있음 console.log(data, "data"); return ( <div> <div>{data?.title}</div> </div> ); }; 만약 제가 생각한게 맞다면 어떻게 해결해야할까요?

  • react
  • next.js
  • react-query
  • next-auth
  • msw
웹개발자 댓글 1 좋아요 0 조회수 232

BrowserRouter사용방법

해결됨

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

강의 12.3 보다가 의문이 들어서 질문 남깁니다. 강의에서 설명하고 사용하셨던 방법과 공식문서에서 BrowserRouter를 사용하는 방법이 달라서 헷갈립니다. 두가지 방법이 같은 것인지, 다르다면 어떻게 다른지 알려주세요 function App () { return ( < BrowserRouter basename = " /app "> < Routes > < Route path = " / " /> </ Routes > </ BrowserRouter > ); } =>공식문서에서는 이렇게 Routes를 BrowserRouter로 감싸서 사용했는데 강의 에서는 그러지 않아서 궁금합니다.!

  • javascript
  • react
  • node.js
ggang89 댓글 2 좋아요 0 조회수 211

인기 태그

인프런 TOP Writers

주간 인기글