ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Deno v2가 출시되었습니다! - Deno v1.0.0부터의 변화와 현재의 실무 관행
    Javascript 2024. 10. 18. 19:20

    Deno v2가 출시되었습니다! - Deno v1.0.0부터의 변화와 현재의 실무 관행

    Deno v2가 정식으로 출시되었습니다

     

    이번 글에서는 Deno v1.0.0 출시 시점부터 Deno v2.0.0까지의 주요 변화와 실무에서의 적용 사례를 정리해 보겠습니다.

     

    Go 스타일 API의 변화 - 웹 표준 준수 강화

    Deno v1.0.0 당시의 API 설계

    Deno v1.0.0 시점의 API와 명령어들은 Go의 영향을 많이 받았습니다.


    예를 들어:

    • 다양한 리소스에 대한 IO 인터페이스 (Deno.Reader/Deno.Writer)
    • deno run 명령어 (스크립트 실행기)
    • deno fmt 명령어 (포매터)
    • deno doc 명령어 (API 문서화 도구)
    • deno test 명령어 (테스트 실행기)

    Deno는 초기부터 웹 표준 준수를 중요하게 생각했지만, 웹 표준으로 커버할 수 없는 부분은 Go를 참고한 경우가 많았습니다.

     

    이는 초기 Deno가 Go로 구현된 것과도 관련이 있을 것입니다.

     

    웹 표준 준수 강화

    Deno v1.0.0 이후, 웹 표준 준수를 더욱 강화하려는 움직임이 있었습니다.


    예를 들어, Deno에서 파일을 나타내는 객체인 Deno.FsFile은 현재 웹 스트림 API를 기반으로 설계되었습니다:

    import { CsvParseStream } from "@std/csv/parse-stream";
    
    {
      using f = await Deno.open("test.csv");
      const stream = f.readable
        .pipeThrough(new TextDecoderStream())
        .pipeThrough(
          new CsvParseStream({
            columns: ["id", "name", "age"],
            skipFirstRow: true,
          }),
        );
      for await (const row of stream) {
        console.info(row);
      }
    }

     

    Deno의 표준 라이브러리인 deno_std에서도 이러한 변화가 나타나며, 현재 다양한 기능이 웹 스트림 API를 기반으로 제공됩니다.

     

    예를 들어:

    • CsvParseStream (std/csv)
    • JsonParseStream (std/json)
    • UntarStream (std/tar)

     

    Deno.Reader/Deno.Writer의 폐지

    Deno v2에서는 Deno.Reader, Deno.Writer, Deno.Closer 등의 타입이 폐지되었습니다.

     

    하지만 Deno.TcpConn이나 Deno.FsFile 같은 객체에서는 여전히 read()write() 메서드를 구현하고 있습니다.

     

    현재는 std/io/types.ts에서 Reader나 Writer 인터페이스를 제공합니다.

     

    설정 파일 도입 (deno.json)

    Deno는 초기부터 설정 파일 없이도 사용할 수 있는 특징이 있었지만, Deno v1.0.0 이후 deno.json 설정 파일이 도입되었습니다.

     

    이 파일은 JSONC 형식을 지원하며, TypeScript의 compilerOptions 설정, deno fmt와 deno lint 명령어 조정 등을 포함할 수 있습니다.

    // deno.json
    {
      "compilerOptions": {
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true
      }
    }
    
    // deno.jsonc
    {
      "lint": {
        "rules": {
          "include": [
            "no-console"
          ]
        }
      }
    }
    의존성 관리

    Deno v1.0.0에서는 다양한 방법으로 의존성을 관리했으나, Deno v2에서는 본체에 패키지 관리자가 통합되었습니다.

     

    Import maps를 deno.json에 정의하여 의존성을 관리할 수 있습니다.

    // deno.json
    {
      "imports": {
        "@std/csv": "jsr:@std/csv@^1"
      }
    }

     

    JSR 패키지와 npm 패키지 모두 관리할 수 있으며, deno add, deno install, deno remove 명령어를 통해 패키지를 추가, 설치, 제거할 수 있습니다.

    Node.js 호환성

    Deno v2에서는 Node.js와의 호환성이 강화되었습니다.

     

    npm 패키지를 직접 사용할 수 있으며, node: 접두사를 통해 Node.js의 내장 모듈을 불러올 수 있습니다.

    import { EventEmitter } from "node:events";
    const emitter = new EventEmitter();

     

    또한, package.json을 지원하여 npm 패키지를 설치하고 사용할 수 있습니다.

     

    타입 체크

    Deno v2에서는 deno run 명령어가 기본적으로 타입 체크를 수행하지 않습니다.

     

    대신, deno check 명령어가 도입되어 타입 체크를 수행할 수 있습니다.

    $ deno check mod.ts
    테스트

    Deno v2에서는 deno test --doc 명령어를 통해 JSDoc 주석이나 Markdown 파일의 코드 스니펫을 실행할 수 있습니다.

     

    또한, BDD 형식의 테스트 작성이 가능합니다.

    import { describe, it } from "jsr:@std/testing@1/bdd";
    import { expect } from "jsr:@std/expect@1";
    import { sum } from "./sum.js";
    
    describe("sum", () => {
      it("should return sum of given numbers", () => {
        expect(sum(2, 3, 4)).toBe(9);
      });
    
      it("should return 0 if no arguments are given", () => {
        expect(sum()).toBe(0);
      });
    });
    기타 기능

    Deno v2에서는 로컬 저장소, FFI, WebGPU API, Jupyter와의 통합 등 다양한 기능이 추가되었습니다.

     

    특히, WebGPU API를 활용한 고성능 렌더링 기능이 주목받고 있습니다.

     

    결론

    Deno v1의 출시부터 Deno v2까지 약 4년 반이 지났으며, 많은 변화와 개선이 있었습니다.

     

    특히 웹 표준 준수와 Node.js 호환성 강화, 의존성 관리 도구의 도입 등이 주요 변화로 꼽힙니다.

     

    앞으로도 Deno의 발전을 기대해 봅니다.

     


     

Designed by Tistory.