| 2026-05-24T20:33:07 |
Aha00a |
1
|
0
|
= [Dev] Page |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
1
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
2
|
== Tables |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
3
|
=== Page |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
4
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
5
|
`Page` 테이블은 페이지 revision 원본을 저장한다. |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
6
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
7
|
* 키: `(site, name, revision)` |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
8
|
* 본문: `content` |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
9
|
* revision 메타: `dateTime`, `user`, `remoteAddress`, `comment`, `isMinorEdit` |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
10
|
* `permRead`는 더 이상 사용하지 않으며 evolution 51에서 제거했다. |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
11
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
12
|
최신 본문, history, diff, blame, include, search처럼 revision 원본이 필요한 경로는 `Page`를 직접 읽는다. |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
13
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
14
|
=== PageMeta |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
15
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
16
|
`PageMeta` 테이블은 페이지별 최신 상태 캐시다. |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
17
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
18
|
* 키: `(site, name)` |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
19
|
* `revision`: 최신 revision |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
20
|
* `dateInserted`: row 생성 시각 |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
21
|
* `dateUpdated`: 계산 완료 시각 |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
22
|
* `image`: 대표 이미지 |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
23
|
* `size`: 최신 revision의 content length |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
24
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
25
|
`PageMeta.permRead`도 evolution 51에서 제거했다. 읽기 권한 판정은 `Permission` 기반으로 처리한다. |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
26
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
27
|
== Calculation |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
28
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
29
|
페이지 계산 시 `PageLogic.calculate`가 최신 `Page`를 읽고 `PageMeta.upsert`를 수행한다. |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
30
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
31
|
대표 이미지는 다음 순서로 선택한다. |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
32
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
33
|
1. `#!Schema`의 `image` 또는 `logo` |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
34
|
1. 업로드된 `Attachment` |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
35
|
1. `[[Image(...)]]` |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
36
|
1. `[[Attachment(...)]]` |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
37
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
38
|
이미지가 없으면 `NULL`로 저장하고 렌더링/API 쪽에서 기본 이미지를 사용한다. |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
39
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
40
|
== Read Paths |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
41
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
42
|
페이지 이름 목록과 최신 페이지 목록/size는 `PageMeta` 기반 캐시를 사용한다. |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
43
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
44
|
* `AhaWikiCache.PageMeta.SeqPageName` |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
45
|
* `AhaWikiCache.PageMeta.SeqPageLatestSummary` |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
46
|
* `ContextSite.setPageName` |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
47
|
* `ContextSite.seqPageByPermission` |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
48
|
* Admin Page 목록과 재계산 대상 선택 |
| 2026-05-24T20:33:07 |
Aha00a |
1
|
49
|
|
| 2026-05-24T20:33:07 |
Aha00a |
1
|
50
|
페이지 생성, 수정, 삭제, rename 시 관련 `PageMeta` row와 캐시를 갱신하거나 무효화한다. |