공유된 따라하기 · 스프링부트
NCafe 메뉴 페이지 만들기 — Next.js App Router와 API 연동
대상 Spring Boot API를 만들었지만 Next.js 프론트엔드와 연동 경험이 없거나, TypeScript와 React 컴포넌트 생명주기가 헷갈리는 사람
목표
localhost:8080의 Spring Boot API 데이터를 Next.js App Router로 가져와서, 카테고리 필터링과 검색 기능이 포함된MenuCard목록을 렌더링한다완성물
localhost:3000/menus에서 카테고리 탭을 클릭하거나 검색어를 입력하면 서버 API를 호출해 메뉴 목록이 실시간으로 갱신되는 Next.js 페이지
- Next.js 14+ (App Router), TypeScript, Tailwind CSS(또는 newtil) 프로젝트가 준비되어 있어야 합니다.
- 이전 따라하기에서 만든 Spring Boot 애플리케이션(
localhost:8080)이 실행 중이어야 합니다. app/(anon)/menus/폴더가 이미 존재한다고 가정합니다.
STEP 1 / 7서버 컴포넌트와 클라이언트 컴포넌트 이해하기
0개 완료 · 7개 남음
React 18 이후 Next.js에서는 컴포넌트가 실행되는 위치(서버/클라이언트)를 명시해야 합니다. 이 단계에서는 왜 두 가지가 필요한지, 그리고 어떤 컴포넌트가 어디에 속하는지 개념을 정리합니다.
1-1. 서버 컴포넌트와 클라이언트 컴포넌트의 차이
서버 컴포넌트 (Server Component)
- 서버에서 실행되어 HTML 문자열을 생성합니다.
useEffect,useState, 이벤트 핸들러(onClick)를 사용할 수 없습니다.- 데이터베이스에 직접 접근할 수 있습니다.
- 번들 사이즈가 0입니다 (클라이언트로 전송되는 JS 코드가 없음).
클라이언트 컴포넌트 (Client Component)
- 브라우저에서 실행됩니다.
useEffect,useState, 이벤트 핸들러를 사용할 수 있습니다.- 서버에서 데이터를 가져와야 할 때는
fetch를 사용해야 합니다. - 인터랙션(클릭, 입력)이 필요한 컴포넌트는 반드시 클라이언트 컴포넌트여야 합니다.
1-2. 이번 실습의 구조 설계
우리가 만들
menus/page.tsx는 초기 데이터(전체 메뉴 목록)를 서버에서 가져와야 하므로 서버 컴포넌트로 시작합니다. 하지만 사용자가 카테고리를 클릭하거나 검색어를 입력할 때 데이터를 다시 가져와야 하므로, 이 인터랙션을 처리하는 하위 컴포넌트(MenuList등)는 클라이언트 컴포넌트로 만듭니다.✅ 확인
- 서버 컴포넌트는
async함수를 사용할 수 있고, 데이터베이스에 직접 접근할 수 있다. - 클라이언트 컴포넌트는
'use client'지시어가 필요하고,useState와useEffect를 사용할 수 있다. - 인터랙션(클릭, 입력)이 필요한 컴포넌트는 클라이언트 컴포넌트여야 한다.
🎓 newlec 쌤의 코멘트
많은 분들이 "React는 클라이언트에서 돌리는 거 아닌가?"라고 묻습니다. Next.js App Router에서는 기본값이 서버 컴포넌트입니다. 서버 컴포넌트는 서버에서 실행되어 HTML을 만들어 클라이언트로 보내므로, 초기 로딩 속도가 빠르고 보안이 좋습니다. 하지만 사용자가 버튼을 누르는 순간, 서버는 그 이벤트를 알 수 없습니다. 그래서 "사용자가 뭔가 할 때" 반응해야 하는 컴포넌트만
'use client'를 붙여 클라이언트로 내려보냅니다. 이 경계를 잘 잡는 것이 Next.js 실력의 핵심입니다.📝 이 단계의 핵심
- 서버 컴포넌트: 데이터 가져오기, HTML 생성.
- 클라이언트 컴포넌트: 상태 관리, 이벤트 처리.
이 주소는 글의 저작자가 공개한 링크입니다. 뉴렉처 스터디의 다른 자료는 로그인 후 볼 수 있어요.