
๐ง aria-label๊ณผ ํ ์คํธ ์ฝํ ์ธ
aria-label ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ ๊น?

์ด๋ฏธ์ง ์ต์ ํ 1.๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ Next.js์์๋ ์ด๋ฏธ์ง ์ต์ ํ๋ฅผ ์ํด next/image์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ค. import Image from 'next/image' <Image src="/images/profile.jpg" width={500} height={500} alt="ํ๋กํ ์ด๋ฏธ์ง" quality={75} /> src: ์ด๋ฏธ์ง ์์ค URL width ๋ฐ height: ํ์ ์์์ผ๋ก, ์ด๋ฏธ์ง์ ์๋ณธ ํฌ๊ธฐ๋ฅผ ...

์ฑ ๋ผ์ฐํฐ์ SEO ์ค์ 1.Metadata App Router์์๋ Pages Router์ Head์ปดํฌ๋ํธ๋ฅผ ๋์ฒดํ๋ metadata๊ฐ์ฒด๋ฅผ ์ด์ฉํด ํ์ด์ง์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ ์ ์๋ค. import { Metadata } from 'next'; export const metadata: Metadata = { title: "ํ์ดํ", description: "์ค๋ช " openGraph: { title: "ํ์ดํ, d...

ํ์ด์ง ๋ผ์ฐํฐ์ SEO ์ค์ 1.Head ํ์ด์ง ๋ณ๋ก Head์ปดํฌ๋ํธ ์์ ์์ฑํ์ฌ SEO ๊ด๋ จ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ ์ ์๋ค. import Head from "next/head"; export default Page() { return ( <> <Head> <title>ํ์ดํ</title> <meata property="og:image" content={์ธ๋ค์ผ ์ฃผ์} /> <...

ํ์ต ๋ด์ฉ ์ค๋์ Header ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค. ์ด ๊ณผ์ ์์ SPA์์ ์ค์ํ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ ๊ณผ ๊ฒ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๋ค. ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ ๊ตฌํ // App.js // Header ์ปดํฌ๋ํธ์ ์ ๋ฌํ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ handleClick: async () => { // ๋ธ๋ผ์ฐ์ ํ์คํ ๋ฆฌ์ ์ ํญ๋ชฉ ์ถ๊ฐ (URL์ ํ์ผ๋ก ๋ณ๊ฒฝ) history.pushState(null, null, "/"); // ํฌ์ผ...

ํ์ต ๋ด์ฉ ์ค๋์ ๋ฐ๋๋ผ JavaScript๋ฅผ ์ฌ์ฉํ SPA ๊ตฌํ์ ํต์ฌ์ธ ์ปดํฌ๋ํธ ํจํด์ ๋ํด ์ฌํ ํ์ต์ ํ๊ณ , ์ด๋ฅผ ์ ์ฉํ์ฌ PokemonList ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค. ๋ฐ๋๋ผ JS ์ปดํฌ๋ํธ ์ค๊ณ ํจํด 1. ์ ํ๋ฆฌ์ผ์ด์ ์ง์ ์ ์ค์ ๋จผ์ , SPA์ ์์์ ์ธ index.js์์ ๋ค์๊ณผ ๊ฐ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐํํ๋ค. import App from './App.js'; // ์ฑ์ ๋ฃจํธ ์์ ์ ํ const $app = document.query...

ํ์ต ๋ด์ฉ ์ค๋์ Node.js์ Express.js๋ฅผ ํ์ฉํ์ฌ ๊ฐ๋จํ ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ํ์ตํ๋ค. Express.js๋ Node.js ํ๊ฒฝ์์ ์น ์๋ฒ๋ฅผ ์ฝ๊ฒ ๊ตฌ์ถํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋ ์์ํฌ๋ก, ๊ฐ๊ฒฐํ ์ฝ๋๋ง์ผ๋ก ์๋ฒ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค. Express ์๋ฒ ๊ธฐ๋ณธ ์ค์ const express = require("express"); const path = require("path"); const app = express(); c...