서론
Go 언어에서 html/template 패키지를 사용하면 HTML 문서 내에서 Go 템플릿 문법을 활용하여 Go와 상호작용하며 동적 페이지를 구성할 수 있다. Go 템플릿에는 조건문, 반복문 및 Go 함수 호출을 사용하여 JSP, PHP, ASP와 같은 서버 사이드 스크립트 언어처럼 사용할 수 있다. 이 글에서는 간단한 HTTP 서버에서 html/template 패키지를 활용하여 동적 웹 페이지를 서비스하는 방법을 소개한다.
Go 변수를 HTML에 출력하기
Go 코드
package main
import (
"html/template"
"log"
"net/http"
)
var totalCnt int
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func handler(w http.ResponseWriter, r *http.Request) {
tmpl, err := template.ParseFiles("index.html")
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
return
}
totalCnt++
_ = tmpl.Execute(w, totalCnt)
}
HTML 코드
<!DOCTYPE html>
<html>
<head>
<title>Jae-Sung</title>
</head>
<body>
<h1>Jae-Sung</h1>
<p>방문해주셔서 감사합니다.</p>
<p>방문자 수: {{.}}</p>
</body>
</html>
Go로 구현한 간단한 웹 서버에서 방문자 수를 출력하는 방법을 보여준다. Go 템플릿을 사용하여 페이지에 방문할 때마다 totalCnt 변수가 1씩 증가하는 것을 HTML에 출력한다. 실행해보면 새로고침을 할 때 마다 숫자가 증가하는 것을 볼 수 있다.
Go 구조체 또는 맵을 HTML에 출력하기
Go 코드
type PageData struct {
Info map[string]interface{}
TotalCnt int
}
totalCnt++
_ = tmpl.Execute(w, PageData{
Info: map[string]interface{}{
"Title": "Jae-Sung",
"Desc": "방문해주셔서 감사합니다.",
},
TotalCnt: totalCnt,
})
HTML 코드
<body>
<h1>{{.Info.Title}}</h1>
<p>{{.Info.Desc}}</p>
<p>방문자 수: {{.TotalCnt}}</p>
</body>
예제와 같이 구조체나 맵을 사용해서 변수명 또는 키 값을 명시하면 여러 변수들을 HTML에서 사용할 수 있다.
HTML에서 조건문 사용
HTML 코드
{{if eq .TotalCnt 10}}
<p>두근두근! 10번째 방문자입니다.</p>
{{else if eq .TotalCnt 100}}
<p>짝짝짝짝! 100번째 방문자입니다.</p>
{{else}}
<p>{{.TotalCnt}}번째 방문자입니다.</p>
{{end}}
Go 템플릿을 활용하면 HTML에서 조건문을 사용해서 상황에 따라서 출력을 변경할 수 있다.
HTML에서 반복문 사용
Go 코드
type PageData struct {
Info map[string]interface{}
Required string
TODO []string
}
_ = tmpl.Execute(w, PageData{
Info: map[string]interface{}{
"Title": "Jae-Sung",
"Desc": "TODO List",
},
Required: "햄버거 먹기",
TODO: []string{"누워있기", "햄버거 먹기", "카페 가기", "잠자기"},
})
HTML 코드
<body>
{{range $key, $value := .Info}}
<p><b>{{$key}}</b>: {{$value}}</p>
{{end}}
<ul>
{{range .TODO}}
<li>
<!-- 루프 밖의 Required 변수와 비교 -->
{{if eq . $.Required}}
<b>{{.}}</b>
{{else}}
{{.}}
{{end}}
</li>
{{else}}
<li>할 일이 없습니다.</li>
{{end}}
</ul>
</body>
Go 템플릿에서는 range를 사용해 슬라이스나 맵을 순회할 수 있다. 반복문 안에서 특정 변수를 사용하려면 해당 변수의 범위를 명확히 해야 하는데, 이때 $. 구문을 사용하여 반복문 밖에서 정의된 변수를 참조할 수 있다. 예를 들어 예제에서 TODO 리스트를 순회하는 반복문 내에서 $.Required 사용할 때 $. 구문으로 외부 변수를 참조하고 있음을 명시했다.
'Language > Go' 카테고리의 다른 글
[golang] iota 키워드로 열거형 상수 정의 (4) | 2024.11.10 |
---|---|
[golang] sync.WaitGroup으로 고루틴 작업 기다리기 (0) | 2024.11.09 |
[golang] json.Marshal에서 HTML 이스케이프 문제 (3) | 2024.10.31 |
[golang] reflect 패키지를 사용한 외부 패키지의 private 필드 접근하기 (0) | 2024.10.30 |
[golang] cgo에서 Go와 C 언어 간의 버퍼 전달 (2) | 2024.10.29 |