더북(TheBook)

template.New() 함수는 매개변수로 전달된 이름으로 *template.Template 객체를 생성한다. 템플릿 이름은 여러 템플릿을 연결할 때 각 템플릿을 식별하기 위해 사용된다. template.Tempate.Parse() 메서드는 템플릿 문자열을 파싱해서 사용 가능한 상태로 만든다. template.Tempate.ParseFiles() 메서드는 파일의 내용을 읽어서 파싱한다. 주로 html 파일을 템플릿 파일로 사용한다. template.Template.Execute() 메서드는 두 번째 매개변수로 전달된 데이터를 템플릿 내부로 전달하여 최종 결과 텍스트를 생성한 후 첫 번째 매개변수로 전달된 io.Writer에 전달한다. 이 예제에서는 os.Stdout을 아웃풋 매개변수로, Subject 구조체의 슬라이스인 subjects를 데이터 매개변수로 전달했다.

데이터 매개변수로 전달된 값은 {{ ... }} 내부에 정의된 템플릿 액션을 통해 최종 텍스트로 변환된다. 템플릿 액션 내부에서 데이터 매개변수 값에는 점(.)을 사용해 접근한다. 데이터 매개변수가 구조체라면 {{ .필드명 }}으로 구조체 내부의 필드에 접근할 수 있다. {{range}} ... {{end}} 액션은 슬라이스의 각 아이템을 순환하며 반복할 때 사용된다. range 액션 내부에서 점(.)을 사용하면 슬라이스 내부의 현재 요소에 접근한다. {{print}} 액션은 fmt.Print() 함수와 유사하게 동작한다. 템플릿 액션으로는 range 외에도 if-else 조건으로 분기를 시키거나 메서드를 실행하는 등 다양한 기능을 사용할 수 있다.

text/template 패키지와 html/template 패키지의 동작 방식은 대부분 유사하다. 한 가지 차이점은 html/template 패키지는 코드 인젝션(code injection) 공격에 안전하다는 것이다.

템플릿에 대한 자세한 내용은 http://golang.org/pkg/text/template를 참고하기 바란다.

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