Next.js
강의

#1 - BFF (Backend for Frontend) 패턴 가이드

중년개발자
중년개발자

@loxo

29일 전

33

BFF (Backend for Frontend) 패턴 가이드

개요

Next.js가 BFF 역할을 수행합니다. 모든 클라이언트 요청은 Next.js를 거쳐 백엔드로 전달됩니다.

text
Client → Next.js (BFF) → Spring Boot (Backend)

BFF 유형별 구현 방식

1. Bypass (단순 프록시)

용도: 인증 헤더 추가만 필요, 데이터 가공 없음

구현: proxy.ts + rewrites

  • Next.js 16: proxy.ts
  • Next.js 15: middleware.ts
typescript
// proxy.ts - Cookie → Authorization 변환 export function proxy(request: NextRequest) { const accessToken = request.cookies.get('accessToken')?.value; if (accessToken) { const headers = new Headers(request.headers); headers.set('Authorization', `Bearer ${accessToken}`); return NextResponse.next({ request: { headers } }); } return NextResponse.next(); }
typescript
// next.config.ts - 백엔드로 프록시 async rewrites() { return [{ source: '/api/:path*', destination: `${API_URL}/:path*` }]; }

2. Aggregation (API 집계)

용도: 여러 API 호출 → 하나의 응답으로 합침

구현: Route Handler (app/api/.../route.ts)

typescript
// app/api/dashboard/route.ts export async function GET() { const [user, stats, posts] = await Promise.all([ coreApi.get('/users/me'), coreApi.get('/users/me/stats'), coreApi.get('/posts', { limit: 5 }), ]); return NextResponse.json({ data: { user: user.data, stats: stats.data, posts: posts.data } }); }

3. Transformation (데이터 가공)

용도: 백엔드 응답을 클라이언트에 맞게 변환

구현: Route Handler + 데이터 변환

typescript
// app/api/posts/formatted/route.ts export async function GET() { const { data: posts } = await coreApi.get('/posts'); // 백엔드 응답 가공 (날짜 포맷, 필드 선택 등) const formatted = posts.map(post => ({ id: post.id, title: post.title.slice(0, 50) + '...', // 제목 자르기 date: dayjs(post.createdAt).format('YYYY.MM.DD'), // 날짜 포맷 isNew: dayjs().diff(post.createdAt, 'day') < 3, // 신규 여부 계산 })); return NextResponse.json({ data: formatted }); }

폴더 구조

text
src/ ├── proxy.ts # Bypass 처리 (인증 헤더 변환) ├── lib/ │ └── api/ │ └── core-client.ts # 서버용 백엔드 호출 (Route Handler에서 사용) ├── services/ │ ├── client.ts # 클라이언트용 API wrapper │ └── posts.ts # 리소스별 서비스 ├── hooks/ │ └── queries/ │ └── usePosts.ts # React Query hooks └── app/ └── api/ ├── dashboard/ │ └── route.ts # Aggregation 예시 └── posts/ └── formatted/ └── route.ts # Transformation 예시

언제 무엇을 사용?

상황방식파일
단순 CRUD (그대로 전달)Bypassproxy.ts + rewrites
여러 API 합침Aggregationapp/api/.../route.ts
응답 가공 필요Transformationapp/api/.../route.ts
인증 없는 공개 APIBypassrewrites만

요약

  1. 대부분의 API: Bypass (proxy.ts → rewrites)
  2. 복잡한 화면 데이터: Route Handler (집계/가공)
  3. Client Component: fetch('/api/...') → Hook 사용
  4. Server Component: coreApi.get(...) 직접 호출

목차

#BFF#Next.js#BackendForFrontend#APIAggregation#next js 16

댓글 0

Ctrl + Enter를 눌러 등록할 수 있습니다
※ AI 다듬기는 내용을 정제하는 보조 기능이며, 최종 내용은 사용자가 확인해야 합니다.