더북(TheBook)

RenderTemplate 메서드 추가

서버 프로그래밍 언어 대부분은 HTML 코드에 가변 데이터를 바인딩해서 동적 HTML 코드를 렌더링하는 기능을 제공한다. 대표적으로 JSP, ASP, PHP가 그렇다. Go에서도 html/template 패키지를 사용하면 HTML 코드에 데이터를 바인딩하여 동적 HTML 코드를 생성할 수 있다.

가변 데이터를 {{ ... }} 내부에 정의하여 템플릿을 만든 후 실제 데이터 값을 템플릿에 주입해서 최종 HTML을 생성하는 방식이다. JSP나 PHP에서 <%= ... =%> 또는 <?php ... ?>로 동적 데이터를 바인딩하는 것과 유사하다.

예를 들어 다음과 같이 템플릿을 만들었다고 해보자.

Hello {{ .name }}!

HTML을 렌더링할 때 {{ .name }}을 실제 name 변수 값으로 치환한다.

핸들러 함수에서 처리된 데이터를 HTML 문서로 전달하여 출력하려면 정적 HTML 파일이 아니라 템플릿 형태로 렌더링해야 한다. 이번에는 템플릿을 렌더링하는 RenderTemplate 메서드를 추가해 보자.

▼ context.go

// templates: 템플릿 객체를 보관하기 위한 map
var templates = map[string]*template.Template{}
 
func (c *Context) RenderTemplate(path string, v interface{}) {
    // path에 해당하는 템플릿이 있는지 확인
    t, ok := templates[path]
    if !ok {
        // path에 해당하는 템플릿이 없으면 템플릿 객체 생성
        t = template.Must(template.ParseFiles(filepath.Join(".", path)))
        templates[path] = t
    }
       
    // v 값을 템플릿 내부로 전달하여 만들어진 최종 결과를 c.ResponseWriter에 출력
    t.Execute(c.ResponseWriter, v)
}

main.go 파일의 핸들러 함수 내부에서 템플릿을 렌더링하게 해보자. / 경로로 요청이 들어왔을 때 public/index.html의 내용을 보여주되, 현재 시간을 템플릿으로 전달해서 현재 시간도 함께 표시한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.