Special Page Placement Rules
template_kind = cover | content | divider | publish 기반으로 special page(간지/발행면) 배치 규칙과 pageSide 동작 상세 규칙을 정의합니다.
1. Template Kinds
template_kind = content
일반 내지 콘텐츠. Flow 엔진으로 이전 콘텐츠 뒤에 자연스럽게 이어 배치됩니다.breakBefore의 column 값 사용 가능.pageSide 사용 불가.
template_kind = divider
섹션 구분 간지 페이지. Flow에 섞이지 않는 특수 페이지로, 항상 독립 페이지로 취급됩니다.breakBefore는 생략 또는 page만 허용.none / column은 에러.
template_kind = publish
발행면(콜로폰) 페이지. divider와 동일하게 독립 특수 페이지입니다. 책 앞/뒤 어디든 배치 가능하지만 항상 기존 콘텐츠의 뒤에 위치합니다.
2. Query Parameters
2.1 breakBefore
| 값 | content에서의 의미 | divider/publish에서의 의미 |
|---|---|---|
none | Flow 그대로 이어서 배치 (기본값) | 에러 |
column | 같은 페이지의 다음 컬럼에서 이어쓰기 | 에러 |
page | 새 페이지에서 시작 | 새 페이지에서 시작 (기본값) |
template_kind)에 따라 자동으로 설정됩니다. 사용자가 명시적으로 값을 지정하면 해당 값이 우선 적용됩니다.2.2 pageSide
값: left | right.divider/publish 전용 옵션입니다. 이 특수 페이지를 어느 면에서 시작할지 지정합니다.content에서 사용 시 에러. 생략 시(auto) 제품/템플릿 기본 규칙 사용.
3. Template Kind별 동작
3.1 template_kind = content
| breakBefore | pageSide | 결과 |
|---|---|---|
| (생략) | (생략) | Flow 그대로 이어붙기 (기본값 none 자동 적용) |
| none | (생략) | Flow 계속 |
| column | (생략) | 같은 페이지의 다음 컬럼에서 이어쓰기 |
| page | (생략) | 새 페이지에서 시작 |
| (무관) | left/right | 에러 — content는 pageSide 불가 |
3.2 template_kind = divider
| breakBefore | pageSide | 처리 |
|---|---|---|
| (생략) | (생략) | 새 페이지 시작 (기본값 page 자동 적용) |
| (생략) | left/right | 새 페이지 시작 + 지정 면 강제 |
| page | (생략) | 새 페이지 시작 |
| page | left/right | 새 페이지 시작 + 지정 면 강제 |
| none | (무관) | 에러 |
| column | (무관) | 에러 |
3.3 template_kind = publish (divider와 동일)
| breakBefore | pageSide | 처리 |
|---|---|---|
| (생략) | (생략) | 새 페이지 시작 (기본값 page 자동 적용) |
| (생략) | left/right | 새 페이지 시작 + 지정 면 강제 |
| page | (생략) | 새 페이지 시작 |
| page | left/right | 새 페이지 시작 + 지정 면 강제 |
| none | (무관) | 에러 |
| column | (무관) | 에러 |
4. pageSide 상세 동작 규칙 (면 배치 알고리즘)
4.1 기본 개념
엔진은 page_layout_state 테이블을 통해 현재 페이지 배치 상태를 관리합니다. 특수 페이지는 항상 독립 페이지로 배치되므로 최근 상태만으로 다음 배치 위치를 판단합니다.
4.2 배치 위치 계산 공식
| 현재 커서 pageside | 요청 pageSide | 결과 pagenum | 결과 pageside | 설명 |
|---|---|---|---|---|
| left | left | pagenum + 1 | left | 다음 페이지 left |
| left | right | pagenum | right | 같은 페이지 right |
| right | left | pagenum + 1 | left | 다음 페이지 left |
| right | right | pagenum + 1 | right | 다음 페이지 right |
pageSide=left 요청 시 → pagenum=2, pageside=left로 배치됩니다.케이스별 예시
Case 2) 현재 커서가 left + pageSide=left
현재: { "pagenum": 3, "pageside": "left" } → 결과: pagenum=4, pageside=left
Case 3) 현재 커서가 left + pageSide=right
현재: { "pagenum": 3, "pageside": "left" } → 결과: pagenum=3, pageside=right
Case 4) 현재 커서가 right + pageSide=left
현재: { "pagenum": 5, "pageside": "right" } → 결과: pagenum=6, pageside=left
Case 5) 현재 커서가 right + pageSide=right
현재: { "pagenum": 5, "pageside": "right" } → 결과: pagenum=6, pageside=right
5. Summary
| 구분 | content | divider / publish |
|---|---|---|
| breakBefore | none / column / page (기본: none) | page만 허용 (기본: page), none/column은 에러 |
| pageSide | 사용 불가 (에러) | left / right 선택 가능 (선택 사항) |
| 배치 방식 | Flow 엔진으로 이어 배치 | 항상 독립 특수 페이지, 커서 이후에만 배치 |
6. 예시
예 1) 스퀘어북 첫 페이지(오른쪽 시작)에서 left 요청
POST /books/{id}/contents?pageSide=left
{ "templateUid": "tpl_divider" }
// page_layout_state 현재 상태:
// { "pagenum": 0, "pageside": "right" }
// 계산:
// 스퀘어북 첫 페이지는 right 시작 → pagenum=1은 right
// pageSide=left 요청 → pagenum=2의 left
// 결과: pagenum=2, pageside=left 에 배치예 2) 현재 커서가 left일 때 pageSide=right
POST /books/{id}/contents?pageSide=right
{ "templateUid": "tpl_publish" }
// page_layout_state 현재 상태:
// { "pagenum": 5, "pageside": "left" }
// 계산: left → right = 같은 페이지의 right
// 결과: pagenum=5, pageside=right 에 배치예 3) 현재 커서가 right일 때 pageSide=left
POST /books/{id}/contents?pageSide=left
{ "templateUid": "tpl_divider" }
// page_layout_state 현재 상태:
// { "pagenum": 7, "pageside": "right" }
// 계산: right → left = 다음 페이지의 left
// 결과: pagenum=8, pageside=left 에 배치