

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Go의 템플릿 지정 언어 사용
<a name="v10-alerting-notifications-go-templating"></a>

****  
이 설명서 주제는 **Grafana 버전 10.x**를 지원하는 Grafana 워크스페이스를 위해 설계되었습니다.  
Grafana 버전 9.x를 지원하는 Grafana 워크스페이스의 경우 [Grafana 버전 9에서 작업](using-grafana-v9.md) 섹션을 참조하세요.  
Grafana 버전 8.x를 지원하는 Grafana 워크스페이스의 경우 [Grafana 버전 8에서 작업](using-grafana-v8.md) 섹션을 참조하세요.

알림 템플릿을 Go의 템플릿 지정 언어인 [text/template](https://pkg.go.dev/text/template)으로 작성합니다.

이 섹션에서는 Go의 템플릿 지정 언어에 대한 개요와 text/template에서 템플릿을 작성하는 방법을 제공합니다.

## 점
<a name="v10-go-dot"></a>

text/template에는 점(dot)이라는 특수 커서가 있습니다(`.`로 씀). 이 커서는 사용되는 템플릿의 위치에 따라 값이 변경되는 변수로 간주할 수 있습니다. 예를 들어 알림 템플릿의 시작 부분에서 `.`은 `ExtendedData` 객체를 참조합니다. 여기에서는 `Alerts`, `Status`, `GroupLabels`, `CommonLabels`, `CommonAnnotations`, `ExternalURL`을 포함하여 여러 필드를 포함합니다. 그러나 점은 목록의 `range`에서 사용할 때, `with`에서 사용할 때 또는 다른 템플릿에서 사용할 기능 템플릿을 작성할 때 다른 항목을 참조할 수 있습니다. [알림 템플릿 생성](v10-alerting-create-templates.md)에서 이에 대한 예제를 확인할 수 있으며, [템플릿 참조](v10-alerting-template-reference.md)에서 모든 데이터 및 함수를 확인할 수 있습니다.

## 여는 태그 및 닫는 태그
<a name="v10-go-openclosetags"></a>

text/template에서 템플릿은 템플릿이 변수를 인쇄하는지 여부와 if 문과 같이 제어 구조를 실행하는지 여부에 관계없이 `{{`로 시작하고 `}}`로 끝납니다. Jinja(변수를 인쇄할 때 `{{` 및 `}}`를 사용하고 제어 구조에서 `{%` 및 `%}`를 사용함)와 같은 다른 템플릿 지정 언어와는 다릅니다.

## 인쇄
<a name="v10-go-print"></a>

무언가의 값을 인쇄하려면 `{{` 및 `}}`를 사용합니다. 점 값, 점 필드, 함수 결과 및 [변수](#v10-go-variables) 값을 인쇄할 수 있습니다. 예를 들어 점이 `ExtendedData`를 참조하는 `Alerts` 필드를 인쇄하려면 다음과 같이 작성합니다.

```
{{ .Alerts }}
```

## 알림에 대한 반복
<a name="v10-go-iterate-alerts"></a>

알림에 대한 모든 정보가 아닌 각 알림의 레이블만 인쇄하려면 `range`를 사용하여 `ExtendedData`에서 알림을 반복할 수 있습니다.

```
{{ range .Alerts }}
{{ .Labels }}
{{ end }}
```

범위 내에서 점은 더 이상 `ExtendedData`를 참조하지 않고 `Alert`를 참조합니다. `{{ .Labels }}`를 사용하여 각 알림의 레이블을 인쇄할 수 있습니다. `{{ range .Alerts }}`에서 알림 목록의 현재 알림을 참조하도록 점을 변경하기 때문에 이러한 방식이 작동합니다. 범위가 완성되면 범위가 시작되기 전에 사용했던 값으로 점이 재설정됩니다(이 예제에서 `ExtendedData`).

```
{{ range .Alerts }}
{{ .Labels }}
{{ end }}
{{/* does not work, .Labels does not exist here */}}
{{ .Labels }}
{{/* works, cursor was reset */}}
{{ .Status }}
```

## 주석 및 레이블에 대한 반복
<a name="v10-go-iterate-labels"></a>

`The name of the label is $name, and the value is $value` 형식으로 각 알림의 레이블을 인쇄하도록 템플릿을 작성합니다. 여기서 `$name` 및 `$value`에는 각 레이블의 이름 및 값이 포함됩니다.

이전 예제와 마찬가지로 점을 사용하여 `.Alerts`에서 알림에 대해 반복합니다. 이때 점은 알림 목록에서 현재 알림을 참조합니다. 그리고 정렬된 레이블에서 두 번째 범위를 사용합니다. 이때 두 번째로 현재 레이블을 참조할 때 점이 업데이트됩니다. 두 번째 범위 내에서 `.Name` 및 `.Value`를 사용하여 각 레이블의 이름 및 값을 인쇄합니다.

```
{{ range .Alerts }}
{{ range .Labels.SortedPairs }}
The name of the label is {{ .Name }}, and the value is {{ .Value }}
{{ end }}
{{ range .Annotations.SortedPairs }}
The name of the annotation is {{ .Name }}, and the value is {{ .Value }}
{{ end }}
{{ end }}
```

## index 함수
<a name="v10-go-index"></a>

특정 주석 또는 레이블을 인쇄하려면 `index` 함수를 사용합니다.

```
{{ range .Alerts }}
The name of the alert is {{ index .Labels "alertname" }}
{{ end }}
```

## If 문
<a name="v10-go-if"></a>

템플릿에서 if 문을 사용할 수 있습니다. 예를 들어 `.Alerts`에 알림이 없는 경우 `There are no alerts`를 인쇄하려면 다음을 작성합니다.

```
{{ if .Alerts }}
There are alerts
{{ else }}
There are no alerts
{{ end }}
```

## With
<a name="v10-go-with"></a>

With는 if 문과 유사하지만, if 문과 달리 `with`에서는 with에서의 값을 참조하기 위해 점을 업데이트합니다.

```
{{ with .Alerts }}
There are {{ len . }} alert(s)
{{ else }}
There are no alerts
{{ end }}
```

## 변수
<a name="v10-go-variables"></a>

text/template의 변수는 템플릿 내에서 생성해야 합니다. 예를 들어 점의 현재 값을 사용해 `$variable` 변수를 생성하려면 다음을 작성합니다.

```
{{ $variable := . }}
```

`with` 또는 범위 내에서 `$variable`을 사용할 수 있으며, 이는 점의 현재 값이 아니라 변수가 정의된 시점에 점의 값을 참조합니다.

예를 들어 두 번째 범위에서 `{{ .Labels }}`를 사용하는 템플릿은 작성할 수 없습니다. 여기서 점은 현재 알림이 아닌 현재 레이블을 참조하기 때문입니다.

```
{{ range .Alerts }}
{{ range .Labels.SortedPairs }}
{{ .Name }} = {{ .Value }}
{{/* does not work because in the second range . is a label not an alert */}}
There are {{ len .Labels }}
{{ end }}
{{ end }}
```

첫 번째 범위와 두 번째 범위 앞에서 `$alert` 변수를 정의하여 이 문제를 해결할 수 있습니다.

```
{{ range .Alerts }}
{{ $alert := . }}
{{ range .Labels.SortedPairs }}
{{ .Name }} = {{ .Value }}
{{/* works because $alert refers to the value of dot inside the first range */}}
There are {{ len $alert.Labels }}
{{ end }}
{{ end }}
```

## 인덱스가 있는 범위
<a name="v10-go-rangeindex"></a>

범위 시작 위치에서 인덱스 및 값 변수를 정의하여 범위 내 각 알림의 인덱스를 가져올 수 있습니다.

```
{{ $num_alerts := len .Alerts }}
{{ range $index, $alert := .Alerts }}
This is alert {{ $index }} out of {{ $num_alerts }}
{{ end }}
```

## 템플릿 정의
<a name="v10-go-define"></a>

`define` 및 템플릿 이름(큰따옴표로 묶음)을 다른 템플릿 내에서 사용할 수 있는 템플릿을 정의할 수 있습니다. `__subject`, `__text_values_list`, `__text_alert_list`, `default.title`, `default.message`와 같은 기본 템플릿을 포함하여 다른 템플릿과 동일한 이름의 템플릿을 정의해서는 안 됩니다. 템플릿이 기본 템플릿과 동일한 이름으로 생성되었거나 다른 알림 템플릿의 템플릿인 경우 Grafana는 두 템플릿 중 하나를 사용할 수 있습니다. Grafana는 이름이 같은 템플릿이 두 개 이상 있는 경우 이를 금지하거나 오류 메시지를 표시하지 않습니다.

```
{{ define "print_labels" }}
{{ end }}
```

## 템플릿 실행
<a name="v10-go-execute"></a>

`template`, 템플릿 이름(큰따옴표로 묶음), 템플릿에 전달해야 하는 커서를 사용하여 템플릿 내에서 정의된 템플릿을 실행할 수 있습니다.

```
{{ template "print_labels" . }}
```

## 템플릿에 데이터 전달
<a name="v10-go-passdata"></a>

템플릿 내에서 점은 템플릿에 전달되는 값을 참조합니다.

예를 들어 템플릿에 실행 알림 목록이 전달되면 점에서는 해당 실행 알림 목록을 나타냅니다.

```
{{ template "print_alerts" .Alerts }}
```

템플릿에 알림에 대해 정렬된 레이블이 전달되면 점은 정렬된 레이블 목록을 참조합니다.

```
{{ template "print_labels" .SortedLabels }}
```

재사용 가능한 템플릿을 작성할 때 유용합니다. 예를 들어 모든 알림을 인쇄하려면 다음을 작성할 수 있습니다.

```
{{ template "print_alerts" .Alerts }}
```

그런 다음, 실행 알림만 인쇄하려면 다음을 작성하면 됩니다.

```
{{ template "print_alerts" .Alerts.Firing }}
```

`.Alerts` 및 `.Alerts.Firing`이 모두 알림 목록이므로 이 방식이 가능합니다.

```
{{ define "print_alerts" }}
{{ range . }}
{{ template "print_labels" .SortedLabels }}
{{ end }}
{{ end }}
```

## 설명
<a name="v10-go-comments"></a>

`{{/*` 및 `*/}}`를 사용하여 주석을 추가할 수 있습니다.

```
{{/* This is a comment */}}
```

설명에 줄 바꿈을 추가하지 못하도록 하려면 다음을 사용합니다.

```
{{- /* This is a comment with no leading or trailing line breaks */ -}}
```

## 들여쓰기
<a name="v10-go-indentation"></a>

탭과 공백, 줄 바꿈에서 모두 들여쓰기를 사용하여 템플릿의 가독성을 개선할 수 있습니다.

```
{{ range .Alerts }}
  {{ range .Labels.SortedPairs }}
    {{ .Name }} = {{ .Value }}
  {{ end }}
{{ end }}
```

그러나 템플릿의 들여쓰기는 텍스트에도 표시됩니다. 다음으로 이를 제거하는 방법을 살펴봅니다.

## 공백 및 줄 바꿈 제거
<a name="v10-go-removespace"></a>

text/template에서 `{{-` 및 `-}}`를 사용하여 선행 및 후행 공백과 줄 바꿈을 제거합니다.

예를 들어 들여쓰기 및 줄 바꿈을 사용하여 템플릿의 가독성을 높이는 경우:

```
{{ range .Alerts }}
  {{ range .Labels.SortedPairs }}
    {{ .Name }} = {{ .Value }}
  {{ end }}
{{ end }}
```

들여쓰기 및 줄 바꿈도 텍스트에 표시됩니다.

```
    alertname = "Test"

    grafana_folder = "Test alerts"
```

각 범위의 시작 위치에서 `}}`를 `-}}`로 변경하여 텍스트에서 들여쓰기 및 줄 바꿈을 제거할 수 있습니다.

```
{{ range .Alerts -}}
  {{ range .Labels.SortedPairs -}}
    {{ .Name }} = {{ .Value }}
  {{ end }}
{{ end }}
```

이제 템플릿의 들여쓰기 및 줄 바꿈은 텍스트에 없습니다.

```
alertname = "Test"
grafana_folder = "Test alerts"
```