묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결React 완벽 마스터: 기초 개념부터 린캔버스 프로젝트까지
80강 수강중인데
80강 3분 08초에서 > 3분 09초로 넘어갈때 메모UI로 어떻게 바뀐건가요? 강의교안에 수정해야 될게 있으면 추가해주세요 / 이런사소한것도 신경안쓰고 강의를 올리십니까 ? 리액을 익히는게 목적인데 환경 잡느라 시간 다 날립니다. 추가영상 촬영해서 올려주시고 교안도 수정해주세요
-
미해결React 완벽 마스터: 기초 개념부터 린캔버스 프로젝트까지
79 타이틀수정 강의중
78 삭제 강의 이후 79 타이틀 수정 으로 넘어 갈떄 home.jsx UI가 바뀌는데 그거에 대해 설명이 없네요 . 강의교안에 home.jsx 파일 올려주시고 / 영상에도 home.jsx 변경 하는거 추가해서 촬영 부탁드립니다.
-
미해결React 완벽 마스터: 기초 개념부터 린캔버스 프로젝트까지
tailwindCss 강의중
공식 사이트에 가니 npm tailwindcss init -p명령어가 사라졌는데 버전이 올라가서 그런건가요?
-
해결됨[리뉴얼] 맛집 지도앱 만들기 (React Native & NestJS)
아 이만 포기할까 합니다.. 안드로이드쪽 문제.
다들 비슷하시군요. ㅋㅋ 지도 띄우는 부분까지 와서 ios 는 경우겨우 의존성 처리해서 구동시켰는데 이번엔 안드로이드가 안되는군요.참고로 라이브러리버전은 다음과 같습니다.강의 내용은 맘에 드는데, 버전 문제 등으로 너무 진행이 뎌뎌서 이만 포기할까 합니다.. 너무 시간이 뺏기네요이거 안되면 ..그냥 플투터로 넘어갈까 합니다..이래저래 버전문제 처리해서 구동시켰는데 앱 실행하자마자 꺼지네요.wrapper.propertiesdistributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/distsbuild.gradlebuildscript { ext { buildToolsVersion = "34.0.0" minSdkVersion = 24 compileSdkVersion = 34 targetSdkVersion = 34 ndkVersion = "25.2.9519653" // 또는 사용 중인 NDK 버전 kotlinVersion = "1.9.10" } repositories { google() mavenCentral() } dependencies { classpath("com.android.tools.build:gradle:8.1.0") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") classpath("com.facebook.react:react-native-gradle-plugin") } } allprojects { repositories { mavenCentral() google() } tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { kotlinOptions { jvmTarget = "17" } } tasks.withType(JavaCompile).configureEach { options.release = 17 } } subprojects { afterEvaluate { project -> if (project.plugins.hasPlugin("com.android.library") || project.plugins.hasPlugin("com.android.application")) { project.android { compileSdkVersion rootProject.ext.compileSdkVersion buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion ndkVersion rootProject.ext.ndkVersion } compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } // ✅ Kotlin 적용 프로젝트에서만 실행 if (project.plugins.hasPlugin("kotlin-android")) { kotlinOptions { jvmTarget = "17" } kotlin { jvmToolchain(17) } } } } } } "dependencies": { "@react-native-community/geolocation": "^3.1.0", "@react-native-community/slider": "^4.5.0", "@react-native-masked-view/masked-view": "^0.3.0", "@react-navigation/bottom-tabs": "^6.5.11", "@react-navigation/drawer": "^6.6.6", "@react-navigation/native": "^6.1.9", "@react-navigation/stack": "^6.3.20", "@tanstack/react-query": "^5.8.7", "axios": "^1.6.2", "patch-package": "^8.0.0", "postinstall-postinstall": "^2.1.0", "react": "18.2.0", "react-native": "^0.72.0", "react-native-config": "^1.5.1", "react-native-date-picker": "^4.3.5", "react-native-encrypted-storage": "^4.0.3", "react-native-gesture-handler": "2.12.0", "react-native-image-crop-picker": "^0.40.2", "react-native-maps": "1.15.0", "react-native-permissions": "^4.0.1", "react-native-reanimated": "3.5.4", "react-native-safe-area-context": "^4.7.4", "react-native-screens": "3.29.0", "react-native-toast-message": "^2.2.0", "react-native-vector-icons": "^10.0.3", "zustand": "^4.5.0" }, "devDependencies": { "@babel/core": "^7.20.0", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/preset-env": "^7.20.0", "@babel/runtime": "^7.20.0", "@react-native/eslint-config": "^0.72.2", "@react-native/metro-config": "^0.72.11", "@tsconfig/react-native": "^3.0.0", "@types/react": "^18.0.24", "@types/react-native-vector-icons": "^6.4.18", "@types/react-test-renderer": "^18.0.0", "babel-jest": "^29.2.1", "babel-plugin-module-resolver": "^5.0.0", "eslint": "^8.19.0", "jest": "^29.2.1", "metro-react-native-babel-preset": "0.76.9", "prettier": "^2.4.1", "react-test-renderer": "18.2.0", "typescript": "4.8.4" }, "engines": { "node": ">=16" }
-
해결됨아바타 커뮤니티앱 만들기 (React Native Expo)
스타일링 라이브러리
강사님 안녕하세요. 강의 잘 듣고 있습니다!강사님께서는 스타일링을 하실때 리액트 네이티브 기본 styleSheet를 사용 해서 개발하시는데,현재 강의에서 개발하는 토이프로젝트 규모의 앱이 아니라, 실제 서비스용 앱을 개발하실때에도 기본 styleSheet를 사용해서 개발하시는지 아니면 다른 외부 라이브러리를 사용해서 개발하시는지 궁금합니다!next.js 나 react 에서는 생산성이나 기능적인 부분때문에 다양한 라이브러리를 사용하는 경우가 많은데, 리액트 네이티브에서는 기본 스타일만으로 충분한지 조언들 듣고 싶습니다. 감사합니다!
-
해결됨아바타 커뮤니티앱 만들기 (React Native Expo)
아바타 이미지는 없는건가요?
아바타 hat이나 hand의 요소 이미지는 제공하지 않나요?
-
미해결React 완벽 마스터: 기초 개념부터 린캔버스 프로젝트까지
git hub 브렌치 강의내용 21~24쪽의 내용이 없네요
20.update-object받으니 컴포넌트의 기억저장서 부터이고 21조건부 랜터링부터 ~ 24이벤트전파까지의 소스 브랜치가 없네요
-
미해결Next + React Query로 SNS 서비스 만들기
Next의 route handler에 대한 질문이 있습니다.
안녕하세요 Next app router 관련해서 질문드립니다.현재 사이드프로젝트에서 route handler를 적극활용하고 있는데요.제가 인프라나 백엔드 관련 지식이 없다보니 좀 헷갈리는게 있습니다. 현재 저희 서비스에서 특정 API는 클라이언트 컴포넌트에서 route handler로 API 호출 -> route handler에서 외부 백엔드 API 호출이런 형태로 사용되고 있는데요, 이때 실제로 route handler 서버가 아래의 사진 중 어느 형태로 운용되는 것인가요? 즉, Next 프로젝트를 배포했을 때 각 유저마다 route handler 서버가 할당되는 것인가요? 아니면 모든 유저의 요청을 오직 하나의 route handler서버에서 대응하는 것인가요? 아니면 이게 배포 환경에 따라 달라지는것인가요?
-
미해결React 완벽 마스터: 기초 개념부터 린캔버스 프로젝트까지
강의교안 노션에 접속이 안되요
무한로딩 되면서 접속이 안되요 ㅠㅠ
-
해결됨아바타 커뮤니티앱 만들기 (React Native Expo)
[서버 실행하기] 의존성 설치를 위한 npm install 시 취약점 발생
초기 설치 시 취약점 발생```npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.npm warn deprecated @humanwhocodes/config-array@0.11.14: Use @eslint/config-array insteadnpm warn deprecated rimraf@3.0.2: Rimraf versions prior to v4 are no longer supportednpm warn deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema insteadnpm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supportednpm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supportednpm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supportednpm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supportednpm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supportednpm warn deprecated superagent@8.1.2: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.netadded 795 packages, and audited 796 packages in 7s122 packages are looking for funding run npm fund for details18 vulnerabilities (4 low, 5 moderate, 9 high)To address issues that do not require attention, run: npm audit fixTo address all issues (including breaking changes), run: npm audit fix --forceRun npm audit for details.```이후 ```npm audit fix``` 실행 후 두 번째 취약점 발생```# npm audit reportmulter 1.4.4-lts.1 - 2.0.0Severity: highMulter vulnerable to Denial of Service via unhandled exception - https://github.com/advisories/GHSA-g5hg-p3ph-g8qgfix available via npm audit fix --forceWill install @nestjs/platform-express@8.2.3, which is a breaking changenode_modules/multer @nestjs/platform-express >=8.2.4 Depends on vulnerable versions of @nestjs/core Depends on vulnerable versions of multer node_modules/@nestjs/platform-express @nestjs/core >=9.0.0-next.1 Depends on vulnerable versions of @nestjs/platform-express node_modules/@nestjs/core @nestjs/serve-static 2.0.0-next.1 - 2.0.0 || >=3.0.0 Depends on vulnerable versions of @nestjs/core Depends on vulnerable versions of path-to-regexp node_modules/@nestjs/serve-static @nestjs/testing >=9.0.0-next.1 Depends on vulnerable versions of @nestjs/core Depends on vulnerable versions of @nestjs/platform-express node_modules/@nestjs/testingpath-to-regexp 0.2.0 - 1.8.0Severity: highpath-to-regexp outputs backtracking regular expressions - https://github.com/advisories/GHSA-9wv6-86v2-598jfix available via npm audit fix --forceWill install @nestjs/serve-static@5.0.3, which is a breaking changenode_modules/@nestjs/serve-static/node_modules/path-to-regexp6 high severity vulnerabilitiesTo address all issues (including breaking changes), run: npm audit fix --force```취약점 6개 발생 이후 안사라지길래 npm audit fix --force 진행해도 6개 그대로 나오는 현상 발생현재 node 23.7, npm 10.9.2 사용중인데 gpt한테 물어보니 nest js 버전 어쩌구 하던데 서버는 잘 몰라서 건들지를 못하겠네요. 어떻게 해야 할까요? ❗질문 작성시 꼭 참고해주세요에러 메세지에서 단서를 찾을 수 있는 경우가 많습니다. 에러 메세지를 읽고 한번 검색해보시는것을 추천드립니다.질문글을 작성하실때는, 현재 문제(또는 에러)와 코드나 github을 첨부해주세요.개발중인 OS, ReactNative, Node 버전 등의 개발환경을 알려주셔야합니다.에러메세지는 일부분이 아닌 전체 상황을 올려주세요. 일부만 보여주시면 답변이 어렵습니다.에러 잘라서 올리시면 안됩니다!(에러 일부만 자르거나 일부만 복사하지말아주세요)
-
미해결Next + React Query로 SNS 서비스 만들기
게시판 리스트 만들때 use client를 어디서부터 집어넣어야할지 모르겠습니다
<리스트> <레코드1/> <레코드2/></리스트> 일 경우… 리스트단에서 use client로 한 후 zustand에서 리스트 자체를 통으로 관리해야하는가?각각의 레코드에 use client를 한 후 데이터를 받으면 zustand에 리스트를 만들어 레코드별로 hash(Map)으로 등록해 관리해야하는가? 레코드에는 좋아요, 조회수 등이 표시됨. 제 생각은1번은 SEO가 중요한건 각각 레코드 (상세페이지) 이므로 zustand에서 통으로 넣어 관리하면 되니 구현 및 데이터 신뢰도에서는 나아보이는데 하나바뀌면 전부 렌더링되니까 애매한거같고2번은 서버에서 모두 다 가져와서 초기속도는 빠르고 seo에 좋으나 zustand에 통으로 못넣고 데이터 자체를 내가 직접관리하는 구조라 구현 및 데이터 신뢰 측면에서는 골치아플거같은데… 무엇이 일반적인 구현방식인지 모르겠습니다. 도와주세요 ㅠㅠ
-
해결됨[리뉴얼] 맛집 지도앱 만들기 (React Native & NestJS)
강의 내용 빈약함
EC2 설정하고 RDS 설정하고그 후에 어떻게 하라는 건지 설명이 없어요...구글링하면서 보안 설정은 했는데마지막 강의가 너무 설명이 없었어서 따로 강의를 추가해주셨으면 해요나머지 강의는 다 좋은데 배포하기 강의가 너무 아쉽네요
-
미해결Next + React Query로 SNS 서비스 만들기
프라이빗 폴더를 해야 하는 이유가 모호한 것 같아요.
프라이빗 컴포넌트로 잡은 것과 그냥 컴포넌트로 잡은 것의 차이가 없지 않나요?컴포넌트를 예로 강의를 찍어 주셨는데 폴더만 더 늘어나고 좋은 예는 아닌듯합니다.프라이빗 폴더가 어떨 때 왜 필요한지를 알려주는게 더 교육적일 것 같아 글 남깁니다.컴포넌트 자체가 재사용성을 갖는 것이기에 내부 구성요소만 표기하는 프라이빗은 큰 의미가 없을 것 가은데요. 컴포넌트 외 폴더라고 해도 와닿지는 않습니다. 어차피 컴포넌트로 사용하면 uri 에도 잡히지 않고 말이죠. 전체적으로 폴더 구조만 더 복잡해지는 것 같아요
-
미해결Next + React Query로 SNS 서비스 만들기
vanilla-extract 못찾는 문제
안녕하세요~ 강의 잘 보고 있습니다! vanilla-extract 적용해보려고 하는데 패키지 설치하고 config설정까지 했는데 해당 에러가 나서 질문드립니다. next.config.ts파일과 globalTheme.css.ts, layout.ts중에 문제가 있을까요?? 파일 이름도 문제가 없고 코드 그대로 사용했는데도 해당 에러가 나서 next15에서 vanilla-extract 적용을 할 수 없는건지 궁금해서 여쭤봅니다.. 감사합니다// package.json// next.config.tsimport type { NextConfig } from "next"; const { createVanillaExtractPlugin // eslint-disable-next-line @typescript-eslint/no-require-imports } = require('@vanilla-extract/next-plugin'); const withVanillaExtract = createVanillaExtractPlugin(); const nextConfig: NextConfig = { /* config options here */ experimental: { serverActions: { bodySizeLimit: '10mb', // Set the body size limit for server actions } }, async rewrites() { return [ { source: '/upload/:slug', destination: `${process.env.NEXT_PUBLIC_BASE_URL}/upload/:slug`, // Matched parameters can be used in the destination }, ] }, }; module.exports = withVanillaExtract(nextConfig); // globalTheme.css.tsimport {assignVars, createGlobalTheme, createGlobalThemeContract, globalStyle} from "@vanilla-extract/css"; export const global = createGlobalThemeContract({ background: { color: 'bg-color' }, foreground: { color: 'fg-color' }, }) const whiteGlobalTheme = { background: { color: 'rgb(255, 255, 255)' }, foreground: { color: 'rgb(0, 0, 0)' }, } const darkGlobalTheme = { background: { color: 'rgb(0, 0, 0)' }, foreground: { color: 'rgb(255, 255, 255)' }, } createGlobalTheme(':root', global, whiteGlobalTheme); // 실제 적용 globalStyle(':root', { '@media': { '(prefers-color-scheme: dark)': { vars: assignVars(global, darkGlobalTheme), } } }) globalStyle('*', { boxSizing: 'border-box', padding: 0, margin: 0, }) globalStyle('html', { '@media': { '(prefers-color-scheme: dark)': { colorScheme: 'dark', } } }); globalStyle('html, body', { maxWidth: '100dvw', overflowX: 'hidden', }) globalStyle('body', { color: global.foreground.color }) globalStyle('a', { color: 'inherit', textDecoration: 'none', }) // layout.tsximport type {Metadata} from 'next' import {Inter} from 'next/font/google' import './globalTheme.css'; import {MSWProvider} from "@/app/_component/MSWComponent"; import AuthSession from "@/app/_component/AuthSession"; if (process.env.NEXT_RUNTIME === 'nodejs' && process.env.NODE_ENV !== 'production' && process.env.MSW_ENABLED !== 'false') { const {server} = require('@/mocks/http') server.listen() } const inter = Inter({subsets: ['latin']}) export const metadata: Metadata = { title: 'Create Next App', description: 'Generated by create next app', } type Props = { children: React.ReactNode, }; export default function RootLayout({children}: Props) { return ( <html lang="en"> <body className={inter.className}> <MSWProvider> <AuthSession> {children} </AuthSession> </MSWProvider> </body> </html> ) }
-
미해결React 완벽 마스터: 기초 개념부터 린캔버스 프로젝트까지
인텔레리제이 세팅환경도 알려주세요
인텔레리제이 세팅환경도 알려주세요
-
미해결React 완벽 마스터: 기초 개념부터 린캔버스 프로젝트까지
린캔버스 수정 시 CanvasDetail 컴포넌트 리랜더링 질문
안녕하세요. 린캔버스 수정 수업 관련해서 질문이 있어서 문의 드립니다. const handleCanvasChange = async updatedCanvas => { try { await updateCanvas(id, updatedCanvas); setCanvas(updatedCanvas); } catch (err) { alert(err.message); } };addNote, deleteNote, updateNote 등의 이벤트가 발생할 경우 setCanvas를 통해 useState에 선언된 canvas 값을 바꾸는데 그렇게 되면 CanvasDetail과 그 하위에 선언된 자식 컴포넌트들이 전부 리랜더링되는 것 같은데 강의에서는 그렇게 보이지 않아서 문의 드립니다.const [canvas, setCanvas] = useState();canvas가 setCanvas 메서드를 통해서 상태가 변하면 리랜더링 되면서 하위 컴포넌트인 Note의 isEditing 값이 다시 false로 초기화되는데 강의에서는 여전히 true값이 남아있는 것 같습니다. 전체적인 코드를 동일하게 작성한 것 같은데 차이점이 발생하는 이유가 무엇일까요?
-
해결됨아바타 커뮤니티앱 만들기 (React Native Expo)
Tanstack query 구조에 관해 질문 드립니다.
엔드포인트마다 훅을 만드는 게 가장 좋은 방법일까요? 엔드포인트가 많아진다면 파일이 너무 많아질 것 같은데 더 좋은 방법이 있을까요?
-
미해결Next + React Query로 SNS 서비스 만들기
fetch 캐싱과 revalidate 관련
안녕하세요 제로초님 fetch 캐싱과 revalidate 관련해서 궁금한 점이 있어 질문드립니다. await fetch('https://api.example.com/posts', { next: { revalidate: 60 }, });A가 /posts를 최초 요청합니다.→ API에서 데이터를 받아오고, 해당 데이터는 Next.js 서버 캐시에 저장이후 60초 동안은 다른 누구든지 이 캐시된 데이터를 그대로 받음그런데 60초가 지나기 전에 DB에서 게시글 1번의 제목이나 내용이 수정됨60초가 지나고 A가 다시 목록을 요청→ 이 시점은 revalidate 만료 시점 이후이므로 재검증 타이밍→ 하지만 A는 여전히 이전 캐시 데이터를 먼저 받고,→ A의 요청을 계기로 Next.js가 백그라운드에서 API를 다시 fetch하여 캐시를 갱신곧이어 B가 /posts를 요청하면→ B는 A 덕분에 갱신된 최신 데이터를 바로 받음 제가 이해한 것이 맞을까요? 만약 저런식으로 동작하면 상세 페이지와 데이터 불일치 문제가 발생할 수 있지 않을까 해서요 만약 상세 페이지 요청도 이렇게 작성되어 있다면await fetch('https://api.example.com/posts/1', { next: { revalidate: 60 }, });A는 목록 요청만 했고, 상세 페이지는 요청하지 않음B는 A 이후에 목록을 보고 → 최신 제목을 확인한 뒤,→ 게시글 1번의 상세 페이지를 클릭그런데 상세 페이지의 제목은 여전히 수정 전의 이전 제목으로 보임→ 목록과 상세 페이지 간에 데이터가 불일치할 수 있음정리하자면 제가 이해한 Next.js의 fetch + revalidate 캐시 동작이 맞는지 궁금하고위와 같은 목록-상세의 데이터 불일치 현상은 실제로 발생 가능한 문제인지 궁금합니다. 제가 실제로 테스트해봤을 때 위 시나리오대로 목록과 상세 페이지에서 서로 다른 제목이 보이는 걸 확인했습니다. 혹시 제가 잘못 이해하고 테스트한 부분이 있는 건지, 아니면 실제로도 발생할 수 있는 동작인지 궁금합니다.
-
해결됨[리뉴얼] 맛집 지도앱 만들기 (React Native & NestJS)
forwardRef 지원 중단에 대한 대응?
https://ko.react.dev/reference/react/forwardRef공식문서를 보면 앞으로는 forwardRef 지원을 중단한다고 나와있는데 이에 대응하려면 코드 작성을 어떻게 하면 될까요?
-
미해결Next + React Query로 SNS 서비스 만들기
강의 듣는 방법
안녕하세요.강의를 어떤 방식으로 듣는 것이 가장 효율적인지 여쭤보고 싶습니다.처음 page.tsx를 만들 때는 하나하나 따라 만들며 진행했지만, 중간부터는 급하게 따라가기만 하다 보니 시간도 오래 걸리고, 오히려 비효율적이라는 생각이 들었습니다.또한 수업 자료의 GitHub를 보면 각 폴더 설명에 "따라치기 위해 보면 안 된다"고 안내되어 있어서, 제가 잘못된 방식으로 수강하고 있는 건 아닌지 고민이 됩니다.그리고 ch0~ch4 강의 이후의 코드를 올려주신 것은, 강의를 들으면서 이해가 안 되거나 따라가지 못한 부분이 있을 경우 해당 코드를 참고하거나 다운로드해서 사용해도 괜찮다는 의미일까요?또한 강의 초반에 GitHub에서 해당 폴더로 들어가 복사하고, 설명을 들으며 진도를 나가는 방식이라고 말씀하신 것을 보았는데, 그렇다면 굳이 모든 코드를 따라 치기보다는 전체 코드를 먼저 불러온 뒤 실행해두고, 강의를 들으며 흐름과 설명 위주로 이해하는 방식으로 수강해도 괜찮을지 궁금합니다.지금처럼 따라치며 수강하려다 보니 상대적으로 시간이 많이 소요되고, 비효율적일 수 있다는 생각이 들어 이렇게 문의드립니다.이에 대해 보다 효율적인 수강 방법에 대해 조언해주시면 감사하겠습니다.