• ABOUT
  • POSTS
  • GUESTBOOK

ยฉ 2025 BlueCool12 All rights reserved.

2025.07.01Next.js

๐Ÿ”Ž Next.js๋ฅผ ์ด์šฉํ•œ SEO ์ตœ์ ํ™”

๋ฆฌ์•กํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ CSR ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ์กฐ์ ์œผ๋กœ SEO์— ๋ถˆ๋ฆฌํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ฐ”๋กœ Next.js์ด๋ฉฐ ์ด๋ฅผ ํ™œ์šฉํ•ด ์–ด๋–ป๊ฒŒ SEO๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์ž.
 

โ€œCSR์ด SEO์— ๋ถˆ๋ฆฌํ•œ ์ด์œ โ€

CSR์€ ์ดˆ๊ธฐ HTML์€ ๊ฑฐ์˜ ๋น„์–ด ์žˆ๊ณ  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ JavaScript ํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ ์ฝ˜ํ…์ธ ๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค. React ๋‚˜ Vue ๊ฐ™์€ ๋Œ€๋ถ€๋ถ„์˜ SPA(Single Page Application)๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ CSR์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

๊ฒ€์ƒ‰์—”์ง„ ํฌ๋กค๋Ÿฌ(Google, Naver ๋“ฑ)๋Š” ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋ฉด ๋จผ์ € HTML ์ฝ˜ํ…์ธ ๋ฅผ ํŒŒ์‹ฑ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ CSR ๋ฐฉ์‹์—์„œ๋Š” JavaScript ์‹คํ–‰ ์ „๊นŒ์ง€ ์ฝ˜ํ…์ธ ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฒ€์ƒ‰์—”์ง„์ด ๋‚ด์šฉ์„ ์ œ๋Œ€๋กœ ์ธ์‹ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋กœ ์ธํ•ด SEO ์ ์ˆ˜๊ฐ€ ๋‚ฎ์•„์ง€๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์— ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ Next.js๋Š” 3๊ฐ€์ง€ ๋ Œ๋”๋ง ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค.
 

  • SSR(Server-Side Rendering) : ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ HTML์„ ์ƒ์„ฑํ•ด ์‘๋‹ตํ•œ๋‹ค.
  • SSG(Static Site Generation) : ๋นŒ๋“œ ์‹œ์— HTML์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ์ •์  ํŒŒ์ผ๋กœ ๋ฐฐํฌํ•œ๋‹ค.
  • ISR(Incremental Static Regeneration) : SSG์ฒ˜๋Ÿผ ์ •์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋˜ ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์žฌ์ƒ์„ฑํ•œ๋‹ค.


๊ฐ๊ฐ์˜ ๋ Œ๋”๋ง ๋ฐฉ์‹์€ ์žฅ๋‹จ์ ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด์ง€์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿผ ๋ณธ๊ฒฉ์ ์œผ๋กœ SEO ์ตœ์ ํ™”๋ฅผ ํ•ด๋ณด์ž.
 

1. ๋ฉ”ํƒ€ํƒœ๊ทธ ์„ค์ •

Next.js์—์„œ๋Š” ๋ฉ”ํƒ€ํƒœ๊ทธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ์‹์ด ๋ผ์šฐํŒ… ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค. pages ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ธฐ๋ฐ˜์˜ ๊ธฐ์กด ๋ฐฉ์‹์—์„œ๋Š” <Head> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  app ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ธฐ๋ฐ˜์˜ App Router ๋ฐฉ์‹์—์„œ๋Š” metadata ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ธ”๋กœ๊ทธ์˜ ๊ฒฝ์šฐ App Router ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์šฐ์„  ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ layout ํŒŒ์ผ์— ์ •์˜ํ•ด๋‘์—ˆ๋‹ค.
 

metadata ๊ฐ์ฒด


๊ทธ ํ›„ ํŽ˜์ด์ง€๋ณ„๋กœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ์—๋Š” page ํŒŒ์ผ๋ณ„๋กœ metadata ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ์ •์˜ํ•˜์—ฌ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•ด์ค€๋‹ค.
 

metadata ์˜ค๋ฒ„๋ผ์ด๋“œ


๋ธ”๋กœ๊ทธ ๊ธ€์ฒ˜๋Ÿผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ผ์ด ์ •์˜ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ์—๋Š” generateMetadata() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
 

generateMetadata

 

2. ์ด๋ฏธ์ง€ ์ตœ์ ํ™”

Next.js๋Š” ๊ธฐ๋ณธ์ ์ธ <img> ํƒœ๊ทธ ๋Œ€์‹  ์ž์ฒด์ ์œผ๋กœ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋ฅผ ์ง€์›ํ•˜๋Š” <Image> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ ๋Œ€ํ‘œ์ ์ธ ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

  • width, height ๋“ฑ์˜ ์†์„ฑ์„ ์„ค์ •ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ์ „์†ก๋˜๋Š” ์ด๋ฏธ์ง€ ์šฉ๋Ÿ‰์„ ์ตœ์ ํ™”ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ WebP ๋˜๋Š” AVIF ๋“ฑ์˜ ์ตœ์‹  ์ด๋ฏธ์ง€ ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ ํ•ด์ค€๋‹ค.
     

  • ๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์— ๋งž์ถฐ ์ด๋ฏธ์ง€๋ฅผ ์ž๋™์œผ๋กœ ๋ฆฌ์‚ฌ์ด์ง•ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜์‘ํ˜• ์›น์‚ฌ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.
     

  • ์ด๋ฏธ์ง€๊ฐ€ ์‹ค์ œ๋กœ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๋กœ๋”ฉ์„ ์ง€์—ฐ์‹œํ‚ค๋Š” Lazy Loading ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅํ•˜์—ฌ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

     

Image ์ปดํฌ๋„ŒํŠธ


3. ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ (JSON-LD)

๊ตฌ์กฐํ™” ๋ฐ์ดํ„ฐ๋ž€ ๊ตฌ๊ธ€๊ณผ ๊ฐ™์€ ๊ฒ€์ƒ‰ ์—”์ง„์ด ํŽ˜์ด์ง€์˜ ์˜๋ฏธ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋•๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ JSON-LD ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋ฉฐ App Router ๋ฐฉ์‹์—์„œ๋Š” head ํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ ์‚ฝ์ž…ํ•œ๋‹ค.

typescript
// app/about/head.tsx
export default function Head() {
  const jsonLd = {
    "@context": "https://schema.org",
    "@type": "Person",
    "name": "BlueCool12",
    "url": "https://pyomin.com/about",
    "jobTitle": "Full Stack Developer"
  };
  
  return (
    <script type="application/ld+json">
      {JSON.stringify(jsonLd)}
    </script>
  );
}


๋ธ”๋กœ๊ทธ์™€ ๊ฐ™์ด ๊ฒ€์ƒ‰ ์œ ์ž…์ด ํ•ต์‹ฌ์ธ ์›น์‚ฌ์ดํŠธ๋Š” SEO ์„ค์ •์ด ๋ฌด์—‡๋ณด๋‹ค ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Next.js๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ Œ๋”๋ง ๋ฐฉ์‹๊ณผ ๊ธฐ๋Šฅ๋“ค์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
 

์ด์ „ ๊ธ€
๐Ÿ‘พ ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ณธ ๋ช…๋ น์–ด ์ •๋ฆฌ
๋‹ค์Œ ๊ธ€
๐Ÿ–ผ๏ธ ์›น ์„ฑ๋Šฅ์„ ์œ„ํ•œ ์ด๋ฏธ์ง€ ์••์ถ• ๋„๊ตฌ ์ •๋ฆฌ (TinyPNG & Squoosh)
์žฅ์‹์šฉ ๋กœ๊ณ