Trawling

Janet의 HTTPF, 함수 메타데이터로 웹 라우트를 등록

Nick F가 Janet의 HTTPF로 웹 서버를 구성한 개인 사용기를 공개했습니다. HTTPF는 함수의 경로 메타데이터를 읽어 라우트를 만들고, 요청과 POST 데이터를 핸들러에 전달해 HTML·JSON 응답을 처리합니다. Nick F는 직접 사용한 범위에서 동적 경로, 응답 헤더 설정, 정적 파일 제공이 제약이라고 설명했습니다.

Nick F는 2026년 11월 4일 개인 블로그에 Janet의 HTTPF로 간단한 웹 서버를 만드는 과정을 게시했습니다. Janet의 확장 라이브러리 Spork에 포함된 HTTPF는 HTML, JDN, JSON 서버를 위한 간단한 웹 프레임워크입니다. Janet 공식 문서는 함수 메타데이터를 읽어 서버와 라우트를 구성하는 방식을 설명합니다.

사용 흐름은 서버 객체를 만든 뒤 요청을 처리할 함수를 정의하고, 그 함수를 라우터에 등록하는 순서입니다. Nick F의 예제에서는 핸들러 함수에 :path 메타데이터로 경로를 지정합니다. add-bindings-as-routes는 범위 안에서 :path 메타데이터가 있는 함수를 찾아 라우트로 등록합니다. 공식 문서에 따르면 이 과정은 경로뿐 아니라 스키마와 문서 설명용 메타데이터도 읽습니다. 마지막으로 listen이 지정한 호스트와 포트에서 요청을 받습니다.

HTTPF는 핸들러에 요청 객체와 POST 데이터를 전달합니다. 요청 객체에는 쿼리를 포함한 전체 경로와 쿼리를 뺀 라우트 경로가 별도 필드로 들어갑니다. 쿼리 매개변수는 Janet 테이블로 파싱되며, 요청 메서드와 파싱 전 원시 본문도 객체에 담깁니다. POST 데이터를 보내지 않으면 두 번째 인자는 nil입니다. Nick F의 폼 전송 예제에서는 one=two가 Janet 테이블로 전달됩니다.

응답의 MIME 형식은 함수 메타데이터의 :render-mime으로 정합니다. Nick F의 HTML 예제는 hiccup 방식의 중첩 자료를 반환하고 Spork의 htmlgen이 이를 HTML로 렌더링합니다. htmlgen에서는 튜플의 첫 값이 HTML 태그 이름이며, 두 번째 값에 속성 딕셔너리를 둘 수 있고 나머지는 자식 요소가 됩니다. JSON 응답을 지정하면 기본 Janet 자료 구조를 JSON으로 변환할 수 있다고 Nick F는 설명합니다. 응답 상태 코드는 핸들러 안에서 setdyn으로 설정하며, 예제는 201 상태와 HTML 본문을 반환합니다.

Nick F는 직접 사용한 범위에서 동적 경로, 응답 헤더 설정, 정적 파일 제공을 주요 제약으로 꼽았습니다. 예를 들어 /posts/123에서 123을 경로 변수로 받는 라우트 대신 /posts?id=123처럼 쿼리 매개변수로 처리해야 한다고 썼습니다. 응답 헤더를 설정할 수 없어 쿠키를 이용한 로그인 기능에도 제약이 있다고 설명했습니다. 정적 파일은 파일을 반환하는 라우트를 직접 만들거나 앞단에 다른 서버를 두어 제공하는 방법을 들었습니다.

참고 자료

오류 제보