Special Page Placement Rules

template_kind = cover | content | divider | publish 기반으로 special page(간지/발행면) 배치 규칙과 pageSide 동작 상세 규칙을 정의합니다.

1. Template Kinds

template_kind = content

일반 내지 콘텐츠. Flow 엔진으로 이전 콘텐츠 뒤에 자연스럽게 이어 배치됩니다.breakBeforecolumn 값 사용 가능.pageSide 사용 불가.

template_kind = divider

섹션 구분 간지 페이지. Flow에 섞이지 않는 특수 페이지로, 항상 독립 페이지로 취급됩니다.breakBefore는 생략 또는 page만 허용.none / column은 에러.

template_kind = publish

발행면(콜로폰) 페이지. divider와 동일하게 독립 특수 페이지입니다. 책 앞/뒤 어디든 배치 가능하지만 항상 기존 콘텐츠의 뒤에 위치합니다.

2. Query Parameters

2.1 breakBefore

content에서의 의미divider/publish에서의 의미
noneFlow 그대로 이어서 배치 (기본값)에러
column같은 페이지의 다음 컬럼에서 이어쓰기에러
page새 페이지에서 시작새 페이지에서 시작 (기본값)
기본값은 템플릿 종류(template_kind)에 따라 자동으로 설정됩니다. 사용자가 명시적으로 값을 지정하면 해당 값이 우선 적용됩니다.

2.2 pageSide

값: left | right.divider/publish 전용 옵션입니다. 이 특수 페이지를 어느 면에서 시작할지 지정합니다.content에서 사용 시 에러. 생략 시(auto) 제품/템플릿 기본 규칙 사용.

3. Template Kind별 동작

3.1 template_kind = content

breakBeforepageSide결과
(생략)(생략)Flow 그대로 이어붙기 (기본값 none 자동 적용)
none(생략)Flow 계속
column(생략)같은 페이지의 다음 컬럼에서 이어쓰기
page(생략)새 페이지에서 시작
(무관)left/right에러 — content는 pageSide 불가

3.2 template_kind = divider

breakBeforepageSide처리
(생략)(생략)새 페이지 시작 (기본값 page 자동 적용)
(생략)left/right새 페이지 시작 + 지정 면 강제
page(생략)새 페이지 시작
pageleft/right새 페이지 시작 + 지정 면 강제
none(무관)에러
column(무관)에러

3.3 template_kind = publish (divider와 동일)

breakBeforepageSide처리
(생략)(생략)새 페이지 시작 (기본값 page 자동 적용)
(생략)left/right새 페이지 시작 + 지정 면 강제
page(생략)새 페이지 시작
pageleft/right새 페이지 시작 + 지정 면 강제
none(무관)에러
column(무관)에러

4. pageSide 상세 동작 규칙 (면 배치 알고리즘)

4.1 기본 개념

엔진은 page_layout_state 테이블을 통해 현재 페이지 배치 상태를 관리합니다. 특수 페이지는 항상 독립 페이지로 배치되므로 최근 상태만으로 다음 배치 위치를 판단합니다.

특수 페이지는 현재 커서 기준으로 "뒤쪽"에서만 배치됩니다. 이미 생성된 페이지/면보다 앞으로 되돌아가 배치하지 않습니다.

4.2 배치 위치 계산 공식

현재 커서 pageside요청 pageSide결과 pagenum결과 pageside설명
leftleftpagenum + 1left다음 페이지 left
leftrightpagenumright같은 페이지 right
rightleftpagenum + 1left다음 페이지 left
rightrightpagenum + 1right다음 페이지 right
특수 케이스 — 스퀘어북 첫 페이지: 현재 상태 pagenum=0 (cover), pageside=right이고 첫 내지(pagenum=1)는 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

구분contentdivider / publish
breakBeforenone / column / page (기본: none)page만 허용 (기본: page), none/column은 에러
pageSide사용 불가 (에러)left / right 선택 가능 (선택 사항)
배치 방식Flow 엔진으로 이어 배치항상 독립 특수 페이지, 커서 이후에만 배치

6. 예시

예 1) 스퀘어북 첫 페이지(오른쪽 시작)에서 left 요청

http
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

http
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

http
POST /books/{id}/contents?pageSide=left
{ "templateUid": "tpl_divider" }

// page_layout_state 현재 상태:
// { "pagenum": 7, "pageside": "right" }

// 계산: right → left = 다음 페이지의 left

// 결과: pagenum=8, pageside=left 에 배치