📐 Go 템플릿에서 공백 제어하기: 중첩 루프 🔗

Go의 text/template 패키지를 사용할 때 중첩된 데이터 구조를 포맷팅하다 보면 원치 않는 빈 줄이 생기는 경우가 많습니다. Go 템플릿은 템플릿 코드 자체의 가독성을 위해 넣은 줄바꿈을 포함해 모든 공백을 그대로 보존하기 때문에, 일반적인 루프를 사용하면 출력 결과물이 불필요하게 부풀어 오릅니다.

Go의 템플릿 트림 마커(trim marker)를 사용해 이 공백 문제를 해결하는 방법을 소개합니다.

📑 목차 🔗


⚠️ 문제 상황: 그대로 보존되는 줄바꿈 🔗

다음과 같은 중첩 데이터 구조를 포맷팅하고 싶다고 가정해 봅시다.

var data = map[string]map[string][]string{
	"1": {
		"1.1": {"1.1.1", "1.1.2", "1.1.3"},
	},
	"2": {
		"2.1": {"2.1.1", "2.1.2", "2.1.3"},
	},
}

템플릿을 작성하는 가장 자연스러운 방법은 기본 {{ range }} 블록을 사용하는 것입니다.

{{ range $name, $map := . }}
{{ $name }}:
  {{ range $name, $values := $map }}
  {{ $name }}:
    {{ range $value := $values }}
    {{ $value }}
    {{ end }}
  {{ end }}
{{ end }}

템플릿에 작성된 모든 줄바꿈과 들여쓰기 공백이 적힌 그대로 출력되기 때문에, 결과물 곳곳에 빈 공간이 지저분하게 남게 됩니다.

1:
  
  1.1:
    
    1.1.1
    
    1.1.2
    
    1.1.3
    
  

2:
...

✂️ 해결책: 트림 마커 (-) 🔗

액션 태그 안쪽에 마이너스 기호(-)를 추가하면 인접한 공백을 제거하도록 Go 템플릿 엔진에 지시할 수 있습니다.

중첩 루프를 수정하기 위해, 우리가 의도한 들여쓰기는 지우지 않으면서 템플릿 포맷팅용 줄바꿈만 삼키도록 - 마커를 전략적으로 배치합니다.

{{- range $name, $map := . -}}
{{ $name }}:
  {{- range $name, $values := $map }}
  {{ $name }}:
    {{- range $value := $values }}
    {{ $value }}
    {{- end }}
  {{- end }}
{{ end -}}

range 선언과 end 블록 바로 앞뒤의 줄바꿈을 제거함으로써 깔끔하고 조밀하게 정돈된 출력 결과를 얻게 됩니다.

1:
  1.1:
    1.1.1
    1.1.2
    1.1.3
2:
  2.1:
    2.1.1
    2.1.2
    2.1.3

💻 실행 가능한 전체 예제 코드 🔗

아래 코드를 복사하여 실행하면 동작을 직접 테스트해 볼 수 있습니다.

package main

import (
	"fmt"
	"os"
	"text/template"
)

var data = map[string]map[string][]string{
	"1": {
		"1.1": {"1.1.1", "1.1.2", "1.1.3"},
	},
	"2": {
		"2.1": {"2.1.1", "2.1.2", "2.1.3"},
	},
}

func main() {
	const tpl = `
{{- range $name, $map := . -}}
{{ $name }}:
  {{- range $name, $values := $map }}
  {{ $name }}:
    {{- range $value := $values }}
    {{ $value }}
    {{- end }}
  {{- end }}
{{ end -}}
`
	fmt.Println("Output:")
	fmt.Println("'''")
	
	t := template.Must(template.New("nested").Parse(tpl))
	t.Execute(os.Stdout, data)
	
	fmt.Println("'''")
}

📚 무료 전자책 다운로드 🔗

카우에의 삶의 방식 오프라인 에디션을 받아보세요—🍏 건강, 💰 부, ❤️ 사랑, 🧘 의미를 최적화하기 위한 실전 가이드입니다.

카우에의 삶의 방식

카우에의 삶의 방식

📬 뉴스레터 구독하기 🔗

더 나은 삶을 위한 새로운 에세이, 도서 요약, 실전 가이드를 발행할 때 알림을 받아보세요. 스팸은 없으며 언제든 구독을 취소할 수 있습니다.


💬 댓글 및 토론 🔗

질문, 의견 또는 제안이 있으신가요? 아래에 생각을 남겨주세요. 댓글은 GitHub Discussions(광고 및 스팸 없음)를 통해 제공됩니다—댓글이나 반응을 남기려면 아래의 GitHub으로 로그인을 클릭하세요(무료 GitHub 계정은 1분 이내에 만들 수 있습니다).



최종 업데이트: 2026. 10. 11..

면책 조항: 본 사이트의 콘텐츠는 정보 제공 및 교육 목적으로만 제공되며 의학, 심리, 재무, 투자, 세무 또는 법률 자문을 구성하지 않습니다. 여기에 제시된 생각, 큐레이션 및 의견은 전적으로 저 개인의 것이며 고용주의 입장을 대변하지 않습니다. 도서, 강연 및 아티클 요약은 독립적인 교육적 해설이며 각 저자의 지적 재산입니다. 편집, 서식 지정 및 요약을 돕기 위해 AI 도구가 사용될 수 있으며, 정확성을 기하기 위해 최선을 다하고 있으나 오류가 포함될 수 있습니다. 개인정보 처리방침: 본 사이트는 선택적 뉴스레터 구독(follow.it), 댓글(giscus / GitHub Discussions) 및 임베디드 미디어(YouTube)를 위해 제3자 서비스를 사용하며, 해당 서비스들은 각자의 개인정보 처리방침에 따라 방문자의 IP 주소와 쿠키를 처리할 수 있습니다.