๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป
article thumbnail
๋ฐ˜์‘ํ˜•

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

1. ๐Ÿ“– ๋“ค์–ด๊ฐ€๋ฉฐ

์ตœ๊ทผ Next.14 ๋ฒ„์ „ app router๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๊ณผ ์—ฌ๋Ÿฌ ์˜ค๋ฅ˜๋ฅผ ๋งž์ดํ•˜์—ฌ ์ƒˆ๋กญ๊ฒŒ ํฌ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค.

 

์ด์ „ ํฌ์ŠคํŒ… ์—์„œ 1๋ฒˆ ~ 1-3๋ฒˆ๊นŒ์ง€๋Š” ๋ฐฉ๋ฒ•์ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด์„œ ํ”Œ๋žซํผ ๋“ฑ๋ก๊นŒ์ง€ ํ•˜๊ณ  ์ฝ์–ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

app router์—์„œ๋Š” _document.tsx์™€ _app.tsx๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  ์ด์ „์— ํ•ด๋‹น ํŒŒ์ผ์—์„œ ์ž‘์„ฑ๋˜์—ˆ๋˜ ์ฝ”๋“œ๋Š” layout.tsx์—์„œ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ์Šคํฌ๋ฆฝํŠธ ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ

์นด์นด์˜ค ๋””๋ฒจ๋กœํผ์—์„œ ํ”Œ๋žซํผ ๋“ฑ๋ก์„ ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด ์ด์ œ ํ”„๋กœ์ ํŠธ๋กœ ๋Œ์•„์™€์„œ ์ ์šฉ์„ ํ•ด๋ด…์‹œ๋‹ค.

 

๋จผ์ € KakaoScript.tsx ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์œ„์น˜๋Š” ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์— ๋งž๊ฒŒ ์ƒ์„ฑํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

<typescript />
// 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 ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

3. ์Šคํฌ๋ฆฝํŠธ ์ปดํฌ๋„ŒํŠธ ์ ์šฉ

<typescript />
// 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 ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ์šฉ์‹œ์ผœ ์ค๋‹ˆ๋‹ค.

4. ๊ณต์œ ํ•˜๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„

์ด์ „ ๊ฒŒ์‹œ๊ธ€ ์ฝ”๋“œ์—์„œ๋Š” Kakao.Link๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ์ง€๋งŒ sdk๋„ ์—…๋ฐ์ดํŠธ๋˜๋ฉด์„œ Kakao.Share๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Link -> Share ์™ธ์— ๋‹ฌ๋ผ์ง„ ์ ์€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ์ 
์ž์„ธํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ

 

<typescript />
const handleShearToKakao = () => { const { Kakao, location } = window; Kakao.Share.sendScrap({ requestUrl: location.href, }); };

์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋ฒ„ํŠผ์— ์ ์šฉํ•˜๋ฉด ํ˜„์žฌ ๊ฒฝ๋กœ๋ฅผ ๊ธฐ๋ฐ˜ํ•ด์„œ og tag๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์นด์นด์˜คํ†ก์œผ๋กœ ๊ณต์œ ๋ฅผ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

4.1. ๋‹ค๋ฅธ ์˜ต์…˜

์ด์ „ ๊ฒŒ์‹œ๊ธ€ ์ค‘ ๋ฐœ์ทŒ

og tag๋ฅผ ์ด์šฉํ•œ sendScript ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š์•„๋„ ์ง์ ‘ ์ž‘์„ฑํ•˜์—ฌ ๋‚ด์šฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ณต์‹๋ฌธ์„œ ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

5. ๐Ÿ“• ๋งˆ๋ฌด๋ฆฌ

app router ๊ด€๋ จํ•ด์„œ ์ž๋ฃŒ๊ฐ€ ๋„ˆ๋ฌด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์€๊ทผํžˆ ์• ๋ฅผ ๋จน์—ˆ๋˜ ์ž‘์—…์ด์—ˆ์Šต๋‹ˆ๋‹ค,,

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

๋ฐ˜์‘ํ˜•
profile

๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป

@์šฉ๋‡ฝ

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!