[Next.js] v13 ์ดํ app router์์ ์นด์นด์คํก ๊ณต์ ํ๊ธฐ ๊ตฌํ(feat.TypeScript)
๐ ๋ค์ด๊ฐ๋ฉฐ
์ต๊ทผ Next.14 ๋ฒ์ app router๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ ์งํํ๋ฉด์ ์นด์นด์คํก ๊ณต์ ํ๊ธฐ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐ ์์ด์ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๊ณผ ์ฌ๋ฌ ์ค๋ฅ๋ฅผ ๋ง์ดํ์ฌ ์๋กญ๊ฒ ํฌ์คํ ํฉ๋๋ค.
์ด์ ํฌ์คํ ์์ 1๋ฒ ~ 1-3๋ฒ๊น์ง๋ ๋ฐฉ๋ฒ์ด ๋์ผํฉ๋๋ค.
์ด์ ํฌ์คํ ์ ์ฐธ๊ณ ํด์ ํ๋ซํผ ๋ฑ๋ก๊น์ง ํ๊ณ ์ฝ์ด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
app router์์๋ _document.tsx์ _app.tsx๊ฐ ์ฌ๋ผ์ง๊ณ ์ด์ ์ ํด๋น ํ์ผ์์ ์์ฑ๋์๋ ์ฝ๋๋ layout.tsx์์ ์์ฑํด์ฃผ์ด์ผ ํฉ๋๋ค.
์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ ์์ฑ
์นด์นด์ค ๋๋ฒจ๋กํผ์์ ํ๋ซํผ ๋ฑ๋ก์ ์๋ฃํ๋ค๋ฉด ์ด์ ํ๋ก์ ํธ๋ก ๋์์์ ์ ์ฉ์ ํด๋ด ์๋ค.
๋จผ์ KakaoScript.tsx ํ์ผ์ ์์ฑํ๊ณ ์๋ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
ํ์ผ ์์น๋ ํ๋ก์ ํธ ๊ตฌ์กฐ์ ๋ง๊ฒ ์์ฑํ์๋ฉด ๋ฉ๋๋ค.
// KakaoScript.tsx
'use client';
import Script from 'next/script';
function KakaoScript() {
const onLoad = () => {
window.Kakao.init(process.env.NEXT_PUBLIC_KAKAO_API_KEY);
};
return (
<Script
src="https://developers.kakao.com/sdk/js/kakao.js"
async
onLoad={onLoad}
/>
);
}
export default KakaoScript;
์ด์ (v11) page router์์๋ ์ต์๋จ ์ปดํฌ๋ํธ์์ useEffect๋ฅผ ์ฌ์ฉํ์ฌ Kakao.init์ ์งํํ์ง๋ง,
TypeScript ํ๊ฒฝ์ app router ์์๋ ํด๋น ๋ฐฉ๋ฒ์ผ๋ก ๋์ํ์ง ์๊ณ Kakao.init์ด ์ ๋๋ก ์คํ๋์ง ์๋ ๋ฌธ์ ๋ฅผ ๊ฒช์์ต๋๋ค.
ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ถ์ด ์๊ธฐ ๋๋ฌธ์ 'use clinet' ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ํด๋น ์ปดํฌ๋ํธ๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ์ฌ์ค์ ์๋ ค์ค๋๋ค.
next์์ ์ ๊ณตํ๋ Script๋ฅผ ์ฌ์ฉํด์ ์ ์ฉ์ํค๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๋จผ์ ,
Kakao Developers์์ ์ ํ๋ฆฌ์ผ์ด์ ์์ฝ ํญ์์ JavaScript ํค๋ฅผ envํ์ผ๋ก ์์ฑํฉ๋๋ค.
๋ค์์ผ๋ก,
Script์ src์ ์นด์นด์ค sdk๋ฅผ ๋ฃ์ด์ค๋๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๋ถ๋ถ์ด ์คํฌ๋ฆฝํธ๋ฅผ ๋ค ๋ถ๋ฌ์ค๋ ์ฆ์ ์คํํ ์ ์๋๋ก ํ๋ onLoad๋ฅผ ์ฌ์ฉํ์ฌ Kakao.init์ ์ ์ฉ์์ผ ์ค๋๋ค.
์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด sdk๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ถ๋ฌ์ค๋ฉด ๊ทธ ์ฆ์ onLoad ํจ์๋ฅผ ์คํํ๊ฒ ๋ฉ๋๋ค.
์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ ์ ์ฉ
// layout.tsx
import KakaoScript from 'components/common/KakaoScript';
declare global {
interface Window {
Kakao: any;
}
}
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html>
<body>
<ClientComponentContainer>{children}</ClientComponentContainer>
</body>
<KakaoScript />
</html>
);
}
body ํ๋จ์ KakaScript ์ปดํฌ๋ํธ๋ฅผ ์ ์ฉ์์ผ ์ค๋๋ค.
๊ณต์ ํ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ
์ด์ ๊ฒ์๊ธ ์ฝ๋์์๋ Kakao.Link๋ฅผ ์ฌ์ฉํ์์ง๋ง sdk๋ ์ ๋ฐ์ดํธ๋๋ฉด์ Kakao.Share๋ฅผ ํตํด ๊ตฌํํ์ต๋๋ค.
Link -> Share ์ธ์ ๋ฌ๋ผ์ง ์ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
const handleShearToKakao = () => {
const { Kakao, location } = window;
Kakao.Share.sendScrap({
requestUrl: location.href,
});
};
์์ ๊ฐ์ด ๊ตฌํํ ์ ์์ต๋๋ค.
ํด๋น ํจ์๋ฅผ ๊ณต์ ํ๊ธฐ ๋ฒํผ์ ์ ์ฉํ๋ฉด ํ์ฌ ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ฐํด์ og tag๋ฅผ ์ฐธ์กฐํ์ฌ ์นด์นด์คํก์ผ๋ก ๊ณต์ ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค.
๋ค๋ฅธ ์ต์
og tag๋ฅผ ์ด์ฉํ sendScript ๋ฉ์๋๋ฅผ ์ด์ฉํ์ง ์์๋ ์ง์ ์์ฑํ์ฌ ๋ด์ฉ์ ๋ง๋ค ์ ์์ผ๋ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค!
๐ ๋ง๋ฌด๋ฆฌ
app router ๊ด๋ จํด์ ์๋ฃ๊ฐ ๋๋ฌด ์์๊ธฐ ๋๋ฌธ์ ์๊ทผํ ์ ๋ฅผ ๋จน์๋ ์์ ์ด์์ต๋๋ค,,
๋์์ด ๋์ จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.