๐ [Next.js] BFF ์๋ฒ ์ฟ ํค ์ ์ค ๋ฌธ์ ๋ฐ ์๋ฒ ์๋ฌ ์ ์ญ ํธ๋ค๋ง ์ฒ๋ฆฌํ๊ธฐ
์ด ๊ธ์์๋ ์๋ ๋ ๊ฐ์ง ์ฃผ์ ์ ๋ํด ๋ค๋ฃฐ ๊ฒ์ด๋ค.
- BFF ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ญํ ์ ํ ๋, ๋ธ๋ผ์ฐ์ ์ ๋ฌ๋ฆฌ ํ์ํ ์ฟ ํค๊ฐ ์๋ ์ํ์ ๋ํ ํด๊ฒฐ ๋ฐฉ์
- ์ค๋ช
์ ๋ํ์๋ฉด BFF์์ API ์์ฒญ์ ํตํด ๋ด๋ถ ์์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ, ์ฆ
getServerSideProps
๋ฅผ ํตํด ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ ๋ ํ์ํ ๋ธ๋ผ์ฐ์ ์ฟ ํค ๊ฐ์ ๊ฐ์ง๊ณ ์์ง ์์ ์ฑ๋ก ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ ๊ฒฝ์ฐ - Next๋ ์ด๊ฑธ ๋ถํ์ํ ๋คํธ์ํฌ ํต์ ์ ๋๋ฆฌ๋ ๋ฐฉํฅ์ด๋ผ๊ณ ํ์ผ๋, ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ๋ API๋ฅผ ์ฌ์ฉํด ํต์ ํ๋ฏ๋ก page route์์ validate, ๊ถํ ์ฒดํฌ ๋ฑ์ ํ ๋ฒ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ํด๋น ๋ฐฉ์์ ์ ํํ๋ค.
- ์ค๋ช
์ ๋ํ์๋ฉด BFF์์ API ์์ฒญ์ ํตํด ๋ด๋ถ ์์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ, ์ฆ
- ์ ์ญ์ ์ธ ์๋ฒ ์๋ฌ ์ฒ๋ฆฌ - [ํ์ด์ง ๊ถํ ์ฒ๋ฆฌ, ErrorBoundary, ๊ฐ ์ปดํฌ๋ํธ์์์ ์ฒ๋ฆฌ]
BFF ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ญํ ์ ํ ๋, ๋ธ๋ผ์ฐ์ ์ ๋ฌ๋ฆฌ ํ์ํ ์ฟ ํค๊ฐ ์๋ ์ํ์ ๋ํ ํด๊ฒฐ ๋ฐฉ์
๐ซ ๋ฌธ์ ์
์ฒ์์๋ ๋ฌด์์ด ๋ฌธ์ ์ธ์ง ์ดํดํ๋ ๊ฒ ์กฐ์ฐจ ์ด๋ ค์ ๋ค. BFF ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ญํ ๊ณผ ์๋ฒ์ ์ญํ ์ ๋์์ ํ๊ณ ์๊ธฐ์ ๋์ ๋ณด์ด์ง ์๋ ๋ถ๋ถ์ ์๋์ ์ผ๋ก ๊ทธ๋ ค๋ด์ ์ดํดํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ก๊ทธ์ธ์ ๋ง์น ์ ์ ๊ฐ (๋ก๊ทธ์ธ์ด ํ์ํ) ํน์ ํ์ด์ง์ ์ ์ํ๋ ค๊ณ ํ๋ฉด,
๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์๊ฒ ํ์ด์ง ์์ฒญ์ ํ๊ณ , ์ดํ์ ์คํ๋๋ getServerSideProps
์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ tanstack-query๋ฅผ ํตํด prefetch ํ๋ค.
- ๋ฐ๋ผ์ ์๋ฒ(BFF)์์ ๋์ํ๋ ์ฝ๋์์๋ ๋ค์ API ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋๋ฐ, ์ด ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ฟ ํค๋ฅผ ํจ๊ป ์ ์กํ์ง ์๊ณ ์์ด์
UnauthorizedError
๋ฐ์
์๋ฒ์์ prefetch ๊ฒฐ๊ณผ๊ฐ ์๋ฌ์์ผ๋ฏ๋ก ๋ธ๋ผ์ฐ์ ์์ ๋ค์ ๋ฐ์ดํฐ ์์ฒญ
- ์ด ๋๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒญ์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ์ฟ ํค๊ฐ ์ค์ ๋์ด ์์
โ prefetching์ ์๋ฏธ๊ฐ ์ ํ ์๋ SSR์ ํ๊ณ ์์๋ค.
๐ ๏ธย ํด๊ฒฐ ๋ฐฉ์
๊ทธ๋ฌ๋ฉด ์๋ฒ์์ ๋ณด๋ด๋ ์์ฒญ์ผ ๊ฒฝ์ฐ์๋ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค๋ฅผ ์ค์ด์ ์์ฒญ์ ๋ณด๋ด์ฃผ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๊ฒ ๊ตฌ๋ ์ถ์๋ค.
๋จผ์ ๊ธฐ์กด์ getServerSideProps
๊ฐ ์ด๋ป๊ฒ ์ง์ฌ์์๋์ง ์ดํด๋ณด๋ฉด, withSessionSsr
์ด๋ผ๋ HOF๋ฅผ ํตํด req์ ์ฟ ํค๋ฅผ ์ฝ๊ณ ๊ฒ์ฆํ ๋ค์ ์ ํจํ ๊ฒฝ์ฐ์ session์ ์ ์ ์ ๋ณด๋ฅผ ๋ด์์ ๋ด๋ ค์ค๋ค.
// page/.../index.jsx
export const getServerSideProps = withSessionSsr(async (context) => {
const queryClient = new QueryClient();
const session = context.req.session; // HOF์์ ๋ด์์ค ์ ์ ์ ๋ณด๊ฐ ์์
if (session) {
/** session ์ ๋ณด ์ธํ
*/
await queryClient.prefetchQuery(...);
}
// ํ์ํ ๋ฐ์ดํฐ prefetch -> ์ด ๋ ์ฟ ํค๋ฅผ ํจ๊ป ๋๊ฒจ์ค์ผ ํ๋ค.
await queryClient.prefetchQuery(...);
return {
props: {
dehydratedState: dehydrate(queryClient),
},
};
});
**๋ฐฉ์ 1 | ๋ช ์์ ์ผ๋ก ํค๋์ ์ฟ ํค๋ฅผ ๋งค๋ฒ ๋ฃ์ด์ฃผ๊ธฐ** |
- prefetching์ ์ฟ ํค๋ฅผ ํจ๊ป ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ
- ๋ด๋ถ์์๋ ์ธ์๋ก ๋ฐ์ ์ฟ ํค๋ฅผ ์ง์ ํค๋์ ์ค์ ํ์ฌ axios ์์ฒญ์ ๋ณด๋
**๋ฐฉ์ 2 | axiosInstance.interceptors ์ฌ์ฉํ๊ธฐ** |
๋ฐฉ์ 1์ ์ฌ๋ฌ ๊ณณ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๋๊ฒจ์ฃผ๊ณ , ํค๋๋ฅผ ๋ช ์์ ์ผ๋ก ์ค์ ํด์ฃผ์ด์ผ ํ๋๋ฐ, ๋๋ฌด ๊ท์ฐฎ๊ณ ์ค๊ฐ์ ๋ณ์ง๋ ๊ฐ๋ฅ์ฑ๋ ํฌ๋ค.
- ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ ์ฝ๋๊ฐ ๋ ๊ณณ์ธ๋ฐ ์ด๋ฏธ ๋๋ฌด ๋ณต์กํ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ์์ฒญ์ด ๊ฐ๊ณ ์๋ ์ํฉ์ ์ด๊ฒ๊น์ง ์ฌ๋ฌ ๊ณณ์์ ์ ๊ฒฝ์ฐ๊ฒ ๋๋ฉด DX๊ฐ ๋๋ฌด ๋จ์ด์ง ๊ฒ ๊ฐ์๋ค.
๋ฐ๋ผ์ axiosInstance.interceptors
๋ฅผ ์ฌ์ฉํ์ฌ 1์ฐจ์ ์ผ๋ก ๋ฆฌํฉํ ๋ง ํ๋ค.
- ๋งค ์์ฒญ ์ ํด๋น ์์ฒญ์ ๊ฐ๋ก์ฑ์ ์ํ๋ ์ฟ ํค ๊ฐ์ ๋ฃ์ด์ค (๊ณตํต ํค๋๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ์๋๊ณ ๊ฐ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ์ด๋ฏ๋ก ๋์์ ์์ฒญ ๋ณด๋์ ๊ฒฝ์ฐ์๋ ์ฟ ํค๊ฐ ๋ฎ์ด์์์ง์ง ์์)
getServerSideProps
์์๋ย prefetching์ ์์ฒญ์ ์ธํฐ์ ํธํ ์ ์๋๋ก ์ฒ๋ฆฌ๋ axios ์ธ์คํด์ค๋ฅผ ์ ๋ฌ
**๋ฐฉ์ 3 | ์ฟ ํค๊ฐ ์ค์ ๋ axiosInstance๋ฅผ ์ฌ์ฉํ๊ธฐ** |
๋ค๋ง ์ ๋ฐฉ์ ์ฌ์ฉ ์ ๊ฐ ์์ฒญ๊ฐ์ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด์ (์ฌ๋ฌ ์์ฒญ์ด ๋์์ ๋ค์ด์๋ ๋
๋ฆฝ์ ์ธ ๊ฐ์์ ์ฟ ํค๋ฅผ ๊ฐ์ ธ์ผ ํจ) ๋งค ๋ฒ ์๋กญ๊ฒ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์ ๋ณด๋ด์ผ ํ๊ณ , ๊ทธ๋ ๋ค๋ฉด ๊ตณ์ด interceptors
๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋ ๊ฒ ๊ฐ๋ค๋ ์๊ฒฌ์ด ์์๋ค.
thanks to. @ํ์ฌ_๋๋ฃ_luke์ ์์ฐ์ ์ธ ์ฝ๋๋ฆฌ๋ทฐ
์ฒ์์๋ interceptors๋ผ๋ ์๋ก์ด ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ค๋ด์๋๋ฐ ๋๋ถ์ ๋ค์ ๋ ผ๋ฆฌ์ ์ผ๋ก ์๊ฐ์ ํ ์ ์์๊ณ ๋ถํ์ํ๊ฒ ์ธํฐ์ ํฐ๋ฅผ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
- ์๋ฒ์์ ๋ณด๋ด๋ ์์ฒญ์ย
getServerSideProps
ย ์์ยcreateServerAxios
(์ฟ ํค๊ฐ ๋ด๊ธด axios ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ํจ์)๋ฅผ ํตํด ์์ฑ
์ด๋ ๊ฒ ์ค๊ฐ์ ์ฟ ํค๋ฅผ ๋ด์์ ์์ฒญ์ ๋ณด๋ผ ์ ์๋๋ก ์ฒ๋ฆฌํจ์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
๐ค๏ธย ์์ํ ์ํ ์ฐฉ์ค
queryClient.fetchQuery
์ queryClient.prefetchQuery
prefetchQuery
๋ ์คํจ ์์ ๋ณ๋๋ก ์๋ฌ๋ฅผ ๋์ง์ง ์๊ณ ๊ฒฐ๊ณผ์ ์๋ฌ๋ฅผ ๋ด์์ ๋ณด๋ด์ค๋ค.prefetch
์ ๋ชฉ์ ์ ์๊ฐํด๋ณด๋ฉด ์ดํด๊ฐ ๋๋ ๋์์ด๊ธด ํ๋ค. ์ค๋ฅ ์ฌ๋ถ์๋ ์๊ด์์ด ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ฅด๋ ๊ฒ์ผ ๋ฟ์ด๊ณ ์ดํ์ ๋ํ ๊ฒฐ๊ณผ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ณณ์์ ๋ค์ ์์ฒญ์ ๋ณด๋ผ ์ง, ์๋ฌ์ ๋ํด ์ฒ๋ฆฌํ ์ง ๊ฒฐ์ ํ๋๊ฒ ๋ง๋ ๊ฒ ๊ฐ๋ค.
- ์คํจ ์ ์๋ฌ๋ฅผ ๋ฐ๋ก ๋ฐ์์ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด
fetchQuery
๋ฅผ ์ฌ์ฉํ์.
req.cookies
์ req.headers.cookie
- axios์ req ์ next ์๋ฒ์ req ํ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ axios req.headers.cookie๋ก ๋ด์์ค ๊ฐ์ next ์๋ฒ์ชฝ ์ฝ๋์ธ checkAuthentication์์ ์ฝ์ง ๋ชปํจ (req.cookies๋ก ์ ๊ทผ)
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, api ๋ผ์ฐํธ์์ ์ฌ์ฉํ๋
checkAuth() -> withSessionRoute
์์req.headers.cookie
๋ฅผreq.cookies
์ ๋ฃ์ด์ค- ์ค์ ๋ก
next-connext
์์ ํ๊ณ ์๋ ์์ (๊ทผ๋ฐ ์ ์๋ฒ์์ ์์ฒญ๋ณด๋์ ๋๋ ์ ์ฒ๋ฆฌ๊ฐ ์๋์ด์๋ ๊ฑด์ง ์ ํํ๊ฒ ์ดํด x, ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณด๋๊ฑฐ๋ bff ๊ฐ ๋ณด๋๊ฑฐ๋ ์ด์จ๋ ๊ฐ์ axios ์์ฒญ์ด ๊ทธ๋๋ก api ๋ผ์ฐํธ๋ก ๋์ด๊ฐ๋๊ฒ ์๋๊ฐ?)
- ์ค์ ๋ก
์ ์ญ์ ์ธ ์๋ฒ ์๋ฌ ์ฒ๋ฆฌ
- [ํ์ด์ง ๊ถํ ์ฒ๋ฆฌ, ErrorBoundary, ๊ฐ ์ปดํฌ๋ํธ์์์ ์ฒ๋ฆฌ]
๐ย ์ ์ฒด์ ์ธ ์ปจ์
- ์๋ฒ ์๋ฌ ํธ๋ค๋ง
_error.jsx
์์ ํ๊ธฐ- ์๋ฌ ๋ฐ์ ์ ๋ฌด์กฐ๊ฑด ์ฌ๊ธฐ๋ก ๋จ์ด์ง
- ๋ค๋ง ์ค์ ์๋ฌ ํ๋ฉด์ด ๋์์ง๋ ๊ฒ์ production์ผ ๋๋ง์ด๊ณ dev์์๋ ์๋ฌ ๋ฐ์ ํ๋ฉด์ด ๋ณด์ฌ์ง (for ๋๋ฒ๊น
)
pages/_error.js
ย is only used in production. In development youโll get an error with the call stack to know where the error originated from. - ๊ฐ๋ฐ ๋ด๋ด ๊ถํ ์ฒ๋ฆฌ๊ฐ ์ ๋๋์ง ํ์ธํ ์ผ์ ์์๊ฑฐ๋๊น ํ์ํ ๊ฒฝ์ฐ์๋ง production ๋น๋ํด์ ํ์ธ
- ๊ธฐ์กด์ ์ฌ์ฉํ๊ณ ์๋ ์ธ์
๊ด๋ จ HOF์์ ํ์ด์ง ๊ถํ ์ฒ๋ฆฌ๋ ํจ๊ป ํ ์ ์๋๋ก ํ์ฅ
- ํ์ด์ง์ ๋ํ ๊ถํ ์ฒดํฌ๋ ํ ์ ์๋๋ก
- ์ง๊ธ์ ํ์ด์ง์ ๋ํ ๊ถํ ์ฒดํฌ๋ ์๊ณ api ์์ฒญ์ ๋ณด๋ด๋ ๊ฒฝ์ฐ์ ๊ทธ ์์ฒญ์ ๋ํ ๊ถํ ํ์ธ + ์๋ต์ผ๋ก ํ์ธ์ด ๊ฐ๋ฅํ๋ฐ, api ์์ฒญ์ ์ฒ์๋ถํฐ ๋ณด๋ด์ง ์๋ ํ์ด์ง์์ ์ ๊ทผ์ ๋ง์์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์
๐ซ ๋ฌธ์ ์
NEXT๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋ ๋ค๋ฅธ ๋ ํฌ์์๋ ์ง์ ์๋ฒ๋ฅผ ๊ตฌ์ฑํ๋ค ๋ณด๋, ํ์ด์ง์ ๋ํ ์ ๊ทผ ๊ถํ ์ฒ๋ฆฌ๋ฅผ routes๋ค์ด ๋ชจ์ฌ ์๋ ํ ๊ณณ์์ ํ ์ ์์๋ค.
๊ทธ๋ฌ๋ NEXT ์ฌ์ฉ ์์๋ ํํ๊ฒ ์ฌ์ฉ๋๋ ํจํด์ ์๋์ง ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์๋ฌ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ์ฌ์ ์ผ๋, ์ฐ๋ฆฌ๊ฐ ๊ตฌ๋ถํด๋ ์๋ฌ statusCode์๋ ๋ฌด๊ดํ๊ฒ ๋ชจ๋ 500.js๋ก ๋จ์ด์ ธ๋ฒ๋ ธ๋ค.
์๋์ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ๋ด๊ธฐ ์ํด ์ฌ๋ฌ ์๋๋ฅผ ํด๋ณด์๋ค.
- ๊ฐ ํ์ด์ง์
getServerSideProps
๋ง๋ค ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ง ์์ - API (axios) ์๋ฌ์ ์ธ์ฆ๊ณผ ๊ด๋ จํด์ ๊ทธ๋ฅ throw ํ๋ ์๋ฌ ๋ชจ๋ ๋ค๋ฃฐ ์ ์์ด์ผ ํจ
๐ ๏ธย ํด๊ฒฐ ๋ฐฉ์
**๋ฐฉ์ 1 | getServerSideProps๋ฅผ tryโฆcatch ๋ก ๊ฐ์ธ์ฃผ๋ HOC** โ โ |
- ๋ง ๊ทธ๋๋ก
getServerSideProps
๋ฅผ tryโฆcatch๋ก ๊ฐ์ธ์ ๋ฐ์ํ ์๋ฌ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค. - ๊ฐ ํ์ด์ง๋ง๋ค ์ถ๊ฐ๋ฅผ ํด์ค์ผํ๋ฏ๋ก ์๊ตฌ์ฌํญ 1 ์ ๋ง์กฑ์ํค์ง ๋ชปํด์ ํจ์คํ๋ค.
**๋ฐฉ์ 2 | middleware.js** โ โ |
- ๋ฏธ๋ค์จ์ด๋ฅผ ํ๋ ์์ ์๋ ์์ง ํด๋น ํ์ด์ง ์์ฒญ์ ๋ํ ์๋ต์ด ์๋ฃ๋์ง ์์์ ํ๋จํ ์๊ฐ ์์ผ๋ฏ๋ก ํจ์ค..
**๋ฐฉ์ 3 | ErrorBoundary ๐ค** |
- ์ด๊ฑด ํ์ด์ง ๋จ์์ ์ง์ ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ ๋ค๋ฆ์ด ์์ด๋ณด์ธ๋ค.
- ํด๋ผ์ด์ธํธ ์๋ฌ ์ฒ๋ฆฌ์ ์ ํฉํ ๊ตฌ์กฐ
- ํ์ด์ง ๋จ์์ ๊ถํ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๊ธฐ์ ๋ชฉ์ ์ ๋ง์ง ์์ ๊ฒ ๊ฐ์์ ๋์ด๊ฐ๋ค.
**๋ฐฉ์ 4 | _app.js์ PageProps.error** โ โ |
getInitialProps
๋ฅผ ์ฌ์ฉํ๋ _error.js ํ์ด์ง๋ฅผ ์ฌ์ฉํ๊ณ ๋์ ธ์ง ์๋ฌ๋ฅผ _app.js์์ ํ ๋ฒ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ด ์์ด์ ์ดํด๋ณด์๋ค.- server side์์ ๋ฐ์ํ ์๋ฌ๋ ์์กํ์ ํจ์ค..
**๋ฐฉ์ 5 | ** _error.js โ |
- Next์์ ์ ์ํ๋ ์ปค์คํ ์๋ฌ ํ์ด์ง ๊ณ ๋ํ ๋ฐฉ๋ฒ์ด๋ค. (๋ฐฉ์ 4์์๋ ์ด ์ปจ์ ์ ์ฌ์ฉํ์๋ค.)
- ์ฌ๊ธฐ์ ๋๋
res.writeHead
๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฌ์ ๋ฐ๋ผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋ ์๋ฌ ํ์ด์ง(/403, โฆ)๋ก ๋ฆฌ๋ค์ด๋ ํธ ์ํค๋ ๋ฐฉ๋ฒ์ ์ฐจ์ฉํ๋ค.- ๋ฏธ๋ฆฌ ์ฒ๋ฆฌํ๊ณ ์ถ์ ์๋ฌ์ ๋ํด์๋ ๊ฐ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ ์ํค๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก
_error.js
์์๋ ์์์น ๋ชปํ ์๋ฌ๋ง ๋ค๋ฃฐ ์ ์๊ฒ๋๋ค.
- ๋ฏธ๋ฆฌ ์ฒ๋ฆฌํ๊ณ ์ถ์ ์๋ฌ์ ๋ํด์๋ ๊ฐ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ ์ํค๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก
- ๊ทธ๋ฐ๋ฐ, ์๋ฒ ์๋ฌ ํธ๋ค๋ฌ๊น์ง๋ 401, 403โฆ ๋ก ์ ์ค๋๋ฐ, _error์์ ๋ฐ์๊ฑด
res.statusCode
๋ ์ผ๊ด 500์ด๋ค. ๐ญ โ response๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ผ๋๊น 500์ผ ์ ๋ฐ์..! ์๋ฌ ๊ฐ์ฒด๋ฅผ ๋ณด๋ฉด ๋๋ค.
// page/_error.js
CustomErrorPage.getInitialProps = ({ res, err }) => {
const errorName = err.name || err.response?.data.code;
let statusCode = 500;
switch (errorName) {
case "UnauthorizedError":
statusCode = 401;
break;
default:
break;
}
if (statusCode !== 500) {
res.writeHead(302, { Location: `/${statusCode}` });
res.end();
}
return { statusCode, myError: statusCode };
};
๊ด๋ จํด์ ์ฌ๋ฌ ๋ ํผ๋ฐ์ค๋ฅผ ์ฐพ์๋ณด๋ค๊ฐ ๋์ ๋์ผํ ์ํฉ์ ์ฒํ ์ฌ๋์ ์ด์๋ฅผ ๋ฐ๊ฒฌํ๊ณ , ๋ฌด๋ ค 1๋ ์ ๊ธ์ด์ง๋ง ๋๊ตฐ๊ฐ์๊ฒ๋ผ๋ ๋์์ด ๋๊ธธ ๋ฐ๋ผ๋ฉฐ ๋๊ธ์ ๋ฌ์๋์๋ค!
How to handle unathorized errors thrown by the server ยท vercel/next.js ยท Discussion #39530
๐ค๏ธย ์์ํ ์ํ ์ฐฉ์ค
_error.jsx
๋ ์๋ค- Next์์ ์ ๊ณตํ๋ ์์ฝ์ด ํ์ด์ง ์
์ด๋ฏ๋ก ์ด๋ฆ์ ์ ํํ๊ฒ
_error.js
๋ก ํด์ผํ๋ค.
- Next์์ ์ ๊ณตํ๋ ์์ฝ์ด ํ์ด์ง ์
์ด๋ฏ๋ก ์ด๋ฆ์ ์ ํํ๊ฒ
# ์นดํ ๊ณ ๋ฆฌ
- BOJ 36
- Algorithm 12
- CodingTest 11
- Web 9
- Javascript 8
- Vue 7
- React 7
- DBProject 4
- Python 3
- Tech-interview 3
- Express 3
- Next 3
- Github 2
- Django 2
- C 1
- C++ 1
- WebGame 1