프론트엔드 BFF 패턴 가이드
BFF(Backend for Frontend)는 프론트엔드가 필요한 데이터를 더 잘 제공하기 위해 중간 계층을 두는 패턴이다. 많은 팀이 이를 단순히 “프론트용 API 서버 하나 더 만든다” 정도로 이해하지만, 실제로 BFF는 화면 중심 데이터 조합, 인증 경계, 네트워크 최적화, 팀 소유권을 재정의하는 아키텍처 선택이다.
프론트엔드가 복잡해질수록 백엔드 API와 화면 요구가 정확히 맞아떨어지지 않는 경우가 늘어난다. 여러 엔드포인트를 조합해야 하거나, 모바일과 웹이 다른 데이터 형식을 원하거나, 토큰 처리와 캐시 전략이 화면 단위로 달라질 때 BFF는 큰 힘을 발휘한다.
아키텍처 그림 설명
[Web / Mobile / Admin]
|
v
[BFF Layer]
auth / aggregation / mapping
|
+------+------------------+
| |
v v
[Domain API 1] [Domain API 2]
| |
+-----------+-------------+
v
[External / Legacy API]
이 구조에서 BFF는 단순 프록시가 아니라 화면 요구를 도메인 API로 번역하는 계층입니다. 클라이언트는 화면 친화적인 응답을 받고, 인증과 헤더 처리, 응답 조합, 에러 매핑은 서버 쪽에서 통제됩니다. 그래서 BFF의 가치는 API를 하나 더 만드는 데 있지 않고, 프론트엔드와 백엔드의 책임 경계를 분명히 하는 데 있습니다.
왜 BFF가 필요한가
BFF는 보통 다음과 같은 상황에서 도입 가치가 높다.
- 하나의 화면이 여러 백엔드 서비스를 조합해야 하는 경우
- 클라이언트가 직접 다루기 복잡한 인증/권한 로직이 있는 경우
- 모바일, 웹, 관리자 화면이 서로 다른 응답 형태를 원하는 경우
- 외부 API 호출을 브라우저에 노출하고 싶지 않은 경우
- 클라이언트에서 너무 많은 네트워크 요청이 발생하는 경우
즉 BFF는 백엔드가 나빠서 필요한 것이 아니라, 프론트엔드 요구와 도메인 API가 서로 다른 책임을 갖기 때문에 필요해진다.
BFF의 핵심 책임
좋은 BFF는 모든 비즈니스 로직을 가져가는 계층이 아니다. 보통 다음 역할에 집중해야 한다.
- 화면 단위 데이터 조합
- 인증 토큰/세션 처리
- 외부 API 캡슐화
- 응답 형태 정규화
- 캐시와 오류 매핑
- 프론트엔드 친화적인 계약 제공
반대로 핵심 도메인 규칙이나 데이터 영속성 책임까지 BFF가 과도하게 가져가면, 프론트 레이어가 사실상 또 하나의 백엔드로 비대해질 수 있다.
화면 모델과 도메인 모델을 분리하라
BFF를 도입하는 이유 중 하나는 화면이 원하는 형태로 데이터를 조합하기 위해서다. 여기서 중요한 것은 도메인 모델을 그대로 노출하지 않는 것이다. UI는 종종 하나의 카드, 리스트, 상세 패널, 대시보드 섹션 단위로 데이터를 원한다.
따라서 BFF는 도메인 API를 단순 프록시하기보다, 화면 모델을 의식한 응답을 제공하는 편이 더 낫다. 다만 이때도 화면마다 완전히 제각각인 응답을 만들면 유지보수가 어려우므로, 재사용 가능한 뷰 모델 수준에서 규칙을 잡는 것이 좋다.
인증과 보안 경계에 특히 유리하다
브라우저가 직접 여러 서비스와 통신하면 토큰 처리, 쿠키 관리, CORS, 민감한 헤더 노출 문제가 복잡해진다. BFF는 이런 문제를 서버 경계 안으로 가져와 보안을 단순하게 만들 수 있다.
실무에서는 특히 다음이 중요하다.
- 액세스 토큰을 브라우저에 최소한으로 노출하기
- 외부 API 자격 증명을 서버에서만 다루기
- 사용자 권한에 따른 응답 가공을 서버에서 처리하기
- 에러 메시지를 그대로 노출하지 않고 안전하게 매핑하기
캐싱 전략이 성능과 비용을 좌우한다
BFF를 두면 네트워크 홉이 하나 늘어나는 것처럼 보일 수 있지만, 잘 설계하면 오히려 전체 성능이 좋아진다. 이유는 클라이언트가 여러 번 요청하던 것을 서버에서 조합해 한 번에 줄 수 있고, 공통 캐시 전략을 중앙화할 수 있기 때문이다.
다만 캐시 설계는 중요하다.
- 사용자별 응답과 공용 응답을 분리할 것
- 어떤 API 조합 결과를 얼마나 오래 캐시할 것
- 실패 시 fallback 데이터나 부분 응답을 허용할 것
- 캐시 무효화 이벤트를 무엇으로 볼 것
팀 구조와 소유권 문제를 함께 봐야 한다
BFF는 기술 패턴이면서 동시에 조직 패턴이다. 누가 BFF를 소유하는지에 따라 성공 여부가 달라진다. 프론트엔드 팀이 직접 소유하면 화면 요구 반영 속도는 빨라지지만, 서버 운영 역량이 필요해진다. 반대로 플랫폼 팀이 소유하면 안정성은 높을 수 있지만, 제품 변화 속도를 따라가기 어려울 수 있다.
따라서 BFF 도입 시에는 코드 구조보다 먼저 다음을 정해야 한다.
- 누가 이 계층의 계약을 관리하는가
- 배포와 장애 대응은 누가 맡는가
- 도메인 서비스와 BFF 사이 책임 경계는 어디인가
- 여러 프론트 채널이 있을 때 BFF를 채널별로 둘 것인가
자주 생기는 안티패턴
- BFF가 도메인 로직까지 흡수해 또 하나의 거대한 백엔드가 됨
- 화면마다 전용 엔드포인트를 무제한으로 늘려 계약이 파편화됨
- 캐시 없이 단순 프록시만 수행해 홉만 늘어남
- 인증과 권한 로직이 BFF와 원본 서비스에 중복됨
- 프론트와 백엔드 모두 소유권이 불명확해 변경이 느려짐
마무리
프론트엔드 BFF 패턴의 핵심은 API를 하나 더 만드는 것이 아니라, 화면 요구와 도메인 API 사이에 명확한 번역 계층을 두는 것이다. 잘 설계된 BFF는 프론트엔드 생산성과 보안을 동시에 높이고, 네트워크 비용과 UI 복잡도도 줄여 준다.
하지만 책임 경계를 잘못 잡으면 매우 빠르게 또 하나의 레거시 서버가 될 수 있다. 결국 BFF의 성공은 기술보다도, 이 계층이 정확히 무엇을 책임지는지 팀이 합의할 수 있느냐에 달려 있다.
운영 환경에서 어려워지는 지점
- BFF는 오케스트레이션 복잡도를 줄일 때만 프론트엔드를 빠르게 만든다. 복제된 모놀리스가 되면 오히려 느려진다.
- 핵심은 요청 프록시 자체가 아니라 어떤 집계, 정책, 포맷팅을 제품 경계에서 책임질지 정하는 일이다.
- 소유권이 모호하면 BFF는 도메인 로직이 실제 서비스 경계에서 이탈하는 장소가 되기 쉽다.
중요한 아키텍처 결정
- BFF는 백엔드 팀 구조가 아니라 프론트엔드 사용 사례를 기준으로 정의한다.
- 인증 처리, 응답 형태 조정, 캐시 정책을 명시적으로 테스트 가능하게 둔다.
- 어떤 로직이 표현 계층 오케스트레이션이고 어떤 로직이 핵심 서비스에 남아야 하는지 구분한다.
실무 예시
건강한 BFF 엔드포인트는 하나의 화면이나 워크플로우를 중심으로 서비스를 조합한다.
GET /bff/dashboard
-> profile service 호출
-> notifications service 호출
-> recommendations service 호출
-> 부분 실패를 UI 친화적으로 정규화
피해야 할 안티패턴
- 핵심 비즈니스 규칙을 BFF 안에 다시 구현하는 것.
- 요구가 다른 여러 클라이언트를 하나의 BFF로 억지로 서비스하는 것.
- 백엔드 오류와 payload 구조를 브라우저에 그대로 전달하는 것.
운영 체크리스트
- 엔드포인트 지연, fan-out 깊이, 부분 실패율을 추적한다.
- 응답 계약을 공개 API 수준으로 신중하게 버전 관리한다.
- 다운스트림 의존성마다 timeout과 fallback 정책을 둔다.
- BFF가 실제로 프론트엔드 복잡도를 줄이고 있는지 주기적으로 감사한다.
최종 판단
BFF 패턴은 UI 중심 오케스트레이션을 책임지고 도메인 권한은 핵심 서비스에 남길 때 가치가 있다. 제2의 백엔드가 되면 복잡도는 줄지 않고 두 배가 된다.
Continue Reading
다음으로 읽기 좋은 글
프론트엔드 Partial Hydration 경계 설계
모든 컴포넌트를 한 번에 깨우기보다, 어디까지 상호작용이 필요한지 경계를 나누는 것이 프론트엔드 성능 최적화의 핵심입니다.
🖥️ FrontendServer-Driven UI의 실전 트레이드오프
서버 주도 UI가 도움이 되는 경우와 오히려 제품 플랫폼을 느리게 만드는 경우를 실전 관점에서 정리합니다.
⚙️ BackendCQRS + Event Sourcing 실전 구현 가이드
CQRS와 Event Sourcing을 도메인 경계와 운영 복잡성의 관점에서 설명하고, Aggregate, Event Store, Projection, Snapshot, 정합성 모델의 선택 기준을 정리합니다.
⚙️ Backend비동기 작업 API의 멱등성과 상태 제어
긴 작업을 HTTP 요청 하나로 끝내지 않고 작업 생성, 재시도, 취소, 결과 조회까지 안정적으로 설계하는 방법을 정리합니다.
다음 탐색