Javascript

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

드리프트2 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의 발전을 기대해 봅니다.