โ ๏ธ ์ ๋ฆฌํ ๋ด์ฉ์ ์คํ๋ ์๋ชป๋ ์ ๋ณด๊ฐ ์์ ์ ์์ต๋๋ค. ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
์ํ ์นด๋๋ฅผ ๋๋ ์ ๋ getServerSideProps
๋ก ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ๊ฐ์ ธ์ค๊ธฐ ์ ๊น์ง ๋ก๋ฉ ์ฒ๋ฆฌ๊ฐ ์์ด์ ํ๋ฉด์ด ๋ฉ์ถฐ์๋ ๊ฒ ์ฒ๋ผ ๋ณด์ด๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค.
์ด๋ฐ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ค์ด ์ดํํ ๊ฐ๋ฅ์ฑ์ด ๋๋ฌด ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ ํ ํ์์ฑ์ ๋๊ผ๋ค.
์์ ๊ฐ์ ๊ฒ์ ๊ฐ์ ํ ์ ์๋๋ก ๋ก๋ฉ ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ํด ์ฃผ๋ ๊ฒ์ด next/router์์ ์ ๊ณตํ๋ router event
์ด๋ค.
router event
๋ ๋จ์ด ๊ทธ๋๋ก ๋ผ์ฐํธ ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ํธ๋ฆฌ๊ฑฐ ๋๋ ์ด๋ฒคํธ์ด๋ค.
์์ ์ธ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋ฉ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์๋ค. ์ด ๋ useEffect
ํ
์ ์ฌ์ฉํ์๋๋ฐ ๊ทธ ์ด์ ๋ ์ฒซ ํ์ด์ง ๋ก๋ฉ ์์ ๋ก๋ฉ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๊ธฐ ์ํด์์ด๋ค.
page/_app.js
์ Router.events ์ ์ฉ๋ํ page/_app.js
์ ์ด๋ฒคํธ๋ฅผ ์ ์ฉํ๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ ์ฉํ๊ฒ ๋๋ฉด ๋ชจ๋ ํ์ด์ง๋ฅผ ์ด๋ํ ๋๋ง๋ค SSR๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋๋ผ๋ ๋ก๋ฉ์ด ์ ์ฉ ๋์ด ์ฌ์ฉ์ ๊ฒฝํ์ด ๊ฐ์ ๋๋ค.
๊ฒฐ๊ตญ, ํน์ ํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ํ์ด์ง์ ์ฝ๋๋ฅผ ํ๋์ฉ ์์ฑํ๊ธฐ๋ณด๋ค app.js์ ๋ก๋ฉ ์ฒ๋ฆฌ๋ฅผ ์ ์ฉํ์ฌ ๊ด๋ฆฌํ๊ธฐ ์ฝ๋๋ก ํ์๋ค.
import { Router } from 'next/router';
import { useEffect, useState } from 'react';
function MyApp({ Component, pageProps }: AppProps) {
const [isLoading, setIsLoading] = useState(false);
useEffect(() => {
const startLoading = () => {
setIsLoading(true);
};
const finishedLoading = () => {
setIsLoading(false);
};
Router.events.on('routeChangeStart', startLoading);
Router.events.on('routeChangeComplete', finishedLoading);
Router.events.on('routeChangeError', finishedLoading);
return () => {
Router.events.off('routeChangeStart', startLoading);
Router.events.off('routeChangeComplete', finishedLoading);
Router.events.off('routeChangeError', finishedLoading);
};
}, []);
return (
<Layout>
{isLoading ? <Loading /> : <Component {...pageProps} />}
</Layout>
);
}
export default MyApp;
next/router
์ ํ์ด์ง ์ด๋ํ๋ ๊ธฐ๋ฅ ๋ง๊ณ ๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค๋ ๊ฒ์ ์๋ก ์๊ฒ ๋์๋ค. ๋๋ถ์ ๋ก๋ฉ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ํ ์ ์์๋ค. ํ์ง๋ง _app.js
์์ ๋ก๋ฉ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ด ์ต์ ์ ๋ฐฉ๋ฒ์ธ์ง๋ ์กฐ๊ธ ๋ ๊ณ ๋ฏผํด๋ด์ผ๊ฒ ๋ค.