본문 바로가기
타입스크립트(TS)/라이브러리

[TS,라이브러리] Effect-TS 알아보기

by goodchuck 2024. 7. 28.

목차

     

     

     서론

    https://www.youtube.com/shorts/2W1fQH0wEe4

    https://www.youtube.com/shorts/MzFCHctD0lM

    https://www.youtube.com/shorts/MzFCHctD0lM

     

    제로초 선생님의 유튜브를 보는 도중 effect라는 라이브러리의 존재를 알게 되었다. 

    제로초 선생님의 말을 빌리자면 타입스크립트의 새로운 표준이 될 수 있는 라이브러리라고 한다.

     

     Effect 라이브러리란?

    Effect는 개발자들에게 복잡하고, 동기,비동기 한 프로그램에 도움을주고자 한 강력한 TS라이브러리라고한다.

     

     

     

    Docs

    https://effect.website/

    https://effect.website/docs/introduction

    https://github.com/Effect-TS/effect

     

    GitHub - Effect-TS/effect: An ecosystem of tools to build robust applications in TypeScript

    An ecosystem of tools to build robust applications in TypeScript - Effect-TS/effect

    github.com

     

    Effect공식 사이트 링크

     

     

     

    Effect라이브러리를 사용하려면 다음과 같은 요구수치가 필요하였다.

    Requirements

    • TypeScript 5.4 or newer
    • The Strict flag enabled in your tsconfig.json file
    {
      // ...
      "compilerOptions": {
        // ...
        "strict": true,
      },
    }

     

     

     

     사용예시

    Error Handling

    const getTodo = (
      id: number
    ): Effect.Effect<unknown, HttpClientError> =>
      HttpClientRequest.get(`/todos/${id}`).pipe(
        HttpClient.fetchOk,
        HttpClientResponse.json,
      )

     

    Retry

    const getTodo = (
      id: number
    ): Effect.Effect<unknown, HttpClientError> =>
      HttpClientRequest.get(`/todos/${id}`).pipe(
        HttpClient.fetchOk,
        HttpClientResponse.json,
        //아래코드가 추가됨
        Effect.retry(
          Schedule.exponential(1000).pipe(
            Schedule.compose(Schedule.recurs(3)),
          ),
        ),
      )

     

    Interruption

    const getTodo = (
      id: number
    ): Effect.Effect<
      unknown,
      //추가된 코드
      HttpClientError | TimeoutException
    > =>
      HttpClientRequest.get(`/todos/${id}`).pipe(
        HttpClient.fetchOk,
        HttpClientResponse.json,
        //추가된 코드
        Effect.timeout("1 second"),
        Effect.retry(
          Schedule.exponential(1000).pipe(
            Schedule.compose(Schedule.recurs(3)),
          ),
        ),
      )

     

    Observability

    const getTodo = (
      id: number
    ): Effect.Effect<
      unknown,
      HttpClientError | TimeoutException
    > =>
      HttpClientRequest.get(`/todos/${id}`).pipe(
        HttpClient.fetchOk,
        HttpClientResponse.json,
        Effect.timeout("1 second"),
        Effect.retry(
          Schedule.exponential(1000).pipe(
            Schedule.compose(Schedule.recurs(3)),
          ),
        ),
        Effect.withSpan("getTodo", { attributes: { id } }),
      )

     

     

     결론

    복잡한 프로그램일수록 점점 어려워지는 구현에 도움을 주고자 한 라이브러리로 이해하고있고 

    rxjs등 라이브러리가 있고 그 라이브러리에도 단점이있어 effect가 도움이된다는거같다.

    아직 사용해보진않았지만 공부를 해두려고 글을 남긴다