본문 바로가기
C.W.K.
Stream
Lesson 07 of 08 · published

Array of table — 반복 구조 항목

~10 min · toml, arrays-of-tables

Level 0평문
0 XP0/64 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

[[name]] 이중 대괄호 형태

Array of table 은 config 파일에서 제일 흔한 고통 하나를 풀어줘. '필드 여러 개짜리 구조체를 죽 늘어놓고, 하나씩 따로 읽거나 고치고 싶다' 는 상황 말이야. 문법은 대괄호 두 개, [[products]] 야. 파일에 [[products]] block 이 나올 때마다 products 배열에 요소가 하나씩 붙어.

언제 잡나

  • 필드가 여럿인 항목을 배열로 두고 싶을 때.
  • 항목마다 따로 주석을 달고, 따로 고치고, grep 으로 찾고 싶을 때.
  • inline table 배열이 너무 길어져서 눈에 안 들어올 때.

[[]] vs [] 구분

[server] 는 server 라는 table 하나를 열어. [[plugins]] 는 plugins 배열에 요소를 하나 밀어 넣고. [[plugins]] 하나하나가 그 안에서 완결된 block 이고, 소스에 적힌 순서가 곧 배열 순서야.

원칙: 헷갈리면 이렇게 생각해. 'N 개 중 하나' 로 읽히는 구조라면 이름으로 키를 매긴 table 의 table 이 아니라 array of table 이어야 해. 배열은 순서를 지켜주고, 리뷰어가 항목마다 코멘트를 달 수 있고, 새 항목을 붙여도 diff 가 깨끗해. YAML 로도 같은 걸 표현할 순 있지만 diff 가 이만큼 믿음직하지 않아.

Code

Array of table — 세 plugin·toml
[[plugins]]
name = "auth"
version = "1.2"
enabled = true

[[plugins]]
name = "rate-limit"
version = "0.4"
enabled = true
config = { window_sec = 60, max = 100 }

[[plugins]]
name = "experimental"
version = "0.1"
enabled = false
# perf regression 랜드까지 비활성화
# (#142 참고)
등가 inline-table 형태 (필드 많을 때 못생김)·toml
plugins = [
  { name = "auth",         version = "1.2", enabled = true },
  { name = "rate-limit",   version = "0.4", enabled = true,  config = { window_sec = 60, max = 100 } },
  { name = "experimental", version = "0.1", enabled = false },
]
# 2-3 짧은 필드엔 inline 형태; 항목 더 클 땐 [[plugins]].
중첩 array of table (Hugo 메뉴 패턴)·toml
[[menu.main]]
name = "Home"
url = "/"
weight = 1

[[menu.main]]
name = "Posts"
url = "/posts"
weight = 2

[[menu.main]]
name = "About"
url = "/about"
weight = 3

External links

Exercise

객체를 죽 늘어놓은 YAML 목록을 하나 골라. CI job 목록이든 webhook 목록이든 route 목록이든. 그걸 TOML array of table 로 옮기고, tomllib.load 에 통과시켜서 파싱된 모양이 dict 의 리스트로 나오는지 확인해. 그 다음 두 형태 각각에서 '항목 하나 추가' commit 을 만들어 diff 를 비교해. TOML 쪽이 노이즈 없이 이기는 게 보일 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.