728x90
BFF에서의 필터링 전략과 정합성 보장 설계
들어가며
BFF(Backend For Frontend)는 단순 API Gateway가 아니다.
모바일, 웹, 관리자 등 다양한 클라이언트의 요구를 반영하고
서비스 전반의 정합성과 일관성을 설계하는 중심 허브가 된다.
이 글에서는 다음 두 가지를 중심으로 설명한다:
- 1부: 필터링/정렬/페이징 대응 전략 (조회 성능 개선 중심)
- 2부: 분산된 서비스 간 정합성 보장 및 오류 복구 설계
1부: 정렬·필터링·페이징의 현실적 해결
상황
"댓글 수가 많은 게시글을 최신순으로 정렬해줘"
- 댓글 수는
comment모듈에서 관리 - 게시글 메타는
article모듈 - 썸네일은
image모듈
즉, 댓글 기준 정렬 → 게시글 정보 조회 → 이미지 로딩
→ MSA 구조에서는 이것만으로 3~4개의 요청이 필요
문제
- API 호출 병목
- 정렬 기준과 데이터 위치가 분산됨
- 조회 성능 저하, 비용 증가
해법: 반정규화 + 조회 전용 테이블
정렬, 필터링 기준 데이터를 게시글 DB에 미리 포함시킨다
예: comment_count, view_count, like_count
@Entity
public class Article {
private Long id;
private String title;
private int commentCount;
private int likeCount;
private int viewCount;
}
정렬은 DB 내에서 index + ORDER BY 로 해결할 수 있음.
Redis 누적 + 주기적 DB 반영
- 요청마다 Redis INCR
- 5~10초마다 DB로 FLUSH (스케줄링)
→ 실시간은 아니지만 정렬 기준으로는 충분히 신뢰할 수 있음
DTO 설계 전략
클라이언트는 단순하게 요청하고,
BFF는 필요한 정렬 기준을 가공해서 전달한다.
// 앱에서 요청
{
"sort": "most_commented"
}
// BFF → Article 모듈
{
"articleIds": [123, 85, 17],
"sortHint": "COMMENT_COUNT"
}
2부: 정합성과 보상 트랜잭션 설계
문제 정의
BFF에서 하나의 요청이 여러 모듈을 호출한다.
그 중 하나라도 실패하면 전체 요청을 "무효화"해야 한다.
→ 우리는 분산 트랜잭션이 없는 환경에서 이를 해결해야 한다.
방법 1: 보상 트랜잭션
- 실패가 발생하면 이미 실행된 작업을 되돌리는 API를 호출
- 예: 게시글 생성 후 이미지 업로드 실패 → 게시글 삭제 API 호출
POST /article
POST /image (실패)
→ DELETE /article
방법 2: 상태 기반 처리
- 모든 작업은 "PENDING" 상태로 시작
- 전부 성공하면 "COMPLETED"
- 실패 시엔 "CANCELLED"로 마킹
이 방식은 보상 API가 실패해도 데이터 정합성을 유지할 수 있다.
공통 요구: 요청 흐름 추적 가능해야 함
- 모든 모듈 요청은
requestId,transactionId등으로 추적 - 장애 상황 시 rollback 대상 파악 가능
BFF의 책임
- 요청을 전파할 뿐만 아니라,
- 흐름을 통제하고, 실패 시 대응까지 책임진다
이걸 하기 위해선 BFF가 다음을 가져야 한다:
- 요청 순서 관리
- 상태 저장 or 이벤트 로그 저장
- 보상 트랜잭션 실행 조건 정의
마무리
- 정렬·필터링은 단순 로직이 아니다. 시스템 설계다.
- 반정규화, Redis, 조회 전용 테이블은 성능을 위한 기본 구성
- 보상 트랜잭션은 MSA 환경에서 반드시 고려해야 할 핵심 설계
요약
| 주제 | 해법 |
|---|---|
| 정렬 기준 데이터 분산 | 반정규화 + Redis 누적 |
| 조회 성능 저하 | 조회 전용 테이블 구성 |
| 분산 실패 처리 | 보상 트랜잭션 or 상태 기반 관리 |
| BFF 역할 강화 | 정합성/흐름/복구 책임 분리 |
728x90
'BindProject' 카테고리의 다른 글
| [Backend] AUTH모듈 : 초기 세팅 (0) | 2025.06.18 |
|---|---|
| [Backend] Auth모듈 : Validator 만들기 (0) | 2025.06.18 |
| [Backend] JWT 토큰 모듈 설계 및 구현기 (1) | 2025.06.17 |
| [Backend] BFF 구현 하기 앞서 구상 및 정리 (0) | 2025.06.17 |
| [중간 회고] 여기까지 구현 하면서... (1) | 2025.06.17 |