Type-safe HTML templating in Zig
Zig에서 타입 안전한 HTML 템플릿 만들기
Zig용 템플릿 라이브러리 zt는 템플릿을 빌드 중 Zig 코드로 변환해 매개변수와 필드 접근을 컴파일 타임에 검사합니다. 동적 값은 기본적으로 HTML 이스케이프하고 결과를 Writer에 직접 출력해 할당과 중간 버퍼를 피합니다.
- 주제
에디터 노트
zt의 강점은 템플릿 오류를 런타임까지 미루지 않고 Zig 컴파일 오류로 드러내는 점과, HTML 이스케이프를 기본값으로 둔 점입니다. 동적 값의 타입 검사와 URL 스킴 검사도 구체적으로 설명하지만, 저자 스스로 XSS를 모두 막지는 않는다고 선을 긋습니다. 직접 Writer에 쓰는 구조와 할당 없는 출력은 성능 요구에 맞춘 설계입니다. 다만 제어 흐름이 일반 문장과 충돌하는 문법 문제는 아직 남았고, 프로젝트도 성숙 단계가 아니라고 밝혔습니다. 따라서 현재 설명으로 확인되는 범위는 컴파일 타임 타입 검사와 일부 흔한 출력 위험을 줄이는 기본 동작입니다.
AI 요약
zt는 Go의 Templ에서 아이디어를 얻어 만든 Zig용 HTML 템플릿 라이브러리입니다. 템플릿 파일을 zig build 단계에서 Zig 코드로 변환하므로 애플리케이션 코드와 템플릿이 서로를 가져올 수 있습니다. 덕분에 템플릿 매개변수와 데이터 필드 접근을 컴파일러가 확인합니다. 존재하지 않는 필드를 쓰거나 잘못된 타입을 넘기면 템플릿 실행 전에 빌드 오류가 나고, 생성 코드의 오류 위치에는 원본 템플릿 줄 정보도 표시됩니다.
템플릿 작성과 출력
템플릿에는 HTML을 그대로 쓰고, 중괄호 안에 Zig 표현식을 넣습니다. @children으로 다른 템플릿을 감싸는 레이아웃을 만들 수 있고, if, for, switch 같은 제어 흐름도 Zig 문법으로 작성합니다. 재사용 가능한 컴포넌트를 값으로 전달하는 방식도 지원합니다. 생성 코드는 std.Io.Writer에 출력 내용을 바로 씁니다. Writer를 소켓에 연결하거나 버퍼에 쌓을 수 있으며, 라이브러리 설명에 따르면 템플릿 출력 과정에서 별도 할당이나 중간 상태를 만들지 않습니다.
동적 값은 텍스트와 HTML 속성에서 기본적으로 이스케이프합니다. href, src 같은 URL 속성은 위험한 스킴도 검사합니다. 원시 HTML을 넣으려면 {!value} 문법을 명시해야 합니다. 파서는 모든 요소의 닫는 태그도 요구합니다. 저자는 이런 기본값이 흔한 XSS 원인을 줄이지만 모든 문제를 막지는 않는다고 설명합니다.
사용 방식과 남은 선택지
예시에서는 HomePage.render(.{user}, writer)로 페이지를 출력합니다. Dusty에서 제공하는 res.render(.html, pages.HomePage, .{user}) 방식으로도 연결할 수 있습니다. 저자는 일반적인 Writer 사용 예시에서 취소 처리가 중요한 상황에 오류 처리 문제가 생길 수 있다고 덧붙이며, Dusty의 렌더 함수는 Writer 처리를 감싼다고 설명합니다.
블록 수준 제어 흐름은 현재 줄이 if, for, switch로 시작하면 Zig 코드로 해석합니다. 그래서 해당 단어로 시작하는 일반 문장은 파서 오류가 날 수 있습니다. 저자는 이를 @if, @for, @switch 문법으로 바꿀지 검토 중입니다. 프로젝트는 아직 성숙 단계가 아니며, 사용 예시로 Dusty의 htmx 기반 TODO 앱을 제시합니다.
원문: Lalinsky / 번역·요약: Trawling