개발자

getServerSideProps의 context를 nextjs13에서 사용하기.

2023년 05월 31일조회 1,005

현재 nextjs12로 짜여진 코드를 nextjs13으로 옮기는 작업을 하고 있습니다. 기존에 getServerSideProps의 context를 이용하여 많은걸 하고 잇었는데 nextjs13에서 getServerSideProps를 사용할 수 없게 되면서 애를 먹고 있습니다. context의 req, res, resolvedUrl 등을 nextjs13에서도 사용하고 싶은데 어떻게 해야 하나요 ㅜㅜ ??

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 2

김하림님의 프로필 사진

새 app dir에선 리퀘스트에 접근할 수 있는 `headers()`, `cookies()` 함수를 제공합니다. `headers()`는 서버 컴포넌트에서 리퀘스트 헤더 값을 받아오는 함수고, `cookies()`는 서버 컴포넌트에서 쿠키에 접근할 수 있는 함수입니다. (첨부한 코드 참조) 자세한 내용은 Next.js 공식 문서를 보면 page dir에서 app dir로 마이그레이션 하는 챕터가 있습니다. 그 중에 accessing-request-object(https://nextjs.org/docs/app/building-your-application/upgrading/app-router-migration#accessing-request-object) 쪽 문서를 살펴보시면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import { cookies, headers } from 'next/headers';
 
async function getData() {
  const authHeader = headers().get('authorization');
 
  return '...';
}
 
export default async function Page() {
  // You can use `cookies()` or `headers()` inside Server Components
  // directly or in your data fetching function
  const theme = cookies().get('theme');
  const data = await getData();
  return '...';
}
커리어리 AI 봇님의 프로필 사진

Next.js 13에서는 'getServerSideProps'를 사용하지 않는 대신에 새로운 기능인 Middleware를 이용하여 'req', 'res', 그리고 'resolvedUrl'과 같은 정보를 얻을 수 있습니다. Middleware는 'getServerSideProps'와 같이 서버에서 실행되지만, 모든 요청에 대해 실행될 수 있고, 따라서 라우터별로 동작을 설정할 수 있다는 점에서 차이가 있습니다. Middleware는 'pages/_middleware.ts' 파일 (또는 '.js', '.ts')에 작성하며, 요청과 응답 객체에 직접 접근할 수 있습니다. 다음은 Middleware에서 'req', 'res', 'resolvedUrl'에 접근하는 간단한 예제입니다: 'getServerSideProps'에서 했던 일부 작업들을 위와 같이 Middleware에서 처리할 수 있습니다. 하지만, 미들웨어는 getServerSideProps와는 다르게 모든 요청에 대해 동작하므로, 성능에 민감한 작업은 주의해야 합니다. 또한, 미들웨어는 Next.js에서 제공하는 Edge Functions 기능을 통해 CDN 측에서 실행될 수 있어, 더 빠른 응답 시간을 제공합니다. Edge Functions에 대한 자세한 내용은 Next.js의 공식 문서를 참고하시면 됩니다. 이처럼 Next.js 13은 여러 새로운 기능과 변화를 도입하였기 때문에, getServerSideProps를 사용하던 기존의 코드를 옮기는 것이 다소 복잡할 수 있습니다. 새로운 패턴을 익히고 기존 코드를 적절히 수정하는 데 시간을 투자하는 것이 중요합니다.

1
2
3
4
5
6
7
8
9
10
11
import { NextRequest, NextResponse } from 'next/server'

export function middleware(req: NextRequest, res: NextResponse) {
  console.log('Resolved URL:', req.nextUrl.pathname);
  console.log('Request Headers:', req.headers);
  console.log('Response:', res);
  
  // Perform some action with these objects...

  return NextResponse.next(); // Continue to the next middleware or the route handler
}

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!