게시된 Reference 15편이 전부 규칙을 `### N. 제목` 으로 쓰고 적용 조건·예외·예시를 항목으로 쓴다. 내 15편은 규칙을 `**굵게**` 로, 나머지 셋을 문단으로 쓰고 있었다 — Studio 의 rules[]·applyWhen[]·exceptions[]·examples[] 는 배열이라 문단으로 두면 항목이 하나로 접힌다. 규칙 68개를 `### N. 제목` 으로 바꿨다 (편당 3~7개, 게시된 것은 4~10개) 적용 조건·예외·예시를 항목으로 갈랐다. 한 항목뿐이던 아홉 편은 조건을 나눠 적었다 주제 6 은 본문을 다시 썼다 — location = 이 정확히 일치하는 경로만 잡아 27개가 얼어붙은 구조, 여덟 곳이 우는 시점을 셋으로 가른 표, digest 를 다시 계산할 때 옛 값을 먼저 재현하는 이유. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
69 lines
3.2 KiB
Markdown
69 lines
3.2 KiB
Markdown
---
|
|
kind: REFERENCE
|
|
slug: do-not-draw-a-link-that-does-not-resolve
|
|
title: 서버가 준 주소는 라우트 표에 맞춰 보고, 맞는 라우트가 없으면 링크로 그리지 않는다
|
|
topic: addresses-frozen-at-publish-time
|
|
topicName: 주소가 만들어지고 굳어지는 곳
|
|
project: TechLog
|
|
status: 게시 전
|
|
verifiedOn: 2026-09-04
|
|
sourceRevision: tech-log@2026-09-02
|
|
source:
|
|
- final/document.md#§9.2
|
|
---
|
|
|
|
# 서버가 준 주소는 라우트 표에 맞춰 보고, 맞는 라우트가 없으면 링크로 그리지 않는다
|
|
|
|
주소를 서버가 만들어 내보내고 화면이 그대로 링크로 그리면, 그 주소가 틀렸다는 것은 방문자만 안다. 화면 코드 어디에도 그 주소가 없기 때문이다. 만드는 쪽과 그리는 쪽 양쪽에서 라우트 표와 맞춘다.
|
|
|
|
## 관계
|
|
|
|
- **계약은 앵커라고 적었고 만드는 쪽은 경로를 만들었다**
|
|
이 기준의 근거 사건이다.
|
|
- **catch-all 라우트는 nginx 패턴으로 번역하지 않는다**
|
|
엣지의 404 가 감사에 남아야 이 기준이 성립한다.
|
|
- **라우트에 딸린 목록은 라우트 계약에서 유도하고, 유도할 수 없는 것은 대조 검사를 둔다**
|
|
라우트 표가 어디서 오는지가 그 기준에 있다.
|
|
|
|
## 목적
|
|
|
|
서버가 만든 주소가 열리지 않는 것을 방문자보다 먼저 잡는다. 이 부류는 화면 코드에 흔적이 없어 저장소 안의 링크 리터럴을 훑는 감사로는 잡히지 않는다.
|
|
|
|
## 규칙
|
|
|
|
### 1. 만드는 쪽에서 생성한 경로를 공개 라우트 패턴에 맞춘다
|
|
|
|
종류마다 만들어 낸 주소가 실제 라우트에 걸리는지 백엔드 테스트가 본다.
|
|
|
|
### 2. 그리는 쪽에서 서버가 준 주소를 라우트 표에 맞추고, 맞는 라우트가 없으면 링크로 그리지 않는다
|
|
|
|
같은 부류가 또 생겨도 방문자가 404 를 만나지는 않는다.
|
|
|
|
### 3. 주소를 고쳤으면 이미 저장된 행도 함께 고친다
|
|
|
|
주소가 게시 시점에 굳어져 저장되면 코드만 고쳐도 기존 링크는 깨진 채 남는다.
|
|
|
|
### 4. 배포 뒤 서버가 내보내는 주소를 전수로 훑는다
|
|
|
|
저장소를 훑는 감사와 다른 것을 본다. 실제로 나가는 주소는 DB 에 있다.
|
|
|
|
## 적용 조건
|
|
|
|
- 주소를 서버가 만들어 내보내고 화면은 받은 문자열을 링크로 그릴 때
|
|
- 게시 시점에 주소가 굳어져 저장되는 구조일 때. 코드만 고치면 이미 저장된 행이 깨진 채 남는다
|
|
- 공개 라우트를 더하거나 지워 주소의 모양이 바뀔 때
|
|
- 배포 뒤 서버가 내보내는 주소를 전수로 훑을 때
|
|
|
|
## 예외
|
|
|
|
- 외부 주소는 라우트 표에 없으므로 이 대조의 대상이 아니다.
|
|
|
|
- 그리는 쪽에만 가드를 두면 링크가 아예 그려지지 않는 것으로 끝나고 원인이 남는다. 만드는 쪽에도 같은 검사를 둔다.
|
|
|
|
## 예시
|
|
|
|
- 결정 링크가 404 였다. 계약은 앵커라고 적었고 만드는 두 곳이 경로를 만들었다.
|
|
|
|
- 배포 후 서버가 내보내는 주소 26개와 주제·축 9개를 더해 35개 전부 200 인 것을 확인했다.
|
|
|
|
- 저장소 안의 링크 리터럴을 훑는 감사로는 이 결함이 잡히지 않았다. 그 주소는 코드에 없다. |