로그인하여 /home에 접속해 있는 도중, 세션이 만료된 상태에서 사용자 정보가 필요한 /message 또는 /explore 등으로 클라이언트 네비게이션을 통해 페이지를 이동하는 경우, 미들웨어의 세션 검사를 거쳐 로그인 페이지로 이동되지 않고 not-found 페이지가 뜨는 오류가 있습니다. / / middleware.ts import { NextResponse } from "next/server"; import { auth } from "./auth"; export { auth } from "./auth"; export async function middleware() { const session = await auth(); if (!session) { return NextResponse.redirect(`http://localhost:3000/i/flow/login`); } } export const config = { matcher: ["/compose/tweeet", "/home", "/explore", "/messages", "/search"], }; 로그인 이 후 쿠키를 삭제를 통해 세션을 없애고 클라이언트 네비게이션을 통해 페이지 이동을 하면 미들웨어의 세션 검사에 걸려 redirect가 진행됩니다. /i/flow/login 페이지로 url이 변경되긴 했지만 병렬 라우트 및 인터셉팅 라우트로 인한 간섭이 있어 제대로 된 page를 찾지 못하는 것으로 보이는데 정확한 원인을 알 수 없어 문의 드립니다.
yarn codegen을 입력하면 이런 에러가 뜹니다 Not all operations have an unique name: fetchBoard: success Saved 1 new dependency. info Direct dependencies └─ @graphql-codegen/cli@5.0.4 info All dependencies └─ @graphql-codegen/cli@5.0.4 코드젠은 이렇게 잘 설치가 되었고 package.json 에도 이렇게 추가해 놓았습니다 "codegen": "graphql-codegen --config codegen.ts" PS C:\Users\young\Desktop\frontend\class-example\my-app> yarn codegen yarn run v1.22.22 warning ..\..\..\..\package.json: No license field $ graphql-codegen --config codegen.ts ✔ Parse Configuration ❯ Generate outputs ❯ Generate to ./src/commons/graphql/ ✔ Load GraphQL schemas ✔ Load GraphQL documents ⠏ Generate [client-preset] the following anonymous operation is skipped: mutation { createBoard(writer: "윰", title: "작성중", contents: "내용작성중") { _id number message } } [client-preset] the following anonymous operation is skipped: query { fetchBoard(number: 1) { number writer title contents } } [client-preset] the following anonymous operation is skipped: query { fetchBoard(number: 2) { number writer title contents } } [client-preset] the following anonymous operation is skipped: query { fetchBoards { number writer title contents } } [client-preset] the following anonymous operation is skipped: query { fetchBoards { number ✔ Parse Configuration ⚠ Generate outputs ❯ Generate to ./src/commons/graphql/ ✔ Load GraphQL schemas ✔ Load GraphQL documents ✖ Not all operations have an unique name: fetchBoard: * fetchBoard found in: - C:/Users/young/Desktop/frontend/class-examp… error Command failed with exit code 1. info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
<ClientComponent> <ServerComponent /> </ClientComponent> export default function ClientComponent({children}: {children: ReactNode}) { Return <div>{children}</div> } 위는 강의에서 나왔던 클라이언트 컴포넌트에 서버 컴포넌트를 children으로 주는 코드입니다. 여기서 클라이언트 컴포넌트에 여러개의 서버 컴포넌트를 children으로 보내고 싶으면 어떻게 해야하나요?
C:/Users/나/.local/share/gem/ruby/3.4.0/gems/bundler-2.6.3/lib/bundler/shared_helpers.rb:371:in 'String#start_with?': incompatible character encodings: UTF-8 and CP949 (Encoding::CompatibilityError) from C:/Users/나/.local/share/gem/ruby/3.4.0/gems/bundler-2.6.3/lib/bundler/shared_helpers.rb:371:in 'block (2 levels) in Bundler::SharedHelpers#clean_load_path' path에 한글이 섞여 있어서 나는 에러로 판단이 되는데 설치를 할때까지만 해도 로컬 D에 설치를 했는데 막상 bundle exec jekyll serve를 실행하니까 C에서 실행이 되어 위 문제가 발생하고있는데 어떻게 수정을 해야 수정을 할수있을까요?? (해당 "나" 폴더는 이름변경이 불가능한 폴더입니다)
rebase 시, 충돌이 발생했을때 관련해서 질문이 있습니다. master 의 commit이 만약 이렇게 되어있다면, (master) commitID_4-2 # test1.txt 수정 commitID_4-1 # test1.txt 수정 commitID_3 commitID_2 commitID_1 그리고 feature/rebase의 브랜치의 commit이 이렇게 되어있다면, (feature/rebase) commitID_4-4 # test1.txt 수정 commitID_4-3 # test1.txt 수정 commitID_3 commitID_2 commitID_1 여기서 feature/rebase 브랜치에서 master를 rebase를 하려고 한다면, 4-1, 4-2도 test1.txt를 수정했고, 4-3, 4-4도 test1.txt를 수정해서 conflict이 발생한다면, 그래서, rebase를 만약 해본다면 git checkout feature/rebase git rebase master 여기서 conflict이 발생하고, 그걸 해결하게 된다면 # conflict 발생 후, 수정 git add test1.txt git commit -m "conflict1" git rebase --continue git add test1.txt git commit -m "conflict2" git rebase --continue >> resolved conflict ... 이렇게 모든 conflict를 수정한 다음에 여기서 어떻게 처리할지 질문입니다. 여기서 제가 git push origin feature/rebase 를 하게된다면, 원격저장소와 로컬저장소의 commit이력이 달라서 다시 git pull origin --rebase feature/rebase 후, 다시 conflict를 수정하고 새로운 commit을 만들어서, push를 하는게 맞는건지 여기서 어짜피 모든 conflict를 해결했으니 git push origin feature/rebase -f 로 강제로 밀어 넣던지 아니면 다른 방법으로 push를 하는건지 보통 rebase시, conflict이 발생 후, conflict를 해결하더라도 push 시, 로컬/원격 저장소간의 commit이력이 달라질텐데 이것을 해결하기 위해 어떤방법을 사용하는지 궁금합니다.
ISR 을 보면서 SSR과 SSG의 각각의 단점을 모두 커버할 수 있는 기술이라 생각이 되었습니다. 진짜, 이 외에는 쓸 필요가 있나 싶을 정도인데요.. 한가지 여쭤보고 싶은 것은, ISR 을 API 로 호출해서 한다고 했을 때 예를 들면, 어떤 게시물이 등록이 되면 그 시점에 이 API를 호출하고 그 후 해당 페이지가 재생성 될 것입니다. 그렇다면, 게시물을 동시에 여러개 작성하게 된다면 (서비스의 비즈니스 로직에 따라..) 어쩔 수 없이 이 API 엔드포인트에 트래픽이 몰리게 될 텐데 그로 인한 서버부하 는 생각 안해도 되는것이지 여쭤보고 싶습니다.
안녕하세요, 강의 2.14에서 이전에 SSR로 만들었던 페이지를 SSG로 변경하는 것 관련하여 질문이 있습니다. SSG에서는 빌드타임에 페이지를 생성하기 때문에 쿼리스트링을 불러올 수 없어서 SSG로 만들고 싶다면 쿼리스트링 가져오는 부분은 클라이언트 사이드쪽에 코드를 추가해주면 가능하다고 하셨는데, 그럼 이 프로젝트의 검색페이지 같은 경우는 SSR를 사용하는게 나은지 SSG를 사용하는게 나은지 궁금합니다. 둘다 장단점이 있기 때문에 개발자의 판단에 달려있는걸까요? 쿼리스트링을 사용하는 페이지에서 어떤 경우에는 SSR로 만드는게 낫고 어떤경우에는 SSG로 만드는게 나을지 그 기준에 대해서도 궁금합니다. 강의 너무 잘 듣고 있습니다. 감사합니다. ++ 다른 비슷한 질문에 답변 다신 것 읽어봤는데 SSG는 식당에서 반찬을 먼저 주는 것과 같다고 말씀하셔서 이해가 잘되었습니다. 근데 SSG의 단점이 최신 데이터의 반영은 어려운것이기 때문에 데이터가 잘 변경되지 않는 페이지에서 사용하는 것이 좋다고 하셨는데, 그럼 검색페이지의 검색결과가 계속 바뀐다고 가정하면 (책 데이터가 계속 추가됨) SSR을 사용하는게 나은가요? 아니면 그 부분은 어차피 클라이언트 사이드에서 쿼리스트링 추가해서 다시 새로 불러오기 때문에 SSG로 사용해도 무방한가요? 거의 다 이해한 것 같은데 조금 헷갈리네요 ㅎㅎ
🚨 아래의 가이드라인을 꼭 읽고 질문을 올려주시기 바랍니다 🚨 질문 하시기 전에 꼭 확인해주세요 - 질문 전 구글에 먼저 검색해보세요 (답변을 기다리는 시간을 아낄 수 있습니다) - 코드에 오타가 없는지 면밀히 체크해보세요 (Date와 Data를 많이 헷갈리십니다) - 이전에 올린 질문에 달린 답변들에 꼭 반응해주세요 (질문에 대한 답변만 받으시고 쌩 가시면 속상해요 😢 ) 질문 하실때 꼭 확인하세요 - 제목만 보고도 무슨 문제가 있는지 대충 알 수 있도록 자세한 제목을 정해주세요 (단순 단어 X) - 질문의 배경정보를 제공해주세요 (이 문제가 언제 어떻게 발생했고 어디까지 시도해보셨는지) - 문제를 재현하도록 코드샌드박스나 깃허브 링크로 전달해주세요 (프로젝트 코드에서 문제가 발생할 경우) - 답변이 달렸다면 꼭 확인하고 반응을 남겨주세요 - 강의의 몇 분 몇 초 관련 질문인지 알려주세요! - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
/book/3만 " 존재하지 않는 페이지 입니다."라고 뜨는데 이유를 잘 모르겠습니다. 아래는 npm run build 결과입니다. > section02@0.1.0 build > next build ▲ Next.js 15.1.6 ./src/components/book-item.tsx 17:7 Warning: Using <img> could result in slower LCP and higher bandwidth. Consider using <Image /> from next/image or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element ./src/pages/book/[id].tsx 51:9 Warning: Using <img> could result in slower LCP and higher bandwidth. Consider using <Image /> from next/image or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element @next/next/no-img-element ./src/pages/search/index.tsx 20:6 Warning: React Hook useEffect has a missing dependency: 'fetchSearchResult'. Either include it or remove the dependency array. react-hooks/exhaustive-deps info - Need to disable some ESLint rules? Learn more here: https://nextjs.org/docs/app/api-reference/config/eslint#disabling-rules ✓ Linting and checking validity of types Creating an optimized production build ... ✓ Compiled successfully ✓ Collecting page data 인덱스 페이지 렌더링 fetchOneBook error Error: 서버 상태 오류 at u (.next/server/pages/book/[id].js:1:634) at async x (.next/server/pages/book/[id].js:1:873) ✓ Generating static pages (8/8) ✓ Collecting build traces ✓ Finalizing page optimization Route (pages) Size First Load JS ┌ ● / (ISR: 3 Seconds) 1.05 kB 95.7 kB ├ /_app 0 B 94.6 kB ├ ○ /404 322 B 94.9 kB ├ ƒ /api/hello 0 B 94.6 kB ├ ƒ /api/revalidate 0 B 94.6 kB ├ ● /book/[id] (5318 ms) 705 B 95.3 kB ├ ├ /book/3 (5072 ms) ├ ├ /book/1 ├ └ /book/2 └ ○ /search 1.11 kB 95.7 kB + First Load JS shared by all 96.9 kB ├ chunks/framework-a4ddb9b21624b39b.js 57.5 kB ├ chunks/main-d4c20200ddabac7f.js 33.7 kB └ other shared chunks (total) 5.68 kB ○ (Static) prerendered as static content ● (SSG) prerendered as static HTML (uses getStaticProps) (ISR) incremental static regeneration (uses revalidate in getStaticProps) ƒ (Dynamic) server-rendered on demand // book/[id].tsx // index.tsx
안녕하세요 선생님. 강의 잘 듣고 있습니다! 강의 주제에 벗어나는 것 같아서 조심스럽게 질문드려보자면, 앱 라우트 방식에서 반응형을 구현하는 방법을 알고 싶습니다. 저는 이전에 페이지 라우터 방식에서 작업할 때 window.matchMedia 를 사용해서 useMediaQuery 훅을 만들어 반응형을 구현했습니다. 근데 서버 컴포넌트에서는 위와 같은 방식을 사용하기 어려울 것 같은데 혹시 앱 라우트 방식에서 반응형을 구현할 때 많이 쓰이는 방식이 있을까요? 화면 너비에 따라 컴포넌트의 size prop을 다르게 넘겨주어야 하는 경우에 클라이언트 컴포넌트로 사용해야 할까요? 이 경우 다수의 컴포넌트가 클라이언트 컴포넌트가 될 것 같아 우려스럽더라고요. Next.js의 앱 라우터에서 반응형을 구현하는 방식에 대해 조언을 구하고 싶습니다.
[1.2) Next.js 사전렌더링 이해하기] 강의 15분 부근에서 " 사전 렌더링에서 페이지 이동 요청 시 클라이언트 사이드 렌더링 방식과 동일하게 처리한다 "는 내용을 보고 질문 드립니다. 강의를 따라가며 CSR에서의 JS Bundle은 서비스 전체 코드에 대한 번들 사전 렌더링에서의 JS Bundle은 해당 페이지에 대한 번들 라고 스스로 생각하여 페이지 이동 요청 시 웹 서버로부터 새 JS Bundle을 받을 줄 알았는데, 사전 렌더링에서도 JS Bundle은 서비스 전체 코드에 대한 번들인 것인지 궁금합니다. 만약 제가 이해한 것이 맞다면, 아래 답변에 대해서 마지막으로 현재 페이지에 필요한 자바스크립트 코드만 Hydration이 이루어지게 됩니다. 그 이유는 간단한데요 단순히 Hydration이라는 과정이 현재 브라우저에 렌더링된 페이지의 HTML과 JS를 연결하는 과정이기 때문입니다. 전체 JS Bundle에서 현재 페이지에 대한 JS를 실행하고, 컴포넌트 교체 및 수화가 일어난다고 생각하면 될까요?
✅ 모든 질문들은 슬랙 채널에서 답변드리고 있습니다. 💡 ”로펀의 인프런 상담소” 슬랙 채널 가입하기 💡 평일중에는 퇴근 이후(저녁 7시)에 답변을 받아보실 수 있고, 주말중에는 상시 답변드리고 있습니다. 안녕하세요. recoil 강의 부분에서 하나의 에러로 인해서 진행이 막힌 상태입니다! TypeError: Cannot destructure property 'ReactCurrentDispatcher' of ' {imported module [project]/nodemodules/next/dist/compiled/react/index.js [app-client] (ecmascript)} .default.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED' as it is undefined. "dependencies": { "next": "15.1.6", "react": "^19.0.0", "react-dom": "^19.0.0", "recoil": "^0.7.7" }, next 15 & react 19 버전으로 진행중이었는데 구글링을 해보아도 다들 더이상 recoi은 사용하지말라 이런 답만 알려주고있어 해결하기가 어려운 상태네요. 결국 버전문제인 것 같은데, 최신 버전으로 해당 문제가 해결이 어렵다면 다른 상태관리 라이브러리를 사용하며 진행하고싶은데요, Zustand 라이브러리를 사용해도 진행에 무리없을까요?
안녕하세요 선생님. 강의 잘 듣고 있습니다. 강의를 듣고 Next.js도 아니고 React는 CSR 방식인데 왜 서버 컴포넌트를 지원하지? 라는 의문이 생겼습니다. React 공식문서를 보니 프레임워크와 통합하기 위해 Next.js 팀과 협력했다고 나오더라고요. React가 서버 컴포넌트를 지원하게 된 계기가 Next.js의 SSR 때문인지 궁금합니다. 공식문서 : https://react.dev/learn/start-a-new-react-project#bleeding-edge-react-frameworks