-- 사이트 테마(색·서체·섹션) 저장. -- -- 관리자 에디터에서 사장님이 바꿀 수 있는 디자인은 6가지다: -- 템플릿 · 섹션 on/off · 섹션 순서 · 섹션별 배리에이션 · 색 · 서체 -- 그중 저장되는 자리가 있던 건 template_id 하나뿐이었다. 나머지 다섯은 브라우저 메모리에만 있다가 -- 새로고침하면 사라졌고, 발행 잡(services/site_payload)은 읽을 곳이 없어 업종 기본 표를 그대로 구웠다. -- 그래서 사장님이 섹션을 끄고 순서를 바꿔도 발행본은 언제나 업종 기본 모양으로 나갔다 — -- template_id 컬럼이 생긴 것과 정확히 같은 이유이고, 남은 다섯을 담을 자리가 이 컬럼이다. -- -- ★ 왜 컬럼 5개가 아니라 jsonb 1개인가 -- 섹션 목록·배리에이션 키·색 토큰 이름은 전부 프론트(배리에이션 레지스트리)가 소유한다. -- 관계형 컬럼으로 펼치면 프론트가 섹션이나 색 토큰을 하나 늘릴 때마다 마이그레이션이 따라와야 한다. -- 서버는 이 값을 해석하지 않고 보관·반환만 하므로 통째로 담는 것이 맞다. -- -- ★ templateId 는 여기 넣지 않는다. -- 이미 sites.template_id 컬럼이 있다. 두 곳에 두면 어느 쪽이 진짜인지 갈리고, -- uq/조회가 걸린 쪽(컬럼)과 payload 가 읽는 쪽(jsonb)이 어긋나는 순간 화면과 발행본이 달라진다. ALTER TABLE site.sites ADD COLUMN IF NOT EXISTS theme jsonb NULL; COMMENT ON COLUMN site.sites.theme IS '에디터가 정한 디자인. {"colors":{...},"fontStyle":"...","sections":[{"id","name","enabled","locked","variantId"}]} ' '— 서버는 해석하지 않고 그대로 보관·반환한다(목록은 프론트가 소유). ' 'NULL 이면 발행 잡이 업종 기본 색·서체·섹션으로 굽는다. templateId 는 sites.template_id 가 소유한다.';