Next.js๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ ์ค ์ฐ์ฐํ ๋ฐ๊ฒฌํ ์ต์ ํ ๊ณผ์ ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
Next.js๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ ์ค ์ฐ์ฐํ ๋ฐ๊ฒฌํ ์ต์ ํ ๊ณผ์ ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
Next.js์ ์ฑ ๋ผ์ฐํฐ์์ MSW๋ฅผ ์ฐ๋ํ๊ณ ์ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฑ ๋ผ์ฐํฐ๋ก ๋ณ๊ฒฝ๋๋ฉด์ MSW๋ฅผ ์ฐ๋ํ๋๋ฐ ๋ฌธ์ ๊ฐ ์์๋๋ฐ,
SSR ๋์์ ๊ทธ ์ ์ MSW ์๋ฒ๊ฐ ๋์ํด์ mock api๋ฅผ ํ์ฑํ ํด์ผํ๋ ๋ฌธ์ ์์ต๋๋ค.
MSW ์์ฒด์์๋ ๋
ธ๋ ํจํค์ง๋ฅผ ์ ๊ณตํด์ ์๋ฒ๋ฅผ ์คํ ์ํฌ์ ์์์ผ๋, Next.js์ SSR ๋์ ์ด์ ์ ํด๋น ์๋ฒ๋ฅผ ์ ํํ ๋์ ์ํฌ ๋ฐฉ๋ฒ์ด ์์์ต๋๋ค.
๊ทธ๋์ ์ฌ๋ฌ๊ฐ์ง ์ด์๋ฅผ ์ฐพ์๋ณด์์ผ๋ ์์๋ฐฉํธ์ ํด๊ฒฐ๋ฐฉ๋ฒ ๋ฟ์ด์์ต๋๋ค.
MSW ์์ ๋ ํฌ์งํ ๋ฆฌ์์ ์ฑ ๋ผ์ฐํฐ ํ๊ฒฝ์ ๋ํ PR์ด ์ฌ๋ผ์ ์์์ต๋๋ค. ํด๋น PR์ ์์ง ๋จธ์ง๊ฐ ์๋์์ง๋ง
ํด๋น ์ ๊ทผ ๋ฐฉ์์ผ๋ก ์ด๋์ ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
ํด๊ฒฐ๋ฐฉ์์ ์๋์ ๊ฐ์ต๋๋ค. ์ฝ๋๋ฅผ ๋ณด๋ฉด window ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ฅผ ํ๋ณํ๊ณ ์ด๋ ๊ฒ ์ค์ ํ๋ฉด SSR๋ก ์๋ต์ด ์ค๊ธฐ์ ์ ํญ์ MSW ์๋ฒ๊ฐ ์คํ์ด ๋ณด์ฅ๋ฉ๋๋ค.
'use client';
import { PropsWithChildren, use } from 'react';
const shouldMockRequest = (url: string) => {
return !url.includes('_rsc') && !url.includes('/_next/') && url.includes('api');
};
const mockingEnabledPromise =
typeof window !== 'undefined'
? import('./browser').then(async ({ worker }) => {
await worker.start({
onUnhandledRequest: (request, print) => {
if (shouldMockRequest(request.url)) {
print.warning();
}
},
});
})
: import('./mocks/server').then(async ({ server }) => {
await server.listen({
onUnhandledRequest: (request, print) => {
if (shouldMockRequest(request.url)) {
print.warning();
}
},
});
});์ด ์ฝ๋๋ฅผ ๋ณด๊ณ Next.js์์๋ ๋ด๋ถ์์ ๋ ๋๋ง์ ํ๊ธฐ ์ ์ ์ด๋ฐ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ํ๊ฐํ ๊ฒ์ธ์ง์ ๋ํด์ ๊ถ๊ธ์ฆ์ด ์๊ฒผ์ต๋๋ค.
๊ทธ๋ฌ๋ค๊ฐ Next.js์ SSR ํ๋ก์ธ์ค์ ์ฝ๋ ์ค์ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
await Promise((res) => setTimeout(() => res()));์ด ์ฝ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ํ๋ฒ ๊ฑด๋๋ฐ๊ณ ๋ค์ ์ด๋ฒคํธ ๋ฃจํ์ ๋์ํ๋๋ก ๋ณด์ฅํ๋ ์ฝ๋์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฃผ์์ผ๋ก Next.js๋ ๋๊ธฐ์ ์ธ ๋ ๋๋ง ํ๋ก์ธ์ค๋ฅผ ์ํ๋๊ฑด ์๋์ง๋ง preload์ ๊ด๋ จ๋ ์ต์ ํ๋ฅผ ์ํํ๊ธฐ ์ํด ๋ ๋๋ง์ ์ผ๋ถ๋ฌ ์ง์ฐํ๋ค๋ ๋ด์ฉ์ด์์ต๋๋ค.
์ฆ, ๋ค์ด๋๋ฏน ์ํฌํธ์ ๊ฐ์ ๋์์ด ๋ง์ดํฌ๋กํ์คํฌ๋ก ์ํ๋ ๋ ์ด๋ฌํ ๋์์ด ๋จผ์ ์ํ๋์ด์ Next.js์์ ์ด๋ค ๋ฆฌ์์ค๋ค์ ๊ฐ๋ฐ์๊ฐ ์ํฌํธํ๋์ง ๋ถ์ํ๊ณ ์ต์ ํ ํ๊ธฐ ์ํจ์ด์์ต๋๋ค.
Next.js๋ ์ด๋ ๊ฒ ์์งํ ์ ๋ณด๋ฅผ ํตํด ๋ฉ์ธ ํ์ด์ง๋ฅผ ๋ฐํํ๋ ์๋ต ํค๋๋ก preload ์์ฑ์ ๋ฃ์ด์ HTML ํ์ฑํ์ง ์๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ค ๋ฆฌ์์ค๋ฅผ ๋ค์ด ๋ฐ์์ผ ํ ์ง ์ ๊ณตํ๋ฏ๋ก์จ ์ต์ ํ๋ฅผ ์ํํฉ๋๋ค.
์ด๋ฐ ๋ด์ฉ์ ๊ณต์๋ฌธ์์ ์ ๊ณต๋์ง ์์์ ์ง์ ์ฐพ์๋ณด์ง ์์ผ๋ฉด ์์ง ๋ชปํ๋ ๋ด์ฉ์ด์์ต๋๋ค.
์ด์ฒ๋ผ Next.js๋ ์ฐ๋ฆฌ๊ฐ ์์ง๋ชปํ๋ ์ต์ ํ๋ฅผ ๋ด๋ถ์ ์ผ๋ก ๋ง์ด ์ํํฉ๋๋ค.
๊ทธ๋์ ์ด๋ฐ ํ๋ ์์ํฌ๋ ์ค์ ๋ก ๋ง์ด ์ฌ์ฉํด๋ณด์ง ์์ผ๋ฉด ์์์น ๋์์ ๋ง์ด ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ํด์ผ ํฉ๋๋ค.