Page Router์ App Router์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ์๋ฒ ์ปดํฌ๋ํธ์ด๋ค.
์๋ฒ ์ปดํฌ๋ํธ๋?
์๋ฒ ์ปดํฌ๋ํธ๋ ์๋ฒ์์๋ง ์คํ๋๋ฉฐ, ํด๋ผ์ด์ธํธ์ JavaScript๋ฅผ ์ ๋ฌํ์ง ์๋๋ค. JavaScript ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ ํ๋๋ฐ ๋์์ด ๋๋ค. ๋จ, ํด๋ผ์ด์ธํธ์์ ์ง์ ์ํธ์์ฉํ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์ฌ์ฉํ ์ ์๊ณ , ์๋ฒ์์ ๋ ๋๋ง๋ HTML๋ง ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌํ๋ค.
page router์์๋ ํ์ด์ง ์ ์ฒด๋ฅผ SSR๋ก ์ฒ๋ฆฌํ ์ง, SSG๋ก ์ฒ๋ฆฌํ ์ง, ํน์ CSR์ผ๋ก ์ฒ๋ฆฌํ ์ง ๊ฒฐ์ ํ ์ ์์์ง๋ง app router์์๋ ์ปดํฌ๋ํธ ๋จ์๋ก ์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ๊ตฌ๋ถํ๋ค.
๋ง์ฝ ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ์์์ผ๋ก ์๋ค๋ฉด ํด๋ผ์ด์ธํธ์์ ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ ๊ฒ์ด๋ฏ๋ก RSC๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ์์ค๋๋ค.์ฆ, ์๋ฒ ์ปดํฌ๋ํธ์ ์ค์ํ ํน์ฑ ์ค ํ ๊ฐ์ง๊ฐ ์์ค๋๋ ๊ฒ์ด๋ค.
- ์๋ฒ์์ ๋ ๋๋ง๋จ: ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์๋ฒ์์ ๋ ๋๋ง๋์ด ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌ๋๋ HTML์ ์์ฑํ๋ค.
- ์ํ ๊ด๋ฆฌ ์์: ํด๋ผ์ด์ธํธ ์ธก ์ํ ๊ด๋ฆฌ์ ์ํธ๊ด๋ฆฌ ๋ก์ง์ด ํฌํจ๋์ง ์๋๋ค.
- ๋ฐ์ดํฐ ํ์นญ: ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ๋ ๋๋งํ๋ค.
๊ทธ๋ฆฌ๊ณ app router๋ SSR, SSG ๋ฑ์ ์ง์ ํด์ค ํ์ ์์ด ๋ด๋ถ์ ์ผ๋ก ์๋์ผ๋ก ๊ฒฐ์ ๋๋ค.
ex) ์ฌ์ฉ์ ํ๋กํ ํ์ด์ง์์ ํ๋ก์ฐ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฅผ ๋ค์ด ์๊ฐํด๋ณด์.
*์๋ฒ ์ปดํฌ๋ํธ
// app/profile/page.js - ์๋ฒ ์ปดํฌ๋ํธ
import React from 'react';
import FollowButton from './FollowButton';
// ์๋ฒ์์ ํ๋กํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์
async function fetchProfileData() {
const response = await fetch('https://api.example.com/profile', {
cache: 'no-store', // ์ต์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด no-store ์ค์
});
if (!response.ok) throw new Error('Failed to fetch profile data');
return response.json();
}
// ์๋ฒ ์ปดํฌ๋ํธ์์ ํ๋กํ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋ง
export default async function ProfilePage() {
const profileData = await fetchProfileData();
return (
<div>
<h1>{profileData.name}'s Profile</h1>
<p>Email: {profileData.email}</p>
{/* ํ์์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ํฌํจ */}
<FollowButton userId={profileData.id} />
</div>
);
}
*ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ
// app/profile/FollowButton.js
'use client'; // ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์ ๋ช
์
import React, { useState } from 'react';
export default function FollowButton({ userId }) {
const [isFollowing, setIsFollowing] = useState(false);
// ๋ฒํผ ํด๋ฆญ ์ ํ๋ก์ฐ ์ํ๋ฅผ ์ ํํ๋ ํจ์
const handleFollow = async () => {
const response = await fetch(`/api/follow/${userId}`, {
method: isFollowing ? 'DELETE' : 'POST',
});
if (response.ok) {
setIsFollowing(!isFollowing);
}
};
return (
<button onClick={handleFollow}>
{isFollowing ? 'Unfollow' : 'Follow'}
</button>
);
}
์ฐธ๊ณ
https://velog.io/@ubin_ing/nextjs-app-router