DENO

RINM·2024년 2월 19일

Introduction

Deno는 노드 개발자가 만든 js/ts runtime이다. 노드와 비슷하다고 하는데 아래 무료 강의를 통해 체험해보기로 했다.

[Inflearn] 따라하며 배우는 데노(DENO) - 기본 강의

Deno는 Node.js의 단점을 보완한 만큼 차이점이 꽤 많다. 모듈을 사용할 때 npm을 활용하여 설치하는 대신, Deno에서는 url로 모듈을 import할 수 있다. 즉, 별도의 패키지 매니저를 사용하지 않는다.
파일 접근 통제 관련 보안성도 강화되었는데, 이제 파일시스템에 접근할 때 permission을 지정해줄수 있다. Deno의 runtime에서 실제 시스템에 영향을 미치지 않을 수 있게 하는 것이다.

Deno는 타입스크립트를 기반으로 만들어졌기 때문에 타입스크립트가 내장되어 있다. Deno에서는 types를 별로도 다운 받거나 컴파일 환경을 따로 설정해 줄 필요가 없는 것이다.

브라우저 내장 함수를 직접 지원한다. 예를 들어 fetch의 경우 node 환경에서 사용하려면 node-fetch 모듈을 다운받아 사용해야하지만, Deno에서는 그럴 필요 없이 바로 fetch를 사용할 수 있다. 이외에 다양한 함수를 지원한다. 모듈을 사용할 때도 브라우저 문법처럼 require 대신 import를 사용한다. (ES Modules) node 계열 풀스택을 해본 입장에서 가장 환영하는 대목이다. 드디어 통일되다니.

Install

Deno 홈페이지에서 Install now를 누르면 설치 방법을 볼 수 있다.

Windows 환경에서는 저렇게 설치하라는데 irm - iex를 처음 봐서 좀 찾아봤다.

Wow... sciprt 다운로드 -> 실행 명령어라고 한다. 침해사고대응에서 배웠던 기억은 없지만 어딘가 위험한 친구로 느껴진다. powershell에서 도입한 다운로드 후 실행 파이프라인이다. 아래 powershell github 참조.

Make it easier to download and execute scripts as a single operation, by enhancing Invoke-Command #8816

잠시 다른 길로 샜지만 다시 돌아와서 powershell로 Deno를 설치해준다.

Standard Library

Deno에서 직접 관리하는 스탠다드 라이브러리 목록이다.

여기에서 사용법과 기타 정보를 볼 수 있다. Std 라이브러리를 사용해서 간단한 web을 만들어보자. VScode의 Deno 확장프로그램을 설치해준다.

간단하게 로그를 찍는 코드를 작성해준 후 deno로 실행한다.

deno tun [파일이름]

이제 deno가 잘 실행되는 것도 확인했으니 datetime 라이브러리를 사용해보자. datetime의 deno 공식 문서에 따르면 아래와 같이 import해서 사용할 수 있다.

import * as mod from "https://deno.land/std@0.216.0/datetime/mod.ts";

dayOfYear 함수를 사용해보자. 이 함수는 주어진 날짜가 그 해의 몇 번째 날인지 반환한다.

Create & Read file

Deno를 사용하여 파일시스템에 접근해보자. Deno.writeFile 함수를 사용하면 된다. Deno는 모두 Promise를 반환한다. 여기서 특징이 Deno는 top level await을 제공하기 때문에 Deno 함수를 호출하기 위하여 별도의 async 함수를 만들지 않고도 바로 await으로 결과를 받아올 수 있다.

const encoder = new TextEncoder()
const helloText = encoder.encode("Hello, Deno!")

await Deno.writeFile("hello.txt",helloText)

TextEncoder를 사용하여 문자열을 만들어주고, 이것을 hello.txt에 담는 코드이다. 여기서 주의할 점은 Deno는 기본적으로 FS에 접근하는 것을 막기 때문에 실행 시 FS에 접근할 수 있도록 flag를 주어야한다는 것이다.

deno run --allow-write createFile.ts

flag를 주지 않으면 권한이 없기 때문에 실행이 거부된다.
이제 생성한 파일을 Deno에서 읽어보자. 강의에서는 Deno.copy를 사용하지만 Deno 2버전부터는 std의 io로 copy를 사용한다.

import {copy} from 'std/io/copy.ts'

const file = await Deno.open("hello.txt")
await copy(file,Deno.stdout)
file.close()

마찬가지로 이번에는 파일을읽을 수 있게 allow-read flag를 주어서 실행시켜야한다.

deno.json

package.json 파일과 유사하게 deno를 설정하는 파일이다. 앞서 사용한 Std 라이브러리의 경우 자주 쓰이기 때문에 imports에 등록하여 std alias를 사용할 수 있다.

{
  "imports": {
    "std/": "https://deno.land/std@0.216.0/"
  },
  "tasks": {
    "dev": "deno run --watch main.ts"
  }
}

tasks의 경우 package.json의 scripts와 비슷한 필드이다. 위와 같이 작성하면 deno task start로 app을 실행할 수 있다. 그 밖에도 많은 설정이 있다.

Web Server

Quick start에 나온대로 웹서버를 만들어보자. Deno 내장 함수 중에 serve()를 사용한다.

Deno.serve((_request: Request) => {
    return new Response("Hello, Deno!");
});

allow-net flag를 주어서 실행시킨다.

deno run --allow-net server.ts

기본 포트는 8000번이다. localhost:8000으로 접속하면 다음과 같이 return 값이 잘 찍힌다.

Serve는 Deno Runtime API 중 HTTP Server API에 해당하는 함수이다.

0개의 댓글