[go] html/template 패키지의 템플릿 동기화

golang의 html/template 패키지는 웹 애플리케이션에서 템플릿을 사용할 수 있도록 해주는 중요한 패키지입니다. 이 패키지를 사용하면 서버측에서 동적인 HTML을 생성할 수 있습니다. 그런데 템플릿이 변경될 때마다 서버를 재시작해야만 하는 문제가 있습니다. 이 문제를 해결하기 위해 템플릿을 동기화하는 방법에 대해 알아보겠습니다.

템플릿 동기화

html/template 패키지의 템플릿을 동적으로 변경하기 위해서는 Filesystem 인터페이스를 구현하는 파일 시스템을 사용할 수 있습니다. 이를 통해 템플릿 파일의 변경을 감지하여 동기화할 수 있습니다.

아래는 템플릿을 동기화하기 위한 예제 코드입니다.

package main

import (
    "html/template"
    "log"
    "net/http"
    "os"
    "time"
)

func main() {
    // 템플릿 파일을 읽어들이는 함수
    readTemplate := func() (*template.Template, error) {
        return template.ParseFS(os.DirFS("templates"), "index.html")
    }

    t, err := readTemplate()
    if err != nil {
        log.Fatal(err)
    }

    go func() {
        for {
            // 템플릿 파일의 변경을 주기적으로 감지
            time.Sleep(5 * time.Second)
            newT, err := readTemplate()
            if err != nil {
                log.Println("error reloading template:", err)
            } else {
                t = newT
                log.Println("template reloaded")
            }
        }
    }()

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        t.Execute(w, nil)
    })

    log.Fatal(http.ListenAndServe(":8080", nil))
}

위 예제 코드는 주기적으로 템플릿 파일을 다시 읽어들여 서버를 재시작할 필요 없이 동기화하는 방법을 보여줍니다.

이처럼 Filesystem을 통해 템플릿 파일을 동기화하는 방법으로 실시간으로 변화하는 템플릿을 적용할 수 있습니다.

이상으로 html/template 패키지를 활용하여 템플릿 동기화하는 방법에 대해 살펴보았습니다.