본문 바로가기

Language/Go

[Go] - web programming : 템플릿과 템플릿 엔진

템플릿

- 템플릿 엔진이 생성하는 미리 만들어진 HTML 페이지로 프로그램에서 반복적으로 사용된다.

 

템플릿 엔진

- 데이터와 템플릿을 합쳐 궁극적으로 HTML을 만들어 낸다.

- 핸들러는 템플릿 엔진을 호출하여 데이터와 템플릿을 합쳐 클라이언트에 HTML 결과를 반환한다.

- 템플릿 엔진은 크게 두가지 유형이 있다.

 

  1. 로직 최소화 템플릿 엔진(Logic-less template engines)

- 동적 데이터는 템플릿에 전달 돼 명시화된 placeholders에 실제 데이터가 대체된다.

- 어떠한 로직 처리를 진행하지 않고 오로지 문자열만 대체하여 로직은 핸들러에서만 처리한다.

 

  2. 내장 로직 템플릿 엔진(Embedded logic template engines)

- 템플릿 내부에 프로그래밍 언어 코드를 삽입하여 템플릿 엔진에 의해 실행될 수 있다.

 

- Go 템플릿 엔진은 html/template, text/template에 있는 기본 라이브러리가 있다.

 

 

Go 템플릿 엔진

- Go 템플릿 엔진은 핸들러에 의해 호출이 된다.

- 핸들러는 템플릿 엔진을 호출하고, 템플릿에 데이터를 전달해 동적인 템플릿 파일 리스트를 생성한다.

- HTML을 생성하거나 쓰기 작업을 ResponseWriter를 통해 수행하며 클라이언트에 응답을 주기도 한다.

 

Go template 엔진 작동과정

- 행동(Action)을 추가하기 위해서는 특정 행동을 {{  }}와 같이 이중 중괄호로 감싼다.

 

example

- index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Go Web Programming</title>
</head>
<body>
    {{.}}
</body>
</html>

- main.go

package main

import (
	"html/template"
	"net/http"
)

func process(w http.ResponseWriter, r *http.Request) {
	t, _ := template.ParseFiles("index.html")
	t.Execute(w, "Hello world!")
}

func main() {
	server := http.Server{
		Addr : "127.0.0.1:8080",
	}
	http.HandleFunc("/process", process)
	server.ListenAndServe()
}

 

1. 텍스프 포맷 템플릿 소스(index.html)를 해석하고 템플릿 구조를 생성한다. 

2. 템플릿 엔진은 데이터와 템플릿을 결합해 HTML을 생성하고 생성결과를 ResponseWriter에 전달합니다.

 

 

템플릿 파싱

 

-  파싱관련함수

 

template.ParseFiles("index.html")  - 템플릿 파싱 여려개의 인자를 받아 중첩 템플릿 형태를 만들 수 있다.

template.ParseGlob("*.html")  - 패턴 매칭을 이용한 템플릿 파싱

template.Parse(data) - string의 템플릿을 파싱

template.Must - Must is a helper that wraps a call to a function returning (*Template, error) and panics if the error is non-nil. It is intended for use in variable initializations (에러가 nil이 아닐 때 발생할경우를 처리할 때 사용)

 

 

템플릿 실행

 

t, _ := template.ParseFiles("index.html")
t.Execute(w, "Hello World!")
t, _ := template.ParseFiles("t1.html", "t2.html") // 2개의 템플릿을 취함
t.Execute(w, "Hello world!")  // parse한 맨 앞의 html인 t1.html이 실행
t.ExecuteTemplate(w, "t2.html", "Hello world!")  // t2.html이 실행되길 원할 때 사용