inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

unstable_cache 사용 시 적정 revalidate 값 문의

해결됨

Next.js 완벽 마스터 (v15): 노션 기반 개발자 블로그 만들기 (with 커서AI)

안녕하세요. 지금까지 알려주신 내용에서 Notion 통해 글을 추가/삭제했을 때, 그에 대한 반영이 이루어지기 위해 unstable_cache 적용 시 revalidate 옵션(단위: s(초))을 줘야 하는 것을 확인했습니다. (getPublishedPosts 구현부분에서 언급되지 않은부분이라 강의내용과 공식문서 토대로 동작 확인했습니다.) Notion이 아닌 실제 페이지에서 글쓰기를 했을 때는 revalidateTag 함수를 호출하여 캐시를 무효화시켰었습니다. 문제는 목록 가져올때도 매번 revalidateTag 함수를 사용하게 된다면 캐시 사용하는게 무의미해질거라 생각합니다. 즉시 반영을 위해서는 Webhook 연동이 필요해보이나, 생각보다 구현 난이도가 복잡해서 revalidate를 적절하게 주는게 좋을거라 생각했습니다. 그렇다면 효율적인 revalidate 값은 어느정도로 지정하는게 좋을까요?? TanStack Query ClientProvider에서 지정한 것처럼 1분 정도가 적절하려나요?? 그리고 실제 구현 이루어지는 프로그램(ex. 쇼핑몰)에 따라 기준이 달라질 것 같은데요. 이에 대한 강사님 의견 듣고싶습니다.

  • react
  • 블로그
  • next.js
  • cursor
  • cursorai
nmnnhlba 댓글 2 좋아요 0 조회수 117

CityList.js에서 api.js 파일의 API_URL이 렌더링이 안되는 오류가 있습니다!

해결됨

한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지

세션 9. 여행지정보 최종프로젝트 작성 중... CityList 개발 13:25분에서 CityList.js를 작성한 후 localhost:3000을 새로고침해도 전혀 변화없이 빈 화면만 출력이 됩니다! api.js에서 API_URL로 전달받을 https://trip-wiki-api.vercel.app/ 에서 도시 정보 40개 정보가 없더라고요, 그래서 웹 화면에 아무것도 출력되지 않아서 문의드립니다! server.js 파일도 /*splat 로 변경해서 "start server" 노드 명령어로 터미널에서 출력되도록 수정 완료했지만, 홈페이지 이미지가 출력되지 않고 있습니다! const express = require("express"); const path = require("path"); const app = express(); const PORT = 3000; app.use(express.static(path.join(__dirname, ".."))); app.get("/*splat", (req, res) => { res.sendFile(path.join(__dirname, "..", "index.html")); }); app.listen(PORT, () => { console.log("START SEVER"); }); export default function CityList({ $app, initialState }) { this.state = initialState; this.$target = document.createElement("div"); this.$target.className = "city-list"; $app.appendChild(this.$target); this.template = () => { let temp = `<div class="city-items-container">`; if (this.state) { this.state.cities.forEach((elm) => { temp += ` <div class="city-item" id=${elm.id}> <img src=${elm.image}></img> <div class="city-item-info">${elm.city}, ${elm.country}</div> <div class="city-item-score">⭐ ${elm.total}</div> </div> `; }); temp += `</div>`; } return temp; }; this.render = () => { this.$target.innerHTML = this.template(); }; this.setState = (newState) => { this.state = newState; this.render(); }; this.render(); }

  • javascript
  • rest-api
  • spa
  • dom
안연수 댓글 1 좋아요 0 조회수 149

useEffect와 useMemo 차이가 이해가 안돼요

해결됨

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

useEffect와 useMemo 둘 다 의존성 배열이 바뀔때만 실행되도록 하는 훅으로 알고 있는데, 정확한 차이가 와닿지 않습니다..!

  • javascript
  • react
2hhhhuuu 댓글 2 좋아요 0 조회수 509

firebase

미해결

비전공자도 가능한 초간단 단톡방 만들기 (바이브코딩, Cursor AI)

firebase 프로젝트 생성하고 설정하고 있는데 Authentication > 로그인방법 설정중에 어느 방법을 선택해도 아래 이미지와 같이 업데이트 오류라는 문구가 뜨고 저장이 안됩니다. 데이터베이스 만들기 과정에서도 '위치'란에 아무 select박스가 안뜹니다. 프로젝트 생성은 영상과 동일하게 하였는데 프로젝트가 제대로 생성이 안된건지 문제가 뭔지 모르겠습니다.

  • firebase
  • next.js
  • vercel
  • cursorai
이지혜 댓글 2 좋아요 0 조회수 144

런타임 에러 ㅠㅠ

미해결

따라하며 배우는 리액트 A-Z[19버전 반영]

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. import axios from "../api/axios"; import React, { useEffect, useState } from 'react' import requests from '../api/requests'; import "./Banner.css" import styled from "styled-components"; export default function Banner() { const [movie, setMovie] = useState([]); const [isClicked, setIsClicked] = useState(false); useEffect(() => { fetchData(); }, []); const fetchData = async() => { //현재 상영중인 영화 정보를 가져오기 (여러 영화) const request = await axios.get(requests.fetchNowPlaying); //여러 영화 중 영화 하나의 ID를 가져오기 const movieId = request.data.results[ Math.floor(Math.random() * request.data.results.length) ].id; //특정 영화의 더 상세한 정보를 가져오기 (비디오 정보도 포함) const {data: movieDetail} = await axios.get(`movie/${movieId}`, { params: {append_to_response: "videos"}, }); setMovie(movieDetail); } const truncate = (str, n) => { return str?.length > n ? str.substr(0, n - 1) + "..." : str; } console.log('movie', movie); if(!isClicked) { return ( <header className="banner" style={{ backgroundImage: `url("https://image.tmdb.org/t/p/original/${movie.backdrop_path}")`, backgroundPosition: "top center", backgroundSize: "cover", }}> <div className="banner__contents"> <h1 className="banner__title"> {movie.title || movie.name || movie.original_name} </h1> <div className="banner__buttons"> <button className="banner__button play" onClick={() => setIsClicked(true)} > Play</button> <button className="banner__button info">More Information</button> </div> <h1 className="banner_description"> {truncate(movie.overview, 100)} </h1> </div> <div className="banner--fadeBottom"></div> </header> ); } else{ return ( <Container> <HomeContainer> <Iframe width="640" height="360" src={`https://www.youtube.com/embed/${movie.videos.results[0].key}?controls=0&autoplay=1&loop=1&mute=1&playlist=${movie.videos.results[0].key}`} title="YouTube video player" allow="autoplay; fullscreen" ></Iframe> </HomeContainer> </Container> ); } } const Iframe = styled.iframe` width: 100%; height: 100%; opacity: 0.65; border: none; &::after { content:""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; }` const Container = styled.div` display: flex; justify-content: center; align-items: center; flex-direction: column; width: 100%; height: 100vh; ` const HomeContainer = styled.div` width: 100vw; height: 100vh;`

  • react
  • redux
  • tdd
  • typescript
  • next.js
  • 소프트웨어-테스트
hundo1217 댓글 1 좋아요 0 조회수 123

초기 접속 요청시 js 번들러 질문!

해결됨

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

이전의 사전 렌더링에서 이런식으로 동작한다고 이해하고 초기접속시 JS 번들러에 남은 컴포넌트를 담아서 준다고 이해했는데 여기서는 페이지 이동 요청시 JS 번들러가 오는데 헷갈립니다.

  • react
  • typescript
  • next.js
강수영 댓글 1 좋아요 0 조회수 119

PUT, DELETE 등의 http 메소드 질문있습니다.

해결됨

React, Node.js, MongoDB로 만드는 나만의 회사 웹사이트: 완벽 가이드

안녕하세요. 오늘도 좋은강의 정말 감사히 듣고 있습니다. 제가 웹개발자가 아니라서 정확하게는 잘 모르긴 합니다. 6-3에서 문의글 상태변경, 삭제할때 PUT, DELETE 인 http메소드를 사용하시던데 제가 알기로는 PUT, DELETE는 보안에 취약한것으로 알고 있는데 사용해도 상관은 없는지 궁금합니다. 만약 사용하지 않는다면 상태변경, 삭제할때 GET과 POST방식만으로 어떤식으로 사용해야할지 로직정도만 알려주시면 감사하겠습니다.

  • HTML/CSS
  • javascript
  • react
  • node.js
  • mongodb
초보자 댓글 2 좋아요 0 조회수 443

onKeyDown event로 onSubmit 을 하는 이유에 대해 궁금해요

해결됨

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

2.8) 페이지별 레이아웃 설정하기 안녕하세요 한입 nextjs 강의 잘 보고 있는데요! 하나 궁금한 게 생겨서 질문 남겨요! 20분쯤에 나오는 onKeyDown 으로 키보드 이벤트를 감지하여 처리하는 이유가 있을까요? 해당 부분만 form 으로 감싸면 자동으로 enter 클릭시 감지해서 요청을 보내게 되는데 onKeyDown으로 함수를 빼서 input 이벤트를 핸들링 하는 이유는 무엇인가요! submit 직전 다른 데이터를 핸들링 할 때 form은 바로 submit이 일어나기 때문에 그런 부분에 있어서 확장성? 을 위한건가용?

  • react
  • typescript
  • next.js
박준희 댓글 2 좋아요 0 조회수 110

강의대로 따라갔는데 에러보다 api키로 들어간 넷플릭스? 그런게 렌더링 되지 않습니다 ㅠ

미해결

따라하며 배우는 리액트 A-Z[19버전 반영]

강의대로 따라갔는데 강의처럼 렌더링이 되고 있지 않습니다 ㅠㅠ 어디가 문제일까요 chatgpt는 서버가 없다 뭐 이렇다는데 ㅠㅠ 출력 화면 Nav.js import React, { useEffect, useState } from 'react' import"./Nav.css" export default function Nav() { const [show, setShow] = useState(false); useEffect(() => { window.addEventListener("scroll", ()=> { console.log('window.scrollY', window.scrollY); if(window.scrollY > 50) { setShow(true); } else { setShow(false); } }) return () => { window.removeEventListener("scroll", ()=> {}); }; }, []); return ( <nav className={`nav ${show && "nav__black"}`}> <img alt = 'Netflix logo' src = "https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Netflix_2015_logo.svg/960px-Netflix_2015_logo.svg.png" decoding="async" width="799" height="216" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/0/08/Netflix_2015_logo.svg/1198px-Netflix_2015_logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/0/08/Netflix_2015_logo.svg/1597px-Netflix_2015_logo.svg.png" className='nav__logo' onClick={() => window.location.reload()} /> <img alt = "User logged" src = "https://occ-0-3077-988.1.nflxso.net/dnm/api/v6/vN7bi_My87NPKvsBoib006Llxzg/AAAABTZ2zlLdBVC05fsd2YQAR43J6vB1NAUBOOrxt7oaFATxMhtdzlNZ846H3D8TZzooe2-FT853YVYs8p001KVFYopWi4D4NXM.png?r=229" className="nav__avatar" /> </nav> ); } Nav.css .nav{ position: fixed; top: 0; width: 100%; height: 30px; z-index: 1; padding: 20px; display: flex; justify-content: space-between; align-items: center; transition-timing-function: ease-in; transition: all 0.5s; } .nav__black { background-color: #111; } .nav__logo{ position: fixed; left: 40px; width: 80px; object-fit: contain; } .nav__avatar { position: fixed; right: 40px; width: 30px; object-fit: contain; } Banner.js import axios from "../api/axios"; import React, { useEffect, useState } from 'react' import requests from '../api/requests'; import "./Banner.css" export default function Banner() { const [movie, setMovie] = useState([]); useEffect(() => { fetchData(); }, []); const fetchData = async() => { //현재 상영중인 영화 정보를 가져오기 (여러 영화) const request = await axios.get(requests.fetchNowPlaying); //여러 영화 중 영화 하나의 ID를 가져오기 const movieId = request.data.results[ Math.floor(Math.random() * request.data.results.length) ].id; //특정 영화의 더 상세한 정보를 가져오기 (비디오 정보도 포함) const {data: movieDetail} = await axios.get(`movie/${movieId}`, { params: {append_to_reponse: "videos"} }); setMovie(movieDetail); } const truncate = (str, n) => { return str?. length > n ? str.substr(0, n - 1) + "..." : str; } return ( <header className="banner" style={{ backgroundImage: `url("https://image.tmdb.org/t/p/original/${movie.backdrop_path}")`, backgroundPosition: "top center", backgroundSize: "cover" }}> <div className="banner__contents"> <h1 className="banner__title"> {movie.title || movie.name || movie.original_name} </h1> <div className="banner__buttons"> <button className="banner__button play">Play</button> <button className="banner__button info">More Information</button> </div> <h1 className="banner_description"> {truncate(movie.overview, 100)} </h1> </div> <div className="banner--fadeBottom"></div> </header> ) } Banner.css .banner{ color: white; object-fit: contain; height: 448px; } @media (min-width : 1500px) { .banner{ position: relative; height: 600px; } .banner--fadeBottom{ position: absolute; bottom: 0; width: 100%; height: 40rem; } } @media (max-width : 768px) { .banner__contents{ width: min-content !important; padding-left: 2.3rem; margin-left: 0px !important; } .banner--description{ font-size: 0.8rem !important; width: auto !important; } .info{ text-align: start; padding-right: 1.2rem; } .space{ margin-left: 6px; } } axios.js import axios from "axios"; const instance = axios.create({ baseURL: "https://api.themoviedb.org", params: { api_key: "eea00451962aefe6185011d467944242", language: "ko-KR", }, }); export default instance; requests.js const requests = { fetchNowPlaying: "movie/now_playing", fetchNetFlixOriginals: "/discover/tv?with_networks=213", fetchTrending: "/trending/all/week", fetchTopRated: "/movie/top_rated", fetchActionMovies: "/discover/movie?with_genres=28", fetchComedyMovies: "/discover/movie?with_genres=35", fetchHorrorMovies: "/discover/movie?with_genres=27", fetchRomanceMovies: "/discover/movie?with_genres=10749", fetchDocumentaries: "/discover/movie?with_genres=99", } export default requests;

  • react
  • redux
  • tdd
  • typescript
  • next.js
  • 소프트웨어-테스트
hundo1217 댓글 1 좋아요 0 조회수 135

Object.keys는 마치 배열과 같다고 생각하면 될까요?

해결됨

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

강의에서 아래 코드와 같이 배웠습니다. 근데 변수인 keys가 마치 배열에서 배열에 담긴 값들을 꺼내는 것 처럼 keys[i] 를 쓰니까 혼란이 옵니다. 그러면 Object.keys()를 배열이라고 봐도 되나요? // 1) Object.keys 사용 // 객체에서 key 값들만 뽑아서 새로운 배열로 반환 let keys = Object.keys(person); for (let i = 0; i < keys.length; i++) { console.log(keys[i]); }

  • javascript
박선정 댓글 2 좋아요 0 조회수 87

안녕하세요

미해결

[리뉴얼] 코딩자율학습 제로초의 자바스크립트 입문

자바스크립트에서 변수뒤에 . 이후 사용하는것은 함수를 사용하는 것인가요? 변수.length 이밖에 등등

  • javascript
이민우 댓글 2 좋아요 0 조회수 129

앱 빌드 문의드립니다.

해결됨

[2025] 비전공자도 가능한 React Native 앱 개발 마스터클래스

앱 빌드 중에 문제가 생겨 문의드립니다. 아래 알려주신 명령어를 입력하면 로컬이 아니라 expo.dev 사이트에서 앱이 빌드 되는 것을 확인 했습니다. 무료 계정 기준으로 빌드 시간이 30분~1시간 소요됩니다... npx eas build --platfo rm android --profile development 바쁘시겠지만 로컬에서 빌드하고 AVD에 설치하는 과정을 알려주시면 감사하겠습니다. 저와 같은 문제가 발생하시는 분들은 npm run android 또는 npm run ios 를 입력하시면 앱이 설치가 됩니다. 이게 정석인지는 잘 모르겠습니다..

  • javascript
  • react
  • node.js
  • react-native
  • typescript
권한준 댓글 3 좋아요 0 조회수 156

동물 앨범 만들기 최종 에러 수정부탁드립니다!

해결됨

한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지

현재 제가 동물 앨범 만들기 전체 파일 구조와 index.html 코드는 이렇게 작성하였으며, 강의 내용과 동일하게 작성하였습니다 api.js 코드와 TabBar.js 코드입니다. 강의 내용과 동일하게 작성하였습니다. content.js 코드와 index.js 코드를 작성하였습니다. 마지막으로 App.js 코드를 작성하였지만, 동물 사진이 웹 화면에 출력이 되지 않고 있습니다! import TabBar from "./components/TabBar.js"; import Content from "./components/Content.js"; import { request } from "./components/api.js"; export default function App($app) { this.state = { currentTab: window.location.pathname.replace("/", "") || "all", photos: [], }; //tabBar const tabBar = new TabBar({ $app, initialState: this.state.currentTab, onClick: async (name) => { history.pushState(null, null, `/${name}`); this.updateContent(name); }, }); //content const content = new Content({ $app, initialState: [], }); //state this.setState = (newState) => { this.state = newState; tabBar.setState(this.state.currentTab); content.setState(this.state.photos); }; this.updateContent = async (tabName) => { console.log(tabName); const name = tabName === "all" ? "" : tabName; const photos = await request(name); this.setState({ ...this.state, currentTab: tabName, photos: photos, }); }; window.addEventListener("popstate", () => { this.updateContent(window.location.pathname.replace("/", "") || "all"); }); const init = async () => { this.updateContent(this.state.currentTab); }; init(); }

  • javascript
  • rest-api
  • spa
  • dom
안연수 댓글 2 좋아요 0 조회수 106

Next의 route handler에 대한 질문이 있습니다.

미해결

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

안녕하세요 Next app router 관련해서 질문드립니다. 현재 사이드프로젝트에서 route handler를 적극활용하고 있는데요. 제가 인프라나 백엔드 관련 지식이 없다보니 좀 헷갈리는게 있습니다. 현재 저희 서비스에서 특정 API는 클라이언트 컴포넌트에서 route handler로 API 호출 -> route handler에서 외부 백엔드 API 호출 이런 형태로 사용되고 있는데요, 이때 실제로 route handler 서버가 아래의 사진 중 어느 형태로 운용되는 것인가요? 즉, Next 프로젝트를 배포했을 때 각 유저마다 route handler 서버가 할당되는 것인가요? 아니면 모든 유저의 요청을 오직 하나의 route handler서버에서 대응하는 것인가요? 아니면 이게 배포 환경에 따라 달라지는것인가요?

  • react
  • next.js
  • react-query
  • next-auth
  • msw
kraf 댓글 2 좋아요 0 조회수 122

동물앨범만들기 코드 에러문의드립니다!

해결됨

한 번에 끝내는 자바스크립트: 바닐라 자바스크립트로 SPA 개발까지

동물 앨범 만들기 3차 까지 들어서 라이브 코드를 작성하였지만, 강의 내용에서 나오는 웹 실행화면이 출력되지 않고 있습니다. 또한, 강사님의 깃 주소에 있는 코드들을 그대로 실행해도 강의 내용처럼 나오지 않습니다. 강사님이 동물 앨범 만들기 2차 때는 1차에서 작성한 각 동물들의 js파일과 html 파일을 삭제하라고 하셨는데, 막상 1차때 작성한 파일들을 삭제하니까 동물 사진이 웹에 출력되지 않아서 다시 기재하였습니다 그래서, 강사님의 깃 주소에는 1차와 2차, 3차 코드는 중복되게 작성하면 안되는 건가요? 강사님처럼 웹 화면에 출력될려면 3차 코드만 있으면 되는 건가요? 왜 3차 코드만으로 강의 내용처럼 출력이 안되는 걸까요? 1차, 2차, 3차의 모든 코드들을 융합해서 작성해야하나요? 다음 강의 node.js와 express.js를 진행할 수 가 없어서 급하게 문의드립니다! !

  • javascript
  • rest-api
  • spa
  • dom
안연수 댓글 1 좋아요 0 조회수 100

API 배포시 No HTTP triggers found. 이슈 발생

해결됨

Azure Native로 나만의 GPT 만들기

10:07:43 PM bh-mygpt-api-function: Zip package size: 5.59 kB 10:07:44 PM bh-mygpt-api-function: Fetching changes. 10:07:45 PM bh-mygpt-api-function: Cleaning up temp folders from previous zip deployments and extracting pushed zip file /tmp/zipdeploy/f322c28d-ce96-4124-9cb3-252f7c3879e2.zip (0.01 MB) to /tmp/zipdeploy/extracted 10:07:47 PM bh-mygpt-api-function: Updating submodules. 10:07:48 PM bh-mygpt-api-function: Preparing deployment for commit id '46352960-d'. 10:07:48 PM bh-mygpt-api-function: PreDeployment: context.CleanOutputPath False 10:07:48 PM bh-mygpt-api-function: PreDeployment: context.OutputPath /home/site/wwwroot 10:07:48 PM bh-mygpt-api-function: Repository path is /tmp/zipdeploy/extracted 10:07:48 PM bh-mygpt-api-function: Running oryx build... 10:07:48 PM bh-mygpt-api-function: Command: oryx build /tmp/zipdeploy/extracted -o /home/site/wwwroot --platform python --platform-version 3.11 -p packagedir=.python_packages/lib/site-packages 10:07:49 PM bh-mygpt-api-function: Operation performed by Microsoft Oryx, https://github.com/Microsoft/Oryx 10:07:49 PM bh-mygpt-api-function: You can report issues at https://github.com/Microsoft/Oryx/issues 10:07:49 PM bh-mygpt-api-function: Oryx Version: 0.2.20230210.1, Commit: a49c8f6b8abbe95b4356552c4c884dea7fd0d86e, ReleaseTagName: 20230210.1 10:07:49 PM bh-mygpt-api-function: Build Operation ID: 379fd46c502b6733 10:07:49 PM bh-mygpt-api-function: Repository Commit : 46352960-d49c-4dd9-8718-f017c28fb0aa 10:07:49 PM bh-mygpt-api-function: OS Type : bullseye 10:07:49 PM bh-mygpt-api-function: Image Type : githubactions 10:07:49 PM bh-mygpt-api-function: Detecting platforms... 10:08:00 PM bh-mygpt-api-function: Syncing triggers... 10:08:02 PM bh-mygpt-api-function: Querying triggers... 10:08:03 PM bh-mygpt-api-function: No HTTP triggers found. VS Code에서 API 배포시 No HTTP triggers found 가 뜨면서 배포가 제대로 안되는 것 같습니다. 저도 애져 포탈에서 함수 앱을 만들 때 스토리지 부분이 없었는데 다른 분들의 질문답변 내용을 참고해서 AzureWebJobsStorage 을 액세스 키로 채워줘도 해결되진 않았습니다 어디 부분이 문제일까요?? 그리고 코드 틀린 부분이 있는지 확인하고 다시 테스트를 해보려면 강의를 처음부터 다시 봐야하는데 완성된 코드 예제는 없을까요?

  • javascript
  • python
  • mongodb
  • azure
  • FastAPI
두루미 댓글 3 좋아요 0 조회수 156

학습 대상자 질문입니다

해결됨

Azure Native로 나만의 GPT 만들기

안녕하세요~ 먼저 좋은 강의를 무료로 공개해주셔서 감사드립니다 다름이 아니라 제 현재 수준이 기초CS나 백엔드 등의 지식이 전무하다보니 강의를 보면서 따라해보고는 있지만 무슨 내용인지 모른 상태로 따라쳐보고만 있고 이슈가 발생하면 막히면서 진행하는데 차질이 큰데 일단 몰라도 쭉 따라가는게 괜찮을까요?? 공부 방법을 어떻게 하면 좋을지 궁금하여 문의드립니다.

  • javascript
  • python
  • mongodb
  • azure
  • FastAPI
두루미 댓글 3 좋아요 0 조회수 145

들여쓰기 정리되는거 확장프로그램인가요?

해결됨

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

강의 보다보면 저장했을 때 들여쓰기가 다 정리되던데 단축키 인가요 확장프로그램인가요??

  • javascript
  • react
  • node.js
이지언 댓글 1 좋아요 0 조회수 123

useActionState에서 반환값 필드 생략 시 조건에 따라 에러 발생 여부가 다른 이유

해결됨

Next.js 완벽 마스터 (v15): 노션 기반 개발자 블로그 만들기 (with 커서AI)

안녕하세요! 강의 잘 듣고 있습니다. 제가 혼자 실습하다가 createPostAction 의 반환값에 success 필드를 넣은 후에 useActionState 의 initialState 에도 이 필드를 아래와 같이 추가했었는데요, const [state, formAction, isPending] = useActionState(createPostAction, { message: '', errors: {}, formData: { title: '', tag: '', content: '', }, success: false, }); useActionState 훅을 사용할 때 initialState 에 포함된 필드 중 일부를 이후 action 함수의 반환값에서 생략하면 어떤 경우에는 에러가 발생하고, 어떤 경우에는 아무 문제 없이 동작하는 게 잘 이해가 되지 않아서요. 예를 들어 initialState 에는 success 필드가 있지만, 유효성 검사 실패 시 반환 객체에서 success 를 생략하면 에러가 발생합니다. if (!validatedFields.success) { return { errors: validatedFields.error.flatten().fieldErrors, message: 'Validation failed', formData: rawFormData, success: false, // 없으면 useActionState 에서 에러 발생 }; } 그런데 try...catch 문에서는 success 없이 반환하면 에러가 발생하지 않는 걸 확인할 수 있었습니다. try { const { title, tag, content } = validatedFields.data; await createPost({ title, tag, content }); revalidateTag('posts'); return { success: true, // 없어도 에러 안남 message: 'Post created successfully', }; } catch (e) { return { message: 'Failed to create post : ' + e, formData: rawFormData, }; } formData 필드도 비슷하게 행동하는데 이 차이가 왜 발생하는지, 어떤 기준으로 반환 객체의 필드 구조를 검사하고 에러를 발생시키는지 궁금합니다. useActionState 에서 반환 객체의 필드가 initialState 와 구조적으로 정확히 일치해야 하는 조건이 언제 적용되는 건가요?

  • react
  • next.js
e_sun 댓글 2 좋아요 0 조회수 105

인기 태그

인프런 TOP Writers

주간 인기글