ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Next.js

[Next.js] v13 ์ดํ›„ app router์—์„œ ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ ๊ตฌํ˜„(feat.TypeScript)

์šฉ๋‡ฝ 2023. 12. 27. 15:50
๋ฐ˜์‘ํ˜•

[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 ๊ด€๋ จํ•ด์„œ ์ž๋ฃŒ๊ฐ€ ๋„ˆ๋ฌด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์€๊ทผํžˆ ์• ๋ฅผ ๋จน์—ˆ๋˜ ์ž‘์—…์ด์—ˆ์Šต๋‹ˆ๋‹ค,,

๋„์›€์ด ๋˜์…จ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•