Next.js 두 번째
2025. 7. 22. 14:15ㆍNext.js + TypeScript
서버 컴포넌트 / 클라이언트 컴포넌트
서버 컴포넌트는 말 그대로 보여주기적 요소만 있는 컴포넌트, 또는 동적 기능이 없는 컴포넌트
정적 렌더링과 보안적 특성이 강함 -> axios,fetch 등 get 요청을 할 때는 서버 컴포넌트에서 사용하는게 좋음
대신 상태/이벤트 핸들링이 불가능 -> useState, useEffect 같은 훅 사용이 불가능
정적인 화면이므로 인터랙션이 불가능.
// 서버 컴포넌트 (초기 데이터 fetch)
export default async function Page() {
const data = await fetch('https://api.example.com/items');
const items = await data.json();
return <ItemList initialItems={items} />;
}
가장 먼저 파일 최상단에 "use client" 작성.
클라이언트 컴포넌트는 실질적 기능과 로직을 수행하는 컴포넌트. useState나 useEffect 등을 사용 가능함. 또한 이벤트 핸들러를 여기서 작성
ajax 중 put, post, delete는 클라이언트 컴포넌트에서 수행. get만 서버 컴포넌트에서 사용. 왜냐하면 앞의 세 메서드는 사용자와의 상호작용과 함께 실행하는게 보통이기 때문
그래서 put, post,delete를 사용할 함수들은 가장 첫 줄에 "use server" 를 달아 함수가 서버에서 실행되도록 명시.
export async function createItem(formData: FormData) {
'use server';
const name = formData.get('name');
const description = formData.get('description');
// DB 작업...
console.log('서버에서 아이템 생성:', { name, description });
await new Promise(resolve => setTimeout(resolve, 500));
revalidatePath('/practice03');
return { success: true, message: '아이템이 성공적으로 생성되었습니다.' };
}
export async function updateItem(id: string, formData: FormData) {
'use server';
const name = formData.get('name');
// DB 작업...
console.log(`서버에서 아이템 ${id} 업데이트:`, { name });
await new Promise(resolve => setTimeout(resolve, 500));
revalidatePath('/practice03');
return { success: true, message: '아이템이 성공적으로 업데이트되었습니다.' };
}
export async function deleteItem(id: string) {
'use server';
// DB 작업...
console.log(`서버에서 아이템 ${id} 삭제`);
await new Promise(resolve => setTimeout(resolve, 500));
revalidatePath('/practice03');
return { success: true, message: '아이템이 성공적으로 삭제되었습니다.' };
}
또한 Next.js 에서는 axios 보단 fetch를 주로 사용.
axios는 재검증과 캐싱 방식을 제어할 수 없어서 개선된 fetch를 주로 사용한다고 한다.
일단 Next.js는 여기까지 알아보고 클론코딩하면서 막히면 더 알아보는 식으로 진행
'Next.js + TypeScript' 카테고리의 다른 글
TypeScript 두 번째 (1) | 2025.07.22 |
---|---|
TypeScript 첫 번째 (3) | 2025.07.22 |
Next.js 시작 (0) | 2025.07.18 |