231005(๋ชฉ) ์ฑ์ฅ
๐ค ์ฑ์ฅ์ผ์ง 7.0
์ฑ
ํ๋ณตํ ์ด๊ธฐ์ฃผ์์(์จ์ธ ๋ค์ด์ด)
์ ๋ด์ฉ์ ์๊ทน๋ฐ์ ์์ํ๋ ์๋ฐํ ์ฑ์ฅ๊ธฐ๋ก
์ด์์๋ ๊ฝ๊ณผ ์ฃฝ์ ๊ฝ์ ์ด๋ป๊ฒ ๊ตฌ๋ณํ๋๊ฐ?
์ฑ์ฅํ๊ณ ์๋ ๊ฒ์ด ์ด์ ์๋ ๊ฒ์ด๋ค.
์๋ช ์ ์ ์ผํ ์ฆ๊ฑฐ๋ ์ฑ์ฅ์ด๋ค!
โ (7.0)<์์ ๊ฐํธ>
ํ์ธ๋ง ํ์ต๋ฒ
์ ์๊ฒ ๋๋งํผ, ์ฑ์ฅ์ผ์ง๋ ์ ๋ง ๊ทธ ๋ ์ ํค์๋ ์ค์ฌ์ผ๋ก ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋๋ก ํ๋ค.
Next.js
๊ธฐ์กด์ React๋ก ์งํํ๋ ๋ฒ ์คํธ ๋ผ๋น์ค ํ๋ก์ ํธ๋ฅผ Next.js๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ๋ก ํ๋ค. ์ฌ์ค ์ฒ์๋ถํฐ ๋ฒ ์คํธ ๋ผ๋น์ค๋ Next๋ก ์งํํ๊ณ ์ถ์๋ค. ์๋ํ๋ฉด ์๋น์ค ์ ๊ณต ๋ฐ ์ ์ง ๋ณด์์ ์ด์ ์ ๋ง์ถ๊ณ ์์ํ ํ๋ก์ ํธ๋ผ์ SEO์ ๊ฐ์ ์ ์ฃผ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ํ๋ก์ ํธ ์์ ์ ์ ๊ธํ๊ฒ Next๋ฅผ ๋ฐฐ์ฐ๋ฉด์ ์งํํ๊ธฐ์๋ ์ฃผ์ด์ง 10์ผ์ด๋ผ๋ ์๊ฐ ๋์ MVP ์กฐ์ฐจ ์์ฑํ์ง ๋ชปํ ๊ฑฐ ๊ฐ์์ React๋ก ์งํํ์๋ค. MVP ๊ฐ๋ฐ์ด ๋๋๊ณ ๋ง์นจ ์๊ฐ์ด ๋์ Next๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ ํ๊ธฐ๋ก ํ๋ค.
PWA ์ ์ฉ๊ณผ Open Graph
Next๋ React์ ๋ง์ฐฌ๊ฐ์ง๋ก PWA๋ฅผ ์ง์ํ๋ค. ๊ทธ ๋ฐฉ๋ฒ ์์ฒด๊ฐ ํฌ๊ฒ ์ด๋ ต์ง ์์๋ฐ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ์๋ฉด ์๋์ ๊ฐ๋ค.
next-pwa
ํจํค์ง ์ค์น
npm i next-pwa
- next.config.js ๋ด์ฉ ์์
const withPWA = require('next-pwa')({
dest: 'public',
// disable: process.env.NODE_ENV === 'development',
});
module.exports = withPWA({
// next.js config
});
๊ฐ์ธ์ ์ผ๋ก ์์ config์์
disable: process.env.NODE_ENV === 'development'
์ ์ค์ ํ๋ ๊ฑธ ์ถ์ฒํ๋ค. ์๋ํ๋ฉดnpm run dev
๋ก ๊ฐ๋ฐ ํ๊ฒฝ์ ์คํํ ๋๋ง๋ค pwa ๋น๋ ํ์ผ์ด ์๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค.(commitํ ๋๋ง๋ค ๋น๋ ํ์ผ์ด ์๋ก ์์ฑ๋ผ์ ๊ต์ฅํ ๋ถํธํ๋ค.)
์ถ๊ฐ๋ก ์์
disable
์ค์ ์ ํ์ง ์๊ณ ์ผ๋จnpm run build
๋ฅผ ํตํด์public
์workbox-*.js
์sw.js
(service-worker)๊ฐ ์์ฑ๋๋์ง ํ์ธํ์.
public
์manifest.json
์์ฑ
manifest.json์ ์ค์ ํ์ฌ ์น ์ฑ์ ์ค์นํ ๋ ์ฌ์ฉํ ์์ด์ฝ, ์ด๋ฆ, ์ค๋ช ๋ฑ์ ์ค์ ํ ์ ์๋ค.
{
"name": "Best Robbins",
"short_name": "Best Robbins",
"description": "Best Robbins",
"icons": [
{
"src": "/icons/icon-72x72.png",
"sizes": "72x72",
"type": "image/png"
},
{
"src": "/icons/icon-96x96.png",
"sizes": "96x96",
"type": "image/png"
}
// ... ์ค๋ต
],
"start_url": "/",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}
- head์ meta ํ๊ทธ ์ถ๊ฐ
- ์ผ๋ฐ์ ์ธ html ํน์ next 12 ๋ฒ์ ์์๋
next/head
๋ฅผ ์ฌ์ฉํ์ฌ Head ์ปดํฌ๋ํธ ๋ด๋ถ์<meta />
ํ์์ผ๋ก ์ถ๊ฐํ ์ ์๋ค. - ํ์ง๋ง next 13 ๋ฒ์ ์์๋ head ์ถ๊ฐ ๋ฐฉ๋ฒ์ด ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์
๊ฐ์ฅ ์ต์๋จ์ layout.tsx ํน์ page.tsx
์ ์๋์ ๊ฐ์ด ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
export const metadata: Metadata = {
metadataBase: new URL('https://best-robbins-fe.vercel.app/'),
title: {
default: '๋ฒ ์คํธ๋ผ๋น์ค',
template: '%s | ๋ฒ ์คํธ๋ผ๋น์ค',
},
description: '์ต๊ณ ์ ์์ด์คํฌ๋ฆผ ์กฐํฉ์ ์ถ์ฒ๋ฐ์๋ณด์ธ์!',
manifest: '/manifest.json',
openGraph: {
type: 'website',
title: '๋ฒ ์คํธ๋ผ๋น์ค',
description: '์ต๊ณ ์ ์์ด์คํฌ๋ฆผ ์กฐํฉ์ ์ถ์ฒ๋ฐ์๋ณด์ธ์!',
images: 'https://kr.object.ncloudstorage.com/best-robbins/logo/logo_string.svg',
locale: 'ko_KR',
url: 'https://best-robbins-fe.vercel.app/',
siteName: '๋ฒ ์คํธ๋ผ๋น์ค',
},
};
์ฌ๊ธฐ์ openGraph๋ ์ฐ๋ฆฌ๊ฐ ํํ
og:image
๋ก ์ฌ์ฉํ๋ ๋ฉํ ํ๊ทธ๋ฅผ ์ค์ ํ๋ ๊ฒ์ด๋ค. Open Graph๋ ํ์ด์ค๋ถ์์ ๋ง๋ ๋ฉํ ํ๊ทธ๋ก, ์น ํ์ด์ง๊ฐ ์์ ๋ฏธ๋์ด์ ๊ณต์ ๋ ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ก ๋ณด์ฌ์ง๋ ์ ๋ณด๋ฅผ ์ค์ ํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์์ ๋ฏธ๋์ด์์ ๊ณต์ ๋ ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ์ ๋์ค๋๋ก ํ ์ ์๋ค.
์ด์ ๋์ด ๋ฌ์ผ๋ฉด ๋น๋ ํ, npm run start
๋ก ์๋ฒ๋ฅผ ์คํํ๊ณ localhost:3000
์ ์ ์ํด๋ณด์. ๊ทธ๋ฆฌ๊ณ ๋ผ์ดํธํ์ฐ์ค๋ฅผ ์คํํ๋ฉด PWA๊ฐ ์ ์ฉ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ก์ปฌ ํฐํธ ์ ์ฉํ๊ธฐ
next์์ ์ ๊ณตํ๋ next/font/google
์ ์ฌ์ฉํด์ ๊ตฌ๊ธ ํฐํธ๋ฅผ ์ ์ฉํ ์ ์๋ค. ํ์ง๋ง ๋ก์ปฌ ํฐํธ๋ฅผ ์ ์ฉํ ๋๋ next/font/local
์ ์ฌ์ฉํ๋ค.
๋จผ์ ์ํ๋ ํฐํธ๋ฅผ ๋ค์ด๋ก๋ ๋ฐ๋๋ค. ๋๋ Pretendard๋ฅผ ์ฌ์ฉํ๋ค. public/fonts
์ ํฐํธ ํ์ผ์ ๋ฃ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋์ ๊ฐ์ด ์ค์ ํ๋ฉด ์ ์ญ์ ํฐํธ๊ฐ ์ ์ฉ๋๋ค.
import './globals.css';
import type { Metadata } from 'next';
import localFont from 'next/font/local';
export const Pretendard = localFont({
src: '../../public/fonts/PretendardVariable.woff2',
});
// ... ์ค๋ต
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="ko">
<body className={Pretendard.className}>{children}</body>
</html>
);
}
๐ ํ๊ณ
ํ์คํ ๋ฐฉํฅ์ ์ ํ๊ณ ๋ค์ ์ฝ๋ฉ์ ํ๋๊น ๋๋ฌด ์ฌ๋ฏธ์๋ค..ใ ใ ๊ฐ๋ฐ ์์ฒด์์ ์ค๋ ์คํธ๋ ์ค๋ ์์ง๋ง ๊ฐ๋ฐํ์ง ์์ ๋ ์ค๋ ์คํธ๋ ์ค๊ฐ ๋ ํฌ๊ณ ํ๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณดํต์ ์๋ก์ด ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํ ์๋ก์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ ์ฌ๋ฏธ์๋ค๊ณ ์๊ฐํ๋๋ฐ, ์ค๋ ๋ง์ด๊ทธ๋ ์ด์ ๋ ๊ทธ๋ ๊ณ ๋ฆฌํฉํ ๋ง๋ ๊ทธ๋ ๊ณ ์คํ๋ ค ์ ์ง๋ณด์ํ๊ณ ์๋ ์ฝ๋๋ฅผ ๊ฐ์ ํ๋ ๊ฒ ๋ ์ฌ๋ฏธ์๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋์ ์์ผ๋ก๋ ์๋ก์ด ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒ๋ณด๋ค ๊ธฐ์กด์ ๊ฐ๋ฐํ๋ ์๋น์ค๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ ๋ ์ง์คํด์ ๊ฐ๋ฐํ ์์ ์ด๋ค.