Deno에 서버를 구축하는 방법 2021년 11월 버전

Deno에서 서버를 만드는 방법은 이전과 다릅니다.본고는 Deno1.16/std0.14 환경에서의 기법에 대해 해설하고자 한다.
https://zenn.dev/kawarimidoll/articles/0d384d53953525

문장을 집필할 때의 결론: std/http의 서버


일단 결론부터.현재 std/httpserve를 사용하는 방법을 추천합니다.
https://deno.land/[email protected]/http
0.14.0시 std/http의 README에는 추가 설명이 없지만 JSDc와 Deno1.16의 발표문에는 이serve 방법을 사용했고 최근까지 추천한listenAndServe 방법은 추천하지 않았다.
견본을 만들어 보았다.serve의 첫 번째 파라미터는Handler: (request: Request, connInfo: ConnInfo) => Response | Promise<Response>이고 두 번째 파라미터는ServeInit: { addr?: string; signal?: AbortSignal; }이다.
server.ts
import { serve } from "https://deno.land/[email protected]/http/server.ts";

const addr = ":8080";
console.log(`HTTP server listening on http://localhost${addr}`)

serve((request: Request) => {
  const { pathname } = new URL(request.url);

  return new Response(`Hello world from ${pathname}`);
}, { addr });
addr는 숫자가 아니라 문자열이다. host:port 형식으로 지정할 수 있기 때문에 본 예에서 보듯이 첫 번째 테이프:port 부분만 설정할 수 있다.기본값은 "0.0.0.0:8000"입니다.
https://doc.deno.land/에서 최신 API 문서를 볼 수 있습니다.
https://doc.deno.land/https/deno.land%2Fstd%400.114.0%2Fhttp%2Fserver.ts
이 형태로 만들어진 서버 파일을 Deno Deploy로 올리려 했지만 문제 없이 작업했다.
https://cloudy-owl-71.deno.dev/
https://github.com/kawarimidoll/deno-dev-template/commit/20bd0e91bf6474c3c67357fd73fc764d4b83a719

Deno 서버 이력


처음 추가된 트윗처럼 Deno에 서버를 만드는 여러 방법을 제시했다.
다음은 그런 것들을 대충 정리하고 싶습니다.

std/http의 서버 이전 버전


애초에 사용했던 물건이다.
본 글에서 소개한 std0.14.0의serve와 동명이지만 다른 물건으로 현재server_legacy에 있습니다.
server_legacy.ts
import { serve } from "https://deno.land/std/http/server_legacy.ts";

const body = "Hello World\n";
const server = serve({ port: 8000 });
for await (const req of server) {
  req.respond({ body });
}
당초server_legacy.ts에서 읽지 않았기 때문에 지정된 버전이 없는 코드는 현재server.ts와 다를 것이 없다.
얼마 전 쓴 디노의 소개 글에는 대부분 이를 사용했다며 "보도된 샘플과 가져온 소스의 파일 이름과 방법명은 똑같은데 매개 변수와 사용법이 완전히 달라 움직일 수 없는..."라는 매우 번거로운 상태가 담겼다.
이것이 화근이 될 수 있기 때문에, 나는 이번 보도를 썼다.

addEventListener


Deno Deploy Beta 1시대에 사용된 수법이다.
beta1_server.ts
addEventListener("fetch", (event) => {
  event.respondWith(new Response("Hello world"));
});
https://deno.com/blog/deploy-beta1/
최근 Deno Deploy는 일반적인 CLI의 Deno 서버와는 전혀 다르게 쓰여졌습니다.

Deno Native HTTP


상기 구serve의 서버 성능이 좋지 않기 때문에 Deno 자체가 HTTP 서버 기능에 편입되었다.
Deno1.9로 가져오고 1.13 안정화.
https://zenn.dev/magurotuna/articles/deno-release-note-1-13-0#1.- 로컬 -http-서버 안정화
native_server.ts
for await (const conn of Deno.listen({ port: 8080 })) {
  (async () => {
    for await (const { respondWith } of Deno.serveHttp(conn)) {
      respondWith(new Response("Hello World"));
    }
  })();
}
디노 1.13 발표 때https://deno.land 서버도 활용되며 실적을 쌓았다.
그리고 이 기법은 Deno Deploy에서도 사용할 수 있으며 CLI와 같은 기술로 서버를 쓸 수 있다.
https://zenn.dev/kawarimidoll/articles/38d5c3d82e6882#cli같은 http 서버가 추가되었습니다.
Deno Deploy Beta2의 발표 기사에도 이런 표기법이 사용됐다(위의std/http.
https://deno.com/blog/deploy-beta2/
이 1.13시에는 디노의 서버가 현지인 서버로 통일돼 폐지될 것으로 예상된다addEventListener.

std/http listenAndServe


Deno의 로컬 HTTP 업데이트는 삭제std/http로 여겨졌지만, Deno 1.14와 병행하여 발표된 std0.17은 로컬 HTTPstd/http를 사용하는 것이 추가되어 삭제는커녕 추천 방법으로 되돌아왔다.
https://zenn.dev/magurotuna/articles/deno-release-note-1-14-0#12.-std%2 Fhttp - 모듈 고속화
로컬 HTTPlistenAndServe의 결과listen에 둘러싸여 실행된 처리 프로그램에도 포함for await...구조가 좀 복잡하지만 for await랩으로 이 일대를 감싸 고성능을 얻으면서 서버는 좀 더 간단하게 기술할 수 있었다.
beta3_server.ts
import { listenAndServe } from "https://deno.land/[email protected]/http/server.ts";

listenAndServe(":8000", () => new Response("Hello World\n"));
디노 1.16 보름 전 디노 디플로이 베타3 발표 기사에는 이쪽 기법이 사용됐다.
https://deno.com/blog/deploy-beta3/

std/http 서버 현행판


시간은 현대다.
최신 방법은 본고에서 소개한 listenAndServe의 새로운 방법std/http이다.
데노 1.16의 발표문에서 serve 방법의 업데이트와 소개에 관한 부분에서 이 기법은 빈번하게 사용되었다.
https://deno.com/blog/v1.16

날과 씨


이 방법은 다음 PR에서 제안되었다.
https://github.com/denoland/deno_std/pull/1478
import { serve } from "https://deno.land/std/http/server.ts";
serve((req) => new Response("Hello world"));
🐯 "Deno Deploy가 사용한 샘플을 깨끗하게 하고 싶다는 이름 자체가 없어요."
거기서 토론이 있었고 아래의 PR은 채용이 이루어졌고fetchlistenAndServe가 되었다.
https://github.com/denoland/deno_std/pull/1506

끝말


지금까지 Deno 서버의 쓰기 방법과 기록입니다.
std가 아직 0이 안 됐어요.x이고 디노 디플로이도 베타이기 때문에 추천하는 방법은 암암 암 변화다.
이 때문에 중도에도 썼지만'범본과 기술이 같아도 움직이지 못하는 경우'가 발생할 수 있다.
공식 최신판 이외의 자료를 참고할 때 제작일과 갱신일을 확인하고 주의해서 사용하시기 바랍니다.
뭐, 이 글을 쓸 때 Deno Deploy 첫 페이지에 실린 샘플 스크립트도 업데이트되지 않았는데...
이 기사가 공식 보도보다 더 멀리 간 셈이다.

https://deno.com/deploy/

좋은 웹페이지 즐겨찾기