비동기/동기 경계면의 임피던스 불일치
핵심 아이디어
비동기 코드와 동기 코드가 만나는 지점에서 발생하는 에러 전파의 비대칭성은 단순한 구현 실수가 아니라, 두 패러다임의 에러 모델이 근본적으로 다르기 때문에 발생한다.
통찰
- 동기 에러 모델:
throw→ 즉시 스택 해제, 콜 스택을 따라 전파 - 비동기 에러 모델:
Promise.reject()→ 이벤트 루프를 통해 마이크로태스크 큐로 전파 - 문제: 이 두 모델이 만나는 경계면에서 **에러가 ‘증발’하거나 ‘이중으로 처리’**되는 현상이 발생한다.
내가 배운 것
- 이 문제의 해결책은 Either/Try 모나드를 사용하여 모든 함수의 반환값을 에러 가능성을 포함한 타입으로 통일하는 것이다.
- 자바스크립트/타입스크립트에서 이 패턴을 적용하려면 명시적인
Result타입을 도입해야 한다. (예:type Result<T, E> = { ok: true, value: T } | { ok: false, error: E })
질문과 의문
- 이 문제를 언어 레벨에서 해결할 수 있을까? (예: Rust의
?연산자, Swift의try/await) - 비동기/동기 경계면에서 발생하는 에러를 자동으로 감지하고 변환해주는 런타임 도구는 가능할까?
실행할 것
- 현재 코드베이스에서 비동기 함수가 동기 함수를 호출하는 지점을 모두 찾아서
try/catch누락 여부를 점검하자. - 팀에 Result 타입 도입을 제안하고, 마이그레이션 계획을 세우자.