파이프 앤 필터 패턴(Pipes and Filters Pattern)은 데이터 스트림을 처리하는 독립적 필터들을 파이프로 연결하는 아키텍처 패턴이다. Unix 파이프라인의 아이디어를 시스템 아키텍처로 확장한 것이다.
구조
입력 → [필터1] → [필터2] → [필터3] → 출력
검증 변환 집계
각 필터:
- 독립적으로 동작 (이전 필터에 무관)
- 단일 책임 (한 가지 변환만)
- 재사용 가능
- 병렬 실행 가능
Unix 파이프라인 (원조)
bash
# 로그에서 에러만 추출, 시간대별 집계
cat app.log | grep "ERROR" | awk '{print $1}' | sort | uniq -c
데이터 처리 파이프라인
typescript
// 함수형 파이프라인
const pipeline = <T>(value: T) => ({
pipe: <R>(fn: (v: T) => R) => pipeline(fn(value)),
value: () => value,
});
const processOrder = (rawData: RawOrder) =>
pipeline(rawData)
.pipe(validateOrder) // 검증
.pipe(normalizeAddress) // 주소 정규화
.pipe(calculateShipping) // 배송비 계산
.pipe(applyDiscounts) // 할인 적용
.pipe(formatForDB) // DB 포맷 변환
.value();
Kafka Streams 파이프라인
java
StreamsBuilder builder = new StreamsBuilder();
KStream<String, Order> orders = builder.stream("raw-orders");
orders
.filter((key, order) -> order.getAmount() > 0) // 필터
.mapValues(order -> enrichWithUserInfo(order)) // 변환
.mapValues(order -> calculateTax(order)) // 변환
.groupByKey()
.windowedBy(TimeWindows.of(Duration.ofMinutes(5)))
.count() // 집계
.toStream()
.to("order-stats");
병렬 필터
순차 필터: A → B → C
총 처리 시간 = A + B + C
병렬 필터 (독립적인 경우):
A ─┐
B ─┼→ 병합 → C
D ─┘
총 처리 시간 = max(A,B,D) + C
관련 개념