웹 및 모바일 클라이언트를 위한 API 게이트웨이 vs BFF: 절충점
API 게이트웨이와 BFF: 두 패턴이 웹 및 모바일 앱의 버전 관리, 성능, 공개/내부 엔드포인트 분리에 어떤 영향을 주는지 알아보세요.

문제: 하나의 백엔드, 많은 클라이언트, 변화하는 요구
보통 시작은 단순합니다: 하나의 백엔드가 엔드포인트 집합을 노출하고 웹 앱과 모바일 앱이 모두 이를 호출합니다. 한 곳에서 기능을 추가하고 버그를 고치며 규칙을 강제하는 것이 효율적으로 느껴집니다.
하지만 현실이 드러납니다. 웹 UI는 보통 밀집된 화면, 필터, 내보내기, 관리자 작업이 필요합니다. 모바일은 필드 수가 적고 화면이 빠르며 오프라인 친화적 흐름과 배터리·데이터 사용에 대한 고려가 필요합니다. 같은 "기능"이라도 각 클라이언트에 가장 적합한 API 형태는 거의 같지 않습니다.
시간이 지나면 엔드포인트가 흩어집니다. 웹 팀은 테이블 뷰를 위해 추가 필드를 넣고, 모바일은 무거운 페이로드를 제거하고 여러 호출을 합쳐달라고 요청합니다. 누군가는 "iOS 전용" 파라미터를 추가하고, 또 다른 사람은 이미 있으니 내부 관리자 엔드포인트를 공개 앱에서 재사용합니다. 한때 깔끔했던 API가 타협의 집합으로 변합니다.
위험은 금방 드러납니다:
- 한 클라이언트가 더 빨리 릴리스할 때 깨지는 변경
- 큰 페이로드나 너무 많은 왕복 호출로 인한 느린 앱
- 모든 클라이언트를 만족시키려다 복잡해진 백엔드 코드
- 내부 필드나 관리자 작업이 공개 API로 유출되는 사고
- "작은 변경"이 오래된 클라이언트에는 작지 않아 고통스러운 버전 관리
이게 바로 API 게이트웨이 vs BFF 논의의 핵심 긴장입니다. 모바일과 웹이 신뢰할 수 있는 안정적인 공개 API를 원하면서도, 각 클라이언트가 자율적으로 진화할 여지는 남겨두고 싶습니다.
API 게이트웨이와 BFF: 무엇이고 무엇이 아닌가
API 게이트웨이는 API의 정문입니다. 클라이언트는 게이트웨이를 호출하고, 게이트웨이는 요청을 적절한 백엔드 서비스로 라우팅합니다. 인증 검사, 레이트 리밋, 요청 로깅, 기본 요청 형식 정리 같은 중복된 작업을 한곳에서 처리하는 경우가 많습니다.
백엔드-포-프론트엔드(BFF)는 특정 클라이언트나 클라이언트 그룹(예: "웹", "모바일")을 위해 만든 작은 백엔드입니다. 클라이언트는 자신의 BFF를 호출하고 BFF가 내부 서비스를 호출합니다. 핵심 아이디어는 집중입니다: BFF는 클라이언트의 언어(화면, 흐름, 페이로드)를 말할 수 있도록 허용됩니다. 핵심 서비스는 더 일반적인 형태로 남아 있을 수 있습니다.
이 패턴들이 아닌 것: 좋은 도메인 서비스나 깔끔한 데이터 모델을 대체하는 것은 아닙니다. 핵심 서비스, 데이터베이스, 비즈니스 규칙은 진실의 근원이어야 합니다. 게이트웨이나 BFF가 점점 비대해져 실제 백엔드가 되어서는 안 됩니다.
간단한 구분법:
- 게이트웨이: 하나의 진입점, 공통 관심사 처리, 라우팅 및 보호
- BFF: 클라이언트별 API로 클라이언트 작업을 줄이고 내부 복잡성을 숨김
둘을 결합할 수도 있습니다. 흔한 구성은 공개 엣지로 게이트웨이를 두고 그 뒤에 웹과 모바일용 각각의 BFF를 두는 방식입니다. 게이트웨이는 외부 보안과 트래픽 규칙을 처리하고 각 BFF는 클라이언트에 맞춰 엔드포인트와 응답을 조정합니다.
각 패턴에서 요청 경로가 어떻게 바뀌는가
API 게이트웨이와 BFF의 가장 큰 차이는 "프론트 도어" 로직(라우팅, 인증 검사, 응답 조형)을 어디에 두느냐입니다.
API 게이트웨이에서는 클라이언트가 보통 하나의 공유 진입점을 호출합니다. 게이트웨이는 내부 서비스로 요청을 전달하며 종종 토큰 검증, 레이트 리밋, 경로 기반 라우팅 같은 기본 작업을 수행합니다.
BFF에서는 각 클라이언트 타입(웹, iOS, Android)이 해당 클라이언트를 위해 설계된 백엔드를 호출합니다. 그 BFF는 내부 서비스를 호출하고 그 클라이언트의 화면과 제약에 맞춘 응답을 반환합니다.
요청 경로를 간단히 그림으로 보면:
- API 게이트웨이 경로: 클라이언트 -> 게이트웨이 -> 서비스(들) -> 응답
- BFF 경로: 클라이언트 -> BFF(웹 또는 모바일) -> 서비스(들) -> 응답
소유권도 이동하는 경우가 많습니다. 게이트웨이는 보통 모든 팀과 서비스에 영향을 주기 때문에 플랫폼 또는 인프라 팀이 소유합니다. BFF는 UI와 릴리스 주기에 따라 움직이므로 기능 팀이 소유하는 경우가 흔합니다.
인증 흐름은 보통 이렇게 진행됩니다: 클라이언트가 토큰을 전송하면 엣지 레이어(게이트웨이 또는 BFF)가 이를 검증하거나 인증 서비스로 전달하고, 이후 사용자 ID나 역할 같은 식별 정보를 다운스트림 서비스에 전달합니다. 차이는 클라이언트 규칙을 어디에 적용하느냐입니다. 게이트웨이에서는 정책이 일반적이고 일관적입니다. BFF에서는 모바일에 더 작은 페이로드를 반환하거나 느린 네트워크에서 여러 호출을 하나로 합치는 등 클라이언트별 조형을 추가할 수 있습니다.
바로 그 조형 단계가 BFF의 장점이지만, 동시에 배포하고 일관되게 유지해야 할 구성 요소가 늘어난다는 뜻이기도 합니다.
공개 엔드포인트와 내부 엔드포인트를 안전하게 분리하기
공개 엔드포인트는 웹 앱, 모바일 앱, 파트너, 제3자가 도달할 수 있는 모든 API 경로입니다. 네트워크나 호출하는 클라이언트 코드를 통제할 수 없으므로 기본적으로 적대적 환경으로 간주하세요.
내부 엔드포인트는 시스템 내부의 서비스 간 통신을 위한 것입니다. 더 빠르게 변경할 수 있고 더 많은 컨텍스트를 가정하며 더 풍부한 데이터를 노출할 수 있지만, 절대 공개 인터넷에서 직접 접근 가능해서는 안 됩니다.
API 게이트웨이를 쓰면 분리는 보통 물리적으로 분명하고 이해하기 쉽습니다: 외부에 노출되는 건 게이트웨이뿐이고 게이트웨이가 어떤 외부 경로를 허용할지 결정합니다. 내부 서비스 API는 표현력이 높게 유지할 수 있고 게이트웨이는 더 작고 안전한 표면을 강제합니다.
BFF 패턴에서는 분리가 제품 경계에 가깝습니다. 각 클라이언트(웹, iOS, Android)는 자신의 BFF와만 통신하고 BFF가 내부 서비스를 호출합니다. 이렇게 하면 내부 복잡성을 숨길 수 있습니다: BFF는 세 개의 서비스를 호출해 결과를 합쳐 클라이언트가 실제로 필요한 한 개의 응답만 노출할 수 있습니다.
분리가 안전하려면 실용적인 통제가 필요합니다:
- 경로별 구체적 권한 부여: 단순한 "로그인 됨" 스위치가 아니라 역할과 스코프로 제어
- 공개 엔드포인트에 대한 사용자, 토큰, IP별 레이트 리밋
- 페이로드 필터링: 클라이언트가 필요로 하는 것만 반환하고 내부 ID, 디버그 정보, 관리자 전용 필드는 제거
- 명확한 허용 목록: 어떤 엔드포인트가 공개이고 어떤 엔드포인트가 내부 전용인지
예: 모바일 앱의 "내 주문" 화면은 BFF가 /orders를 노출하되 주문 상태와 총액만 반환하게 하고, 내부 주문 서비스는 상세 비용 분해, 사기 플래그 같은 정보를 비공개로 유지할 수 있습니다.
버전 관리: 쉬워지는 것과 어려워지는 것
버전 관리 문제는 보통 웹과 모바일이 서로 다른 속도로 움직일 때 나타납니다. 웹 팀은 몇 시간 안에 배포하고 롤백할 수 있지만 모바일 앱은 앱스토어 심사와 업데이트를 기다리는 사용자 때문에 며칠 혹은 몇 주가 걸릴 수 있습니다. 이 격차가 API 게이트웨이 vs BFF 결정에서 실용적인 요소가 됩니다.
API 게이트웨이는 하나의 정문(/v1/..., /v2/...)에 버전 관리를 둘 수 있어 설명과 라우팅이 쉽습니다. 단점은 많은 클라이언트와 파트너 통합이 오래된 버전을 유지하면 게이트웨이가 버전 박물관이 될 수 있다는 점입니다. 결국 같은 데이터의 오래된 형식을 더 오래 지원하게 됩니다.
BFF는 종종 "클라이언트별" 버전 관리를 제공합니다. 모바일 BFF는 오래된 계약을 유지하는 반면 웹 BFF는 더 빨리 움직일 수 있어 공개 버전을 오랫동안 유지해야 할 압력이 줄어듭니다. 단점은 관리해야 할 버전 결정이 늘어나고 배포가 복잡해진다는 것입니다.
서비스 내부에서의 버전 관리는 가능하지만 클라이언트 주도의 변경을 시스템 깊숙이 밀어 넣습니다. 또한 서비스 로직이 클라이언트 버전에 따라 분기되면서 내부 코드가 읽기 어려워질 수 있습니다.
비파괴적 변경은 최고의 친구입니다: 선택적 필드 추가, 새 엔드포인트 추가, 추가 입력 필드 수용 등이 그렇습니다. 파괴적 변경은 필드 이름 변경, 타입 변경(문자열->숫자), 엔드포인트 제거 등입니다.
권고되는 폐기(디프리케이션) 방식:
- 명확한 종료 날짜를 설정하고 일찍 소통하세요
- 오래된 버전 사용량을 추적(로그, 메트릭)해 잔존 사용자를 모니터하세요
- 먼저 클라이언트 업데이트(특히 모바일)를 배포한 다음 오래된 경로를 제거하세요
- 오래된 버전이 차단될 때는 명확한 오류 메시지를 돌려주세요
성능: 지연, 페이로드 크기, 호출 수
API 게이트웨이와 BFF 구성에서 성능은 주로 트레이드오프입니다: 시스템 내부에 한 홉이 추가되는 것 vs 클라이언트에서의 느리고 신뢰할 수 없는 네트워크 왕복을 줄이는 것. 많은 경우 가장 빠른 옵션은 클라이언트 네트워크 시간을 줄이는 것입니다. 서버 측의 작은 추가 홉이 있더라도 전체로 보면 빠릅니다.
클라이언트가 많은 호출을 해야 한다면 BFF가 유리한 경우가 많습니다. 웹과 모바일이 다섯 개 엔드포인트를 호출해 디바이스에서 결과를 조합하는 대신, BFF가 서버 측에서 필요한 것을 불러와 한 번에 응답하면 모바일에서 총 지연이 줄어듭니다(셀룰러 네트워크는 요청마다 지연이 커집니다).
게이트웨이나 BFF로 얻는 일반적인 성능 향상:
- 집계: 여러 서비스의 데이터를 하나의 응답으로 합침
- 더 똑똑한 캐싱: 엣지나 BFF에서 읽기 중심 화면을 캐시
- 더 작은 페이로드: 화면에 필요한 필드만 반환
- 왕복 호출 수 감소: 채티한 클라이언트 동작 축소
- 일관된 압축과 타임아웃: 한 곳에서 기본값을 강제
하지만 패턴이 해가 될 때도 있습니다. 레이어가 추가될수록 CPU 작업이 늘고 기다려야 할 지점도 많아집니다. 웹과 모바일에 대해 같은 집계 로직을 중복하면 작업이 두 배가 되고 동작이 일관되지 않을 수 있습니다. 범용 엔드포인트가 모든 화면을 만족시키려다 과도하게 많은 데이터를 반환하는 것도 흔한 손실입니다.
모바일 현실은 이러한 트레이드오프를 더 날카롭게 만듭니다. 불안정한 네트워크는 재시도와 타임아웃을 만들고, 추가 호출은 배터리를 더 소모합니다. 콜드 스타트도 중요합니다: 첫 화면이 사용 가능해지기 전 여러 요청이 필요하면 사용자는 느끼게 됩니다.
실용 규칙: 클라이언트 요청 수를 먼저 줄이고, 그 다음에 추가 홉을 최적화하세요.
설계를 빠르게 판단하는 방법
화면이 순차 호출을 2~3회 이상 필요로 하면 집계를 고려하세요. 응답이 크고 대부분 사용되지 않는다면 엔드포인트를 분리하거나 클라이언트별 BFF를 고려하세요.
운영: 배포, 모니터링, 스케일링
API 게이트웨이와 BFF에서 큰 운영 질문은 얼마나 많은 움직이는 부품을 운영하고 지원할 것인가입니다. 게이트웨이는 많은 팀과 클라이언트의 공유 인프라가 되는 경우가 많습니다. BFF는 보통 더 작은 서비스지만 각 클라이언트(웹, iOS, Android, 파트너)마다 하나씩 생기면 배포와 온콜 부담이 늘어납니다.
테스트와 릴리스 측면에서, 게이트웨이는 라우팅, 인증, 레이트 리밋이 주된 목적일 때 더 안전할 수 있습니다. 변경이 중앙화되어 있으므로 한 실수가 모두에게 영향을 줄 수 있습니다. BFF는 Blast radius를 줄여 웹 전용 변경은 웹 BFF에만 배포되므로 영향을 좁힐 수 있습니다. 단점은 더 많은 파이프라인과 더 많은 버전이 동시에 존재하게 되는 것입니다.
관측성에는 사용자의 단일 요청이 여러 레이어를 거칠 때 전체 경로를 볼 수 있어야 합니다.
- 상관 ID를 사용하고 게이트웨이, BFF, 백엔드 로그 전반에 전달하세요
- 트레이스를 캡처해 어디에서 시간이 소비되는지 파악하세요(게이트웨이, BFF, 다운스트림 서비스)
- 구조화된 로그를 유지하세요(클라이언트, 엔드포인트, 상태 코드, 지연, 페이로드 크기)
- 엔드포인트별 핵심 지표 몇 가지를 추적하세요: 오류율, p95 지연, 처리량
스케일링도 다르게 보입니다. 게이트웨이는 공유 병목 지점이므로 스파이크와 뜨거운 엔드포인트를 견딜 수 있어야 합니다. BFF는 클라이언트별로 스케일링할 수 있어 웹 트래픽이 업무 시간에 급증할 때 유리합니다.
사건 발생 시 장애는 패턴에 따라 "이동"할 수 있습니다. 게이트웨이에서는 광범위한 5xx나 인증 오류로 문제가 나타나는 경향이 있고, BFF에서는 한 클라이언트의 기능에만 이슈가 국한될 수 있습니다. 런북을 명확히 하고 폴백 동작을 단순하게 유지하세요(예: 타임아웃 대신 축소된 응답 반환).
선택 방법: 단계별 간단한 의사결정 과정
API 게이트웨이와 BFF 사이의 선택은 이론적보다 클라이언트의 일상적 필요에 더 가깝습니다.
실용적 결정 흐름
-
서버가 아니라 클라이언트부터 시작하세요. 지원하는 모든 클라이언트(웹 앱, iOS, Android, 파트너 API, 내부 관리자)를 적고 각 주요 화면이 무엇을 필요로 하는지 적으세요. 같은 "고객 상세" 뷰가 클라이언트별로 다른 필드와 호출 패턴을 필요로 하면 클라이언트별 조형 신호입니다.
-
현재 상태를 매핑하세요. 현재 엔드포인트를 가져와 공유되는 부분(주문, 결제, 사용자 같은 핵심 도메인 작업)과 표현형에 맞춘 부분(대시보드 요약, 결합된 "홈 화면" 페이로드)을 표시하세요. 공유되는 부분은 핵심 백엔드에 있어야 하고, 표현형 조각은 BFF에 더 적합합니다.
-
조형과 규칙을 어디에 둘지 결정하세요. 라우팅, 인증, 레이트 리밋, 캐싱, 공개 vs 내부 노출 제어가 주 목적이라면 게이트웨이가 자연스러운 장소입니다. 실제 조합(여러 서비스 호출 합치기, 여섯 호출을 하나로 줄이기, 클라이언트별 다른 페이로드)이 필요하면 테스트 가능하고 읽기 쉬운 BFF 코드에 두세요.
-
실제 지킬 수 있는 버전 및 폐기 규칙을 정하세요. 예: "파괴적 변경은 새 버전 없이 불가, 폐기된 필드는 90일 유지" 같은 규칙. 게이트웨이만으로 가면 공개 표면을 버전 관리하고 뒤에서 변환해야 할 수 있습니다. BFF를 쓰면 핵심 API는 안정적으로 유지하고 클라이언트별 BFF 엔드포인트만 버전하면 됩니다.
-
배포 계획과 측정. 변경 전에 기준 메트릭을 수집하세요: p95 지연, 화면당 호출 수, 페이로드 크기, 오류율. 소규모로 먼저 배포해 전후를 비교한 다음 확장하세요.
간단한 예: 모바일 앱은 한 달에 한 번 릴리스하지만 웹 포털은 매일 배포한다면, 작은 모바일 BFF는 모바일을 잦은 백엔드 변경으로부터 보호하면서 웹은 빠르게 움직일 수 있게 합니다.
예시: 서로 다른 릴리스 속도의 웹 포털 + 모바일 앱
고객 포털(웹)과 현장 앱(모바일)을 가진 회사를 상상해보세요. 두 클라이언트 모두 고객, 작업, 청구서, 메시지 같은 동일한 핵심 데이터를 필요로 합니다. 포털은 주간으로 변경되고 모바일 앱은 앱스토어 심사와 약한 신호 환경 때문에 더 느리게 업데이트됩니다.
문제는 금방 드러납니다. 모바일 사용자는 응답이 간결하고 호출 수가 적으며 오프라인 작업을 지원하는 흐름(예: 오늘 작업을 한 번 내려받고 이후 변경사항만 동기화)을 원합니다. 웹 포털은 항상 온라인이고 업데이트가 쉬워 더 많은 호출과 풍부한 화면을 허용합니다.
옵션 A: 안정된 서비스 앞의 API 게이트웨이
게이트웨이 우선 선택은 백엔드 서비스를 대부분 변경하지 않습니다. 게이트웨이는 인증, 라우팅, 헤더 조정, 레이트 리밋, 간단한 필드 매핑 같은 작업을 처리합니다.
버전 관리는 주로 서비스 API 수준에서 이루어질 수 있어 이동 부품이 적습니다. 하지만 모바일 특화 변경은 기본 엔드포인트가 공유되므로 /v2 같은 넓은 버전으로 밀어야 할 때가 있습니다.
엔드포인트 노출은 게이트웨이를 공개 문으로 취급하면 더 명확합니다. 내부 엔드포인트는 그 뒤에 숨겨두되 게이트웨이가 무엇을 접근할 수 있고 무엇을 공개할지 엄격히 관리해야 합니다.
옵션 B: "모바일"을 말하는 모바일 BFF
모바일 BFF를 두면 모바일 앱이 모바일 화면과 동기화 흐름에 맞춘 엔드포인트를 호출합니다. BFF는 (작업 상세 + 고객 + 최근 메시지) 같은 데이터를 서버 측에서 집계하고 필드를 다듬어 앱 요구에 맞춘 하나의 페이로드를 반환할 수 있습니다.
변화되는 것들:
- 버전 관리는 클라이언트별로 쉬워집니다: 모바일 BFF를 버전 관리해도 웹 포털을 강제로 이동시키지 않습니다
- 모바일 성능은 종종 개선됩니다: 왕복 호출 감소와 더 작은 응답
- 공개 vs 내부 분리가 명확해집니다: BFF는 공개되지만 내부 서비스는 노출될 필요가 없습니다
흔한 실수와 피해야 할 함정
API 게이트웨이 vs BFF 논쟁에서 가장 큰 함정은 게이트웨이를 미니 백엔드로 만드는 것입니다. 게이트웨이는 라우팅, 인증, 레이트 리밋, 간단한 요청 조형에 적합합니다. 비즈니스 규칙을 가득 채우면 테스트하기 어렵고 디버그하기 어렵고 설정 변경으로 쉽게 깨질 수 있습니다.
BFF는 반대 방향으로 잘못될 수 있습니다: 팀이 화면별이나 기능별로 BFF를 너무 많이 만들면 유지보수가 폭증합니다. BFF는 보통 클라이언트 타입(웹, iOS, Android)이나 명확한 제품 영역에 매핑되어야 합니다. 그렇지 않으면 동일한 규칙을 여러 곳에 중복하고 버전 관리는 풀타임 일이 됩니다.
버전 관리 실수는 극단에서 옵니다. 초기에 모든 것을 버전 관리하면 API를 너무 일찍 동결하고 오래된 변형을 영구히 유지하게 됩니다. 반대로 전혀 버전 관리를 하지 않으면 의도치 않은 파괴적 변경을 배포하게 됩니다. 실용 규칙: 작은 추가 변경에는 버전을 만들지 말고, 제거나 의미 변경에는 버전을 만드세요.
공개 vs 내부 엔드포인트는 팀이 가장 크게 다칩니다. 내부 서비스를 공개 인터넷에 직접 노출하면 모든 내부 변경이 잠재적 장애나 보안 사고가 됩니다. 경계를 명확히 하세요: 공개는 게이트웨이 또는 BFF만, 내부 서비스는 비공개.
성능 문제는 보통 스스로 만들었습니다: 과도한 페이로드, 너무 많은 왕복 호출, 지연 예산 없음. 예: 모바일 앱이 주문 상태와 총액만 필요하지만 전체 주문 객체(라인 아이템, 감사 필드 포함)를 받으면 셀룰러에서 각 요청이 느려집니다.
주의 신호:
- 게이트웨이 설정에 "환불 자격"이나 "VIP 규칙" 같은 비즈니스 개념이 참조됨
- BFF가 제공하는 클라이언트 수보다 더 빨리 늘어남
- API 버전 전략을 한 문장으로 설명하지 못함
- 내부 서비스 엔드포인트가 공개 인터넷에서 접근 가능함
- "나중에 유용할지도"라며 응답이 계속 커짐
빠른 체크리스트와 다음 단계
API 게이트웨이 vs BFF 결정에 막혔다면, 실제로 먼저 깨질 부분: 릴리스, 페이로드, 보안 경계를 중심으로 생각하세요.
빠른 체크리스트
다음 질문들에 대해 "아니오"가 여러 개라면 현재 구성은 클라이언트가 늘어남에 따라 문제를 일으킬 가능성이 큽니다:
- 하나의 백엔드 서비스를 바꿀 때 모든 클라이언트가 같은 주에 업데이트해야 하나요?
- 공개 엔드포인트(인터넷에 안전한)와 내부 엔드포인트(신뢰된 시스템 전용) 사이에 명확한 경계가 있나요?
- 웹과 모바일은 필요한 것만 받나요(거대한 "주방 싱크" 응답이 아닌가요)?
- 변경을 점진적으로 배포하고 작은 비율로 먼저 롤아웃해 오류, 지연, 이상 트래픽을 빠르게 볼 수 있나요?
- 각 엔드포인트의 계약을 누가 소유하고 파괴적 변경을 누가 승인하는지 알고 있나요?
다음 단계
답변을 계획으로 바꾸세요. 목표는 완벽한 아키텍처가 아니라 릴리스할 때 놀라움이 적은 것입니다.
API 계약을 평범한 언어로 작성하세요(입력, 출력, 오류 코드, 변경 가능한 항목). 소유 모델을 정하세요: 누가 클라이언트 요구(웹/모바일)를 소유하고 누가 핵심 도메인 서비스를 소유하는지. 버전 관리는 어디에 둘지(클라이언트별 또는 중앙) 정하고 따라갈 폐기 규칙을 세우세요.
큰 리팩터링 전에 기본 모니터링을 추가하세요: 요청률, p95 지연, 오류율, 페이로드 크기 상위 엔드포인트. 가장 위험한 클라이언트 흐름을 먼저 프로토타입하세요.
AppMaster (appmaster.io)로 구축한다면 한 가지 실용적 접근은 생성된 백엔드에 핵심 비즈니스 로직과 데이터 모델을 두고, 클라이언트가 정말로 다른 페이로드 조정이나 릴리스 분리를 필요로 할 때만 얇은 게이트웨이나 BFF 레이어를 추가하는 것입니다.
체크리스트에 답하기 어렵다면, 그건 공개와 내부 분리를 더 엄격히 하고 계약을 단순화해야 할 신호로 보세요.
자주 묻는 질문
공통적인 제어나 라우팅, 인증 검사, 레이트 리밋 같은 항목이 주 목적이라면 API 게이트웨이로 시작하세요. 웹과 모바일이 명확히 다른 페이로드나 호출 패턴, 독립적인 릴리스 주기가 필요할 때 BFF를 추가하는 것이 좋습니다.
게이트웨이는 엣지에서의 교차 관점(라우팅, 인증 강제, 기본 요청/응답 처리)에 적합합니다. BFF는 클라이언트 관점의 합성(여러 서비스 호출을 합치고 필드를 다듬는 작업)에 적합하지만, 핵심 비즈니스 규칙이 쌓이지 않도록 주의해야 합니다.
게이트웨이는 설명하기 쉬운 하나의 버전된 '정문'을 제공합니다. 단, 오래된 버전을 오랫동안 유지하게 될 수 있습니다. BFF는 클라이언트별로 버전 관리가 가능해 모바일은 안정적으로, 웹은 빠르게 발전시키기 좋지만 관리해야 할 서비스가 늘어납니다.
기본 원칙은 비파괴적 변경을 우선하는 것입니다. 선택적 필드 추가, 새 엔드포인트 추가, 입력 필드 수용 같은 방식이 비파괴적 변경입니다. 필드 제거, 이름 변경, 타입 변경처럼 의미가 바뀌는 경우에는 새 버전을 만드세요. 모바일은 사용자가 업데이트하지 않을 수 있으니 특히 주의해야 합니다.
내부 서비스는 비공개로 유지하고, 공개 인터넷에는 게이트웨이나 BFF만 노출하세요. 응답을 필터링해 클라이언트가 필요한 데이터만 주고, 경로별로 권한을 엄격히 적용해 내부 관리자 동작이 노출되지 않게 하세요.
클라이언트가 여러 연속 호출을 해야 한다면 BFF가 더 빠를 수 있습니다. 서버 측 집계로 호출 수를 줄이면 모바일의 셀룰러 네트워크 지연을 줄일 수 있기 때문입니다. 다만 게이트웨이나 BFF도 추가 홉을 만들므로 가볍게 유지하고 지연과 페이로드 크기를 측정하세요.
게이트웨이는 공유 지점이라 잘못된 설정 하나로 모든 클라이언트에 영향이 갈 수 있습니다. BFF는 변경 범위를 좁혀 격리 효과가 있지만 배포와 모니터링, 온콜 부담이 늘어납니다. 어느 쪽이 더 쉬운지는 팀의 운영 능력에 따라 다릅니다.
게이트웨이/BFF와 다운스트림 서비스 전반에 걸쳐 하나의 상관 ID를 전달해 사용자 요청을 끝까지 추적하세요. 엔드포인트별로 오류율, p95 지연, 처리량, 페이로드 크기 같은 핵심 지표를 모니터링하면 성능 회귀를 빠르게 발견할 수 있습니다.
게이트웨이에 비즈니스 규칙이 쌓이는 것과, 클라이언트별로 지나치게 많은 BFF를 만드는 것이 가장 흔한 실수입니다. 전자는 테스트와 디버깅을 어렵게 만들고, 후자는 중복과 버전 관리 부담을 키웁니다.
핵심 데이터 모델과 비즈니스 프로세스는 생성된 백엔드에 두고, 진짜로 클라이언트별 페이로드 조정이나 릴리스 분리가 필요할 때만 얇은 게이트웨이나 BFF 레이어를 추가하세요. 예: 생성된 Go 백엔드에 도메인 엔드포인트를 두고 모바일 집계용 얇은 레이어만 추가합니다.


