Skip to content
created by Aha00aAha00a at 2026-05-24
last modified by Aha00aAha00a at 2026-08-10
revision: 2

Blame of Dev Page

older newer
DateTime Nickname Rev # Content Comment
2026-05-24T20:33:07 Aha00aAha00a 1 0 = [Dev] Page initial
2026-05-24T20:33:07 Aha00aAha00a 1 1 initial
2026-05-24T20:33:07 Aha00aAha00a 1 2 == Tables initial
2026-05-24T20:33:07 Aha00aAha00a 1 3 === Page initial
2026-05-24T20:33:07 Aha00aAha00a 1 4 initial
2026-05-24T20:33:07 Aha00aAha00a 1 5 `Page` 테이블은 페이지 revision 원본을 저장한다. initial
2026-05-24T20:33:07 Aha00aAha00a 1 6 initial
2026-05-24T20:33:07 Aha00aAha00a 1 7 * 키: `(site, name, revision)` initial
2026-05-24T20:33:07 Aha00aAha00a 1 8 * 본문: `content` initial
2026-05-24T20:33:07 Aha00aAha00a 1 9 * revision 메타: `dateTime`, `user`, `remoteAddress`, `comment`, `isMinorEdit` initial
2026-05-24T20:33:07 Aha00aAha00a 1 10 * `permRead`는 더 이상 사용하지 않으며 evolution 51에서 제거했다. initial
2026-05-24T20:33:07 Aha00aAha00a 1 11 initial
2026-05-24T20:33:07 Aha00aAha00a 1 12 최신 본문, history, diff, blame, include, search처럼 revision 원본이 필요한 경로는 `Page`를 직접 읽는다. initial
2026-05-24T20:33:07 Aha00aAha00a 1 13 initial
2026-05-24T20:33:07 Aha00aAha00a 1 14 === PageMeta initial
2026-05-24T20:33:07 Aha00aAha00a 1 15 initial
2026-05-24T20:33:07 Aha00aAha00a 1 16 `PageMeta` 테이블은 페이지별 최신 상태 캐시다. initial
2026-05-24T20:33:07 Aha00aAha00a 1 17 initial
2026-05-24T20:33:07 Aha00aAha00a 1 18 * 키: `(site, name)` initial
2026-05-24T20:33:07 Aha00aAha00a 1 19 * `revision`: 최신 revision initial
2026-05-24T20:33:07 Aha00aAha00a 1 20 * `dateInserted`: row 생성 시각 initial
2026-05-24T20:33:07 Aha00aAha00a 1 21 * `dateUpdated`: 계산 완료 시각 initial
2026-05-24T20:33:07 Aha00aAha00a 1 22 * `image`: 대표 이미지 initial
2026-05-24T20:33:07 Aha00aAha00a 1 23 * `size`: 최신 revision의 content length initial
2026-05-24T20:33:07 Aha00aAha00a 1 24 initial
2026-05-24T20:33:07 Aha00aAha00a 1 25 `PageMeta.permRead`도 evolution 51에서 제거했다. 읽기 권한 판정은 `Permission` 기반으로 처리한다. initial
2026-05-24T20:33:07 Aha00aAha00a 1 26 initial
2026-05-24T20:33:07 Aha00aAha00a 1 27 == Calculation initial
2026-05-24T20:33:07 Aha00aAha00a 1 28 initial
2026-05-24T20:33:07 Aha00aAha00a 1 29 페이지 계산 시 `PageLogic.calculate`가 최신 `Page`를 읽고 `PageMeta.upsert`를 수행한다. initial
2026-05-24T20:33:07 Aha00aAha00a 1 30 initial
2026-05-24T20:33:07 Aha00aAha00a 1 31 대표 이미지는 다음 순서로 선택한다. initial
2026-05-24T20:33:07 Aha00aAha00a 1 32 initial
2026-05-24T20:33:07 Aha00aAha00a 1 33 1. `#!Schema`의 `image` 또는 `logo` initial
2026-05-24T20:33:07 Aha00aAha00a 1 34 1. 업로드된 `Attachment` initial
2026-05-24T20:33:07 Aha00aAha00a 1 35 1. `[[Image(...)]]` initial
2026-05-24T20:33:07 Aha00aAha00a 1 36 1. `[[Attachment(...)]]` initial
2026-05-24T20:33:07 Aha00aAha00a 1 37 initial
2026-05-24T20:33:07 Aha00aAha00a 1 38 이미지가 없으면 `NULL`로 저장하고 렌더링/API 쪽에서 기본 이미지를 사용한다. initial
2026-05-24T20:33:07 Aha00aAha00a 1 39 initial
2026-05-24T20:33:07 Aha00aAha00a 1 40 == Read Paths initial
2026-05-24T20:33:07 Aha00aAha00a 1 41 initial
2026-05-24T20:33:07 Aha00aAha00a 1 42 페이지 이름 목록과 최신 페이지 목록/size는 `PageMeta` 기반 캐시를 사용한다. initial
2026-05-24T20:33:07 Aha00aAha00a 1 43 initial
2026-05-24T20:33:07 Aha00aAha00a 1 44 * `AhaWikiCache.PageMeta.SeqPageName` initial
2026-05-24T20:33:07 Aha00aAha00a 1 45 * `AhaWikiCache.PageMeta.SeqPageLatestSummary` initial
2026-05-24T20:33:07 Aha00aAha00a 1 46 * `ContextSite.setPageName` initial
2026-05-24T20:33:07 Aha00aAha00a 1 47 * `ContextSite.seqPageByPermission` initial
2026-05-24T20:33:07 Aha00aAha00a 1 48 * Admin Page 목록과 재계산 대상 선택 initial
2026-05-24T20:33:07 Aha00aAha00a 1 49 initial
2026-05-24T20:33:07 Aha00aAha00a 1 50 페이지 생성, 수정, 삭제, rename 시 관련 `PageMeta` row와 캐시를 갱신하거나 무효화한다. initial
2026-08-10T08:40:38 Aha00aAha00a 2 51 페이지명과 URL 을 오가는 규칙을 PageNameUrl 한 곳으로 모은 것을 기록한다 — encode 가 두 형태로 갈라져 같은 페이지의 URL 이 둘이었다
2026-08-10T08:40:38 Aha00aAha00a 2 52 == 페이지명과 URL 페이지명과 URL 을 오가는 규칙을 PageNameUrl 한 곳으로 모은 것을 기록한다 — encode 가 두 형태로 갈라져 같은 페이지의 URL 이 둘이었다
2026-08-10T08:40:38 Aha00aAha00a 2 53 페이지명과 URL 을 오가는 규칙을 PageNameUrl 한 곳으로 모은 것을 기록한다 — encode 가 두 형태로 갈라져 같은 페이지의 URL 이 둘이었다
2026-08-10T08:40:38 Aha00aAha00a 2 54 페이지명을 URL 조각으로 바꾸는 것과 되돌리는 것은 `logics.wikis.PageNameUrl` 한 곳에 있습니다. 페이지명과 URL 을 오가는 규칙을 PageNameUrl 한 곳으로 모은 것을 기록한다 — encode 가 두 형태로 갈라져 같은 페이지의 URL 이 둘이었다
2026-08-10T08:40:38 Aha00aAha00a 2 55 페이지명과 URL 을 오가는 규칙을 PageNameUrl 한 곳으로 모은 것을 기록한다 — encode 가 두 형태로 갈라져 같은 페이지의 URL 이 둘이었다
2026-08-10T08:40:38 Aha00aAha00a 2 56 * `encode` — `/w/{encode(name)}` 형태로 쓰는 경로 조각. `UriUtil.encodeURIComponent` 와 같아서 `!'()~` 는 그대로 둡니다. 페이지명과 URL 을 오가는 규칙을 PageNameUrl 한 곳으로 모은 것을 기록한다 — encode 가 두 형태로 갈라져 같은 페이지의 URL 이 둘이었다
2026-08-10T08:40:38 Aha00aAha00a 2 57 * `decode` — 라우트로 들어온 이름을 되돌립니다. `+` 를 `%2B` 로 먼저 바꾸는데, 이걸 빼면 페이지명 안의 `+` 가 공백으로 읽혀 엉뚱한 페이지를 찾습니다. 페이지명과 URL 을 오가는 규칙을 PageNameUrl 한 곳으로 모은 것을 기록한다 — encode 가 두 형태로 갈라져 같은 페이지의 URL 이 둘이었다
2026-08-10T08:40:38 Aha00aAha00a 2 58 페이지명과 URL 을 오가는 규칙을 PageNameUrl 한 곳으로 모은 것을 기록한다 — encode 가 두 형태로 갈라져 같은 페이지의 URL 이 둘이었다
2026-08-10T08:40:38 Aha00aAha00a 2 59 전에는 decode 가 4곳, encode 가 8곳에 흩어져 있었고 encode 는 두 형태로 갈라져 있었습니다. 어떤 코드가 링크를 만드느냐에 따라 **같은 페이지의 URL 이 두 가지** 였습니다 — sitemap, 텔레그램 알림, 렌더링된 위키 링크가 서로 달랐습니다. 페이지명과 URL 을 오가는 규칙을 PageNameUrl 한 곳으로 모은 것을 기록한다 — encode 가 두 형태로 갈라져 같은 페이지의 URL 이 둘이었다
2026-08-10T08:40:38 Aha00aAha00a 2 60 페이지명과 URL 을 오가는 규칙을 PageNameUrl 한 곳으로 모은 것을 기록한다 — encode 가 두 형태로 갈라져 같은 페이지의 URL 이 둘이었다
2026-08-10T08:40:38 Aha00aAha00a 2 61 `encodeURIComponent` 쪽으로 맞춘 이유는 브라우저가 이미 그 함수를 쓰기 때문입니다. 서버가 만든 링크와 클라이언트가 만든 링크가 같아집니다. 두 형태 모두 같은 페이지로 해석되므로 겉모습 차이였지만, 정규 URL 이 두 가지인 상태는 그대로 둘 수 없습니다. 페이지명과 URL 을 오가는 규칙을 PageNameUrl 한 곳으로 모은 것을 기록한다 — encode 가 두 형태로 갈라져 같은 페이지의 URL 이 둘이었다