묻고 답해요
140만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨한 입 크기로 잘라먹는 Next.js(15+)
특정 상황에서 상세페이지에 적합한 렌더링 방식은 무엇인가요?
현재 페이지 라우터 강의까지 듣고 궁금한 점이 생겨서 질문드립니다!Q1. 다음과 같은 상황일 때, book페이지는 어떤 렌더링 방식이 적합한가요? SSG, SSR, ISR 모두 완벽히 맞아 떨어진다는 생각이 들지 않아 질문드립니다데이터 변경 가능성이 적고, 관리자 서비스를 통해 데이터가 변경되나, 변경 시점이 명확하지 않은 경우on-demand revalidation 사용이 안되는 경우 (next12)Q2. 만약 on-demand revalidation을 사용할 때, 별도의 서비스에서 일어난 요청을 기준으로 렌더링을 해야한다면 그 요청이 일어났음을 알 수 있는 방법이 있나요?
-
해결됨한 입 크기로 잘라먹는 Next.js(15+)
getLayout이 받는 page라는 인자는 왜 "현재 페이지"인가요??
각 페이지에 레이아웃을 덮어씌워 보내는 함수인 getLayout이라는 메소드는 저희가 정의한 커스텀 메소드인데이 메소드가 받는 page라는 인자는 어떻게 현재 페이지가 되는지 모르겠습니다. 떄문에 app.tsx에서 해당하는 Component(접속한 페이지)의 getLayout이라는 메소드가 없을 경우에 (page)=> page라는 함수를 리턴시켜 기본의 페이지를 리턴한다는 맥락도 또한 이해가 가지 않습니다.page라는 인자는 도대체 왜 현재페이지라고 인식해서 오는지요ㅠㅜ
-
해결됨한 입 크기로 잘라먹는 Next.js(15+)
module CSS 말고 Styled-Component로 css를 작성하는 방법은 어떤가요??
동료들과 협업할때 CSS를 작성하는 방법을 module로 할지 Styled-Component로 할지 고민인데요. module로 하면 className에 계속 "style." 접두사를 넣어주어야 한다는 불편함이 있고 Styled-Component를 쓰게 되면 하나의 파일에 줄이 길어지는 단점과, 스타일링을 코드 한줄 넣고싶어도 하나의 스타일 컴포넌트를 만들어야 한다는 단점이 있더라고요. 강사님꼐서는 module을 추천하시기에 module을 강의에 넣으신걸까요??
-
해결됨[풀스택 완성] Supabase로 웹사이트 3개 클론하기 (Next.js 14)
카카오 로그인 관련
카카오 로그인 까지 구현 후vercel에 배포 까지 한 상태이고 아직 도메인은 등록 하지않았습니다만집에서 할 때는 vscode로 로컬 서버를 열어놔서 몰랏었는데 로컬 서버를 열어놨을 때는 잘되지만밖에서 제가 vercel에 배포한 사이트를 들어가서 카카오 로그인을 시도해보니 localhost에서 연결을 거부했습니다. ERR_CONNECTION_REFUSED 에러가 나오는데 어디가 문제 인걸까요? ㅠ
-
미해결Next + React Query로 SNS 서비스 만들기
Cannot read properties of undefined (reading 'substring')
강의를 따라하는 도중 이런 에러를 만났습니다 에러 경로를 보고 찾을려고 하는데 node_modules\oidc-token-hash\lib\shake256.js (3:1)가 어딘지를 잘 못찾겠습니다
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
28-01-payment
포트원 사이트에 나와있는 내용이랑 인강내용이랑 코드가 전혀다릅니다.인증 결제 연동하기 (portone.io)바뀐거 같은데 어떤것으로 공부해야 하나요
-
해결됨한 입 크기로 잘라먹는 Next.js(15+)
풀 라우트 캐시1 질문
Dynamic Page로 설정되는 기준 중에서 동적 함수(쿠키, 헤더, 쿼리스트링)을 사용하는 컴포넌트가 있을때가 있다고 말씀해주셨습니다.그리고 웬만하면 Static Page로 만드는 것이 성능 측면에서 좋다고 하셨습니다. 하지만 예를 들어, 거의 모든 페이지에서 header나 footer 컴포넌트를 공통 컴포넌트로 쓰고있고, 그 컴포넌트에서 쿠키를 통해 어떤 값을 세팅한다면 Static Page는 거의 없을 것으로 판단이 되는데 따로 해결방안이 있을까요? Dynamic Page로 설정되는 기준 중에서 아래와 같이 캐시되지 않는 data fetching을 사용하는 경우가 있다고 하셨는데 async function Comp() { const response = await fetch('...') return <div>...</div> }async function Comp() { const response = await fetch('...', {cache : "no-store"}) return <div>...</div> }아래와 같이 revalidate로 캐시 옵션이 세팅되었을때는 Static Page로써 적용이 되는 것이지요? 그 이유가 해당 time이 지났을때는 데이터캐시에 있는 값이 stale되었다고 판단이 되어 캐싱되어있는 값을 가져오지않고 새로운 값을 가져오기 때문이라고 보면 되는걸까요?async function Comp() { const response = await fetch('...', { next: { revalidate: 3 } }) return <div>...</div> }
-
해결됨한 입 크기로 잘라먹는 Next.js(15+)
getServerSideProps 함수 내부에서 context 객체 활용에 대해서 질문드립니다.
getServerSideProps 함수 내부에서 context.query.q로 데이터를 불러오는데, 이러한 querystring을 활용하는 요청 또한 사전 렌더링으로 처리를 할 수가 있나요? 초기 접속 요청(인덱스 페이지)에서 서버는 유저가 querystring을 입력하기 전까지는 querystring의 값을 모르지 않나요? 어떻게 context.query.q도 사전 렌더링의 SSR 방식으로 처리를 할 수가 있나요?
-
해결됨한 입 크기로 잘라먹는 Next.js(15+)
공간 크기에 맞도록 자동으로 이미지 사이즈 적용
img 태그를 사용할 때처럼 이미지 사이즈를 따로 작성하지 않고 그 공간의 크기에 따라 자동으로 이미지 사이즈가 적용되는 방법은 없을까요?예를 들어 화면이 줄어들면 리스트 아이템들도 사이즈가 줄어들어 이미지 사이즈도 자동으로 줄어들게 되는 것처럼 그 부모에 맞춰(이때 부모도 사이즈 고정x) 사이즈가 자동으로 변하도록 하는 방법이 있는지 궁금합니다
-
해결됨Next + React Query로 SNS 서비스 만들기
인터셉트 + 패러렐 라우트 catch-all route 모달 닫힘 경로 문제
안녕하세요 제로초님! 제로초님 강의 보면서 개인 프로젝트 해보고 있는 수강생입니다. 현재 로그인과 회원가입 페이지를 인터셉트와 패러렐 라우트를 이용했는데,(저의 현재 폴더 구조입니다.)app/ ├── layout.tsx ├── page.tsx // 메인 페이지 ├── @modal/ │ ├── (.)login/ │ │ │ └── page.tsx // 로그인 모달 페이지 │ ├── (.)signup/ │ │ │ └── page.tsx // 회원가입 모달 페이지 // 프로필 수정 모달 페이지 │ ├── [...catchAll]/ │ │ └── page.tsx // 모달을 닫기 위한 catch-all 라우트 ├── (auth)/ │ ├── login/ │ │ └── page.tsx // 로그인 페이지 │ ├── signup/ │ │ └── page.tsx // 회원가입 페이지 └── 기타 페이지들... 회원가입이 되면 메인 페이지('/')로 이동하게 했는데 router.push, replace로는 경로는 이동이 되나 모달이 닫히지 않는 문제가 있었습니다. 그래서 catch-all route를 이용해서 특정 경로에 매칭되지 않으면 모달이 닫히도록 null을 반환하였습니다.// catch-all route export default function ModalCatchAll() { console.log('CatchAll triggered'); return null; } 그런데 router.push('/') 메인 홈페이지인 '/' 경로로 이동을 해도 catch-all route가 실행되지 않았는데, 메인 경로 외에 게시글 라우트로 router.push('/foster') 경로를 변경했더니 catch-all route가 실행이 되었습니다. router.back 말고도 push나 replace를 사용하고 싶어서 catch-all route를 사용했는데메인 홈 경로는 안되고 다른 경로로 이동시킬 때는 catch-all route가 왜 적용되는지 모르겠어서 질문 남깁니다..
-
해결됨한 입 크기로 잘라먹는 Next.js(15+)
빌드 타임에 관해서 이해가 되지 않아 질문드립니다.
혹시 SSG의 빌드 타임이라는 것이 무엇인가요?npm run build를 할때의 순간을 빌드 타임이라고 하신 것 같은데,빌드 타임이 있으면 왜 SSR에서 html로 js를 변환하고 그러는 것인가요?빌드 타임에 다 변환 시켜놓으면 되는 것 아닌가요?
-
미해결한 입 크기로 잘라먹는 Next.js(15+)
Pre-Rendering 과정에 대해서 질문드립니다!
현재 Next.js Styling 부분까지 시청하였으나, 기존의 사전 렌더링 부분이 이해가 가지 않아 다시 수강한 후 질문드립니다.일단, 제가 정리한 사전 렌더링 과정은 이와 같습니다.유저가 브라우저를 통해 서버에게 초기 접속 요청을 보낸다. 서버는 서버 측에서 리엑트 앱을 실행시켜서 모든 리엑트 앱의 컴포넌트를 HTML로 변환한다.이 변환된 HTML을 브라우저에게 보내준다.변환된 HTML을 받은 브라우저는 HTML을 화면에 렌더링한다. 이때 유저는 완성된 화면을 볼 수 있다. 이렇게 유저가 요청후에 1차적으로 화면에 요소를 볼 수 있게 되는 시간을 FCP(First Contentful Paint)라고 한다.그러나 지금은 html만 브라우저에게 보내진 상태이며, 페이지 이동, 버튼 클릭 등등의 상호작용을 수행하는 자바스크립트 코드는 아직 html에 담겨지지 않은 상태이다.그러므로 유저에게 1차적으로 화면에 렌더링된 이후에 후속으로 서버에서 자바스크립트를 Bundling하여서 브라우저에게 보내준다.브라우저는 이 번들링된 자바스크립트 파일을 실행한 후에 기존에 1차적으로 화면에 렌더링된 html과 자바스크립트의 로직을 연결하게 된다. 이러한 과정을 hydration이라고 한다.유저가 초기 요청부터 hydration 까지 종료된 시간을 TTI(Time To Interact)라고 한다.페이지 이동은 hydration 과정에서 받아온 bundle 자바스크립트 파일을 실행해서 현재 보여지는 컴포넌트를 교체하는 방식으로 CSR과 똑같은 방식으로 처리한다.결론적으로 제가 궁금한 부분은,처음에 html로 변환할때 "jsx 부분만" 변환하나요?아니면 처음에 html로 변환할때 "jsx 부분만" 변환하지 않나요? 처음에 html로 변환할때 next.js의 "모든 Jsx 부분"을 변환하여 브라우저에게 전달하나요?아니면, 처음에 html로 변환할때 next.js의 모든 Jsx 부분이 아니라, "지금 요청한 페이지의 부분의 jsx만" html 변환하여 브라우저에게 전달하나요? hydration이라는 과정에서는 자바스크립트 파일 뿐만 아니라 "스타일 코드나 다양한 이미지 파일, json 파일"도 전달하여 기존에 쏴준 html에 연결시켜 주는 것인가요?아니면 지금 요청한 페이지에 연관된 "자바스크립트만" 번들링해서 hydration을 해주는 것인가요? 저의 질문이 조금 장황할 수도 있을 것 같지만 양해부탁드립니다.
-
해결됨한 입 크기로 잘라먹는 Next.js(15+)
RSC Payload에 대해 궁금합니다.
앱 라우터에서 RSC Payload파일은 초기 접속 요청 이후에페이지 이동이나 프리패칭시일때만 서버에서 받아오는걸까요?아니면 초기 접속 요청시에 초기 접속 페이지가 서버 컴포넌트로 되어있으면 초기 접속 요청때도 rsc payload파일을 서버에서 받아오나요?
-
해결됨Next + React Query로 SNS 서비스 만들기
QueryClientProvider의 use client관련해서 궁금한게 있습니다
안녕하세요. Next에서 Tanstack-query 를 사용하실 때 궁금한게 있어서 질문드립니다.QueryClientProvider를 생성하실 때 아래와 같이 진행하신 다음에 layout.tsx 에서 감싸주고 있는데,QueryClientProvider에 use client를 사용하게 되면 결국 모든 하위 컴포넌트가 클라이언트 컴포넌트가 되는게 아닌가요?즉, layout.tsx 부터 모든 컴포넌트가 전부 클라이언트 컴포넌트로 사용되는게 맞는건가요...?'use client'; import React, { ReactNode, useState } from 'react'; import { QueryClientProvider, QueryClient } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; function RQProvider({ children }: { children: ReactNode }) { const [client] = useState( new QueryClient({ defaultOptions: { // react-query 전역 설정 queries: { refetchOnWindowFocus: false, retryOnMount: true, refetchOnReconnect: false, retry: false, }, }, }), ); return ( <QueryClientProvider client={client}> {children} {/* 개발 모드일때만 데브툴 사용*/} <ReactQueryDevtools initialIsOpen={process.env.NEXT_PUBLIC_MODE === 'local'} /> </QueryClientProvider> ); } export default RQProvider;
-
해결됨한 입 크기로 잘라먹는 Next.js(15+)
사전렌더링에 대해서 궁금합니다.
서버에서 사전렌더링(js 실행)할때 모든 react 컴포넌트들을 html로 변환한다고 하셨는데 서버에서 렌더링할때는 특정 경로에 있는 js만 html으로 렌더링 하는게 아니라 프로젝트의 모든 js코드를 html으로 렌더링하고 js bundle파일만 특정 경로에 있는 js bundle파일을 받아오는게 맞나요?
-
미해결Next + React Query로 SNS 서비스 만들기
next auth error
// auth.ts import NextAuth from "next-auth"; import CredentialsProvider from "next-auth/providers/credentials"; export const { handlers: { GET, POST }, auth, signIn, } = NextAuth({ pages: { signIn: "/i/flow/login", newUser: "/i/flow/signup", }, providers: [ CredentialsProvider({ credentials: { username: { label: "Username", type: "text", placeholder: "jsmith" }, password: { label: "Password", type: "password" }, }, async authorize(credentials) { const authResponse = await fetch( `${process.env.NEXT_PUBLIC_BASE_URL}/api/login`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ id: credentials.username, password: credentials.password, }), } ); if (!authResponse.ok) { return null; } const user = await authResponse.json(); return { email: user.id, name: user.nickname, image: user.image, ...user, }; }, }), ], }); // route.ts export { GET, POST } from "@/auth"; 각종 커뮤니티 글을 보긴했지만,, 해당 에러는 보이지 않아서 문의 남깁니다. 서버쪽 에러는 [auth][error] CallbackRouteError: Read more at https://errors.authjs.dev#callbackrouteerror[auth][cause]: TypeError: fetch failed at Object.fetch (node:internal/deps/undici/undici:11372:11) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async Object.authorize (webpack-internal:///(rsc)/./src/auth.ts:31:38) at async Module.callback (webpack-internal:///(rsc)/./node_modules/@auth/core/lib/actions/callback/index.js:241:39) at async AuthInternal (webpack-internal:///(rsc)/./node_modules/@auth/core/lib/index.js:66:24) at async Auth (webpack-internal:///(rsc)/./node_modules/@auth/core/index.js:127:34) at async /Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/compiled/next-server/app-route.runtime.dev.js:6:55759 at async eO.execute (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/compiled/next-server/app-route.runtime.dev.js:6:46527) at async eO.handle (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/compiled/next-server/app-route.runtime.dev.js:6:57093) at async doRender (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/server/base-server.js:1345:42) at async cacheEntry.responseCache.get.routeKind (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/server/base-server.js:1555:40) at async DevServer.renderToResponseWithComponentsImpl (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/server/base-server.js:1475:28) at async DevServer.renderPageComponent (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/server/base-server.js:1901:24) at async DevServer.renderToResponseImpl (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/server/base-server.js:1939:32) at async DevServer.pipeImpl (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/server/base-server.js:914:25) at async NextNodeServer.handleCatchallRenderRequest (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/server/next-server.js:272:17) at async DevServer.handleRequestImpl (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/server/base-server.js:810:17) at async /Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/server/dev/next-dev-server.js:339:20 at async Span.traceAsyncFn (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/trace/trace.js:154:20) at async DevServer.handleRequest (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/server/dev/next-dev-server.js:336:24) at async invokeRender (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/server/lib/router-server.js:173:21) at async handleRequest (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/server/lib/router-server.js:350:24) at async requestHandlerImpl (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/server/lib/router-server.js:374:13) at async Server.requestListener (/Users/kimyoungwoong/Desktop/next-x/node_modules/next/dist/server/lib/start-server.js:141:13)[auth][details]: { "code": "ECONNREFUSED", "provider": "credentials"}이렇게 발생하고 있습니다. 신 버전인 만큼 .env AUTH_SECRET=woong작성 해놨고 .env local 같은 경우는 NEXT_PUBLIC_API_MOCKING=enabledNEXT_PUBLIC_BASE_URL=http://localhost:9090작성해놨습니다. 잘 해결이 안되서 글 남깁니다.
-
해결됨한 입 크기로 잘라먹는 Next.js(15+)
사용자 편의성을 위해 쿼리스트링 사용 시 SSR
안녕하세요. NextJS 14 App Router로 개발중인 프로젝트가 있습니다. 사용자 편의성을 위해 페이지네이션 관련 상태값이나 사용자가 검색한 값을 쿼리스트링에 저장하는 훅을 만들어서 훅 내부에서 상태값을 받아 URLSearchParams로 쿼리스트링을 세팅해서 router push를 하거나 usePathname이나 useSearchParmas를 사용해서 쿼리스트링 값을 읽어서 상태값으로 업데이트하고 데이터 페칭을 하고 있습니다.메인 메뉴들 전반적으로 이 훅을 사용중이여서 페이지 컴포넌트에 'use client'를 입력해줘야 하는 상황인데, 그러면 제가 사용자 편의성을 위해 쿼리스트링에 값을 저장하는 방식 때문에 SSR을 사용할 수 없는 상황인지 궁금합니다.그리고 이런 편의성을 제공하면서 SSR을 하려면 다른 방법이 있을까요?
-
해결됨기초부터 배우는 Next YTMusic 클론 코딩 (with next.js 14, UI 마스터)
코드가 왜 그런지 모르겠는데, 이럴땐 어떻게 공부해야하나요?
7.4 PlayListCarousel - 1 강의의 6분 15초를 보시면,<div className="relative left-[-45px]">부분이 있는데요.left-[-45px]을 해야 화살표가 보이게 되는데, 이게 왜 그런질 모르겠습니다. 근데 제가 질문 드리고싶은 것은, 저 코드가 어떤 원리로 작동되는지가 아닙니다. 이럴때는 스스로 그냥 계속 문서를 참고하든 개발자도구를 참고하든 이해 될때까지 파고드는게 맞는 방법인지 여쭤보고 싶습니다.이것 말고도 제가 어려웠던 부분에 대한 예시를 들자면,1) components 폴더에 저장되는 것들과components/elements 폴더에 저장되는 것들의 차이를 정확히 모르겠음.2) 태그를 감쌀때 어떤 것은 div로 컨테이너를 주시고 어떤것은 안주시는 경우가 있는데, 차이를 모르겠음.3) useUIState에 저장된 변수 이름이 "homeCategory"인데, 제 생각엔 이것 보다는 "selectedSubject" 같은 이름이 더 직관적이라 생각하는데, 그럼에도 제 생각보단 선생님 생각이 맞을건데 제 생각이 어느부분이 부족한질 모르겠음.4) 위와 같은 문제들을 해결하고 싶어서, 책을 찾아보려 하는데 리액트 훅을 설명해주는 책들은 많은데, HTML CSS를 어떤 구조로 짜야 하는지, 리액트 앱 만들때 폴더구조는 어떻게 하는게 좋은지에 대한 책은 없어서 어떻게 해야할지 모르겠음.이런 어려움이 있었습니다. 혹시 공부법 조언 부탁드려도 될까요?
-
미해결한 입 크기로 잘라먹는 Next.js(15+)
client & server components 관련 질문입니다.
완강 후 Next로 프로젝트를 만들어 보며 질문 드립니다.제가 쿠키를 활용할 일이 있어 Nest api 요청에 쿠키를 담아 보냈었습니다. 쿠키가 잘 도착 하는 상황은 postman요청, 브라우저에서 nest api 직접 요청Next 페이지 에서는 쿠키가 도착하지 않았습니다. 완강 후 Next에서는 최대한 static하게 만들면서도 동적으로는 소통할 수 있도록 만드는 것이 Next가 추구하는 방향이라 이해 하였고, 최대한 static하게 만들었습니다. 쿠키가 도착하지 않아 한참을 실랑이를 하였는데 생각을 해 보니 서버컴포넌트에서 client로 cookie를 저장 한 다는 것이 말이 되지 않다는 것을 알았습니다. 찾아 보니 미들웨어라는 것이 있었고, 서버에서 쿠키를 내리는 것이 아니라 api응답을 받기 전 미들웨어에서 client에 쿠키를 심는 방법이 있더라구요. 근데 client에서 쿠키를 심더라도 static한 페이지로 만들어진 페이지에서 다음 요청에 쿠키를 서버로 전송하지 않기 때문에 쿠키를 활용해 서버와 뭔가의 소통이 불가능 하다고 느껴졌습니다.제 질문이 이해가 가실지 모르겠지만..Next에서 보통 서버와 쿠키를 활용한 상호작용을 할때 어떤 방식을 통해 하는지궁금합니다.
-
해결됨한 입 크기로 잘라먹는 Next.js(15+)
이미지 최적화까지 진행된 상태인데.
라이트하우스 tbt가 늠어요 fcp와 tti의 사이 시간이라는데 client 컴포넌트도 몇개없는데 왜이럴까요 ?만약 해결하려면 어떻게해야하나요