Effect - TypeScript로 강력한 앱 구축을 도와주는 라이브러리
(effect.website)- "The missing Standard Library for TypeScript"
- 복잡한 동기/비동기 프로그램을 쉽게 만들 수 있도록 설계
- 코드를 더욱 Composable, Reusable, Testable 하게
- Maximum Type-Safety(에러 핸들링 포함)
- 다양한 라이브러리 제공
- 클러스터링 & 워크플로우 제공 (알파버전)
- 폭넓은 호환성
- Node, Deno, Bun, Cloudflare Workers, Chrome
- React, Solid.JS , Vite, Next.JS, Tauri
- 주요 특징
- 동시성(Concurrency) : Fiber 기반 동시성 모델을 통해 고도로 확장 가능하고 초저지연 애플리케이션을 구현 가능
- 조합성(Composability) : 작고 재사용 가능한 구성 요소를 사용하여 유지 관리가 용이하고 읽기 쉬우며 유연한 소프트웨어를 구축 가능
- 리소스 안전성(Resource Safety) : 프로그램이 실패하더라도 리소스의 획득과 해제를 안전하게 관리 가능
- 타입 안전성(Type Safety) : 타입 추론과 타입 안전성에 중점을 두고 있어, TypeScript 타입 시스템을 최대한 활용 가능
- 오류 처리(Error Handling) : 내장 오류 처리 기능을 사용하여 구조화되고 신뢰할 수 있는 방식으로 오류를 처리 가능
- 비동기성(Asynchronicity) : 코드가 동기식이든 비동기식이든 동일하게 보이도록 작성 가능
- 관측 가능성(Observability) : 완전한 추적 기능을 통해 프로그램의 실행을 쉽게 디버그하고 모니터링 가능
왜 Effect 인가?
- 프로그래밍은 어려움
- 라이브러리와 앱을 만들 때 많은 도구를 사용해 복잡성을 관리함
- Effect는 TypeScript 프로그래밍에 대한 새로운 사고방식을 제시함
- Effect 생태계의 도구를 통해 더 나은 애플리케이션과 라이브러리를 구축할 수 있음
- 이를 통해 TypeScript 언어와 타입 시스템을 더 잘 이해하고 프로그램을 더 신뢰성 있고 유지 관리하기 쉽게 만들 수 있음.
Effect 패턴
- 일반적인 TypeScript 코드에서는 함수가 성공하거나 예외를 던질 것이라고 가정함
- 예:
divide
함수는 0으로 나누면 예외를 던짐
- 예:
- 타입만 봐서는 이 함수가 예외를 던질 수 있다는 것을 알 수 없음
- 코드베이스에 수백, 수천 개의 함수가 있을 때 이 문제는 커짐
- 예외 처리를 잊기 쉽고, 관리하기 어려움
- TypeScript의 컴파일러는 버그, 도메인 오류 및 일반적인 복잡성에 대한 첫 번째 방어선임
Effect 패턴 적용하기
- Effect의 주요 인사이트는, 성공 값뿐만 아니라 오류와 "컨텍스트"를 추적하기 위해 타입 시스템을 사용할 수 있다는 것
- 예:
divide
함수의 Effect 버전은 예외를 던지지 않고, 오류를 호출자에게 전달함
- 예:
- 오류와 성공 값을 관리하는 기능을 제공
- 컨텍스트 추적을 통해 모든 인수를 전달하지 않고도 함수에 추가 정보를 제공할 수 있음
- 예: 테스트 중 외부 서비스의 실제 구현을 모의 객체로 교체 가능
import { Effect } from "effect"
const divide = (a: number, b: number): Effect.Effect<number, Error, never> =>
b === 0
? Effect.fail(new Error("Cannot divide by zero"))
: Effect.succeed(a / b)
Effect 생태계
- Effect의 독특한 인사이트와 다른 도구들이 결합되어 복잡한 애플리케이션을 쉽게 만들 수 있는 풍부한 라이브러리 생태계가 형성됨
- 과거에는 불가능해 보였던 것들이 이제는 평범하게 됨
- Effect 생태계는 빠르게 성장 중이며, Effect의 GitHub에서 확인 가능함
바퀴를 재발명하지 말 것
- TypeScript 애플리케이션 코드에서는 종종 같은 문제를 반복적으로 해결함
- 외부 서비스, 파일 시스템, 데이터베이스와의 상호작용은 모든 애플리케이션 개발자에게 공통된 문제임
- Effect는 이러한 문제들에 대한 표준화된 솔루션을 제공하는 풍부한 라이브러리 생태계를 제공함
- 여러 종속성을 설치할 필요 없이 Effect는 많은 문제를 한 번에 해결함
실용적인 문제 해결
- Effect는 Scala와 Haskell에서 영감을 받음.
- 그러나 Effect의 목표는 실용적인 도구 키트를 제공하여 TypeScript 애플리케이션과 라이브러리를 구축할 때 직면하는 일상적인 문제를 해결하는 것임
즐기면서 배우기
- Effect를 배우는 것은 재미있음
- 많은 개발자들이 실무에서 Effect를 사용해 실제 문제를 해결하고 있음
- Effect 생태계의 일부를 먼저 사용해보고, 점점 더 많은 도구를 활용할 수 있음
- 처음에는 Effect의 개념이 낯설 수 있으나, 문서를 읽고 핵심 개념을 이해하는 데 시간을 들이면 나중에 더 고급 도구를 사용할 때 도움이 됨
- Effect 커뮤니티는 항상 학습과 성장을 도울 준비가 되어 있음. Discord나 GitHub를 참고할 것
fp-ts 가 3.0 개발을 안하고 effect로 합류하기로 했습니다.
fp-ts 를 쓴다면 effect를 고려해 보시면 좋습니다.
https://x.com/MichaelArnaldi/status/1626975031048773635
https://effect.website/docs/other/fp-ts