발행일

탭 이름을 이틀 만에 되돌렸다 — 화면에 뜨는 낱말은 UI 문구가 아니라 도메인 계약이다

탭 이름을 이틀 만에 되돌렸다

표준데이터 검색 화면의 셋째 탭 이름은 9월 7일에 개념체계에서 개념 탐색으로 바뀌었습니다. 당시 코드 주석에 적힌 근거는 이랬어요 — 개념체계는 클래스 이름(skos:ConceptScheme)이라 탭이 무엇을 하는 자리인지 말해 주지 못한다, 개념 계층을 따라 내려가며 좁히는 자리니 개념 탐색이 맞다.

이틀 뒤인 9월 9일에 되돌렸습니다(b3e016e9).

되돌린 이유는 이름 자체가 아니었다

같은 날 필터줄의 칸 이름도 정보 주제에서 개념체계로 돌아왔습니다. 이 두 이름은 원래 하나였는데, 9월 7일에 일부러 다른 이름을 줬어요. 탭은 하는 일을 따라 개념 탐색, 그 탭 안의 필터 칸은 목업의 필터 이름이자 그 칸에서 고르는 값(dcat:theme)의 뜻을 따라 정보 주제. 사용자가 보기에는 같은 축인데 부르는 말이 셋(데이터 모델의 개념체계까지)이 된 상태였습니다.

되돌린 뒤 코드에 남긴 주석입니다.

# 2026-09-07 `개념 탐색` 으로 바꿨다가 2026-09-09 `개념체계` 로 되돌림 — 필터줄의
# `정보 주제` 칸도 같은 날 `개념체계` 가 돼 탭·칸 이름이 다시 하나다.
"title": _("개념체계"),

9월 7일에도 데이터 맵 소스 탭과 이용안내 슬라이드 제목까지 한 커밋에서 같이 바꿨습니다. 탭 이름과 칸 이름도 하나씩 보면 각자 근거가 있었고요. 놓친 건 둘을 합쳐 보면 한 축을 세 이름으로 부르게 된다는 것이었고, 되돌린 커밋에 적힌 사유도 그 하나입니다. 뒤집힌 경위를 지우지 않고 주석과 문서에 날짜째 남겼어요. 두 달 뒤에 이 자리를 여는 사람이 "왜 클래스 이름을 그대로 탭 이름으로 쓰지?"라고 물을 때, 이미 한 번 바꿔 봤고 무엇 때문에 돌아왔는지가 답이 됩니다.

이름만 돌아온 게 아니다 — 선택지도 한 단으로 폈다

같은 커밋에서 개념체계 드롭다운의 구조가 바뀌었습니다. 이 칸의 선택지는 일주일 사이 세 번째 모양이에요.

시점뿌리하위
~9/6개념체계(그릇)체계 아래 개념
9/7모든 체계의 최상위 개념▸ 로 펼침
9/9상위개념이 없는 개념만, 평평하게없음

9월 9일 결정은 기획 쪽입니다 — 관리 화면에서 상위개념(skos:broader) 값이 빈 개념이 곧 이 칸의 목록이라는 것. 하위 개념을 화면에서 고를 수 없게 됐지만 검색 결과가 좁아지지는 않습니다. 뿌리를 고르면 서버가 하위를 늘 함께 걸거든요.

구현은 카탈로그 칸과 공유하는 트리 도구를 그대로 쓰되, 가지가 없는 것처럼 만들어 넘깁니다.

(data.root_concepts || []).forEach(function (concept) {
  roots.push(Object.assign({}, concept, { has_children: false }));
});
return { roots: roots, children: {} };

has_children을 눌러 두면 ▸ 표시가 안 서고, children이 비어 있으니 펼칠 것도 없습니다. 같은 렌더러를 쓰는 카탈로그 칸은 그대로 계층으로 남아요. 드롭다운 코드를 갈래로 나누는 대신 데이터를 평평하게 만들어 넘기는 쪽을 골랐습니다.

이 커밋에서 조용히 빠진 것

9월 7일 버전에는 값이 달린 개념(count > 0)을 앞에 세우는 정렬이 있었습니다. 이번 커밋에서 그 정렬이 같이 빠졌어요.

-    roots.sort(function (a, b) {
-      return (b.count > 0) - (a.count > 0);
-    });

커밋 메시지에는 이 이야기가 없습니다. 지금 선택지 순서는 체계 순서대로 이어 붙인 서버 응답 그대로예요. 0건 개념이 목록 위쪽에 섞여 있을 수 있고, 그게 의도된 것인지 평평하게 펴면서 딸려 나간 것인지는 커밋만 봐서는 알 수 없습니다. "평평하게 편다"는 변경 안에 "정렬을 뺀다"가 숨어 들어간 셈이고, 이런 건 커밋 메시지에 한 줄이 있어야 했습니다.

첫 줄의 '전체 …'

드롭다운 맨 위에 전체 개념체계 줄을 세웠습니다(카탈로그 드롭다운도 같이). 체크박스 목록에는 원래 "아무것도 안 고른 상태"를 가리키는 자리가 없어서, 고른 걸 다 풀려면 하나씩 눌러 꺼야 했거든요.

동작은 셀렉트 칸의 첫 선택지를 흉내 냅니다 — 누르면 전부 해제되고, 고른 것이 없으면 이 줄이 체크된 것처럼 보이고, 그 상태에서 다시 눌러도 풀리지 않습니다. 빈 조건이 곧 전체라서요.

"전체"라는 낱말이 이 화면에서 무엇을 뜻하는지는 며칠 전에 한 번 정리한 적이 있습니다. 조건 없음이 아니라 뿌리 전부의 합집합이에요. 그 뜻 그대로 이 줄을 세웠습니다.

같은 주의 다른 두 자리

서비스 소개 카드 문구를 고쳤습니다(fb761343). "탐색 범위를 좁힙니다"가 "주제별 그룹을 만듭니다"로요. 분류 축이 하는 일은 묶는 것이고, 좁히는 건 그 결과로 사용자가 하는 일입니다. 카드가 축의 역할을 결과 쪽으로 설명하고 있었어요.

홈 목록의 표제도 바꿨습니다(e31cc998). 자주 찾는·최근 등록 표준데이터 행이 영문 식별자를 세우고 있었는데, 그 자리에 dct:title 한글 제목을 넣고 영문명은 툴팁으로 물렸습니다.

# 표제는 한글 제목(dct:title) 하나만 — 홈 행은 한 줄이라 목록 카드처럼
# `한글 (영문명)` 을 병기하면 잘린다. 영문명은 툴팁으로 물러나고, 제목이 없는
# 건만 이름을 세운다. 동명 인스턴스는 그룹값으로 갈린다.

목록 카드가 쓰는 한글 (영문명) 병기를 그대로 못 쓴 이유가 저 주석에 있습니다. 홈 행은 날짜 칸까지 한 줄에 들어가야 해서 병기하면 잘려요. 제목이 없는 건은 전처럼 영문명을 세웁니다.

조회는 행마다 붙지 않게 했습니다. OID 카드 목록이 이미 쓰던 title_map이 pk 목록을 받아 슬롯 값을 한 번에 가져오거든요. 새로 만들 게 아니라 이미 있는 묶음 조회를 얹는 일이었습니다.

검증

  • e2e 스펙 3개(std-data-tab-names·dataset-list-scope-filter·std-data-axis-tabs)의 기대값을 되돌린 이름으로 갱신하고, dataset-list-scope-filter에는 평평해진 선택지와 전체 개념체계 줄 테스트를 새로 넣었습니다. 이름이 하드코딩돼 있어서 되돌릴 때 같이 빨개지는 자리예요 — 이게 이름 변경의 실제 비용입니다.
  • 홈은 테스트를 한 건 추가했습니다. 슬롯에 한글 제목을 넣은 인스턴스가 표제로 그 제목을, 툴팁으로 영문명을 갖는지 확인해요.

남은 것 · 한계

  • 이틀 만에 뒤집었습니다. 탭과 칸에 하나씩은 근거 있는 이름을 줬는데, 한 축이 세 이름으로 불리게 된다는 걸 합쳐서 보지 않은 게 원인입니다.
  • 정보 주제는 아직 화면에 남아 있습니다. 되돌린 건 검색 화면의 탭과 필터 칸이고, 되돌린 커밋 시점에도 관계도의 2차 그룹·범례와 OID 화면의 정보 행·이용안내에는 같은 축이 정보 주제로 적혀 있었어요. 이름은 한 곳에 있는 게 아니라서, 이번에 손댄 범위 밖에서는 두 이름이 같이 삽니다.
  • 정렬이 말없이 빠졌습니다. 위에 적은 대로입니다. 0건 개념의 위치를 어떻게 할지는 아직 정하지 않았어요.
  • 옛 주소와 새 주소가 같이 삽니다. 칸이 만드는 조건은 concept_ids 하나지만 서버는 scheme_ids도 계속 받습니다. 옛 링크를 살려 두려는 것인데, 받는 쪽이 둘인 상태가 언제까지인지는 정해 두지 않았습니다.
  • 홈의 영문명은 툴팁에만 있습니다. 마우스를 올려야 보이니 터치 환경에서는 영문 식별자로 찾을 방법이 홈에 없어요. 그 자리는 목록 화면이 담당한다고 보고 넘어갔습니다.
  • 세 자리 모두 크지 않은 정리입니다. 다만 같은 주에 화면의 낱말이 가리키는 대상과 어긋난 자리를 세 번 마주쳤고, 그때마다 낱말을 대상에 맞추는 선택을 했습니다.

관련 글: 탭의 '전체'는 조건 없음이 아니라 합집합이었다 · 용어 하나를 96개 파일 667곳에서 바꿨다 · 홈 화면의 준비 중 타일을 지웠다 · 필터 선택지 옆 건수를 어느 모집단으로 셀 것인가