일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 알고리즘
- Component
- 프론트엔드
- 타입스크립트
- 아키텍처
- SVG
- Solid
- Primitive
- jest
- javascript
- svgr
- test
- 백준
- DAILY
- nextjs
- error
- 타입
- 자바스크립트
- react
- typescript
- next.js
- DFS
- type
- Docker
- Study
- 다이나믹프로그래밍
- BFS
- 리액트
- docker-compose
- Unit Test
- Today
- Total
`프론트엔드 개발자` 개형이의 벽돌집
Next.js getServerSideProps에서 발생한 500 - Internal Server Error 해결하기 본문
프로젝트 배포 환경에서 500 - Internal Server Error가 데이터독에 잡혔다.
해당 에러의 원인을 파악한 결과, getServerSideProps 내부에 api를 Prefetch하는 곳에서 발생한 문제였다.
우선 getServerSideProps 내부에서 Error가 throw되면 어떻게 될까?
위 Next.Js 공식 문서에서 명시해뒀듯이 pages/500.js로 이동되는 듯 하다!
❗️ 500.js란?? 500 에러 발생했을 경우 이동하게 되는 페이지이며 pages에 만들 경우 500 에러 페이지를 커스텀하게 보여줄 수 있다.
500 에러가 발생했을 경우 두가지 제시 방안이 있는데..
1. 에러 페이지로 랜딩 시킴 (커스텀으로 500.js 혹은 _error.js 구성)
2. 에러 발생시 클라이언트 단에서 처리할 수 있게 위임
해당 포스팅에서는 첫번째 제시 방안을 적용해보고자 한다.
우선 내가 작성한 페이지의 getServerSideProps를 보자.
export const getServerSideProps = async () => {
return {
props: {
fallback: {
[unstable_serialize(apiKey())]: await api(),
},
},
}
})
- 현재 프로젝트에서는 swr을 사용하고 있기 때문에 프리패칭한 데이터를 swr 전역 설정에 넣어준다. (SWRConfig의 fallback 옵션 사용)
- unstable_serialize: array나 function 타입을 key로 사용할 수 있도록 지원
🤔 작성한 코드를 본 결과.. 에러가 발생했을 경우에 대한 예외처리가 되어있지 않다는 것을 깨달았다.
따라서 제시한 두번째 방법인 '에러 발생시 클라이언트 단에서 처리할 수 있게 위임'을 실현하기 위해 예외 처리를 넣고 예외 발생시 fallback에 빈 객체를 넣어주는 방향을 생각했다.
현재 모든 페이지에 위 코드와 같이 데이터를 프리패칭해주기 때문에 페이지마다 일일이 try-catch를 넣는 방향보다는,
api 호출을 감싸는 decorator를 생성해주기로 했다.
내가 만든 decorator 코드는 다음과 같다.
export const prefetchDecorator = async (apiKey: any, api: any) => {
try {
return {
[unstable_serialize(apiKey())]: await apiFunc(),
}
} catch (error) {
return {}
}
}
- api에 문제가 발생했을 경우 예외처리로 빈 객체 return하도록 설정
자, 이제 기존 getServerSideProps안에 내가 만든 decorator를 적용시켜보자!
export const getServerSideProps = async () => {
const fallback: Fallback = await prefetchDecorator(apiKey, api)
return {
props: {
fallback,
},
}
})
이제 getServerSideProps에서 데이터를 프리패칭해주는 부분에 해당 데코레이터를 적용하여 Error Handling이 되었다!! 🙌
SWR: https://swr.vercel.app/ko/docs/with-nextjs
Next.js와 함께 사용하는 방법 – SWR
Next.js와 함께 사용하는 방법 페이지가 빈번하게 업데이트하는 데이터를 포함하고 이를 프리렌더링할 필요가 없다면, SWR은 완벽하게 적합하며 어떠한 특별한 설정도 필요하지 않습니다. useSWR을
swr.vercel.app
Next.js: https://nextjs.org/docs/basic-features/data-fetching/get-server-side-props
Data Fetching: getServerSideProps | Next.js
Fetch data on each request with `getServerSideProps`.
nextjs.org
'Next.js' 카테고리의 다른 글
[Storybook] 스토리북 환경에서 svg 파일 사용하기 (feat. svgr) (0) | 2024.02.14 |
---|---|
[next-pwa] Manifest doesn't have a maskable icon 해결하기 (1) | 2023.12.05 |
Next.js 와 Svg, Material UI SvgIcon 다루는 방법 알아보기 (0) | 2023.08.02 |
Next js에서 sessionStorage is not defined 문제 해결 방법 (0) | 2022.01.19 |