๋๋ฅ ํ๋ก์ ํธ๋ฅผ ์์ํ๋ฉด์ Next.js๋ฅผ ์ฒ์ ํ๋ก์ ํธ์ ์ฌ์ฉํ๋ค. ๊ธฐํ์ ์ด์ ํ๋ก์ ํธ๋ณด๋ค SEO๋ฅผ ๋ ์ ๊ฒฝ์จ์ผํ๊ณ , ์ด๋ฏธ์ง ์ต์ ํ์ ๊ฐ์ ๊ฒ๋ค์ ์๋์ผ๋ก ์ ๊ณตํด์ค๋ค๋ ์ ์ด ์ข์๋ค. ์ด์ ๋ถํฐ ๊ณ์ ์จ๋ณด๊ณ ์ถ์๋ ๊ธฐ์ ์ด์์ด์ ๊ณต๋ถํ๋ฉด์ ํ๋ก์ ํธ์ ์ฌ์ฉํ ๊ฐ์น๊ฐ ์์๋ค. ์ด๋ฒ ํฌ์คํ ์ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง ํ๊ฒฝ์์ ์นด์นด์ค ์์ ๋ก๊ทธ์ธ์ ๊ตฌํํ๋ฉด์ ๊ณต๋ถํ๋ ๋ด์ฉ๊ณผ ๋ง์ฃผ์ณค๋ ๊ณ ๋ฏผ๋ค์ ๊ธฐ๋กํ ๊ธ์ด๋ค.
๋ชฉ์ฐจ
1. Next.js์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR)
2. ์๋ฒ ์ฌ์ด๋์์ ์ฟ ํค ์ฌ์ฉํ๊ธฐ
3. getInitialProps๋ฅผ ์ฌ์ฉํด๋ ๋๋๊ฐ?
1. Next.js์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง
๊ธ์ ์ค๋นํ๋ฉด์ Next.js์์ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ๋ฐฉ์์ ์กฐ๊ธ ๋ ๊ณต๋ถํด๋ณด์๋ค. ๋จผ์ ๋ค๋ค ์๋ ์๊ธฐ. Next.js๋ SSR์ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง, ํ์ด์ง๊ฐ ๋ก๋๋ ์ดํ์๋ ์ผ๋ฐ์ ์ธ ๋ฆฌ์กํธ์ CSR์ ์ด์ฉํ๋ค. ํ์ด์ง๊ฐ ํ๋ฒ ๋ ๋๋ง๋ ์ดํ์ (axios ๋ฑ์ผ๋ก) ํจ์น๋ ๋ฐ์ดํฐ๋ค์ ๋ณด์ฌ์ค๋ ํด๋ผ์ด์ธํธ์ชฝ์์ ๋ค์ ๋ ๋๋งํ๋ค.
CSR์์ useEffect
๋ฅผ ํตํด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋ ๋ฐ์ดํฐ ํจ์นญ์ ํ ์ ์๋ค. ํ์ง๋ง ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ํ๋ Next.js์์ ์ปดํฌ๋ํธ๋ ์ฌ์ ์ ๋ถ๋ฌ์์ผํ ๋ฐ์ดํฐ๊ฐ ํ์ํ ์ ์๋ค. getInitialProps
์ getServerSideProps
๋ฑ์ ์ด์ฉํด ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ํจ์นญํ๊ณ , ๋ฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด ๋ฏธ๋ฆฌ ๋ ๋๋งํ๋ค.
์๋ฒ์ฌ์ด๋์ ํ๋ฆ์ ๋ด๊ฐ ์ดํดํ ๋ฐ๋ก , ๋ค์๊ณผ ๊ฐ๋ค.
- Next ์๋ฒ์์ Get ์์ฒญ์ ๋ฐ์ผ๋ฉด, ์์ฒญ์ ๋ง๋ Page๋ฅผ ์ฐพ๋๋ค.
_app.js
์getInitialProps
๊ฐ ์๋ค๋ฉด ์คํํ๋ค.- ํด๋น Page์
getServerSideProps
๊ฐ ์๋ค๋ฉด ์คํํ๋ค. pageProps
๋ค์ ๋ฐ์์์ ์ ์ ์ธ ํ์ด์ง๋ฅผ ์์ฑํ๋ค.
React๋ ํด๋ผ์ด์ธํธ์์ HTML, CSS, ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ render()
ํจ์๋ฅผ ์ด์ฉํด ์์ฑํ๋ค. ๋ฐ๋ฉด, Next.js๋ ์๋ฒ์์ HTML์ ๊ฐ์ ธ์จ ํ์, ํด๋ผ์ด์ธํธ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ hydrate ํ์ฌ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋งํ๋ค. hydrate()
ํจ์๋ฅผ ์ด์ฉํด ์๋ฒ์์ ๋ฐ์์จ HTML์ ๋ฒ๋ค๋ง๋ React ์ฝ๋๋ค์ด ํ๋ฒ ๋ ๋ ๋๋ง ๋๋ ๊ฒ.
2. ์๋ฒ ์ฌ์ด๋์์ ์ฟ ํค ์ฌ์ฉํ๊ธฐ
๋๋ฅ์์ ์นด์นด์ค ์์ ๋ก๊ทธ์ธ์ ์ด์ฉํ๊ณ ์๋ค. ์๊ธด๊ฑด ์ผ๋ ๋ ๋ ์ ์ ์ผ๋ ์นด์นด์ค ๋ก๊ทธ์ธ (์คํจํ) ๊ธฐ๋ก์ด ์๊ทผ ์กฐํ์๋ฅผ ๋ฌ๋ฌํ๊ฒ ๋จน๊ณ ์๋ค. ์ฐพ์์จ ์ฌ๋๋ค์๊ฒ ๋ช ์พํ ๋ต์ ์ฃผ์ง ๋ชปํด์ ์๊ทผ ๋ฏธ์ํจ. ๊ฐ๋จํ๊ฒ ํ๋ฆ๋ง ์ ๋ฆฌํ๋ฉด ์ด๋ ๋ค.
- client๊ฐ kakao server์๊ฒ ์ธ๊ฐ ์ฝ๋๋ฅผ ์์ฒญํ๋ค.
- ์ด๋ ์ธ๊ฐ ์ฝ๋๋ ๋ฆฌ๋ค์ด๋ ํธ url์ ์ฟผ๋ฆฌ๋ก ์ ๋ฌ๋๋ค.
๋ฆฌ๋ค์ด๋ ํธ ํ์ด์ง๋ฅผ ํ๋ ๋ง๋ค์ด๋๊ณ ๊ฑฐ๊ธฐ์ ์ฝ๋๋ฅผ ๋ฐ์ ์ฌ์ฉํ ์ ์๋ค. - ์ธ๊ฐ์ฝ๋๋ฅผ ๋ด์ server๋ก ๋ณด๋ธ๋ค.
server๋ ๊ทธ ์ฝ๋๋ฅผ kakao server๋ก ๋ณด๋ด ์นด์นด์ค์ ํ ํฐ์ ๋ฐ๊ธ๋ฐ๋๋ค. - ์๋ฒ์์ ๋ฐ๋ก ํ ํฐ์ ๋ฐ๊ธํด client๋ก ์๋ต์ ์ค๋ค. ์์ฒด์ ์ผ๋ก ์ ์ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๊ธฐ ์ํจ.
ํ์ฌ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ์ด๋๋ฏผ ๋ ํฌ์ ํฐ์ผ ๋ ํฌ ๋๋ก ๋๋์ด์ ธ ์์ง๋ง ๋ ์๋น์ค๊ฐ ์ด๋์ด ์์ด๋ ๋ก๊ทธ์ธ์ ๊ณ์ ์ ์ง๋์ด์ผ ํ๋ค. accessToken์ ํญ์ recoil์์ atom์ผ๋ก ๊ด๋ฆฌํ๊ณ , refreshToken๋ง cookie์ ์ ์ฅํ๋๋ก ํ๋ค. ์๋ก๊ณ ์นจ์ ํ๊ฑฐ๋ ์ฒ์ ํ์ด์ง์ ๋ค์ด๊ฐ๋๋ง๋ค ๋ฆฌํ๋ ์ฌ ๋ก์ง์ด ๋์ ๋งค๋ฒ ์๋ก์ด accessToken์ ๋ฐ์์จ๋ค. ํ์ง๋ง ํด๋ผ์ด์ธํธ์์ ๋ ๋๋ง๋ ๋ ๋ฆฌํ๋ ์ฌ๋ฅผ ํด์ ๋ณด์ฌ์ค๋ค๋ฉด ์ฝ๊ฐ์ ๋๋ ์ด๋์ ๋ก๊ทธ์ธ์ด ํ๋ฆฐ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์๋ค.
์ด๋ ๊ฒ ์๋ฒ์์ ๋ ๋๋ง๋ ํ์ด์ง์์๋ถํฐ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ๋ณด์ฌ์ง๋๋ก ํ๊ณ ์ถ์๋ค. ์ด๋๋ฏผ ์๋น์ค๋ก ์ด๋ํ๋๋ผ๋ ๋ก๊ทธ์ธ์ด ์์ฐ์ค๋ฝ๊ฒ ์ ์ง๋๋ ๊ฒ ์ฒ๋ผ ๋ณด์ผ ๊ฒ ๊ฐ์๋ค. getInitialProps
๋ฅผ ํตํด ์๋ฒ์ฌ์ด๋์์ ์ ์ญ์ผ๋ก ๋ฐ์ดํฐ ํจ์นญ์ ํ ์ ์๋ค.
pages/_app.tsx
MyApp.getInitialProps = async (context: AppContext) => {
const { ctx, Component } = context;
const refreshToken = cookies(ctx).refreshToken;
let pageProps = {};
let loginData: OauthLoginResponse | null;
try {
const response = await AuthApi.REFRESH(refreshToken!);
loginData = response;
ctx.res?.setHeader(
'set-cookie',
`refreshToken=${response.refreshToken}; path=/; max-age=${response.refreshTokenAge}`,
);
} catch (err: any) {
loginData = null;
}
if (Component.getInitialProps) {
// Component์ context๋ก ctx๋ฅผ ๋ฃ์ด์ฃผ์
pageProps = await Component.getInitialProps(ctx);
}
// returnํ ๊ฐ์ ํด๋น ์ปดํฌ๋ํธ์ props๋ก ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
return { pageProps, loginData };
};
export default MyApp;
refresh ์์ฒญ์๋ refreshToken์ ๋ด์์ ๋ณด๋ธ๋ค. ์๋ฒ์์๋ window
์ document
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ document.cookie
์์ ํ ํฐ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ ์ธ ์ ์๋ค. ๋์ ์์ฒญ์ ์ฟ ํค์ ๋ค์ด์๋ ํ ํฐ์ ๋นผ์ค๋ฉด ์๋ฒ ์ฌ์ด๋์์๋ ์ฟ ํค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
getInitialProps
๋ context
๋ผ๋ ์ธ์๋ฅผ ๋ฐ๋๋ค. context
์์๋ req
(HTTP ์์ฒญ ๊ฐ์ฒด)์ res
(์๋ต ๊ฐ์ฒด)๊ฐ ์๋ค. ์ด๋ฅผ ์ด์ฉํด ์๋ฒ ์ฌ์ด๋์์ cookie๋ฅผ ๋ค๋ฃฐ ์ ์๋ค. next-cookies
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ctx.req์ ๋ด๊ธด ์ฟ ํค๋ฅผ ์ฝ๊ฒ ๋ฌธ์์ด๋ก ํ์ฑํด ๊ฐ์ ธ์๋ค. refresh๋ก ๋ฐ์์จ ๋ฐ์ดํฐ๋ค์ ์ปดํฌ๋ํธ์ prop์ผ๋ก ๊ฐ์ด ๋๊ฒจ์ค ์ ์๋ค.
refresh ํ์ ์๋ก ๋ฐ๊ธ๋ฐ์ ํ ํฐ๋ค๋ ๋ค์ ํด๋ผ์ด์ธํธ์ ์ฟ ํค๋ก ๊ปด์ฃผ๋ ์์ ๋ ํ์ํ๋ค. ctx.res์ ํค๋์ ์ฟ ํค๋ฅผ ์ธํ ํด์ค๋ค. ์ด ๋ถ๋ถ์ด ์๋ค๋ฉด ์ฟ ํค๊ฐ ์ ํ ํฐ์ผ๋ก ์ ๋ฐ์ดํธ๋์ง ์๊ณ ์๋ ๊ฑฐ๊ฐ ๊ทธ๋๋ก ๋จ์์๊ฒ ๋ ๊ฒ์ด๋ค. refresh ์์ฒญ์ด ํด๋ผ์ด์ธํธ์์ ๋ณด๋ธ๊ฒ ์๋๋ผ ์๋ฒ์์ ๋ณด๋ด์ ์๋ฒ๋ก ๋ฐ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ.
ํ๋ฆ์ ์ฝ๊ฒ ์ ๋ฆฌํ์๋ฉด, ํ์ด์ง ์์ฒญ์ ๋ด๊ธด ์ฟ ํค๋ฅผ ๋นผ์์ refresh api๋ฅผ ํธ์ถํ๋๋ฐ ์ฌ์ฉํ๊ณ , ๊ทธ ์๋ก ๋ฐ์์จ ํ ํฐ๋ค์ ํ์ด์ง ์๋ต์ ํค๋์ ๋ค์ ๊ปด์ ๋ธ๋ผ์ฐ์ ๋ก ๋ณด๋ด์ฃผ๋ ๊ฒ์ด๋ค.
interface MyAppProps extends AppProps {
loginData: OauthLoginResponse | null;
}
function MyApp({ Component, pageProps, loginData }: MyAppProps) {
const initializer = useMemo(
() =>
({ set }: MutableSnapshot) => {
if (loginData) {
const auth = {
userProfile: loginData.userProfile,
accessToken: loginData.accessToken,
isAuthenticated: true,
callbackUrl: (getCookie('redirectUrl') as string) || '/',
};
set(authState, auth);
}
},
[loginData],
);
return (
<...์๋ต>
<RecoilRoot initializeState={initializer}>
// ...์๋ต
</RecoilRoot>
</...์๋ต>
);
}
Page๋ก ๋๊ฒจ์ค loginData๋ฅผ ์ปดํฌ๋ํธ์์ ์ ์ฝ๋์ ๊ฐ์ด ๋ฐ์ ์ ์๋ค. ๋ฐ์์จ ์ ๋ณด๋ ๋ฆฌ์ฝ์ผ์ initializeState๋ฅผ ์ด์ฉํด ๋ฐ๋ก ์ธํ ํ๋ค.
๊ฐ๋ฐํ๊ฒฝ์ผ๋ ์ฟ ํค ๋ฑ๋ก
staging ์๋ธ๋๋ฉ์ธ์ ๋์์ ธ ์๋ ์๋ฒ๋ฅผ ๊ฐ์ง๊ณ ๋ก์ปฌ์์ ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ์ ์งํํ๊ณ ์๋ค. ์๋ฒ(staging.dudoong.com)์ ๋ก์ปฌ ๊ฐ๋ฐํ๊ฒฝ(localhost)์ด ๋๋ฉ์ธ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฟ ํค๊ฐ ์ ๋๋ก ์ธํ ์ด ๋์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์๋ค. ๊ทธ๋ฅ ํ์์ฒ๋ผ ํด๋ผ์ด์ธํธ์์ api ์์ฒญ์ ๋ณด๋ผ ๋๋ ํฌ๊ฒ ๋ฌธ์ ๊ฐ ๋์ง ์์๋ค. ๊ฐ๋ฐ์๋๊ตฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ธ์ด ๋์ง ์๋๋ผ๋ ์ค์ ์์ฒญ์ ํค๋๋ฅผ ์ดํด๋ณด๋ฉด ์ฟ ํค๊ฐ ์ ๋๋ก ๊ปด์ ธ์๋ค.
ํ์ง๋ง ์๋ฒ ์ฌ์ด๋์์ refresh api๋ฅผ ํธ์ถํ ๋ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค. ์ง์ ctx.req
์์ ์ฟ ํค๋ฅผ ๊ฐ์ ธ์ ์ธํ
ํด์ฃผ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๋๋ ๊ฐ์ ๋๋ฉ์ธ์ด ์๋ ์ฟ ํค๋ ๋ณด์ฌ์ง์ง ์๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐํ๊ฒฝ์์ ๋ก๊ทธ์ธ์ ํ์ ๋ ์ํํ ์์
์ ๋ฐ๋ก ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค.
export const setCredentials = (refresh: OauthLoginResponse) => {
axiosPrivate.defaults.headers.common[
'Authorization'
] = `Bearer ${refresh.accessToken}`;
// ๊ฐ๋ฐํ๊ฒฝ์์ ๋ก์ปฌํธ์คํธ๋ก ์ฟ ํค ์ง์ ๋ฃ์ด์ฃผ๊ธฐ ์ํจ
if (process.env.NODE_ENV === 'development') {
setCookie('accessToken', refresh.accessToken, {
maxAge: refresh.accessTokenAge,
});
setCookie('refreshToken', refresh.refreshToken, {
maxAge: refresh.refreshTokenAge,
});
}
};
3. getInitialProps๋ฅผ ์ฌ์ฉํด๋ ๋๋๊ฐ?
๊ณต์๋ฌธ์๋ฅผ ํฌํจํด ๋ง์ ๊ธ์์ getInitialProps
์ฌ์ฉ์ ๊ถํ์ง ์๊ณ ์๋ค. ๋๋ฅ์์ ์ฒ์ Next๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ณต๋ถํ ๋ ๋ฌผ๋ก ๋ฌธ์์์ ๋ณด๊ณ ์ง๋๊ฐ๋ ๊ธ์ด์๋ค. ๊ทธ๋ผ์๋ getInitialProps
๋ฅผ ์ฌ์ฉํ๊ฑด ์ฒ์ ์๋น์ค์ ์ง์
ํ ๋ ๋ฌด์กฐ๊ฑด ๋ฆฌํ๋ ์ฌ ๋ก์ง์ ๋์ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๋ฐ์์์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์๋น์ค์ ์ด๋ค ํ์ด์ง์์ ์๋ก๊ณ ์นจํ์๋๋ ํญ์ ๋ก๊ทธ์ธ์ด ์ ์ง๋์ด์ผ ํ๋ค.
ํ์ง๋ง ์ฝ๊ฐ์ ๊ณต๋ถ๋ฅผ ํ ๋ค์ ์๊ฒ๋ ๋ฌธ์ ์ ๋ค์ด ์์๋ค.
a. ์๋ ์ ์ ์ต์ ํ(Automatic Static Optimization) ๋ถ๊ฐ
Next๋ ๋น๋ํ์์ getInitialProps
๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ์ด์ง๋ฅผ ์๋์ผ๋ก pre-render ํ๋ค. ๋ค๋ฅธ๋ง๋ก ํ๋ฉด, _app.tsx
์์ ์ ์ญ์ผ๋ก getInitialProps
๋ฅผ ์ ์ฉํ๊ฒ ๋๋ฉด, ๋ชจ๋ ํ์ด์ง๊ฐ ๋ฌด์กฐ๊ฑด ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ด ๋๋๊ฒ์ด๋ค.
λ (Server) server-side renders at runtime (uses getInitialProps or getServerSideProps)
โ (Static) automatically rendered as static HTML (uses no initial props)
๋น๋ ์์ ํฐ๋ฏธ๋์ ๋์ค๋ ๋ง์ด๋ค. pre-render ํ๋ค๋ ๊ฒ์ ์ ์ HTMLํ์ผ๋ก ์์ฑ๋์๋ค๋ ๋ป์ด๋ค. ์ค์ ๋ก .next/server/static
ํด๋์ ์์ฑ๋ ํ์ผ๋ค์ ํ์ธํด๋ณด๋ฉด ์ค๋ฅธ์ชฝ์ ๊ฒฝ์ฐ์ ์ ์ HTMLํ์ผ์ด ์์ฑ๋ ๊ฒ์ ๋ณผ ์ ์๋ค (ํด๋น ๊ฒฝ๋ก์๋ ์๋ฒ์์ ์ฌ์ฉ๋๋ ํ์ผ๋ค์ด ์์ฑ๋๋ค). getInitialProps
๊ฐ ์๋ ํ์ด์ง๋ JSํ์ผ๋ก ๋ฒ๋ค๋ง๋์ด ์ฌ๋ผ๊ฐ๋ค.
ํ์ง๋ง ๋๋ฉํ์ด์ง์ ๊ณต์ฐ ์์ธํ์ด์ง์ ๊ฐ์ด ์ ์ ์ผ๋ก ๋ณด์ฌ์ค ์ ์๋ ํ์ด์ง๊น์ง๋ ํญ์ SSR์ ๊ฑฐ์ณ์ผ ํ๋ค.
b. ํ์ด์ง ์ด๋๋ง๋ค getInitialProps ์คํ
getInitialProps
๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์ ์๋ฒ ์ฌ์ด๋ ๋ชจ๋์์ ๋์ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ ์ฌ์ด๋์์ ํจ์นญํ ๋ฐ์ดํฐ๋ฅผ pageProps๋ก ๋๊ฒจ ๋ ๋๋งํ๋ ์ญํ ์ ํ๋ค. ํ์ง๋ง next/link
๋ next/router
๋ฅผ ์ด์ฉํด ํ์ด์ง๋ฅผ ์ด๋ํ ๋, ํด๋ผ์ด์ธํธ ์ฌ์ด๋๋ก getInitialProps
๊ฐ ๋ด๋ ค์ ์๋ํ๊ฒ ๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ํด๋น ๋ก์ง์ด ๋ถํ์ํ๊ฒ ์ฑ์ ๋ฒ๋ค์ ํฌํจ๋์ด ์ฑ๋ฅ์ ์ ํ๊ฐ ์๊ธธ ์ ์๋ค. Next 9๋ฒ์ ์ดํ getServerSideProps
์ getStaticProps
๋ก ๋ถ๋ฆฌ๋ ์ดํ๋ก๋ ์ต๋ํ ์ฌ์ฉ์ ์ง์ํ๋ผ๋ ์ด์ ์ด๊ธฐ๋ ํ๋ค.
์ฝ์์ ์ฐ๊ณ ํ์ด์ง๋ฅผ ์ด๋ฆฌ์ ๋ฆฌ ์ด๋ํด๋ณด์๋ค. ์ฒซ ๋ ๋๋ง์์๋ ์๋ฒ์์ ์คํ๋๊ณ , ๊ทธ ์ดํ๋ก ๋ธ๋ผ์ฐ์ ์ ์ฝ์์์ ๋ณด์ฌ์ง๋ค. ๋งค ํ์ด์ง ์ด๋๋ง๋ค getInitialProps
๊ฐ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์ ์ํ๋๋ค๋ ๋ป. getServerSideProps
๋ฅผ ์ฌ์ฉํ๋ ํ์ด์ง(์ฃผ๋ฌธ,๊ฒฐ์ )๊ฐ ๋ ๋๋ง๋ ๋๋ getInitialProps
๊ฐ ๋จผ์ ์คํ๋ ํ์ getServerSideProps
๊ฐ ์คํ๋๋ค.
๋คํํ recoil์ initializeState
๋ฅผ ๋ฃ๋ ๋ก์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์์ ์ต์ ํ๊ฐ ๋์ด์๋์ง ์ต์ด 1ํ ์ธ์๋ ์คํ๋์ง ์๋๋ค.
์ฑ๋ฅ์ ๊ทธ๋ ๋ค์น๊ณ , ๋งค ํ์ด์ง ์ด๋๋ง๋ค getInitialProps
๊ฐ ์คํ๋์ด ๋ฆฌํ๋ ์ฌ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋๊ฑด ๋ด ์ฒ์ ์๋์ ์ ํ ๋ง์ง ์์๋ค. ๋ฑ ์ฒ์ ํ๋ฒ๋ง ๋์ด์ผํ๋๋ฐ... ์๊พธ ํฐ๋ฏธ๋ ์ฝ์์ ์ด์ํ๊ฒ ์ฐํ๊ธธ๋ ์ด๊ฒ ๋ญ์ง ํ์๋๋ฐ ์ด๊ฒ ๊ทธ ์ด์ ์๋ค.
try {
if (ctx.req) {
const response = await AuthApi.REFRESH(refreshToken!);
console.log(response.refreshToken);
loginData = response;
ctx.res?.setHeader(
'set-cookie',
`refreshToken=${response.refreshToken}; path=/; max-age=${response.refreshTokenAge}`,
);
} else throw new Error('isClient');
} catch (err: any) {
loginData = null;
}
์ฐ์ ๊ฐ๋จํ๊ฒ ์์ ํด๋ณด์๋ค.
ctx.req๋ ์๋ฒ ์ฌ์ด๋์ ์๊ธฐ ๋๋ฌธ์, ์ต์ด 1ํ๋ง ์คํ๋ ์ ์๋ค.
https://im-designloper.tistory.com/111
https://www.howdy-mj.me/next/hydrate