30P by xguru 3달전 | favorite | 댓글 3개
  • "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를 참고할 것

rust 가 가지고 있는 핵심이랑 비슷한 궤를 가지고 있네요.

좀 더 써봐야 알 것 같지만 fp-ts 에 비하면 훨씬 쾌적하게 사용할 수 있네요

fp-ts 가 3.0 개발을 안하고 effect로 합류하기로 했습니다.

fp-ts 를 쓴다면 effect를 고려해 보시면 좋습니다.

https://x.com/MichaelArnaldi/status/1626975031048773635
https://effect.website/docs/other/fp-ts