[golang] html/template 패키지로 동적 페이지 처리하기

2024. 11. 7. 18:17·Language/Go

서론

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
'Language/Go' 카테고리의 다른 글
  • [golang] iota 키워드로 열거형 상수 정의
  • [golang] sync.WaitGroup으로 고루틴 작업 기다리기
  • [golang] json.Marshal에서 HTML 이스케이프 문제
  • [golang] reflect 패키지를 사용한 외부 패키지의 private 필드 접근하기
在晟
在晟
  • 在晟
    Jae-Sung
    在晟
  • 전체
    오늘
    어제
    • 분류 전체보기 (25)
      • Language (23)
        • Go (23)
      • DBMS (1)
        • MariaDB (1)
      • Notes (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Jae-Sung
    • GitHub
  • 인기 글

  • 태그

    fasthttp
    filepath
    go
    interface{}
    Runtime
    오블완
    recover
    unsafe
    티스토리챌린지
    http
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
在晟
[golang] html/template 패키지로 동적 페이지 처리하기
상단으로

티스토리툴바