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

Dev Page

1. Tables

1.1. Page

Page 테이블은 페이지 revision 원본을 저장한다.

  • 키: (site, name, revision)
  • 본문: content
  • revision 메타: dateTime, user, remoteAddress, comment, isMinorEdit
  • permRead는 더 이상 사용하지 않으며 evolution 51에서 제거했다.

최신 본문, history, diff, blame, include, search처럼 revision 원본이 필요한 경로는 Page를 직접 읽는다.

1.2. PageMeta

PageMeta 테이블은 페이지별 최신 상태 캐시다.

  • 키: (site, name)
  • revision: 최신 revision
  • dateInserted: row 생성 시각
  • dateUpdated: 계산 완료 시각
  • image: 대표 이미지
  • size: 최신 revision의 content length

PageMeta.permRead도 evolution 51에서 제거했다. 읽기 권한 판정은 Permission 기반으로 처리한다.

2. Calculation

페이지 계산 시 PageLogic.calculate가 최신 Page를 읽고 PageMeta.upsert를 수행한다.

대표 이미지는 다음 순서로 선택한다.

  • #!Schemaimage 또는 logo
  • 업로드된 Attachment
  • [[Image(...)]]
  • [[Attachment(...)]]

이미지가 없으면 NULL로 저장하고 렌더링/API 쪽에서 기본 이미지를 사용한다.

3. Read Paths

페이지 이름 목록과 최신 페이지 목록/size는 PageMeta 기반 캐시를 사용한다.

  • AhaWikiCache.PageMeta.SeqPageName
  • AhaWikiCache.PageMeta.SeqPageLatestSummary
  • ContextSite.setPageName
  • ContextSite.seqPageByPermission
  • Admin Page 목록과 재계산 대상 선택

페이지 생성, 수정, 삭제, rename 시 관련 PageMeta row와 캐시를 갱신하거나 무효화한다.

4. 페이지명과 URL

페이지명을 URL 조각으로 바꾸는 것과 되돌리는 것은 logics.wikis.PageNameUrl 한 곳에 있습니다.

  • encode/w/{encode(name)} 형태로 쓰는 경로 조각. UriUtil.encodeURIComponent 와 같아서 !'()~ 는 그대로 둡니다.
  • decode — 라우트로 들어온 이름을 되돌립니다. +%2B 로 먼저 바꾸는데, 이걸 빼면 페이지명 안의 + 가 공백으로 읽혀 엉뚱한 페이지를 찾습니다.

전에는 decode 가 4곳, encode 가 8곳에 흩어져 있었고 encode 는 두 형태로 갈라져 있었습니다. 어떤 코드가 링크를 만드느냐에 따라 **같은 페이지의 URL 이 두 가지** 였습니다 — sitemap, 텔레그램 알림, 렌더링된 위키 링크가 서로 달랐습니다.

encodeURIComponent 쪽으로 맞춘 이유는 브라우저가 이미 그 함수를 쓰기 때문입니다. 서버가 만든 링크와 클라이언트가 만든 링크가 같아집니다. 두 형태 모두 같은 페이지로 해석되므로 겉모습 차이였지만, 정규 URL 이 두 가지인 상태는 그대로 둘 수 없습니다.

5. See Also

5.2. Similar Pages

Similar pages by cosine similarity. Words after page name are term frequency.

  • Same Wiki
    • 42.61% Dev WebSocket page(21:42), updated(1:26), 페이지(5:20), wiki(2:13), name(6:8), 최신(6:6), revision(6:5), url(6:5), site(4:5), 권한(1:7)
    • 37.02% Dev Attachment page(21:16), attachment(2:23), url(6:11), name(6:10), 페이지(5:11), 삭제(1:11), site(4:5), seq(3:6), content(2:7), date(3:5)
    • 33.23% HotKey page(21:8), 페이지(5:1), aha(2:3), edit(1:4), wiki(2:2), 있습니다(1:3), 페이지를(1:3), 페이지의(1:2), blame(1:1), comment(1:1)
    • 32.92% Api api(1:85), page(21:29), name(6:18), revision(6:18), 페이지(5:19), wiki(2:15), edit(1:16), minor(1:16), aha(2:14), content(2:12)
    • 32.42% Dev Cache cache(2:45), page(21:17), site(4:29), aha(2:31), wiki(2:30), seq(3:20), meta(9:8), 삭제(1:14), logics(1:13), 페이지(5:7)
  • Sister Wikis
    • 38.33% Aha00a:ProjectAhaWiki page(21:7), name(6:16), revision(6:12), content(2:5), time(1:6), wiki(2:3), aha(2:2), permission(2:1), read(2:1), address(1:2)
    • 30.25% Aha00a:RecentChanges page(21:3), name(6:1), revision(6:1), date(3:1), wiki(2:1), api(1:2), include(1:2), minor(1:2), address(1:1), comment(1:1)

5.3. Adjacent Pages

Control
≤ 32
all
1.0x
1.0x
80
-120
ON
Metrics
Nodes(visible/total)0/0
Links(visible/total)0/0
Avg degree0.00
Depth coverage0
Queue(fetch/graph)0 / 0
Zoom(scale)1.00x
Ctrl/⌘ + Scroll: Zoom
Root 1-hop 2-hop+