묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실무에 바로 적용하는 프런트엔드 테스트 - 1부. 테스트 기초: 단위・통합 테스트
debounce 함수 테스트 정확도 관련 질문입니다.
안녕하세요. debounce 함수 테스트 관련 강의를 보고 궁금한 점이 있어 문의드립니다. debouncedFn이 300ms이 지난 후 실행되어야 함을 테스트할 때, 기존에 작성해주신 것 처럼 테스트할 시에는 함수가 300ms 후가 아닌 즉시 실행이 되거나 그보다 작은 시간이 지나고 실행이 되어도 테스트가 통과하게 됩니다. 그에 따라 아래처럼 작성하는 것이 더 정확한 테스트라고 생각이 되는데 이렇게 테스트하지 않는 이유가 있는지 궁금합니다! it('특정 시간이 지난 후 함수가 호출된다.', () => { const spy = vi.fn(); const debouncedFn = debounce(spy, 300); debouncedFn(); expect(spy).not.toHaveBeenCalled(); // 즉시 호출되지 않았는지 확인 vi.advanceTimersByTime(299); expect(spy).not.toHaveBeenCalled(); // 299ms 후에도 호출되지 않았는지 확인 vi.advanceTimersByTime(1); expect(spy).toHaveBeenCalledTimes(1); // 300ms 후에 정확히 한 번 호출되었는지 확인 expect(spy).toHaveBeenCalled(); });
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
몽고db 연결 오류가 납니다 위에껀 입력한 코드, 아래껀 터미널이에요
const express = require('express') const app = express() const port = 5000 const mongoose = require('mongoose') mongoose.connect('mongodb+srv://newlifecode:1234@newlifecode.f0tau.mongodb.net/test?retryWrites=true&w=majority&appName=newlifecode' , { useNewUrlParser: true, useUnifiedTopology: true, }) .then(() => console.log('MongoDB Connected...')) .catch(err => console.error('MongoDB Connection Error:', err.message)); app.get('/', (req, res) => { res.send('Hello World!') }) app.listen(port, () => { console.log(`Example app listening on port ${port}`) }) PS C:\Users\USER\Documents\boiler-plate> npm run start > boiler-plate@1.0.0 start > node index.js (node:7628) [MONGODB DRIVER] Warning: useNewUrlParser is a deprecated option: useNewUrlParser has no effect since Node.js Driver version 4.0.0 and will be removed in the next major version (Use `node --trace-warnings ...` to show where the warning was created) (node:7628) [MONGODB DRIVER] Warning: useUnifiedTopology is a deprecated option: useUnifiedTopology has no effect since Node.js Driver version 4.0.0 and will be removed in the next major version node:events:496 throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE: address already in use :::5000 at Server.setupListenHandle [as _listen2] (node:net:1907:16) at listenInCluster (node:net:1964:12) at Server.listen (node:net:2066:7) at Function.listen (C:\Users\USER\Documents\boiler-plate\node_modules\express\lib\application.js:635:24) at Object.<anonymous> (C:\Users\USER\Documents\boiler-plate\index.js:19:5) at Module._compile (node:internal/modules/cjs/loader:1546:14) at Object..js (node:internal/modules/cjs/loader:1689:10) at Module.load (node:internal/modules/cjs/loader:1318:32) at Function._load (node:internal/modules/cjs/loader:1128:12) at TracingChannel.traceSync (node:diagnostics_channel:315:14) Emitted 'error' event on Server instance at: at emitErrorNT (node:net:1943:8) at process.processTicksAndRejections (node:internal/process/task_queues:90:21) { code: 'EADDRINUSE', errno: -4091, syscall: 'listen', address: '::', port: 5000 } Node.js v22.11.0 PS C:\Users\USER\Documents\boiler-plate> npm run start > boiler-plate@1.0.0 start > node index.js (node:860) [MONGODB DRIVER] Warning: useNewUrlParser is a deprecated option: useNewUrlParser has no effect since Node.js Driver version 4.0.0 and will be removed in the next major version (Use `node --trace-warnings ...` to show where the warning was created) (node:860) [MONGODB DRIVER] Warning: useUnifiedTopology is a deprecated option: useUnifiedTopology has no effect since Node.js Driver version 4.0.0 and will be removed in the next major version node:events:496 throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE: address already in use :::5000 at Server.setupListenHandle [as _listen2] (node:net:1907:16) at listenInCluster (node:net:1964:12) at Server.listen (node:net:2066:7) at Function.listen (C:\Users\USER\Documents\boiler-plate\node_modules\express\lib\application.js:635:24) at Object.<anonymous> (C:\Users\USER\Documents\boiler-plate\index.js:19:5) at Module._compile (node:internal/modules/cjs/loader:1546:14) at Object..js (node:internal/modules/cjs/loader:1689:10) at Module.load (node:internal/modules/cjs/loader:1318:32) at Function._load (node:internal/modules/cjs/loader:1128:12) at TracingChannel.traceSync (node:diagnostics_channel:315:14) Emitted 'error' event on Server instance at: at emitErrorNT (node:net:1943:8) at process.processTicksAndRejections (node:internal/process/task_queues:90:21) { code: 'EADDRINUSE', errno: -4091, syscall: 'listen', address: '::', port: 5000 }
-
해결됨손에 익는 Next.js - 블로그 만들기
배포 후, 조회수 증가 이슈
안녕하세요 조은님!강의 즐겁게 수강했습니다 🤓 다른게 아니라 배포 후 발견한 문제 때문에 질문 드립니닷!로컬에서는 문제없이 새로고침할 때마다 조회수가 1씩 증가하는데용배포 후에는 조회수가 3씩 증가 하고 있습니닷 🤔(포스팅 갯수도 3개여서 관련이 있을 거라고 생각되는데욤..) 제 코드는 강의와 약간 다른 점이 있습니닷!현재 Vercel에서는 기존 Vercel Postgres를 대체하는 Neon Marketplace 통합으로 변경되었는데요(자세히는 잘 모르겠습니닷.. 관련 링크를 첨부합니닷..)https://vercel.com/docs/storage/vercel-postgreshttps://vercel.com/changelog/neon-now-available-on-vercel-marketplace그래서 강의와는 다른 import { neon } from "@neondatabase/serverless"; 를 불러와서 사용 중입니닷"use server"; import { neon } from "@neondatabase/serverless"; import { unstable_noStore as noStore } from "next/cache"; const sql = neon(`${process.env.DATABASE_URL}`); export async function getViewsCount(): Promise< { slug: string; count: number; }[] > { if (!process.env.POSTGRES_URL) { return []; } noStore(); const rows = await sql` SELECT slug, count FROM views `; return rows.map((row) => ({ slug: row.slug, count: row.count, })); } export const incrementView = async (slug: string) => { noStore(); await sql` INSERT INTO views (slug, count) VALUES (${slug}, 1) ON CONFLICT (slug) DO UPDATE SET count = views.count + 1; `; };다른 분들도 저와 비슷한 오류가 생길지 궁금한데용.. 혹시 배포 후 조회수 증가를 확인해주실 수 있을까용..? 감사합니다!
-
해결됨[React / VanillaJS] UI 요소 직접 만들기 Part 2
스낵바를 만들 때 snackBarContext와 snackBarSetContext
스낵바를 만들 때 snackBarContext와 snackBarSetContext를 둘로 나누셔서 관리하는데 이렇게 하신 이유나 장점을 정확히 알 수 있을까요?단점도 알려주시면 감사드리겠습니다.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 쇼핑몰 사이트 만들기[전체 리뉴얼]
오버로드 오류
강사님. 강의를 따라하다가 App.js에 오버로드오류가 나타나는데 어떻게 해결할 수 있난요?
-
미해결Next + React Query로 SNS 서비스 만들기
msw 쿠키 관련 궁금증!
안녕하세요, 강좌들으며, msw를 프로젝트에 도입하다 궁금한점이 있어 남깁니다!현재 위와 같이 코드를, 작성하여, 로그인 성공시, 위와 같이, 데이터와, 쿠키를 동시에 세팅해주고 있는 상황입니다!실제로 아래와 같이, response들은 잘 넘어오나response headers에 쿠키가, 오지 않아, 실제로 스토리지에 쿠키가 담기지 않습니다!원래, 가상으로 심어주는 쿠키는, 브라우저의 쿠키에 담기지 않는건가요?? 궁금하여 질문남깁니다!!좋은 강의 감사합니다!
-
미해결실무 중심! FE 입문자를 위한 React
Chapter 4-2 React랜더링과정 설명중 자료가 틀리게 적어져있네요..
Chapter 4-2 React랜더링과정 설명중 강의자료 코드 이미지가 잘못되있어요..강의자료 (처음부터 ~ 2분까지나오는 내용)const [value, setValue] = useState(0);........중간생략 setValue((state) => state +1) 로 되어있는데.. => 틀린부분onClick 이벤트를 실행할때마다 value값이 1씩 증가하도록 setValue 값을 설정했다고 하는데.. setValue((value) => value +1) 로 되야하는건 아닌가요??
-
해결됨한 입 크기로 잘라먹는 Next.js
인덱스 페이지가 dynamic으로 표시되는데요!
마지막 최적화 강의에서 코드 수정 후에 정환님이 인덱스 페이지가 정적 페이지로 동작된다하셨는데 빌드 때에는 f로 dynamic 페이지로 표시됩니다. 혹시 이 부분은 정적 페이지임을 어떻게 알 수 있을까요?
-
미해결손에 익는 Next.js - 블로그 만들기
추가로 Head tag에서 작성된 script 코드 관련하여 질문드리고 싶습니다. (feat. 즉시 실행 함수, dangerouslySetInnerHTML)
안녕하세요 조은님! 앞서 작성했던 질문 글에 다 작성하며 너무 길어질 것 같아 이렇게 나눠서 적게 되었습니다 ㅎㅎ; Q3. 강의에서 즉시 실행함수는 스코프를 제한해주기 위해서 사용한다고 이해를 했는데, 이건 혹시 모를 변수 중복 위험을 제한하기 위해서일까요?? 이 외에도 강사님께서 즉시 실행 함수를 사용하는 일반적인 케이스나 즉시 실행함수를 사용하면 좋은 케이스들이 있다면 배워가고 싶습니다! Q4. 추가로 dangerouslySetInnerHTML를 사용하는 이유에 대해서 여쭤보고 싶습니다!제가 찾아봤을 때는 React에서 HTML 사용에 위험성을 알리기 위해서는 dangerouslySetInnerHTML를 사용해라. 라는 것까지는 확인을 했습니다! 하지만 기능적으로 특별한 기능을 하는 것 같지는 않은데.. dangerouslySetInnerHTML이 사용되는 다른 이유가 있을지에 대해 여쭤보고 싶습니다!
-
미해결손에 익는 Next.js - 블로그 만들기
Head tag에서 script를 작성하는 이유에 대해서 여쭤보고 싶습니다! (+ NextJS의 Head tag와 Script tag)
안녕하세요. 조은님 :) 이번에 다크 모드 관련 내용을 수강하면서 head 태그를 작성하는 부분에서 작은 의문이 생겨 질문 드리게 되었습니다. Q1. 이번 강의 중 다크모드 설정을 localStorage에서 가져오는 부분에서 head에서 script를 사용하는 이유에 대해서 알 수 있을까요?? fouc 문제를 막기위해서 저렇게 사용한다고 검색을 통해 알게 되었는데, 이 의도 맞을지 혹시 또 다른 이유가 있을지에 대해서 여쭤보고 싶습니다! Q2. 이어지는 질문으로 관련해서 공부를 하다보니 NextJS에서 제공하는 Head tag와 Script tag가 있는 걸 알게 되었습니다. 혹시 해당 태그들을 사용하지 않고 순수 HTML로 작성하신 이유에 대해서 궁금증이 생겨 여쭤보고 싶습니다! 가능하다면 두 개의 차이점에 대해서도 여쭤보고 싶습니다!
-
미해결코딩 몰라도 OK! CursorAI로 시작하는 개발 생활 (웹/초급)
실습 강의에서 node.js설치법
안녕하세요. 실습 시작 강의에서 node.js설치법이 강의 노트에 있다고 하는데, 안보여서 질문 드립니다.개인적으로 다운 받아 설치 코자 하는데, Docker, fnm 중에서 어떤 걸 선택해야 하는지 모르겠네요혹, 제가 노트에서 못 찾고 있다면 노트 위치를 설명해 주심 감사하겠습니다. 답변 부탁드립니다.
-
미해결처음 만난 리액트(React)
jsx 실습 관련 오류 npm start를 해도 강사 화면처럼 안떠요.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.왼쪽의 화면처럼만 뜹니다.그리고 강사처럼 npm start만 하면 이런 오류가 떠서cd my-app , npm start하면 그나마 실행되는데 위의 사진처럼 결과 리액트가 아니라 로딩화면같이 뜹니다. 어떻게 해결해야하나요?
-
미해결처음 만난 리액트(React)
terminal에서 npx 명령어 입력해도 안떠요..
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.어떻게 해결해야할까요?
-
해결됨한 입 크기로 잘라먹는 Next.js
모달 구현 후 북 상세 클릭 시 뒤 화면 스크롤이 하단으로 내려갑니다.
모달 구현 후 북 상세 클릭 시 뒤 화면 스크롤이 하단으로 내려갑니다. 정환님 화면에서는 그렇지 않은데, 저는 스크롤이 하단으로 내려가서 부자연스럽게 동작하네요. 차이는 저는 윈도우입니다. 혹시 이유를 아실까요? .
-
해결됨한 입 크기로 잘라먹는 Next.js
App Router의 네비게이팅 관련 질문 드립니다.
1) prefetching 이 초기 1회만 발생하는지, 페이지를 이동할때마다 해당 페이지에 맞춰서 발생하는지가 궁금합니다.초기 접속이후에는 CSR 방식으로 동작해서 서버에서 렌더링이 발생하지 않는다고 배웠는데,이동 가능한 페이지에 대해서 prefetching 한다고 하니,인덱스 페이지에서 바로 이동 가능한 페이지가 아닌 경우 (특정 페이지를 통해서만 이동가능한 페이지)의 prefetching은 어떤식으로 처리되는지가 궁금합니다. 2) 초기접속시 전달받는 JS Bundle에는 인덱스 페이지에서 이동 가능한 페이지들에 대한 JS 파일만 구성되어 있는 것인지 궁금합니다. 그 이후에 다른 페이지에 이동 요청을 보내면 필요에 따라 JS Bundle을 추가로 서버에서 전달받는 건가요?
-
미해결Next + React Query로 SNS 서비스 만들기
Nextjs dev모드 오류
nextjs dev모드로 실행하다가 코드 저장하면 자꾸 서버 다운될 때도 많고, 코드 새로 수정해도 반영 안 될 때가 있어서, 서버 껐다 키는 경우가 빈번한데.. 이런거 해결하는 방법 없나요.. 제 컴퓨터에서는 nextjs가 너무 무거워서 리로드 하는 시간도 너무 오래 걸려서요 ㅠㅠ
-
해결됨[2025] 비전공자도 가능한 React Native 앱 개발 마스터클래스
섹션7. 4강 5분 57초부터 api.json
말씀하신 것을 어떻게 해야 할지 모르겠습니다.api.json 파일을 생성했는데, 이곳에 어떤 데이터를 넣으면 될까요??아래 링크 주신 것들을 하나하나 넣어봤는데, 되지는 않았습니다. ㅠㅠ
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
컨텍스트와 프로퍼티 선택 기준
안녕하세요 강의 잘 보고 있습니다. 컨텍스트도 많이 사용하면 성능 저하가 생길 것으로 예상됩니다. 그래서 컨텍스트와 프로퍼티 선택 기준이 궁금한데,실무에선 보통 프로퍼티로 우선 사용하고 하위 컴포넌트들이 특정 개수 이상이 되면 컨텍스트로 변경을 하나요?아니면 처음부터 컨텍스트로 정의해 놓고 불필요한 컨텍스트를 프로퍼티로 변경하나요? 감사합니다
-
해결됨[2025] 비전공자도 가능한 React Native 앱 개발 마스터클래스
섹션5. 날씨 앱 expo 버전
확실히 expo 버전으로 프로젝트를 생성하면, 영상처럼 진행이 되지 않습니다 ㅠㅠ 프로젝트 설치 및 실행 과정은 다음과 같습니다.기종: Androidnpx create-expo-app <앱 이름> --template세 번째(blank) :typescript 선택npx expo start를 실행expo 앱에서 QR 코드로 보기강의와 달리, expo로 빌드하셨다면npx expo install expo-location를 설치해주신 다음에 useEffect 함수 부분을 다음과 같이 변경해주면 됩니다.(Expo는 자체 위치 서비스 API를 제공하므로, @react-native-community/geolocation 대신 expo-location을 사용해야 합니다.)useEffect(() => { const getLocation = async () => { try { // 위치 권한 요청 let { status } = await Location.requestForegroundPermissionsAsync(); if (status !== 'granted') { setError('위치 권한이 거부되었습니다'); setLoading(false); return; } // 현재 위치 가져오기 let location = await Location.getCurrentPositionAsync({}); const { latitude, longitude } = location.coords; fetchWeather(latitude, longitude); } catch (err) { setError(err.message); setLoading(false); } }; getLocation(); }, []);다음으로 OpenWeatherMap API는 기본적으로 켈빈 온도를 반환합니다. 따라서 섭씨로 변환하는 코드를 추가해야 합니다.각자 가져오신 API 값 뒤에 &units=metirc 를 추가해주시면 됩니다. 전체 코드는 다음과 같습니다.import { StatusBar } from 'expo-status-bar'; import { useEffect, useState } from 'react'; import { ActivityIndicator, Text, View } from 'react-native'; import styled from 'styled-components/native'; import * as Location from 'expo-location'; const Container = styled.View` align-items: center; margin-top: 40px; background-color: #222222; flex: 1; `; const MainTemp = styled.Text` font-size: 80px; color: white; `; const Addition = styled.View` background-color: #aeaeae; width: 150px; height: 150px; margin: 15px; align-items: center; justify-content: center; border-radius: 15px; `; const App = () => { const [weatherData, setWeatherData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const getLocation = async () => { try { // 위치 권한 요청 let { status } = await Location.requestForegroundPermissionsAsync(); if (status !== 'granted') { setError('위치 권한이 거부되었습니다'); setLoading(false); return; } let location = await Location.getCurrentPositionAsync({}); const { latitude, longitude } = location.coords; fetchWeather(latitude, longitude); } catch (err) { setError(err.message); setLoading(false); } }; getLocation(); }, []); const fetchWeather = async (latitude, longitude) => { try { const response = await fetch( `https://api.openweathermap.org/data/2.5/weather?lat=${latitude}&lon=${longitude}&appid=<<개인 API값>>&units=metric` ); // <<>>는 지우셔야 합니다. if (!response.ok) { throw new Error('Network response was not ok'); } const data = await response.json(); setWeatherData(data); } catch (error) { setError(error.message); } finally { setLoading(false); } }; if (loading) { return ( <Container> <ActivityIndicator size="large" color="#ffffff" /> </Container> ); } if (error) { return ( <Container> <Text style={{ color: 'white', fontSize: 20 }} >{`Error: ${error}`}</Text> </Container> ); } if (!weatherData) { return ( <Container> <Text style={{ color: 'white', fontSize: 20 }}>No data available</Text> </Container> ); } const { main: { temp, feels_like, humidity, temp_max, temp_min }, wind: { speed }, weather, } = weatherData; return ( <Container> <StatusBar /> <Text style={{ fontSize: 20, marginTop: 40, color: 'white' }}> {weatherData.name} </Text> <MainTemp>{Math.round(temp)}℃</MainTemp> <Text style={{ fontSize: 24, color: 'white' }}>{weather[0].main}</Text> <View style={{ flexDirection: 'row' }}> <Addition> <Text style={{ color: 'white', fontSize: 20, marginTop: -40, marginBottom: 30, }} > 체감 온도 </Text> <Text style={{ color: 'white', fontSize: 18 }}> {Math.round(feels_like)}℃ </Text> </Addition> <Addition> <Text style={{ color: 'white', fontSize: 20, marginTop: -40, marginBottom: 30, }} > 습도 </Text> <Text style={{ color: 'white', fontSize: 18 }}>{humidity}%</Text> </Addition> </View> <View style={{ flexDirection: 'row' }}> <Addition> <Text style={{ color: 'white', fontSize: 20, marginTop: -40, marginBottom: 30, }} > 최고/최저 온도 </Text> <Text style={{ color: 'white', fontSize: 18 }}> {Math.round(temp_max)}℃/{Math.round(temp_min)}℃ </Text> </Addition> <Addition> <Text style={{ color: 'white', fontSize: 20, marginTop: -40, marginBottom: 30, }} > 풍속 </Text> <Text style={{ color: 'white', fontSize: 18 }}>{speed} m/s</Text> </Addition> </View> <View></View> </Container> ); }; export default App;
-
미해결Next + React Query로 SNS 서비스 만들기
쿠키 로그인 방식에 대한 궁금한 점이 있습니다!
서버 배포후 제공해주는 쿠키의 domain이, .naver.com이고, 만약 로컬호스트로 개발 할 경우 localhost의 도메인을 갖게되어, 둘의 도메인이 달라, 쿠키가 담기지 않는 경우가 발생합니다. 모든 통신 요청을 서버와 직접 진행 할 경우, .naver.com의 쿠키로, 모든것이 공유가 가능하니, 정상적으로 접근이 가능한 것 같은데이제 간혹, 라우트 핸들러나, 미들웨어를 거쳐서, 통신 할 경우 도메인이 localhost가 되어, 401 에러가 발생하게 됩니다!!이를 해결하기 위해, 로컬에서 두개의 서버를 띄워서 테스트하는 방법말고, 보통 실무나, 현업에서는 배포된 쿠키 로그인 방식을 활용할 떄, 어떻게 Next.js에서 환경 구성을 하는지, 로컬호스트가 아닌, 다른 도메인으로 띄울 수 있는 방법이 있는지 궁금합니다.