Files
document-haness/docs/TechLog/tech-log-studio/values-lost-between-boundaries/concept/concept-eleven-boundaries-a-value-crosses.md
T
DongHyeonkaandClaude Opus 5 a8ce0dda07 docs(TechLog): 주제 셋을 스킬대로 다시 쓰고 SSOT 를 저장소 실물로 고친다
건너뛴 참조 다섯을 읽고 나서 다시 썼다 — from-ssot-to-records.md 의 「그림과 증거는
배정 대상이다」, code-tables-diagrams.md 의 표·코드 규칙, explaining.md 의 「이름을
댔으면 왜 있는지도 댄다」.

**SSOT 를 먼저 고쳤다.** §3.3 의 코드블록이 저장소와 달랐다 — PATH_PREFIX_KINDS 는
Record 표가 아니라 튜플 배열이고, 진짜 경로 표는 EXPLORE_KIND_PATHS 다. 저장소에서
확인해 실물로 바꾸고, javadoc 이 적어 둔 이유를 함께 옮겼다. §16.7 에 BRANCH_FIELDS 와
pathOf 실물을, §4.3 에 ContractRouteCoverageTest 의 javadoc 과 면제 상수 둘을 더했다.
62,643 → 65,737 자.

**계약에 ssot-assets·ssot-evidence 를 배정했다.** 그 절차를 건너뛰어서 SSOT 가 이미
가진 그림과 측정이 글감에 배정되지 않은 채였다. TechLog 12 글감, keycloak-session-store
는 그림 21장·증거 19건을 배정하고 붙일 글감이 없는 그림 4장은 이유를 계약에 적었다.
배정하자 검사기가 「배정한 증거를 기록이 쓰지 않는다」 4건을 드러냈다.

**주제 셋을 다시 썼다.**
  hand-listed-kinds            중앙값 1,925 → 3,760 자
  declared-but-not-implemented          → 2,608 자
  values-lost-between-boundaries        → 2,602 자

게시된 기록은 keycloak 4,546 · n+1liner 3,190 이다. 표와 코드를 SSOT 에서 옮기고,
Reference 에 담을 수 없던 표(§5.5 의 여덟 자리)를 짝이 되는 Case 로 내렸다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 18:54:45 +09:00

4.8 KiB

kind, slug, title, topic, topicName, project, status, basisVersion, assets, sourceRevision, source
kind slug title topic topicName project status basisVersion assets sourceRevision source
CONCEPT eleven-boundaries-a-value-crosses 공개 화면 한 줄이 그려지기까지 값이 지나는 경계 열한 개 values-lost-between-boundaries 값이 경계에서 사라진다 TechLog 게시 전 tech-log-backend · tech-log-frontend 2026-09-02 · OpenAPI 3.1 계약 3종을 반입해 쓰는 구조
key file
value-boundaries ../../../final/assets/diagrams/value-boundaries/value-boundaries.svg
tech-log@2026-09-02
final/document.md#§1.2
final/document.md#§17.1

공개 화면 한 줄이 그려지기까지 값이 지나는 경계 열한 개

공개 화면의 한 줄은 PostgreSQL 의 투영 테이블에서 출발해 열한 번 모양을 바꾼 뒤에 그려진다. 그 사이 어느 한 곳이 값을 담지 않아도 오류가 나지 않는다. undefined 는 빈 문자열로 그려지고 빈 배열은 「항목이 없습니다」로 그려진다.

관계

  • 공개 Reference 가 통째로 비어 있었다 — 이름이 어긋났고 본문은 다른 테이블에 있었다 이 경계 중 두 곳에서 값이 사라진 사건이다.
  • 관계의 요약이 경계 세 곳을 지나며 사라졌다 한 값이 연달아 세 경계에서 버려진 사건이다.
  • 한 경계를 고쳤으면 값의 여정 끝에서 확인한다 이 경계 수가 그 규칙의 근거다.

본문

열한 번 모양이 바뀐다

공개 화면의 한 줄은 게시 시점에 굳어진 투영 테이블에서 출발해 열한 번 모양을 바꾼 뒤에 그려진다.

PostgreSQL 테이블
  └─ public_resource_projection (게시 시점에 굳어진 투영)
       └─ JDBC 어댑터의 SQL (컬럼 이름을 컴파일러가 검사하지 않는다)
            └─ *View 레코드 (application-core)
                 └─ *ResponseMapper (adapter/inbound/web)
                      └─ 생성된 DTO (계약이 만든 모양)
                           └─ HTTP envelope
                                └─ openapi-typescript 타입
                                     └─ http-public-content-gateway 의 매퍼
                                          └─ 포트 타입 (application/ports)
                                               └─ 화면 컴포넌트

:::evidence key="value-boundaries" alt="저장·백엔드 조립·HTTP envelope·프론트엔드 조립·화면 다섯 묶음을 세 저장소 구역으로 나눠 이은 흐름도" caption=" " zoom="true" :::

저장 쪽에 둘, 백엔드 조립에 넷, 전선에 하나, 프론트엔드 조립에 셋, 화면에 하나다. 저장소 경계로 보면 백엔드가 여섯, 전선이 하나, 프론트엔드가 넷이다.

경계마다 무엇이 값을 지키는가

같은 경계라도 무엇이 확인되는지가 다르다.

어디 무엇이 확인되나 무엇이 확인되지 않나
어댑터 SQL 실행할 때 컬럼이 있는지 컴파일 시점에는 컬럼 이름을 아무도 안 본다
생성된 DTO 계약의 스키마 모양 그 칸에 값이 담겼는지
게이트웨이 매퍼 계약이 준 타입의 이름 as 단언을 쓰면 그 확인이 사라진다
포트와 화면 두 타입이 맞는지 포트와 어댑터가 타입을 따로 들면 한쪽만 늘어난다

어댑터 SQL 은 컬럼 이름을 문자열로 적는다. 이름이 틀리면 실행할 때 알게 되고, 그 SQL 을 실제로 돌리는 검사가 없으면 배포 뒤에 알게 된다.

계약이 만든 DTO 와 생성된 타입 사이는 생성기가 지킨다. 다만 생성기가 보는 것은 스키마의 모양이고, 그 칸에 값이 담기는지는 보지 않는다.

값을 버려도 오류가 나지 않는다

이 경계들은 값을 담지 않았다고 말하지 않는다. 담지 않은 채 다음으로 넘긴다.

undefined 는 화면에서 빈 문자열이 되고 빈 배열은 「항목이 없습니다」가 된다. 그래서 화면만 보면 값이 없는 것과 값을 잃은 것이 같아 보이고, 작성 도구에서는 작성자가 그것을 자기가 아직 쓰지 않은 것으로 읽는다.

계약을 지나는 길이 둘이다

Studio 편집기와 공개 화면은 같은 데이터베이스를 보지만 다른 계약을 지난다. 작성 쪽은 작성 계약을, 조회 쪽은 조회 계약을 지난다.

두 화면이 같은 값을 두고 다르게 보이면 그 사이에 있는 것은 저장소가 아니라 계약이다. 이 저장소에서 그 신호가 여덟 번 같은 원인을 가리켰다.

이 문서의 결함 절반이 여기서 났다

이 기간에 적은 결함의 절반 이상이 「이 중 한 경계가 값을 버렸다」는 같은 모양이었다. 한 경계를 고치고 확인하면 다음 경계가 같은 값을 다시 버리는 일도 났다.