Next.js ํ๋ก์ ํธ์์ Jotai๋ฅผ ์ฌ์ฉํ๋ค๊ฐ ๋ง๋ ๊ฒฝ๊ณ ...! ๋ง ๊ทธ๋๋ก Jotai ์ธ์คํด์ค๊ฐ ์ค๋ณต๋์ด์ ๋ํ๋๋ ๊ฒฝ๊ณ ์ธ ๊ฒ ๊ฐ์๊ณ , ๊ฒฝ๊ณ ๋ฌธ์ ํจ๊ป ๋์ค๋ github ๋งํฌ๋ฅผ ํ๊ณ ๋ค์ด๊ฐ์ ๋ด์ฉ๋ ์ดํด๋ดค๋๋ฐ, Context๊ฐ ์ค์ฒฉ๋๋ฉด ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ด์ ๋ํ๋๋ ๊ฒฝ๊ณ ๋ผ๊ณ ๋์ ์์๋ค.
ํ๋ก์ ํธ ์ด๊ธฐ์ Context api๋ฅผ ์ฌ์ฉํด์ ์ํ ๊ด๋ฆฌ๋ฅผ ํ๋ค๊ฐ Jotai๋ฅผ ๋์
ํ ๊ฑด๋ฐ, ์์ง ๊ทธ๋ ์ฌ์ฉํ Context๋ฅผ ์๋ฒฝํ๊ฒ ๊ฑท์ด๋ด์ง ์์์ ์๊ธฐ๋ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ๋์ ๊ทธ๋ ์ฌ์ฉํ Context ์ฝ๋๋ฅผ ๋ค ๊ฑท์ด๋ด๊ณ ์ ๊ฑฐํ๋๋ฐ... ๊ณ์ ๊ฒฝ๊ณ ๊ฐ ๋ํ๋ฌ๋ค.
github ๋งํฌ๋ฅผ ๋ณด๋ฉด Next.js ์์ ๋ฒ์ ์์ ๊ทธ๋ฅ ๋ํ๋๋ ๊ฒฝ๊ณ ์ธ ๊ฒ ๊ฐ๋ค๋ ๋ด์ฉ๋ ์์ด์ ์ผ๋จ ๊ทธ๋ฅ ๋์ด๊ฐ๊น ์ถ์๋๋ฐ ์๋ฌด๋ฆฌ ์๊ฐํด๋ ๋ญ๊ฐ ์ฐ์ฐ...ํด์ ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋๋๊ณ ๋จ๋ ์๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ ์ดํด๋ดค๋๋ฐ, ๋๋์ด ์ด๋ค ๊ฒ ๋ฌธ์ ์ธ์ง ๋ฐ๊ฒฌํ๋ค!!
layout.tsx
'use client';
import './globals.css';
import type { Metadata } from 'next';
import Providers from '@/components/Provider/providers';
//export const metadata: Metadata = {
// title: 'Create Next App',
// description: 'Generated by create next app',
//};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
const { getAccessToken } = useAuth();
useEffect(() => {
getAccessToken();
}, []);
return (
<html lang="ko">
<body>
<Providers>
{children}
</Providers>
</body>
</html>
);
}
๊ธฐ์กด์ ๋ด layout.tsx
ํ์ผ์ด๋ค. ์๋ก๊ณ ์นจ์ ํด๋ ๋ก๊ทธ์ธ์ด ์ ์ง๋๊ฒ๋ ํ๊ณ ์ถ์ด์ layout.tsx
์์ ํ ํฐ์ ๋ถ๋ฌ์ค๋ custom hook์ ์คํ์ํค๋ ๋ก์ง์ ์ถ๊ฐํ๋๋ฐ, ํด๋น ๋ก์ง ์์์ Jotai store์ access token์ ์ ์ฅํ๋ ๋ก์ง์ด ์์ด์ ๋ฌธ์ ์๋ค... ์ฌ์ค ์ด ๋ฃจํธ ๋ ์ด์์ ํ์ผ์ use client
๋ฅผ ์ ์ธํ๋ ๊ฒ๋ ์ ๋ง ์ข์ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ ๊ฐ์์ ๊ณ ๋ฏผ์ด ๋ง์๋ค... ์๋ฌดํผ ์ด ํ์ผ ์์์ Jotai๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ Providers
๋ฅผ ๊น์์ฃผ๋๋ฐ, ์ฌ๊ธฐ์ ๋์์ useEffect()
๋ก Jotai๋ฅผ ์ฌ์ฉํ๋ ๋ก์ง์ ์คํ์์ผ๋ฒ๋ฆฌ๋๊น ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ ๊ฐ์๋ค.
Token.tsx
'use client';
import useAuth from '@/hooks/useAuth';
import { useEffect } from 'react';
function Token() {
const { getAccessToken } = useAuth();
useEffect(() => {
getAccessToken();
}, []);
return <></>;
}
export default Token;
ํ ํฐ์ ๊ฐ์ ธ์ค๋ ๋ก์ง์ ์คํ์ํฌ ์ปดํฌ๋ํธ๋ฅผ ์๋ก ๋ง๋ ๋ค์,
layout.tsx
import './globals.css';
import type { Metadata } from 'next';
import Providers from '@/components/Provider/providers';
import Token from '@/components/Common/Token';
export const metadata: Metadata = {
title: 'Create Next App',
description: 'Generated by create next app',
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="ko">
<body>
<Providers>
<Token />
{children}
</Providers>
</body>
</html>
);
}
๋ง๋ Token
์ปดํฌ๋ํธ๋ฅผ layout.tsx
์์ importํด์ return๋ฌธ ์์ ๋ฃ์ด์ฃผ์๋ค. ์ด๋ ๊ฒ ํ๋ use client
๋ ์ง์ธ ์ ์์๊ณ , metadata๋ ์ฌ์ฉํ ์ ์์ด์ ์ฝ๋๊ฐ ํจ์ฌ ์ข์์ก์ ๋ฟ๋๋ฌ multiple Jotai instance ๊ฒฝ๊ณ ๋ ํด๊ฒฐํ ์ ์์๋ค...!
Sharing state with library component
[Next.js] ๋ก๊ทธ์ธ ๊ตฌํ(Silent Refresh)
โ ์ด ๋ธ๋ก๊ทธ์์ ์๊ฐ์ ์ป์๋ค๐