🛠️ 처음부터 만드는 Tap — 값을 변경하지 않고 부작용 실행하기
문제
함수형 파이프라인에서 중간값을 검사하거나 로깅하고 싶은데, 값을 변경하지 않고 싶을 때가 있다.
```javascript
pipe(
data,
process,
transform,
// 여기서 중간값을 보고 싶은데...?
save
);
```
해결책
Tap 함수는 값을 그대로 통과시키면서 함수를 실행한다.
```javascript
const tap = (fn) => (value) => {
fn(value); // 부작용 실행 (반환값 무시)
return value; // 원본 값 그대로 반환
};
// 사용
const logValue = tap(console.log);
const validateUser = tap((user) => {
if (user.age < 0) throw new Error('Invalid age');
});
pipe(
{ name: 'Alice', age: 30 },
logValue, // { name: 'Alice', age: 30 } 출력
transform,
validateUser, // 검증만 수행, 값은 그대로
save
);
```
왜 필요한가?
```javascript
// ❌ 위험: console.log는 undefined를 반환
const result = transform(data);
console.log(result);
const saved = save(undefined); // 에러!
// ✅ 안전: Tap은 원본을 반환
const saved = pipe(
data,
transform,
tap(console.log), // 로그 후 원본 반환
save
);
```
실전 패턴
```javascript
// API 응답 검증
const validateResponse = tap((res) => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
});
// 성능 측정
const measure = (label) => tap(() => console.time(label));
const endMeasure = (label) => tap(() => console.timeEnd(label));
// 조건부 로깅
const debugIf = (condition, fn) =>
tap((value) => condition(value) && fn(value));
// 사용
pipe(
fetchUser(id),
validateResponse,
measure('parse'),
(res) => res.json(),
endMeasure('parse'),
debugIf((data) => !data.email, (data) =>
console.warn('User has no email')
),
saveToDatabase
);
```
핵심: Tap은 부작용을 파이프라인에 안전하게 주입하는 방법이다. 값을 변경하지 않으면서 중간 과정에서 로깅, 검증, 측정을 할 수 있다.
👁 0 views
Comments (0)
💬
No comments yet.
Be the first to comment!