건너뛴 참조 다섯을 읽고 나서 다시 썼다 — 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>
91 lines
4.8 KiB
Markdown
91 lines
4.8 KiB
Markdown
---
|
|
kind: CONCEPT
|
|
slug: eleven-boundaries-a-value-crosses
|
|
title: 공개 화면 한 줄이 그려지기까지 값이 지나는 경계 열한 개
|
|
topic: values-lost-between-boundaries
|
|
topicName: 값이 경계에서 사라진다
|
|
project: TechLog
|
|
status: 게시 전
|
|
basisVersion: tech-log-backend · tech-log-frontend 2026-09-02 · OpenAPI 3.1 계약 3종을 반입해 쓰는 구조
|
|
assets:
|
|
- key: value-boundaries
|
|
file: ../../../final/assets/diagrams/value-boundaries/value-boundaries.svg
|
|
sourceRevision: tech-log@2026-09-02
|
|
source:
|
|
- final/document.md#§1.2
|
|
- final/document.md#§17.1
|
|
---
|
|
|
|
# 공개 화면 한 줄이 그려지기까지 값이 지나는 경계 열한 개
|
|
|
|
공개 화면의 한 줄은 PostgreSQL 의 투영 테이블에서 출발해 열한 번 모양을 바꾼 뒤에 그려진다. 그 사이 어느 한 곳이 값을 담지 않아도 오류가 나지 않는다. `undefined` 는 빈 문자열로 그려지고 빈 배열은 「항목이 없습니다」로 그려진다.
|
|
|
|
## 관계
|
|
|
|
- **공개 Reference 가 통째로 비어 있었다 — 이름이 어긋났고 본문은 다른 테이블에 있었다**
|
|
이 경계 중 두 곳에서 값이 사라진 사건이다.
|
|
- **관계의 요약이 경계 세 곳을 지나며 사라졌다**
|
|
한 값이 연달아 세 경계에서 버려진 사건이다.
|
|
- **한 경계를 고쳤으면 값의 여정 끝에서 확인한다**
|
|
이 경계 수가 그 규칙의 근거다.
|
|
|
|
## 본문
|
|
|
|
<!-- body:start -->
|
|
|
|
## 열한 번 모양이 바뀐다
|
|
|
|
공개 화면의 한 줄은 게시 시점에 굳어진 투영 테이블에서 출발해 열한 번 모양을 바꾼 뒤에 그려진다.
|
|
|
|
```text
|
|
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 편집기와 공개 화면은 같은 데이터베이스를 보지만 다른 계약을 지난다. 작성 쪽은 작성 계약을, 조회 쪽은 조회 계약을 지난다.
|
|
|
|
두 화면이 같은 값을 두고 다르게 보이면 그 사이에 있는 것은 저장소가 아니라 계약이다. 이 저장소에서 그 신호가 여덟 번 같은 원인을 가리켰다.
|
|
|
|
## 이 문서의 결함 절반이 여기서 났다
|
|
|
|
이 기간에 적은 결함의 절반 이상이 「이 중 한 경계가 값을 버렸다」는 같은 모양이었다. 한 경계를 고치고 확인하면 다음 경계가 같은 값을 다시 버리는 일도 났다.
|
|
|
|
<!-- body:end -->
|