diff --git a/docs/WORK_STATUS.md b/docs/WORK_STATUS.md index ef96118..f7a4497 100644 --- a/docs/WORK_STATUS.md +++ b/docs/WORK_STATUS.md @@ -86,3 +86,4 @@ | 2026-07-11 | 최초 작성 — 요구사항 27건·현황·남은 큐·함정 | | 2026-07-11 | 신규 5화면(SCR-13~17) 구현 완료 반영 + 미개발 통합 백로그 `UNDEVELOPED_BACKLOG.md` 신설·연결 | | 2026-07-11 | 모바일 트랙 하네스 신설(kintex-mobile-dev + kintex-mobile-orchestrator, WISE 모바일 레퍼런스·Stitch 디자인 경유·G3 EAS 게이트) + 웹 WISE 기능 레퍼런스 강화(kintex-frontend-dev·impl-orchestrator) | +| 2026-07-12 | **제안서.pptx 완성**(나라장터 표준 7대장·97슬라이드·RTM 142/142 QA 승인·화면갤러리 19시안) + 산출물 7종 전체 완성(개발계획서·지침서3·프로그램사양서·DA·사업수행계획서). PLANNING v3.1(계정통합·앱 2타깃)·design v2.1(84화면)·백로그 Phase F. Stitch 신규 24/64 확보(웹코어 트랙 진행·실패 12건은 서비스 저하 — 재시도 예약). 재생성: deliverables/제안서/_gen/build_deck.py | diff --git a/docs/deliverables/제안서.pptx b/docs/deliverables/제안서.pptx new file mode 100644 index 0000000..687b162 Binary files /dev/null and b/docs/deliverables/제안서.pptx differ diff --git a/docs/deliverables/제안서/_gen/_qa_rtm.py b/docs/deliverables/제안서/_gen/_qa_rtm.py new file mode 100644 index 0000000..ec42765 --- /dev/null +++ b/docs/deliverables/제안서/_gen/_qa_rtm.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +import re, json, io, sys +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') +slides = json.load(open(r"C:\GUARDiA\workspace\kintex\_workspace\proposal\_qa_slides.json", encoding="utf-8")) + +# Full REQ universe +UNIV = {} +for pfx, cnt in [("F", 81), ("A", 20), ("N", 21), ("S", 20)]: + for i in range(1, cnt + 1): + UNIV[f"{pfx}-{i:03d}"] = None # slide where covered + +# Parse each text line for badge tokens with prefix-context + range + continuation. +# Grammar we support in a run: +# REQ-

- single +# REQ-

-~ range (same prefix) +# ...·

- new prefix single continuation +# ...·

-~ new prefix range continuation +# ...· bare number continues LAST prefix (e.g. A-011·012) +# ...·~ bare range continues last prefix (e.g. 067~069) +cover = {} # req -> list of slides + +def add(pfx, a, b, sn): + for i in range(a, b + 1): + key = f"{pfx}-{i:03d}" + cover.setdefault(key, set()).add(sn) + +# token: optional prefix letter, number, optional ~ number +tok = re.compile(r"(?:REQ-)?(?:([FANS])-)?(\d{2,3})(?:\s*~\s*(?:[FANS]-)?(\d{2,3}))?") + +for s in slides: + sn = s["n"] + for t in s["texts"]: + # only scan segments that look like badge context (contain REQ- or letter-number dot chains) + for m in re.finditer(r"REQ-[FANS]-\d{2,3}(?:\s*~\s*\d{2,3})?(?:[·,\s]+(?:[FANS]-)?\d{2,3}(?:\s*~\s*\d{2,3})?)*", t): + seg = m.group(0) + last_pfx = None + for mm in tok.finditer(seg): + p, a, b = mm.group(1), mm.group(2), mm.group(3) + if p: + last_pfx = p + if last_pfx is None: + continue + ai = int(a) + bi = int(b) if b else ai + # sanity: within universe range + add(last_pfx, ai, bi, sn) + +missing = sorted(k for k in UNIV if k not in cover) +print("=== RANGE-EXPANDED BADGE COVERAGE ===") +print("COVERED (badge):", len(cover), "/ 142") +print("NOT badge-covered (", len(missing), "):", ", ".join(missing)) + +# priority 7 +prio = ["F-008", "F-010", "F-026", "F-032", "A-003", "A-005", "A-008"] +print("\n=== PRIORITY 7 BADGE STATUS ===") +for r in prio: + print(f"{r}: badge slides = {sorted(cover.get(r, []))}") + +# dump per-covered for the previously-flagged 18 +flagged = ["F-005","F-008","F-010","F-026","F-032","F-034","F-036","F-038","F-039","F-054","F-074","F-075","F-076","A-003","A-005","A-008","S-005","S-006"] +print("\n=== PREVIOUSLY-FLAGGED 18: badge coverage after range expansion ===") +for r in flagged: + sl = sorted(cover.get(r, [])) + print(f"{r}: {'BADGE ' + str(sl) if sl else 'NO BADGE'}") diff --git a/docs/deliverables/제안서/_gen/_qa_struct.py b/docs/deliverables/제안서/_gen/_qa_struct.py new file mode 100644 index 0000000..5218c56 --- /dev/null +++ b/docs/deliverables/제안서/_gen/_qa_struct.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +import json, io, sys, re +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') +S = json.load(open('_qa_slides.json', encoding='utf-8')) + +ROMAN = ["Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ","Ⅷ"] + +print("=== PER-SLIDE STRUCTURE (chapter line + first content) ===") +for s in S: + n = s["n"] + chap = "" + for t in s["texts"]: + # chapter header like "Ⅲ. 기술·기능 · ..." + if any(t.startswith(r + ".") or t.startswith(r + " ") for r in ROMAN): + chap = t + break + # headline = the longest early text that's not chapter/boilerplate + head = "" + for t in s["texts"][:6]: + if t == chap: continue + if "킨텍스" in t or "2026-07" in t or t in ROMAN: continue + if len(t) > len(head): head = t + print(f"{n:>3}| {chap[:46]:<46} | {head[:52]}") + +print("\n=== 배점 / SCORING TOKENS ===") +pats = ["80/20","35/80","90/10","70+20","90(","기술 90","기술 80","가격 10","가격 20","정성 70","정량 20","재정렬","공고 확정"] +for p in pats: + hits=[(s['n'],t[:80]) for s in S for t in s['texts'] if p in t] + print(f'--- {p!r}: {len(hits)}') + for n,t in hits[:8]: print(f' {n}: {t}') + +print("\n=== HONESTY LABELS ===") +for p in ["[검증됨]","[구현 계획]","[협의]","[가정]","[Non-Goal]","[공고"]: + hits=[(s['n'],t[:74]) for s in S for t in s['texts'] if p in t] + print(f'--- {p!r}: {len(hits)}') + for n,t in hits[:14]: print(f' {n}: {t}') + +print("\n=== WATERMARK / AI NOTICE ===") +for p in ["워터마크","AI 생성","AI-generated","watermark","합성 이미지","예상 이미지","시공 예"]: + hits=[(s['n'],t[:74]) for s in S for t in s['texts'] if p.lower() in t.lower()] + print(f'--- {p!r}: {len(hits)} : slides {sorted(set(n for n,_ in hits))}') diff --git a/docs/deliverables/제안서/_gen/build_deck.py b/docs/deliverables/제안서/_gen/build_deck.py new file mode 100644 index 0000000..7a8822a --- /dev/null +++ b/docs/deliverables/제안서/_gen/build_deck.py @@ -0,0 +1,1942 @@ +# -*- coding: utf-8 -*- +""" +킨텍스 자동전시시스템 구축 — 제안서(기술제안서) PPTX 생성기 +- 소스: _workspace/proposal/{proposal_content.md, design_system.md, visual_concepts.md, tech_advisory.md, assets/icons/*.svg, assets/screens/*} +- 디자인: KINTEX Blue #0066B3 / AI Purple #6D4AFF / 맑은 고딕 / 16:9 · 개발계획서(gen_dev_plan_pptx.py)와 동일 팔레트·톤(산출물 패밀리) +- 도식 15종은 python-pptx 도형으로 직접 작도(visual_concepts 좌표·색·라벨 그대로). 선 아이콘은 SVG→PNG(icon_raster) 삽입. +- 부록 D: assets/screens/ + screens_manifest.json 재스캔 → 화면 설계(안) 갤러리 자동 재구성. +- 보안 불변: 키·비번·IP·SSH 미기재. AI 생성 이미지 워터마크·금지 고지 유지. +재실행: python build_deck.py +""" +import os, json, glob +from pptx import Presentation +from pptx.util import Emu, Pt +from pptx.dml.color import RGBColor +from pptx.enum.text import PP_ALIGN, MSO_ANCHOR +from pptx.enum.shapes import MSO_SHAPE +from pptx.oxml.ns import qn +from icon_raster import render_icon + +BASE = os.path.dirname(os.path.abspath(__file__)) +ICONPNG = os.path.join(BASE, "_iconpng") +SCREENS = os.path.join(BASE, "assets", "screens") +os.makedirs(ICONPNG, exist_ok=True) + +# ---------------- 팔레트 (design_system §1) ---------------- +BLUE = RGBColor(0x00, 0x66, 0xB3) +BLUE_DK = RGBColor(0x00, 0x44, 0x7A) +BLUE_LT = RGBColor(0xE1, 0xEF, 0xF9) +PURPLE = RGBColor(0x6D, 0x4A, 0xFF) +PURPLE_DK = RGBColor(0x4A, 0x2F, 0xCC) +PURPLE_LT = RGBColor(0xEC, 0xE8, 0xFF) +INK = RGBColor(0x10, 0x18, 0x28) +MUTED = RGBColor(0x66, 0x70, 0x85) +SLATE = RGBColor(0x98, 0xA2, 0xB3) +LINE = RGBColor(0xE4, 0xE7, 0xEC) +BG = RGBColor(0xF9, 0xFA, 0xFB) +HALL_BG = RGBColor(0xF2, 0xF4, 0xF7) +WHITE = RGBColor(0xFF, 0xFF, 0xFF) +CARD = WHITE +GREEN = RGBColor(0x12, 0x9E, 0x63) +AMBER = RGBColor(0xE0, 0x8A, 0x00) +RED = RGBColor(0xD9, 0x2D, 0x20) +CYAN = RGBColor(0x0B, 0xA5, 0xEC) +TEAL = RGBColor(0x0E, 0x93, 0x84) +ZEBRA = RGBColor(0xFC, 0xFC, 0xFD) +BLUEMID = RGBColor(0x4A, 0x90, 0xD9) +NAVY = RGBColor(0x2B, 0x4C, 0x7E) +POLY = RGBColor(0xD8, 0xDE, 0xE8) +SUBLT = RGBColor(0xC7, 0xDD, 0xF2) +FONT = "맑은 고딕" + +EMU_W = 12192000; EMU_H = 6858000 +IN = 914400 +def inch(v): return int(v * IN) + +prs = Presentation() +prs.slide_width = EMU_W; prs.slide_height = EMU_H +BLANK = prs.slide_layouts[6] + +def slide(): return prs.slides.add_slide(BLANK) + +def _fill(sp, color): + if color is None: sp.fill.background() + else: sp.fill.solid(); sp.fill.fore_color.rgb = color + +def rect(s, x, y, w, h, fill=None, line=None, line_w=1.0, shape=MSO_SHAPE.RECTANGLE, + shadow=False, dash=None): + sp = s.shapes.add_shape(shape, inch(x), inch(y), inch(w), inch(h)) + _fill(sp, fill) + if line is None: + sp.line.fill.background() + else: + sp.line.color.rgb = line; sp.line.width = Pt(line_w) + if dash: + ln = sp.line._get_or_add_ln() + d = ln.makeelement(qn('a:prstDash'), {'val': dash}); ln.append(d) + sp.shadow.inherit = False # creates an empty + if shadow: + el = sp._element.spPr + ef = el.find(qn('a:effectLst')) + if ef is None: + ef = el.makeelement(qn('a:effectLst'), {}); el.append(ef) + sh = ef.makeelement(qn('a:outerShdw'), + {'blurRad':'90000','dist':'38100','dir':'5400000','rotWithShape':'0'}) + clr = sh.makeelement(qn('a:srgbClr'), {'val':'101828'}) + alp = clr.makeelement(qn('a:alpha'), {'val':'16000'}) + clr.append(alp); sh.append(clr); ef.append(sh) + return sp + +def line_conn(s, x1, y1, x2, y2, color=SLATE, w=1.0, dash=None): + ln = s.shapes.add_connector(2, inch(x1), inch(y1), inch(x2), inch(y2)) + ln.line.color.rgb = color; ln.line.width = Pt(w) + ln.shadow.inherit = False + if dash: + el = ln.line._get_or_add_ln() + d = el.makeelement(qn('a:prstDash'), {'val': dash}); el.append(d) + return ln + +def text(s, x, y, w, h, content, size=11, color=INK, bold=False, align=PP_ALIGN.LEFT, + anchor=MSO_ANCHOR.TOP, line_spacing=1.0, space_after=2, wrap=True): + """content: str | list[para]; para = str | seg-dict | list[seg]; seg={'t','size','color','bold'}""" + tb = s.shapes.add_textbox(inch(x), inch(y), inch(w), inch(h)) + tf = tb.text_frame + tf.word_wrap = wrap + tf.vertical_anchor = anchor + tf.margin_left = 0; tf.margin_right = 0; tf.margin_top = 0; tf.margin_bottom = 0 + if isinstance(content, str): content = [content] + for i, para in enumerate(content): + p = tf.paragraphs[0] if i == 0 else tf.add_paragraph() + p.alignment = align; p.line_spacing = line_spacing + p.space_after = Pt(space_after); p.space_before = Pt(0) + if isinstance(para, str): segs = [{"t": para}] + elif isinstance(para, dict): segs = [para] + else: segs = para + for seg in segs: + r = p.add_run(); r.text = seg.get("t","") + r.font.name = FONT; r.font.size = Pt(seg.get("size", size)) + r.font.bold = seg.get("bold", bold); r.font.color.rgb = seg.get("color", color) + rPr = r._r.get_or_add_rPr() + rPr.append(rPr.makeelement(qn('a:ea'), {'typeface':FONT})) + return tb + +def page_bg(s, color=BG): rect(s, -0.1, -0.1, 13.53, 7.7, fill=color) + +def chip(s, x, y, w, h, label, fill, tc=WHITE, size=9.5, bold=True, line=None): + rect(s, x, y, w, h, fill=fill, line=line, line_w=1.0, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x, y, w, h, label, size=size, color=tc, bold=bold, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) + +def card(s, x, y, w, h, fill=CARD, line=LINE, shadow=True): + return rect(s, x, y, w, h, fill=fill, line=line, line_w=1.0, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=shadow) + +# ---- 선 아이콘(SVG→PNG) ---- +def icon(s, name, x, y, size, color=BLUE): + hexc = '%02X%02X%02X' % (color[0], color[1], color[2]) + out = os.path.join(ICONPNG, f"{name}__{hexc}.png") + if not os.path.exists(out): + render_icon(name, (color[0], color[1], color[2]), out, px=160) + s.shapes.add_picture(out, inch(x), inch(y), inch(size), inch(size)) + +# ---- 이미지 aspect-fit 삽입 ---- +def img_fit(s, path, x, y, w, h, frame=True, framecolor=LINE, bg=WHITE): + from PIL import Image + iw, ih = Image.open(path).size + ar = iw/ih; box = w/h + if ar > box: + dw = w; dh = w/ar + else: + dh = h; dw = h*ar + dx = x + (w-dw)/2; dy = y + (h-dh)/2 + if frame: + rect(s, x, y, w, h, fill=bg, line=framecolor, line_w=1.0, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + s.shapes.add_picture(path, inch(dx), inch(dy), inch(dw), inch(dh)) + +# ---- 헤더/푸터 ---- +FOOTER = "킨텍스(KINTEX) 자동전시시스템 구축 · 기술제안서" +def content_header(s, kicker, title, idx, req=None): + page_bg(s, BG) + rect(s, 0, 0, 13.333, 0.12, fill=BLUE) + rect(s, 0.55, 0.5, 0.62, 0.62, fill=BLUE, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, 0.55, 0.5, 0.62, 0.62, f"{idx:02d}" if isinstance(idx,int) else idx, + size=20, color=WHITE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) + text(s, 1.32, 0.5, 9.3, 0.28, kicker, size=11, color=PURPLE, bold=True) + tw = (11.46 - 0.082*len(req)) if req else 11.3 # REQ 배지와 겹치지 않도록 폭 축소(길면 자동 줄바꿈) + text(s, 1.32, 0.72, tw-1.32, 0.56, title, size=19.5, color=INK, bold=True, line_spacing=0.96) + rect(s, 0.55, 1.34, 12.23, 0.02, fill=LINE) + text(s, 0.55, 7.06, 8, 0.3, FOOTER, size=8.5, color=MUTED) + text(s, 11.0, 7.06, 1.78, 0.3, "2026-07-11", size=8.5, color=MUTED, align=PP_ALIGN.RIGHT) + if req: + rw = 0.15 + 0.082*len(req) + rect(s, 12.78-rw, 0.55, rw, 0.3, fill=RGBColor(0xEE,0xF0,0xF3), shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, 12.78-rw, 0.55, rw, 0.3, req, size=8, color=MUTED, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) + +def caption(s, txt, y=6.62): + text(s, 0.55, y, 12.23, 0.3, txt, size=9.5, color=MUTED, align=PP_ALIGN.LEFT) + +# 라벨 컬러(검증됨/구현 계획/협의) +LABELC = {"[검증됨]":GREEN, "[구현 계획]":BLUE, "[협의]":AMBER, "[가정]":AMBER, "[Non-Goal]":SLATE} +def _segify(t): + """문자열에서 [라벨] 토큰을 색 run으로 분리.""" + segs=[]; i=0 + while i < len(t): + hit=None + for lab in LABELC: + if t.startswith(lab, i): hit=lab; break + if hit: + segs.append({"t":hit, "color":LABELC[hit], "bold":True}); i+=len(hit) + else: + j=i + while j < len(t): + if any(t.startswith(l, j) for l in LABELC): break + j+=1 + segs.append({"t":t[i:j]}); i=j + return segs + +def bullets(s, x, y, w, items, dot=BLUE, size=10.5, gap=0.46, lh=1.0, dotsize=0.1, tcolor=INK): + for i, it in enumerate(items): + yy = y + i*gap + rect(s, x, yy+0.07, dotsize, dotsize, fill=dot, shape=MSO_SHAPE.OVAL) + segs = _segify(it) if isinstance(it, str) else it + for sg in segs: + sg.setdefault("size", size); sg.setdefault("color", tcolor) + text(s, x+0.24, yy, w-0.24, gap, [segs], line_spacing=lh) + +def lead(s, x, y, w, h, txt, fill=BLUE, tc=WHITE, size=15): + rect(s, x, y, w, h, fill=fill, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x+0.25, y, w-0.4, h, txt, size=size, color=tc, bold=True, anchor=MSO_ANCHOR.MIDDLE) + +def wm_badge(s, x, y, w, h=0.34, size=8.5): + rect(s, x, y, w, h, fill=RGBColor(0xFC,0xE9,0xE7), line=RED, line_w=1.0, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x+0.12, y, w-0.2, h, "AI 생성 예상 이미지 — 실제 시공과 다를 수 있음. 계약·심사 서류 사용 금지.", + size=size, color=RED, bold=True, anchor=MSO_ANCHOR.MIDDLE) + +def arrow(s, x, y, big=False, color=SLATE): + text(s, x, y, 0.3, 0.5, "›" if not big else "→", size=17 if not big else 15, + color=color, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) + +def titlecard(s, x, y, w, h, title, tcolor, items, headfill=None, bodysize=9.5, hsize=12, igap=None): + card(s, x, y, w, h) + if headfill: + rect(s, x, y, w, 0.46, fill=headfill, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x, y, w, 0.46, title, size=hsize, color=WHITE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) + y0 = y+0.62 + else: + rect(s, x, y, 0.09, h, fill=tcolor, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x+0.24, y+0.13, w-0.4, 0.32, title, size=hsize, color=tcolor, bold=True) + y0 = y+0.55 + g = igap if igap else min(0.4, (h-(y0-y)-0.1)/max(1,len(items))) + for i, it in enumerate(items): + yy = y0 + i*g + rect(s, x+0.22, yy+0.06, 0.09, 0.09, fill=tcolor, shape=MSO_SHAPE.OVAL) + segs=_segify(it) if isinstance(it,str) else it + for sg in segs: sg.setdefault("size",bodysize); sg.setdefault("color",INK) + text(s, x+0.42, yy, w-0.6, g, [segs], line_spacing=0.94) + +def table(s, x, y, w, cols, rows, colw, headfill=BLUE, rowh=0.4, hsize=9.5, bsize=9, + hl_rows=None, hl_fill=BLUE_LT): + hl_rows = hl_rows or set() + rect(s, x, y, w, rowh, fill=headfill, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + cx = x + for j, c in enumerate(cols): + text(s, cx+0.1, y, colw[j]-0.12, rowh, c, size=hsize, color=WHITE, bold=True, anchor=MSO_ANCHOR.MIDDLE, + align=PP_ALIGN.CENTER if j>0 else PP_ALIGN.LEFT) + cx += colw[j] + for i, row in enumerate(rows): + ry = y + rowh + i*rowh + if i in hl_rows: + rect(s, x, ry, w, rowh, fill=hl_fill) + elif i % 2 == 1: + rect(s, x, ry, w, rowh, fill=ZEBRA) + rect(s, x, ry, w, 0.008, fill=LINE) + cx = x + for j, cell in enumerate(row): + b = (i in hl_rows) and j==0 + col = INK if j==0 else MUTED + if isinstance(cell, tuple): txt, col = cell + else: txt = cell + text(s, cx+0.1, ry, colw[j]-0.12, rowh, txt, size=bsize, color=(INK if i in hl_rows else col), + bold=(i in hl_rows), anchor=MSO_ANCHOR.MIDDLE, align=PP_ALIGN.CENTER if j>0 else PP_ALIGN.LEFT) + cx += colw[j] + +# ================================================================ +# COVER (S01) +# ================================================================ +def cover(): + s = slide() + rect(s, -0.1, -0.1, 13.53, 7.7, fill=BLUE_DK) + rect(s, 6.4, -1.5, 9, 11, fill=BLUE, shape=MSO_SHAPE.PARALLELOGRAM) + rect(s, 9.2, -2.0, 7, 12, fill=PURPLE, shape=MSO_SHAPE.PARALLELOGRAM) + # 브랜드 + rect(s, 0.85, 0.8, 0.42, 0.42, fill=WHITE, shape=MSO_SHAPE.OVAL) + rect(s, 0.97, 0.92, 0.18, 0.18, fill=PURPLE, shape=MSO_SHAPE.OVAL) + text(s, 1.42, 0.78, 6, 0.46, "KINTEX · WISE AI", size=15, color=WHITE, bold=True, anchor=MSO_ANCHOR.MIDDLE) + chip(s, 0.85, 2.3, 1.75, 0.42, "기술제안서", PURPLE, WHITE, size=12) + chip(s, 2.72, 2.3, 2.25, 0.42, "Technical Proposal", NAVY, WHITE, size=10.5) + text(s, 0.85, 2.88, 11, 1.9, [ + [{"t":"킨텍스 자동전시시스템","size":44,"color":WHITE,"bold":True}], + [{"t":"구축 기술제안서","size":44,"color":WHITE,"bold":True}], + ], line_spacing=1.02) + # 슬로건 배너 + rect(s, 0.85, 4.7, 11.4, 0.66, fill=RGBColor(0x14,0x35,0x63), shape=MSO_SHAPE.ROUNDED_RECTANGLE) + rect(s, 0.85, 4.7, 0.1, 0.66, fill=PURPLE, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + icon(s, "camera-render", 1.06, 4.86, 0.34, WHITE) + text(s, 1.55, 4.7, 10.6, 0.66, "신청서를 내는 순간, 시공 후 사진을 먼저 본다.", + size=18, color=WHITE, bold=True, anchor=MSO_ANCHOR.MIDDLE) + text(s, 0.88, 5.55, 11.4, 0.4, + "설계 → 시각화 → 발주 → 시공 → 운영 → 분석. 킨텍스에서 한 흐름으로 끝난다.", + size=12.5, color=SUBLT) + rect(s, 0.85, 6.12, 11.63, 0.02, fill=RGBColor(0x3A,0x5A,0x8C)) + text(s, 0.85, 6.32, 8.5, 0.4, [[{"t":"사업명 ","size":10.5,"color":RGBColor(0x90,0xA6,0xC9)}, + {"t":"킨텍스(KINTEX) 자동전시시스템 구축","size":11,"color":WHITE,"bold":True}]]) + text(s, 0.85, 6.68, 9.2, 0.4, [[{"t":"기술스택 ","size":10.5,"color":RGBColor(0x90,0xA6,0xC9)}, + {"t":"React(Vite)+TS · Spring Boot 3.x(Java17)+MyBatis · PostgreSQL(PostGIS) · Redis · 나노바나나 워커 · Claude AI","size":9.5,"color":WHITE}]]) + text(s, 9.7, 6.32, 2.78, 0.4, "작성일 2026-07-11", size=11, color=WHITE, bold=True, align=PP_ALIGN.RIGHT) + text(s, 9.7, 6.68, 2.78, 0.4, "제안 · GUARDiA/WISE 팀", size=9, color=RGBColor(0x90,0xA6,0xC9), align=PP_ALIGN.RIGHT) + +# ================================================================ +# 간지 divider (배점 배지) +# ================================================================ +def divider(no, kr, en, points, score, score_fill=BLUE): + s = slide() + rect(s, -0.1, -0.1, 13.53, 7.7, fill=BLUE_DK) + rect(s, 8.6, -1.5, 8, 11, fill=BLUE, shape=MSO_SHAPE.PARALLELOGRAM) + rect(s, 10.9, -2, 6, 12, fill=PURPLE, shape=MSO_SHAPE.PARALLELOGRAM) + text(s, 1.0, 2.05, 5, 2.2, no, size=150, color=RGBColor(0x2C,0x4E,0x82), bold=True) + rect(s, 1.15, 3.9, 0.9, 0.09, fill=PURPLE) + text(s, 1.15, 4.05, 7, 0.8, kr, size=34, color=WHITE, bold=True) + text(s, 1.18, 4.9, 7, 0.4, en, size=13, color=RGBColor(0x9C,0xB4,0xD8), bold=True) + for i, p in enumerate(points): + yy = 2.5 + i*0.62 + rect(s, 7.55, yy+0.07, 0.16, 0.16, fill=PURPLE, shape=MSO_SHAPE.OVAL) + text(s, 7.85, yy, 4.7, 0.5, p, size=12.5, color=WHITE, anchor=MSO_ANCHOR.MIDDLE) + # 배점 배지 + rect(s, 10.05, 0.7, 2.5, 0.6, fill=score_fill, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + text(s, 10.05, 0.7, 2.5, 0.6, score, size=13, color=WHITE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) + return s + +# ================================================================ +# 도식 ① 3중 해자 벤다이어그램 +# ================================================================ +def venn(s, detail=False): + cx = 5.0 if not detail else 4.3 + A=(cx-0.0, 3.55); B=(cx+2.5, 3.55); C=(cx+1.25, 5.35); r=1.95 + # 원(연한 fill + 굵은 stroke) + rect(s, A[0]-r/2, A[1]-r/2, r, r, fill=PURPLE_LT, line=PURPLE, line_w=2.5, shape=MSO_SHAPE.OVAL) + rect(s, B[0]-r/2, B[1]-r/2, r, r, fill=BLUE_LT, line=BLUE, line_w=2.5, shape=MSO_SHAPE.OVAL) + rect(s, C[0]-r/2, C[1]-r/2, r, r, fill=RGBColor(0xE1,0xF3,0xF1), line=TEAL, line_w=2.5, shape=MSO_SHAPE.OVAL) + # 라벨 + icon(s, "ai-sparkle", A[0]-1.35, A[1]-1.15, 0.3, PURPLE) + text(s, A[0]-2.35, A[1]-1.5, 2.3, 0.3, "나노바나나 시공 예측", size=11.5, color=PURPLE, bold=True, align=PP_ALIGN.RIGHT) + text(s, A[0]-2.35, A[1]-1.2, 2.3, 0.3, "image-to-image·40초·S1~S7", size=8, color=MUTED, align=PP_ALIGN.RIGHT) + icon(s, "postgis-spatial", B[0]+1.05, B[1]-1.15, 0.3, BLUE) + text(s, B[0]+0.05, B[1]-1.5, 2.4, 0.3, "PostGIS 실측 공간데이터", size=11.5, color=BLUE, bold=True) + text(s, B[0]+0.05, B[1]-1.2, 2.5, 0.3, "폴리곤·트렌치·배선 단일 원천", size=8, color=MUTED) + icon(s, "closed-loop", C[0]-0.15, C[1]+0.95, 0.3, TEAL) + text(s, C[0]-2.6, C[1]+1.0, 2.3, 0.3, "공사 옥션 폐루프", size=11.5, color=TEAL, bold=True, align=PP_ALIGN.RIGHT) + text(s, C[0]+0.25, C[1]+1.0, 2.7, 0.3, "AI자료→응찰→낙찰→발주 자동전환", size=8, color=MUTED) + # 중앙 해자 배지 + mx=cx+1.25 + rect(s, mx-1.1, 3.95, 2.2, 0.78, fill=INK, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + text(s, mx-1.1, 4.0, 2.2, 0.34, "우리만의 해자(Moat)", size=11, color=WHITE, bold=True, align=PP_ALIGN.CENTER) + text(s, mx-1.1, 4.34, 2.2, 0.3, "재현 난이도 높은 결합", size=8.5, color=SUBLT, align=PP_ALIGN.CENTER) + if detail: + rc = titlecard(s, 8.95, 1.55, 3.83, 5.0, "3결합 재현이 어려운 이유", PURPLE, [ + "원A [검증됨] — G1 승인·나노바나나 워커 라이브, image-to-image 구조보존 파이프라인 상주", + "원B [검증됨] — M2~M5 PostGIS 매퍼 라이브, 부스 폴리곤·트렌치·배선 단일 공간 원천", + "원C [구현 계획] — Phase D·M15, AI 설계자료가 곧 응찰 근거(attached_refs)", + "결합의 희소성 — 단일 요소는 모방 가능하나 셋의 폐루프 결합은 경쟁 전시테크·범용 SI가 재현 곤란", + "실증 우위 — '말이 아니라 이미 돈다'(인프라·인증·PostGIS·나노바나나·자동배포 기동 중)", + ], headfill=PURPLE, bodysize=9.3, igap=0.86) + + +# ================================================================ +# 후행 정의 헬퍼 (조립 시 상단 hoist) +# ================================================================ + +def scr_path(scr): return os.path.join(SCREENS, scr+".png") +def screen_panel(s, scr, x, y, w, h, label): + p = scr_path(scr) + if os.path.exists(p): + img_fit(s, p, x, y, w, h) + chip(s, x+0.12, y+h-0.36, 0.95, 0.28, scr, PURPLE, size=8) + text(s, x+1.15, y+h-0.37, w-1.3, 0.3, label, size=8.5, color=MUTED, anchor=MSO_ANCHOR.MIDDLE) + else: + rect(s, x, y, w, h, fill=HALL_BG, line=LINE, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x, y, w, h, label, size=10, color=MUTED, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) + +def org(x,y,w,h,t,sub,fill,tc,ln=None,big=False): + rect(s,x,y,w,h,fill=fill,line=(ln or fill),line_w=1.2,shape=MSO_SHAPE.ROUNDED_RECTANGLE,shadow=big) + text(s,x,y+(0.08 if sub else 0),w,(0.3 if sub else h),t,size=(11.5 if big else 10),color=tc,bold=True, + align=PP_ALIGN.CENTER,anchor=(MSO_ANCHOR.TOP if sub else MSO_ANCHOR.MIDDLE)) + if sub: text(s,x,y+0.34,w,h-0.38,sub,size=7.8,color=(MUTED if fill==WHITE else WHITE),align=PP_ALIGN.CENTER) + +def _modbox(col, ry, rh, code, name, cl, icn, strong=False): + x=mx0+col*mcw+0.03 + rect(s, x, ry, mcw-0.12, rh, fill=(PURPLE_LT if cl==PURPLE else (BLUE_LT if cl==BLUE else HALL_BG)), + line=cl, line_w=(2.2 if strong else 1.0), shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x+0.08, ry+0.05, mcw-0.24, 0.28, [[{"t":code+" ","size":9,"color":cl,"bold":True},{"t":name,"size":7.6,"color":INK}]], line_spacing=0.9) + if icn: icon(s, icn, x+mcw-0.44, ry+0.06, 0.26, cl) + +def band(y, h, fill, ln, label): + rect(s, 0.55, y, 10.6, h, fill=fill, line=ln, line_w=1.0, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + rect(s, 0.55, y, 1.45, h, fill=ln, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, 0.55, y, 1.45, h, label, size=9, color=WHITE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, line_spacing=0.9) +def nd(x, y, w, h, t, fill, tc, ln=None, sz=8.2): + rect(s, x, y, w, h, fill=fill, line=(ln or LINE), line_w=0.8, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x+0.04, y, w-0.08, h, t, size=sz, color=tc, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, line_spacing=0.88) + +# ================================================================ +# 슬라이드 시퀀스 (나라장터 표준 7대장) +# ================================================================ + +cover() + + +# ---- 목차 (표준 7대장) ---- +s = slide(); content_header(s, "CONTENTS", "목차 — 나라장터 정보시스템 표준 7대장", "―") +toc=[("Ⅰ","일반현황","제안사·수행조직·핵심 투입인력(M/M)·정량 대응",BLUE), + ("Ⅱ","전략 및 방법론","사업이해·추진전략·적용기술·표준FW·개발방법론",PURPLE), + ("Ⅲ","기술 및 기능","나노바나나·배치설계배선·옥션·관람·BI·데이터·보안",PURPLE), + ("Ⅳ","성능 및 품질","성능·SLA·품질·인터페이스·관측성",BLUE), + ("Ⅴ","프로젝트 관리","일정·관리방법론·위험이슈·품질형상",BLUE), + ("Ⅵ","프로젝트 지원","인수인계·교육·기술지원·유지보수(SM)·비상대책",BLUE), + ("Ⅶ","그 밖의 사항","확장·상생협력·하도급·기대효과",PURPLE), + ("부록","A·B·C·D","확인필요·REQ커버리지·성숙도·화면 갤러리",NAVY)] +colw=5.9 +for i,(no,t,d,cl) in enumerate(toc): + col=i//4; row=i%4 + x=0.6+col*(colw+0.33); y=1.55+row*1.24 + rect(s, x, y, colw, 1.08, fill=CARD, line=LINE, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + rect(s, x, y, 0.09, 1.08, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x+0.26, y, 1.0, 1.08, no, size=(20 if no!="부록" else 13), color=cl, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) + text(s, x+1.35, y+0.2, colw-1.6, 0.4, t, size=13.5, color=INK, bold=True) + text(s, x+1.35, y+0.62, colw-1.6, 0.4, d, size=8.6, color=MUTED, line_spacing=0.95) +caption(s, "표준 7대장(Ⅰ~Ⅶ) + 부록 — 평가부문과 장 구조를 1:1 정렬. Ⅲ(기술·기능)에 제안 무게 집중.", y=6.68) + +# ---- 배점 대응 맵 (90/10) ---- +s = slide(); content_header(s, "표준 목차 · 평가배점 대응 맵", "정보화사업 표준 배점 — 기술 90(정성70+정량20) / 가격 10에 장별 정렬", "―") +strip=[("기술능력 90","정성 70 + 정량 20",BLUE,7.4),("가격 10","입찰가격평가",PURPLE,4.83)] +sx=0.55 +for name,sub,cl,ww in strip: + rect(s, sx, 1.5, ww, 0.72, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + text(s, sx+0.2, 1.55, ww-0.3, 0.36, name, size=13, color=WHITE, bold=True, anchor=MSO_ANCHOR.MIDDLE) + text(s, sx+0.2, 1.92, ww-0.3, 0.26, sub, size=8.5, color=SUBLT, anchor=MSO_ANCHOR.MIDDLE) + sx+=ww+0.15 +heat=[("전략 및 방법론","Ⅱ","사업이해·추진전략·적용기술·표준FW·개발방법론",PURPLE), + ("기술 및 기능 (최다)","Ⅲ","나노바나나·배치설계배선·옥션·관람·BI·기술보안",PURPLE), + ("성능 및 품질","Ⅳ","성능·SLA·품질·인터페이스·관측성",BLUE), + ("프로젝트 관리","Ⅴ","일정·관리방법론·위험이슈·품질형상",BLUE), + ("프로젝트 지원","Ⅵ","인수인계·교육·기술지원·유지보수(SM)·비상",BLUE), + ("정량(보유인력·경영·실적·상생)","Ⅰ·Ⅶ","일반현황 증빙·상생협력·하도급",TEAL)] +y0=2.5 +for i,(name,ch,desc,cl) in enumerate(heat): + y=y0+i*0.62 + rect(s, 0.55, y, 4.0, 0.5, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, 0.72, y, 2.95, 0.5, name, size=9.8, color=WHITE, bold=True, anchor=MSO_ANCHOR.MIDDLE) + rect(s, 3.85, y+0.06, 0.62, 0.38, fill=WHITE, line=cl, line_w=1.2, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, 3.85, y+0.05, 0.62, 0.4, ch, size=11, color=cl, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) + text(s, 4.7, y, 8.0, 0.5, desc, size=9.2, color=INK, anchor=MSO_ANCHOR.MIDDLE) +caption(s, "배점은 수요기관 재량 — 정보화 지침 제18조 원칙값(기술90/가격10, 정성70+정량20) 표기. 실제 공고 확인 시 재정렬.", y=6.5) + +# ---- [가정] 고지 (표준 7대장) ---- +s = slide(); content_header(s, "표준 목차 · [가정] 고지 간지", "가정은 숨기지 않고 드러냅니다 — 실제 공고 확인 시 즉시 재정렬합니다", "―") +card(s, 0.55, 1.6, 12.23, 2.15) +rect(s, 0.55, 1.6, 0.1, 2.15, fill=AMBER, shape=MSO_SHAPE.ROUNDED_RECTANGLE) +icon(s, "risk-warning", 0.85, 1.85, 0.55, AMBER) +text(s, 1.6, 1.85, 11.0, 0.4, "표준 7대장 재편 — 평가배점·목차 가정 고지", size=13, color=AMBER, bold=True) +bullets(s, 1.6, 2.4, 10.9, [ + "목차 — 조달청 별지 제5호서식(정보시스템 구축) 표준 7대장(Ⅰ~Ⅶ)으로 재편", + "배점 — 정보화사업 표준 기술 90(정성70+정량20)/가격 10 [가정], 실제 공고 확인 시 재정렬", + "상생협력·하도급·투입인력 실명·단가는 [공고·컨소시엄 확정 시 기재]", + "확인 필요(T1~T5)는 부록 A에 집약 → 정직성을 강점으로 전환", +], dot=AMBER, gap=0.42) +lead(s, 0.55, 4.05, 12.23, 0.56, "우리의 태도 — 약한 고리를 먼저 드러내고 방어 논리를 붙인다. 발주처 협업 자세로 신뢰를 얻는다.", fill=INK, size=13) +caption(s, "실제 공고가 확인되면 배점·목차·분량·투입계획을 즉시 재정렬한다.") + +# ================================================================ +# Ⅰ 일반현황 +# ================================================================ + +divider("Ⅰ", "일반현황", "GENERAL STATUS", ["제안사·수행조직", "핵심 투입인력 M/M", "정량평가 대응"], "정량 대응 · 20점", TEAL) + +# ---- S02 제안 개요 ---- +s = slide(); content_header(s, "Ⅰ. 일반현황 · 제안 개요", "도면이 아니라 사진으로 컨펌하고, 그 사진으로 발주까지 종결한다", "Ⅰ", "REQ-A-001") +assets = [("camera-render","나노바나나 시공 예측","도면을 못 읽어도 신청 시점에 '시공 후 사진'으로 의사결정", PURPLE), + ("postgis-spatial","PostGIS 실측 공간데이터","부스 폴리곤·트렌치·배선 LineString 단일 원천에서 검증·정산·BI", BLUE), + ("closed-loop","공사 옥션 폐루프","AI 설계자료→응찰→낙찰→발주 자동전환, 한 흐름에서 종결", TEAL)] +cw=3.95 +for i,(ic,t,d,cl) in enumerate(assets): + x=0.55+i*(cw+0.19) + card(s, x, 1.55, cw, 2.15) + rect(s, x, 1.55, cw, 0.08, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + icon(s, ic, x+0.28, 1.85, 0.62, cl) + text(s, x+1.05, 1.9, cw-1.2, 0.5, t, size=13, color=cl, bold=True) + text(s, x+0.28, 2.68, cw-0.5, 0.9, d, size=10, color=INK, line_spacing=1.0) +lead(s, 0.55, 3.95, 12.23, 0.62, "차별점 한 줄 — “말이 아니라 이미 돈다”: 인프라·인증·PostGIS 코어·나노바나나·자동배포가 라이브로 기동 중", fill=BLUE, size=14) +bullets(s, 0.55, 4.85, 12.0, [ + "우리는 누구 — GUARDiA 표준 프레임워크(WISE/UIWS) 검증 자산 위에 전시 도메인 코어를 얹은 팀", + "왜 우리인가 — ①나노바나나 시공 예측 ②PostGIS 실측 공간데이터 ③공사 옥션 폐루프, 세 결합을 이미 라이브로 검증 [검증됨]", + "제안 무게 — 기술·기능(Ⅲ) 배점 비중이 가장 큼, 제안서 분량을 그에 맞춰 배분", +], dot=PURPLE, gap=0.5) +caption(s, "단일 요소는 모방할 수 있으나, 세 결합은 재현하기 어렵다 — 우리만의 해자.") + +# ---- Ⅰ 핵심 투입인력 (M/M) ---- +s = slide(); content_header(s, "Ⅰ. 일반현황 · 핵심 투입인력", "직군·등급·투입 M/M로 수행역량을 정량 제시 — 실명·단가는 공고 확정 시 확정", "Ⅰ") +mm_rows=[("총괄 PM","4","4","4","12"), + ("아키텍트(AA·SA·TA·DA·NA)","8","4","2","14"), + ("백엔드(공통·코어·도메인)","12","16","12","40"), + ("프론트엔드(역할별 6포털)","8","12","8","28"), + ("DB 엔지니어(PostGIS)","4","4","2","10"), + ("AI 개발(Claude·제약 솔버)","4","4","2","10"), + ("시각화(나노바나나 워커)","4","2","2","8"), + ("QA","4","6","6","16"), + ("DevOps/인프라","2","2","4","8"), + ("소계 (핵심 개발)","50","54","42","146")] +table(s, 0.55, 1.6, 8.7, ["직군","P1","P2","P3","합계(M/M)"], mm_rows, [3.4,1.05,1.05,1.05,2.15], rowh=0.42, hsize=9.5, bsize=9, hl_rows={9}) +titlecard(s, 9.45, 1.6, 3.33, 4.6, "투입 요약", PURPLE, [ + "핵심 개발 약 146 M/M + PMO·품질 오버헤드 4~8 → 총 ~150 M/M", + "12개월(Phase 1~3) 기준 · 상주 1.0 FTE PM", + "라이브 스캐폴드·인증·인프라·나노바나나로 착수 공수 실측 절감", + "실명 대신 직군·등급·M/M만 기재(개인정보·단가 미노출)", +], headfill=PURPLE, bodysize=9.0, igap=0.98) +chip(s, 0.55, 6.35, 5.7, 0.4, "가격제안 투입인력표와 1:1 매핑", BLUE, size=10) +caption(s, "직군별 공수(M/M) 산정 — 총 ~150 M/M. 예산·기간은 [가정](공공 SI 통례), 공고 확인 시 재정렬.", y=6.8) + +# S15 추진체계도 (도식 ⑬) +s = slide(); content_header(s, "Ⅰ. 일반현황 · 수행조직·추진체계", "거버넌스·아키텍트·코어·도메인·AI·QA·DevOps가 게이트로 맞물린다", "Ⅰ", "REQ-N-004") +org(4.9,1.45,3.55,0.7,"프로젝트 총괄 (PM)","범위·일정·리스크·게이트(G1·G2)",BLUE,WHITE,big=True) +line_conn(s,6.67,2.15,6.67,2.45,SLATE,1.2) +org(2.95,2.48,3.35,0.62,"개발 PM","WBS·스프린트·품질게이트",PURPLE,WHITE) +org(7.05,2.48,3.35,0.62,"PMO","관리표준·형상·QA 거버넌스",PURPLE,WHITE) +rect(s,0.55,3.35,12.23,0.38,fill=BLUE_LT,shape=MSO_SHAPE.ROUNDED_RECTANGLE) +text(s,0.72,3.35,4,0.38,"아키텍트 그룹",size=10.5,color=BLUE_DK,bold=True,anchor=MSO_ANCHOR.MIDDLE) +for i,(a,d) in enumerate([("AA","앱 아키텍처"),("SA","시스템·NFR"),("TA","기술표준"),("DA","데이터·ERD"),("NA","네트워크·보안")]): + org(0.55+i*2.46,3.82,2.32,0.62,a,d,WHITE,BLUE,BLUE) +rect(s,0.55,4.6,12.23,0.38,fill=PURPLE_LT,shape=MSO_SHAPE.ROUNDED_RECTANGLE) +text(s,0.72,4.6,4,0.38,"구현 그룹",size=10.5,color=PURPLE,bold=True,anchor=MSO_ANCHOR.MIDDLE) +for i,(a,d) in enumerate([("공통/시스템","common-dev"),("백엔드","backend-dev"),("프론트","frontend-dev"),("DB","db-engineer"),("도메인","옥션·관람·CMS·BI·관리자"),("AI·시각화","ai-dev·visualizer")]): + org(0.55+i*2.05,5.07,1.93,0.66,a,d,WHITE,PURPLE,PURPLE) +org(3.4,5.88,3.0,0.6,"품질 (kintex-qa)","점진 QA·경계면·보안 불변",GREEN,WHITE) +org(6.95,5.88,3.0,0.6,"배포 (devops-dev)","CI/CD·systemd·env",NAVY,WHITE) +caption(s, "선행 게이트(G1·G2) + Phase 게이트 QA 통과로 진행 — 거버넌스·아키텍트·실행 계층.") + +# ---- Ⅰ 정량평가 대응 ---- +s = slide(); content_header(s, "Ⅰ. 일반현황 · 정량평가 대응", "정량평가(보유인력·경영·실적·상생) 항목별 증빙 대응 — 총 20점 이내", "Ⅰ") +q=[("보유인력","투입 직군·등급·자격 증빙, 상주 PM·아키텍트 확보","org-people",BLUE), + ("경영상태","기업신용평가 등급 제출(공고 기준)","dashboard-chart",PURPLE), + ("수행실적","동일·유사 정보시스템 구축 실적 증빙","document-rtm",TEAL), + ("상생협력","중소기업 공동수급 참여지분율(별표11, 최대 5점)","tenant-building",BLUE_DK), + ("사회적책임·지리","가점 항목 대응(공고 지정 시)","check-verify",NAVY)] +for i,(t,d,ic,cl) in enumerate(q): + x=0.55+(i%3)*4.11; y=1.6+(i//3)*1.75 + card(s, x, y, 3.97, 1.55) + icon(s, ic, x+0.22, y+0.28, 0.5, cl) + text(s, x+0.9, y+0.28, 2.9, 0.4, t, size=12, color=cl, bold=True) + text(s, x+0.9, y+0.75, 2.9, 0.7, d, size=9, color=INK, line_spacing=1.0) +lead(s, 0.55, 5.35, 12.23, 0.6, "정량은 증빙 미제출 시 최하점 — 발주 확인 후 별첨(증빙)으로 100% 대응, 배점 20점 이내 확보.", fill=INK, size=12.5) +caption(s, "정량평가 항목 대응 맵 — 보유인력·경영상태·수행실적·상생협력·사회적책임. [가정] 공고 확인 시 확정.") + +# ================================================================ +# Ⅱ 전략 및 방법론 +# ================================================================ + +divider("Ⅱ", "전략 및 방법론", "STRATEGY & METHODOLOGY", ["사업이해·추진전략", "적용기술(나노바나나·AI)", "표준FW·개발방법론"], "정성 · 전략및방법론", PURPLE) + +# ---- S04 핵심 요약 (도식 ① 요약) ---- +s = slide(); content_header(s, "Ⅱ. 전략·방법론 · 제안 핵심 요약", "단일 요소는 모방할 수 있으나, 세 결합은 재현하기 어렵다 — 우리만의 해자", "Ⅱ", "REQ-A-001·002") +venn(s, detail=False) +# 우측 Win Theme 요약 +wl = ["WT-1 시공 예측", "WT-2 배치·설계·배선 3안+규정검증", "WT-3 옥션 폐루프", "WT-4 보안 3중 격리", "WT-5 멀티테넌트 SaaS"] +for i,w in enumerate(wl): + y=1.7+i*0.52 + rect(s, 9.1, y, 3.68, 0.44, fill=BLUE_LT, line=BLUE, line_w=1.0, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, 9.28, y, 3.5, 0.44, w, size=9.5, color=BLUE_DK, bold=True, anchor=MSO_ANCHOR.MIDDLE) +caption(s, "셋의 결합은 경쟁 전시테크·범용 SI가 재현하기 어렵다. 최다 배점은 Ⅲ(기술·기능).") + +# S07 배경·목적 +s = slide(); content_header(s, "Ⅱ. 전략·방법론 · 사업 이해도", "108,011㎡의 아시아권 상위 전시장, 준비는 여전히 HWP·CAD 수작업이다", "Ⅱ") +mets = [("108,011㎡","현 전시면적",BLUE),("178,000㎡","2028 제3전시장 완공",PURPLE),("수일~수주","CAD 외주 배치 리드타임",AMBER),("HWP·육안","신고·검수 방식",SLATE)] +mw=2.94 +for i,(v,l,cl) in enumerate(mets): + x=0.55+i*(mw+0.16) + rect(s, x, 1.55, mw, 1.1, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + text(s, x, 1.68, mw, 0.5, v, size=22, color=WHITE, bold=True, align=PP_ALIGN.CENTER) + text(s, x, 2.24, mw, 0.32, l, size=9.5, color=WHITE, align=PP_ALIGN.CENTER) +titlecard(s, 0.55, 2.9, 6.05, 3.3, "현행 병목 (As-Is)", SLATE, [ + "부스 배치 — CAD 외주 수작업, 수일~수주 소요", + "신고서류 — HWP 수기 작성·이메일 제출", + "배선·위치표시도 — 육안 작도, 수기 위치표시", + "규정 검수 — 홀매니저 육안 검토 병목", + "시공 결과 — 개장일에 처음 대면(사전 시각화 부재)", +], headfill=SLATE, bodysize=9.8, igap=0.5) +titlecard(s, 6.75, 2.9, 6.03, 3.3, "추진 목적 (To-Be)", PURPLE, [ + "전시 준비 전 과정을 AI로 자동화 — 설계·검증·시각화", + "리드타임·오류·외주비용을 동시 절감", + "핵심 차별화 — 시공 전 '결과 사진' 선(先)시각화", + "설계→시각화→발주→시공→운영→분석 폐루프 완성", + "KINTEX 기준 + 다중 전시관 멀티테넌트 SaaS 확장", +], headfill=PURPLE, bodysize=9.8, igap=0.5) +caption(s, "규모는 국내 최대·아시아권 상위이나, 준비 실무는 수작업에 정체 — 자동화 여지 큼.") + +# S08 As-Is 타임라인 +s = slide(); content_header(s, "Ⅱ. 전략·방법론 · 사업 이해도", "D-150부터 D-7까지, 마디마다 사람이 기다리고 CAD를 외주한다", "Ⅱ") +steps = [("D-150","판매·견적","견적을 담당자가 수기 회신 → 대기 발생",BLUE), + ("D-30","배치·설계","CAD 외주 수일~수주, 규정 위반 육안 검수",AMBER), + ("D-25","유틸리티","전기·네트워크·급배수 신청이 채널별 파편화",AMBER), + ("D-7","제출·검수","kxwp 제출·서류 육안 검토",RED)] +line_conn(s, 0.9, 3.1, 12.4, 3.1, color=SLATE, w=1.6) +bw=2.85 +for i,(d,t,pain,cl) in enumerate(steps): + x=0.7+i*(bw+0.18) + rect(s, x+bw/2-0.13, 2.97, 0.26, 0.26, fill=cl, shape=MSO_SHAPE.OVAL) + chip(s, x+bw/2-0.6, 2.3, 1.2, 0.42, d, cl, size=12) + card(s, x, 3.45, bw, 1.5) + text(s, x+0.2, 3.6, bw-0.4, 0.35, t, size=12, color=cl, bold=True) + text(s, x+0.2, 4.0, bw-0.4, 0.85, pain, size=9.5, color=INK, line_spacing=1.0) + icon(s, "risk-warning", x+bw-0.55, 3.58, 0.32, cl) +lead(s, 0.55, 5.3, 12.23, 0.62, "진단 — 각 마디의 대기·외주·육안 작업이 리드타임과 오류의 원천. To-Be 자동화의 근거.", fill=INK, size=13) +caption(s, "As-Is 프로세스 병목 — D-데이별 Pain Point.") + +# S09 페르소나 +s = slide(); content_header(s, "Ⅱ. 전략·방법론 · 사업 이해도", "6역할+2관리자, 각자의 과업·고통·기대를 정확히 안다", "Ⅱ", "REQ-F-081") +pers = [("org-people","주최자 (organizer)","배치·행사 총괄","CAD 수작업 고통",BLUE), + ("visitor-badge","참가업체 (exhibitor)","부스 신청·설계","도면 못 읽어 개장일 첫 대면",PURPLE), + ("auction-gavel","공사·장치업체","견적·시공","리스트+엑셀 매칭, 비교 부재",TEAL), + ("check-verify","홀매니저 (ops)","규정 검수·승인","육안 검수 병목",AMBER), + ("mobile","관람객 (visitor)","등록·현장","배지·체크인 대기",BLUE), + ("dashboard-chart","일반 대중 (public)","공개 열람","일정·플로어플랜 접근",SLATE)] +cw=3.95 +for i,(ic,role,task,pain,cl) in enumerate(pers): + x=0.55+(i%3)*(cw+0.19); y=1.55+(i//3)*2.35 + card(s, x, y, cw, 2.15) + rect(s, x, y, cw, 0.08, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + icon(s, ic, x+0.24, y+0.28, 0.5, cl) + text(s, x+0.9, y+0.32, cw-1.0, 0.5, role, size=11.5, color=cl, bold=True, line_spacing=0.92) + text(s, x+0.24, y+1.0, cw-0.48, 0.32, [[{"t":"과업 ","color":MUTED,"size":9,"bold":True},{"t":task,"color":INK,"size":9}]]) + text(s, x+0.24, y+1.35, cw-0.48, 0.32, [[{"t":"Pain ","color":RED,"size":9,"bold":True},{"t":pain,"color":INK,"size":9}]]) + text(s, x+0.24, y+1.7, cw-0.48, 0.32, [[{"t":"기대 ","color":GREEN,"size":9,"bold":True},{"t":"각 과업의 자동화·가시화","color":INK,"size":9}]]) +caption(s, "+ 플랫폼 관리자·테넌트 관리자 2관리자 → 역할별 포털 분리 근거(REQ-F-081).") + +# S10 To-Be 정량 +s = slide(); content_header(s, "Ⅱ. 전략·방법론 · 사업 이해도", "견적은 즉시, 배치는 수 분, 검수는 자동, 결과는 사진으로", "Ⅱ", "REQ-F-002·007·009") +rows=[("홀 배정 견적","수일 대기","즉시 (규칙엔진 2,250원/㎡ 자동)"), + ("배치도 초안","수주 CAD 외주","수 분 3안 자동생성"), + ("규정 검수","육안 검토","제출 전 자동 플래깅"), + ("위치표시도","수기 작도","좌표 클릭 자동 작도"), + ("시공 결과","개장일 첫 대면","신청 시점 사진 예측")] +table(s, 0.55, 1.7, 12.23, ["개선 항목","As-Is","To-Be"], rows, [3.6,3.9,4.73], rowh=0.62, hsize=11, bsize=10.5) +for i in range(len(rows)): + text(s, 7.35, 2.32+i*0.62, 0.4, 0.5, "→", size=13, color=PURPLE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +caption(s, "As-Is→To-Be 정량 개선 5행 — 리드타임 수일→즉시·수 분, 검수 육안→자동.") + +# S11 비전·포지셔닝 +s = slide(); content_header(s, "Ⅱ. 전략·방법론 · 추진전략", "도면·표를 보여주는 전시테크가 아니라, 사진으로 컨펌하는 베뉴 운영 플랫폼", "Ⅱ") +lead(s, 0.55, 1.6, 12.23, 1.05, "“도면이 아니라 사진으로 컨펌한다”", fill=BLUE_DK, size=26) +titlecard(s, 0.55, 2.9, 3.95, 3.3, "사진급 의사결정", PURPLE, [ + "기존 전시테크 = 도면·3D 뷰어 수준", + "우리 = 사진급 시공 예측", + "신청 시점에 결과를 본다", +], headfill=PURPLE, bodysize=10, igap=0.55) +titlecard(s, 4.65, 2.9, 3.95, 3.3, "단일 폐루프", BLUE, [ + "설계 자료가 곧 발주 근거", + "발주까지 한 흐름에서 종결", + "재입력·중복 작업 제거", +], headfill=BLUE, bodysize=10, igap=0.55) +titlecard(s, 8.75, 2.9, 4.03, 3.3, "데이터 주권", TEAL, [ + "온프레미스 Ollama 기본", + "외부 AI(Claude·Gemini)는 승인 예외만", + "데이터존 아웃바운드 0", +], headfill=TEAL, bodysize=10, igap=0.55) +caption(s, "포지셔닝 — 사진 수준 의사결정 + 폐루프 종결 + 데이터 주권.") + +# S12 3중 해자 상세 (도식 ①) +s = slide(); content_header(s, "Ⅱ. 전략·방법론 · 추진전략", "셋 중 하나는 흉내낼 수 있어도, 셋의 결합은 재현 난이도가 높다", "Ⅱ", "REQ-A-001·002") +venn(s, detail=True) +caption(s, "3중 해자 — 나노바나나 시공 예측 ∩ PostGIS 실측 공간데이터 ∩ 공사 옥션 폐루프.") + +# S13 Win Theme 5 +s = slide(); content_header(s, "Ⅱ. 전략·방법론 · 추진전략", "다섯 개의 차별화 메시지가 배점 다섯 곳을 정확히 겨눈다", "Ⅱ", "REQ-A-001·S-009") +wts = [("WT-1","도면이 아니라 사진으로 컨펌한다","AI 시각화 핵심","20점",PURPLE,"camera-render"), + ("WT-2","수 분 내 3안, 제출 전 규정 자동검증","시각화+기능 교차","20+15",BLUE,"booth-layout"), + ("WT-3","사진 수준 자료로 응찰하고 발주까지","옥션 폐루프","15점",TEAL,"auction-gavel"), + ("WT-4","AI가 만든 것은 표시, 남의 데이터는 차단","보안 3중","10점",BLUE_DK,"shield-security"), + ("WT-5","코드 배포 없이 데이터 온보딩으로 확장","멀티테넌트","5점",BLUE,"tenant-building")] +cw=2.4 +for i,(no,msg,sub,sc,cl,ic) in enumerate(wts): + x=0.55+i*(cw+0.06) + card(s, x, 1.6, cw, 4.6) + rect(s, x, 1.6, cw, 0.5, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x, 1.6, cw, 0.5, no, size=13, color=WHITE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) + icon(s, ic, x+cw/2-0.32, 2.35, 0.64, cl) + text(s, x+0.16, 3.2, cw-0.32, 1.4, msg, size=10.5, color=INK, bold=True, align=PP_ALIGN.CENTER, line_spacing=1.02) + text(s, x+0.16, 4.9, cw-0.32, 0.5, sub, size=9, color=MUTED, align=PP_ALIGN.CENTER) + chip(s, x+cw/2-0.6, 5.5, 1.2, 0.44, sc, cl, size=11) +caption(s, "5개 Win Theme가 평가배점 5개 항목(20·20+15·15·10·5)에 1:1 대응.") + +# S17 나노바나나 개요 +s = slide(); content_header(s, "Ⅱ. 전략·방법론 · 적용기술(나노바나나)", "시공 전에 사진으로 의사결정한다 — 경쟁 전시테크가 못 하는 차별화", "Ⅱ", "REQ-A-001") +bullets(s, 0.55, 1.6, 7.0, [ + "문제 — 참가업체는 도면을 못 읽어 개장일에야 결과를 처음 본다", + "해법 — image-to-image로 빈 부스(도면/실측)를 '시공 후 사진'으로 예측", + "실증 — Gemini 라이브(G1 소유자 승인 완료), 워커 상주 [검증됨]", + "효과 — 조감도 외주(비용·시간) 대체, 신청 시점 의사결정", +], dot=PURPLE, gap=0.62, size=11) +screen_panel(s, "SCR-12", 7.85, 1.6, 4.93, 3.5, "시각화 갤러리 — 표준 샷 · 워터마크 표기") +wm_badge(s, 7.85, 5.2, 4.93, 0.62) +lead(s, 0.55, 4.5, 7.0, 0.9, "“도면이 아니라 사진으로 컨펌한다” — 신청 시점에 결과 사진으로 의사결정하는 유일 차별화.", fill=PURPLE, size=13) +caption(s, "Gemini gemini-3.1-flash-image-preview 워커 라이브 [검증됨] · 모든 컷 워터마크 항상 포함.") + +# S19 image-to-image 구조보존 +s = slide(); content_header(s, "Ⅱ. 전략·방법론 · 적용기술(나노바나나)", "골격·치수·통로·카메라 앵글은 잠그고, 스타일·재질만 사실화한다", "Ⅱ", "REQ-A-002·003") +titlecard(s, 0.55, 1.6, 6.05, 3.4, "보존 (잠금) — 왜곡·과장 방지", BLUE, [ + "부스 골격·치수", + "통로·동선", + "카메라 앵글·시점", + "참조 이미지 inlineData 기준 구조 고정", +], headfill=BLUE_DK, bodysize=11, igap=0.58) +titlecard(s, 6.75, 1.6, 6.03, 3.4, "교체 (사실화) — 사진 리얼리티", PURPLE, [ + "스타일·컨셉", + "재질·마감", + "조명·분위기", + "구조화 프롬프트 사전(BOOTH_TYPES·STYLES·FIXTURE_LAYERS)", +], headfill=PURPLE, bodysize=11, igap=0.58) +lead(s, 0.55, 5.25, 12.23, 0.62, "검증 패턴 — ReRoomAI의 image-to-image 보존/교체 분리를 이식(reroomai-source.md).", fill=INK, size=13) +caption(s, "보존/교체 파라미터 분리로 왜곡·과장 방지 + 사진급 리얼리티 동시 달성.") + +# S20 파이프라인 (도식 ③) +s = slide(); content_header(s, "Ⅱ. 전략·방법론 · 적용기술(나노바나나)", "생성은 전면 비동기 — 사용자는 대기하지 않고, 완료는 WebSocket으로 밀어준다", "Ⅱ", "REQ-A-007·N-006") +boxes=[("사용자\n렌더 요청",BLUE_LT,BLUE,"mobile"),("Spring 백엔드\nRenderJob·쿼터",WHITE,BLUE,None), + ("Redis 큐\nleftPush",WHITE,BLUE,"pipeline-flow"),("워커\nBLPOP",PURPLE_LT,PURPLE,"ai-sparkle"), + ("Gemini\nimage-to-image",PURPLE_LT,PURPLE,None),("워터마크·S6\n로컬 PIL 래스터",PURPLE_LT,PURPLE,"watermark"), + ("오브젝트\n스토리지",WHITE,BLUE,None),("WebSocket\n완료 푸시",BLUE_LT,BLUE,None)] +bw=1.44; bx0=0.55; by=2.35; bh=1.0 +for i,(t,fl,cl,icn) in enumerate(boxes): + x=bx0+i*(bw+0.075) + rect(s, x, by, bw, bh, fill=fl, line=cl, line_w=1.3, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + if icn: icon(s, icn, x+bw/2-0.18, by+0.1, 0.36, cl) + text(s, x+0.06, by+(0.46 if icn else 0.14), bw-0.12, bh-0.5, t, size=8.3, color=(PURPLE_DK if cl==PURPLE else BLUE_DK), bold=True, align=PP_ALIGN.CENTER, line_spacing=0.9) + if i in(3,4): chip(s, x+bw/2-0.35, by-0.28, 0.7, 0.24, "라이브", GREEN, size=7.5) + if i point)","최단 경로 ST_Length · 통로 횡단 최소","SRID 0 홀 로컬 미터 · GiST 실시간"] +for i,nt in enumerate(notes): + yy=4.05+i*0.6 + rect(s, 9.6, yy+0.06, 0.09, 0.09, fill=BLUE, shape=MSO_SHAPE.OVAL) + text(s, 9.8, yy, 2.85, 0.55, nt, size=8.6, color=INK, line_spacing=0.95) +caption(s, "홀별 평면도 15장 + CAD 확보 [검증됨] · 미확보 구간은 '가정 좌표(실측 대기)' 라벨(R-2).") + +# S28 위치표시도·유틸리티 신청 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 기능(위치표시도)", "좌표 클릭으로 위치표시도를 자동 작도하고, 신청·견적은 D-25 역산으로 챙긴다", "Ⅲ", "REQ-F-017·018") +bullets(s, 0.55, 1.6, 6.9, [ + "위치표시도 자동생성 — 좌표 클릭 자동 작도, 수기 작도 폐지(REQ-F-017)", + "네트워크·급배수·압축공기 신청 + 마감 리마인더(D-25 역산)(REQ-F-018)", + "자동 견적 연동 — 신청과 동시에 요율 기반 견적 산출", +], dot=BLUE, gap=0.6, size=11) +screen_panel(s, "SCR-08", 7.7, 1.6, 5.08, 3.7, "유틸리티 신청 요약·위치표시도") +caption(s, "수기 위치표시도 폐지 — 좌표 클릭 자동 작도로 오류·리드타임 제거.") + +# ---- P3-D 옥션 ---- +# S29 옥션 폐루프 (도식 ⑦) +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 기능(옥션 폐루프)", "AI가 만든 설계 자료가 곧 응찰 근거이고, 한 흐름에서 발주까지 끝난다", "Ⅲ", "REQ-F-025·026·031") +# 좌측 AI 자료 스택 +rect(s, 0.55, 2.0, 2.7, 3.4, fill=PURPLE_LT, line=PURPLE, line_w=1.3, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) +icon(s, "ai-sparkle", 1.6, 2.15, 0.5, PURPLE) +text(s, 0.7, 2.72, 2.4, 0.3, "AI 자료 패키지", size=11, color=PURPLE, bold=True, align=PP_ALIGN.CENTER) +for i,t in enumerate(["M2 배치","M3 설계","M4 배선/BOQ","M5 시공예측 이미지"]): + yy=3.15+i*0.5 + rect(s, 0.75, yy, 2.3, 0.4, fill=WHITE, line=PURPLE, line_w=0.8, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, 0.75, yy, 2.3, 0.4, t, size=9, color=INK, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +flow=[("옥션 개설\n(역경매/RFQ/고정가)",BLUE,"auction-gavel"), + ("등록업체 검증 게이트\n미등록 응찰 차단 403",RED,"shield-security"), + ("견적서 제출\nPDF·버전",BLUE,"document-rtm"), + ("실시간 순위·라운드 마감\nRedis 정렬셋·WS 델타",BLUE,"dashboard-chart"), + ("종합평가 낙찰\n가격+평판+납기",PURPLE,"check-verify"), + ("Award → 계약/발주 자동전환\nM6·M9",TEAL,"closed-loop")] +positions=[(3.55,2.0),(6.65,2.0),(9.75,2.0),(9.75,3.75),(6.65,3.75),(3.55,3.75)] +fw=2.9; fh=1.4 +for i,((t,cl,icn),(x,y)) in enumerate(zip(flow,positions)): + rect(s, x, y, fw, fh, fill=(PURPLE_LT if cl==PURPLE else (RGBColor(0xFC,0xE9,0xE7) if cl==RED else (RGBColor(0xE1,0xF3,0xF1) if cl==TEAL else BLUE_LT))), + line=cl, line_w=(2.0 if cl==RED else 1.2), shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + icon(s, icn, x+0.14, y+0.14, 0.34, cl) + text(s, x+0.56, y+0.12, fw-0.6, fh-0.2, t, size=9.3, color=(INK), bold=True, line_spacing=0.95, anchor=MSO_ANCHOR.MIDDLE) + text(s, x+fw/2-0.12, y-0.02, 0.3, 0.4, str(i+1), size=9, color=WHITE, bold=True, align=PP_ALIGN.CENTER) + chip(s, x+fw/2-0.15, y-0.02, 0.3, 0.3, str(i+1), cl, size=8) +line_conn(s, 3.25, 3.0, 3.55, 2.7, color=PURPLE, w=1.5) +caption(s, "AI 설계자료가 곧 발주 근거. 사진 수준 자료로 응찰→발주까지 한 흐름 [구현 계획: Phase D-M15].") + +# S30 역경매 순위 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 기능(역경매)", "라운드·마감·최저가·내 위치를 실시간으로, 자동마감까지", "Ⅲ", "REQ-F-027") +rows=[("A 장치","1,240만원","4.2점","D+3","1위"),("B 시공","1,285만원","4.5점","D+2","2위"), + ("C 종합","1,310만원","4.1점","D+4","3위"),("D 부스","1,360만원","3.9점","D+3","4위")] +table(s, 0.55, 1.7, 7.6, ["업체","현재 최저가","평판","납기","순위"], rows, [1.9,1.9,1.2,1.2,1.4], rowh=0.5, hl_rows={0}) +titlecard(s, 8.35, 1.7, 4.43, 3.5, "실시간 메커니즘", BLUE, [ + "실시간 순위 = Redis 정렬셋 + WebSocket 델타 푸시", + "라운드 마감 = Redis 타이머(자동마감)", + "익명 옵션 · 내 위치 표시", + "스캐폴드 4계층·큐·WS 패턴 확정 [구현 계획]", +], headfill=BLUE, bodysize=9.5, igap=0.6) +chip(s, 0.55, 4.4, 3.0, 0.5, "잔여 시간 02:14:37", RED, size=13) +caption(s, "실시간 순위 보드 — 업체 순위·최저가·잔여 시간, 라운드 자동마감.") + +# S31 종합평가 낙찰 (도식 ⑧) +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 기능(종합평가 낙찰)", "가격만이 아니라 평판·납기까지 가중 스코어로 투명하게 낙찰한다", "Ⅲ", "REQ-F-028·030·031") +text(s, 0.55, 1.5, 12.2, 0.3, "가중치(예): 가격 0.6 / 평판 0.25 / 납기 0.15 — 옥션별 설정형(weight jsonb)", size=9.5, color=MUTED) +rows=[("B 시공","1,285만원(92)","4.5(90)","D+2(95)","91.6","1위"), + ("A 장치","1,240만원(96)","4.2(84)","D+3(88)","91.2","2위"), + ("C 종합","1,310만원(88)","4.1(82)","D+4(80)","85.3","3위"), + ("D 부스","1,360만원(80)","3.9(78)","D+3(88)","81.3","4위")] +table(s, 0.55, 1.9, 12.23, ["업체","견적금액(점수)","평판(점수)","납기(점수)","가중 종합점수","순위"], + rows, [2.2,3.0,2.2,2.2,1.83,0.78], rowh=0.56, hl_rows={0}) +# 낙찰 배지 +icon(s, "check-verify", 11.6, 2.5, 0.3, GREEN) +lead(s, 0.55, 4.8, 12.23, 0.62, "선정 사유·항목별 비교 근거 자동 산출 — 가격만이 아니라 평판·납기 가중으로 투명·최적 발주.", fill=INK, size=13) +bullets(s, 0.55, 5.7, 12.0, [ + "등록업체 AI 매칭 추천(REQ-F-030) · 물량서(BOQ) 자동산출 근거(REQ-F-031)", +], dot=PURPLE, gap=0.4, size=10) +caption(s, "1위(B 시공) = BLUE_LT 강조 + 낙찰(Award). 종합점수 가중합 시각화.", y=6.35) + +# S32 등록 게이트·발주 전환 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 기능(등록 게이트·발주)", "미등록 업체는 응찰 자체가 차단(403)되고, 낙찰은 계약·발주로 자동 전환된다", "Ⅲ", "REQ-F-029·032·S-007") +seq=[("응찰 시도",BLUE),("M7 등록 검증\nTB_COMPANY.kintex_registered",PURPLE),("미등록?\nNOT_REGISTERED_COMPANY 403",RED),("등록 확인 → 응찰 허용",GREEN)] +for i,(t,cl) in enumerate(seq): + x=0.55+i*3.12 + rect(s, x, 1.7, 2.9, 1.1, fill=(RGBColor(0xFC,0xE9,0xE7) if cl==RED else (BLUE_LT if cl==BLUE else (PURPLE_LT if cl==PURPLE else RGBColor(0xE3,0xF6,0xEC)))), + line=cl, line_w=1.3, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + text(s, x+0.1, 1.7, 2.7, 1.1, t, size=9.5, color=INK, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, line_spacing=0.95) + if i<3: text(s, x+2.9-0.05, 1.7, 0.24, 1.1, "›", size=16, color=SLATE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +lead(s, 0.55, 3.2, 12.23, 0.7, "킨텍스 '등록업체 시공 필수' 규정을 시스템이 강제 — 미등록 = 응찰 원천 차단(403).", fill=RED, size=13) +titlecard(s, 0.55, 4.15, 12.23, 2.15, "발주 자동전환", TEAL, [ + "Award → 계약/발주 자동전환(M6 서류·M9 정산 연동)", + "이벤트 디커플 — 모듈 간 직접 호출 없이 이벤트로 연동, 순환 의존 금지", + "낙찰 확정 시점에 계약서·발주서·납부 스케줄 자동 생성 흐름으로 연결", +], headfill=TEAL, bodysize=10, igap=0.5) +caption(s, "등록 검증 시퀀스 + 발주 전환 — 규정 강제와 폐루프 완결.") + +# ---- P3-E 판매·서류 ---- +# S33 판매 M1 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 기능(판매·서류)", "가용성은 실시간 캘린더로, 견적은 규칙엔진으로 즉시, 신청은 웹폼→HWP로", "Ⅲ", "REQ-F-001~006") +bullets(s, 0.55, 1.6, 6.9, [ + "홀/반홀 가용성 실시간 캘린더(REQ-F-001)", + "규칙엔진 자동 견적 — 2,250원/㎡ [협의: C4 요율 공식본](REQ-F-002)", + "배정신청 웹폼→HWP 자동생성(REQ-F-003)", + "부스 판매 인벤토리·온라인 셀프 선택(REQ-F-004·005)", + "임대계약 전자서명(선택, REQ-F-006)", +], dot=BLUE, gap=0.56, size=10.5) +screen_panel(s, "SCR-02", 7.7, 1.6, 5.08, 3.7, "주최자 대시보드 — 행사·가용성·신청 현황") +caption(s, "견적 수일 대기 → 즉시(규칙엔진). 신청 웹폼→HWP 자동생성으로 수작업 제거.") + +# S34 서류 M6 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 기능(서류·마일스톤)", "D-150/30/25/7을 역산해 알리고, 웹폼은 HWP/PDF로, 검수는 AI가 돕는다", "Ⅲ", "REQ-F-020~024·A-011·012") +mile=[("D-150","판매·계약",BLUE),("D-30","배치·설계 마감",AMBER),("D-25","유틸리티 신청",AMBER),("D-7","제출·검수",RED)] +line_conn(s, 0.9, 2.35, 8.2, 2.35, color=SLATE, w=1.5) +for i,(d,t,cl) in enumerate(mile): + x=0.7+i*1.9 + rect(s, x+0.75, 2.22, 0.26, 0.26, fill=cl, shape=MSO_SHAPE.OVAL) + chip(s, x+0.3, 1.65, 1.15, 0.4, d, cl, size=11) + text(s, x, 2.6, 1.85, 0.5, t, size=9, color=INK, bold=True, align=PP_ALIGN.CENTER, line_spacing=0.9) +bullets(s, 0.55, 3.4, 8.0, [ + "마일스톤 자동생성·역산 알림(F-020) · 신고서류 웹폼→HWP/PDF 7종(F-021)", + "서류 버전·전자결재 워크플로(F-023) · OCR 계약·납품서 자동등록(F-024·A-020)", + "AI 서류 검수(누락·불일치)(A-011) · 규정 자연어 챗봇(근거·인용)(A-012)", + "kxwp 제출 릴레이 — 웹폼→HWP/PDF까지 완결, 릴레이만 킨텍스 IT 협의 [협의: C2, R-3](F-022)", +], dot=PURPLE, gap=0.55, size=10) +screen_panel(s, "SCR-10", 9.0, 3.35, 3.78, 2.95, "홀매니저 승인 큐 — 서류·전자결재") +caption(s, "D-데이 역산 알림 + 웹폼→HWP/PDF + AI 검수 — 서류 리드타임·오류 절감.") + +# ---- P3-F 관람·참가 ---- +# S35 관람 M10 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 기능(관람·등록)", "사전등록→모바일 배지→현장 체크인→리드까지, 오프라인에서도 끊기지 않는다", "Ⅲ", "REQ-F-037~044·A-018") +journey=[("사전등록","유형별·중복검증",BLUE,"document-rtm"),("모바일 배지/QR","발급",PURPLE,"mobile"), + ("현장 체크인","QR·즉석 인쇄·집계",BLUE,"visitor-badge"),("리드 캡처","AI 스코어링·분류",PURPLE,"dashboard-chart")] +jw=2.9 +for i,(t,d,cl,icn) in enumerate(journey): + x=0.55+i*(jw+0.14) + card(s, x, 1.65, jw, 2.0) + rect(s, x, 1.65, jw, 0.08, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + icon(s, icn, x+jw/2-0.28, 1.9, 0.56, cl) + text(s, x+0.1, 2.6, jw-0.2, 0.4, t, size=11.5, color=cl, bold=True, align=PP_ALIGN.CENTER) + text(s, x+0.1, 3.05, jw-0.2, 0.5, d, size=9, color=MUTED, align=PP_ALIGN.CENTER) + if i<3: text(s, x+jw-0.02, 1.65, 0.2, 2.0, "›", size=16, color=SLATE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +chip(s, 4.8, 3.85, 3.7, 0.44, "오프라인 체크인 폴백 (REQ-F-040)", GREEN, size=10) +bullets(s, 0.55, 4.55, 12.0, [ + "참가업체 리드캡처(F-041) · AI 리드 스코어링·분류(F-042·A-018) · 세그먼트 EDM(F-043)", + "티켓발권·AI폼빌더·스마트배지(선택, F-044)", +], dot=PURPLE, gap=0.45, size=10) +caption(s, "등록→체크인→리드 여정 — 오프라인에서도 끊기지 않는 현장 폴백.") + +# S36 비즈매칭·CMS·공개사이트 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 기능(비즈매칭·공개)", "AI가 매칭을 추천하고, 다국어 공개사이트·마이크로사이트가 SEO로 관람객을 모은다", "Ⅲ", "REQ-F-045~051·067~069") +titlecard(s, 0.55, 1.6, 6.05, 3.1, "비즈매칭·마케팅 (M11)", PURPLE, [ + "AI 비즈매칭 추천(F-045·A-018)", + "미팅 슬롯·성과 리포트(F-046)", + "이벤트 모바일앱·세션·채팅·설문(F-047)", + "세그먼트 EDM·캠페인 자동화(F-050)·스폰서십(F-051)", +], headfill=PURPLE, bodysize=9.8, igap=0.52) +titlecard(s, 6.75, 1.6, 6.03, 3.1, "CMS·공개사이트 (M12·M17)", BLUE, [ + "공개 홍보 사이트(SEO·다국어)(F-048)", + "공개 인터랙티브 플로어플랜(F-049)", + "CMS 게시 워크플로·버전(F-067)·마이크로사이트(F-068)", + "다국어 콘텐츠·hreflang(F-069) · AI 카피·번역(A-015)", +], headfill=BLUE, bodysize=9.8, igap=0.52) +lead(s, 0.55, 5.0, 12.23, 0.62, "AI 매칭으로 성과를 높이고, 다국어 SEO 공개사이트로 관람객·바이어를 모은다.", fill=INK, size=13) +caption(s, "공개사이트 + 마이크로사이트 + AI 매칭 — 참가·관람 유입 확대.") + +# ---- P3-G 정산·BI·현장 ---- +# S37 정산 M9 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 기능(정산·결제)", "납부는 스케줄로, 결제는 PG로, 예치금은 실사용까지 투명하게 정산한다", "Ⅲ", "REQ-F-056~060") +flow=[("납부 스케줄\n자동생성·알림",BLUE),("PG 결제\n유틸리티·부대",PURPLE),("예치금\n실사용 정산",TEAL),("세금계산서\n수수료 정산",BLUE)] +for i,(t,cl) in enumerate(flow): + x=0.55+i*3.12 + rect(s, x, 1.7, 2.9, 1.3, fill=(PURPLE_LT if cl==PURPLE else (RGBColor(0xE1,0xF3,0xF1) if cl==TEAL else BLUE_LT)), + line=cl, line_w=1.3, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + text(s, x+0.1, 1.7, 2.7, 1.3, t, size=11, color=INK, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, line_spacing=1.0) + if i<3: text(s, x+2.9-0.05, 1.7, 0.24, 1.3, "›", size=16, color=SLATE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +bullets(s, 0.55, 3.4, 12.0, [ + "납부 스케줄 자동생성·알림(F-056) · 유틸리티·부대 PG 결제(F-057)", + "예치금 실사용 정산 투명화(F-058) · 세금계산서·옥션 수수료 정산(F-059)", + "환불·취소 규정 자동(선택, F-060)", +], dot=BLUE, gap=0.5, size=10.5) +lead(s, 0.55, 5.1, 12.23, 0.62, "예치금은 실사용까지 투명 정산 — PG 결제·세금계산서·옥션 수수료를 한 흐름에.", fill=INK, size=13) +caption(s, "정산 흐름 — 납부→결제→예치금 정산→세금계산서.") + +# S38 BI-1 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 기능(경영분석 BI)", "가동률·매출구성·행사별 P&L·㎡당 수익을 운영사 관점 한 화면에", "Ⅲ", "REQ-F-061~063") +bullets(s, 0.55, 1.6, 6.9, [ + "홀·기간별 가동률 대시보드(REQ-F-061)", + "매출 구성·행사별 P&L(REQ-F-062)", + "전시장 ROI·RevPAD·㎡당 수익(REQ-F-063)", + "BI 집계·조회는 읽기복제 오프로드(운영 프라이머리 보호)", +], dot=BLUE, gap=0.58, size=10.5) +screen_panel(s, "SCR-13", 7.7, 1.6, 5.08, 3.7, "경영분석 대시보드 — 가동률·매출·P&L·RevPAD") +caption(s, "운영사 관점 한 화면 — Recharts 대시보드, 읽기복제로 운영 부하 격리.") + +# S39 BI-2 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 기능(경영분석 BI)", "리텐션·LTV·참가사 ROI를 권한 격리로, AI가 수요를 예측하고 KPI를 브리핑한다", "Ⅲ", "REQ-F-064~066·A-013·014") +bullets(s, 0.55, 1.6, 7.0, [ + "참가사 리텐션·LTV 코호트(REQ-F-064)", + "참가업체 관점 ROI — 권한 격리(자사 데이터만)(REQ-F-065)", + "경영진 KPI 대시보드·드릴다운(REQ-F-066)", + "AI 수요예측·수율/동적가격(REQ-A-013)", + "AI KPI 브리핑·자연어 조회 Text-to-SQL(REQ-A-014)", +], dot=PURPLE, gap=0.55, size=10.5) +titlecard(s, 7.85, 1.6, 4.93, 3.4, "데이터 거버넌스", TEAL, [ + "BI 마트는 개인 식별자 비반입(집계만)", + "참가업체는 자사 데이터만(격리)", + "AI 인사이트는 근거·인용 병기", +], headfill=TEAL, bodysize=10, igap=0.6) +caption(s, "KPI 드릴다운 + AI 인사이트 — 권한 격리와 개인정보 비반입 원칙 준수.") + +# S40 현장운영·물류 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 기능(현장운영·물류)", "반입/반출 슬롯·통행증 QR·wayfinding·이상탐지 — 선택 기능은 시설 협의 전제로", "Ⅲ", "REQ-F-033~036·052~055") +bullets(s, 0.55, 1.6, 6.9, [ + "반입/반출 슬롯 예약·통행증 QR·중량물 우선(F-033·034)", + "지게차·부대장비 렌탈·철거 대기열 시뮬(F-035·036)", + "실내 wayfinding·POI·경로(F-052)", + "혼잡 모니터·예측·전력부하·주차(F-053·054·A-019)", + "안전 위반·이상탐지(F-055·A-019) · 사이니지 배포(F-070)", +], dot=BLUE, gap=0.55, size=10.5) +screen_panel(s, "SCR-14", 7.7, 1.6, 5.08, 3.0, "홀 현장운영 대시보드 — 혼잡·전력·안전·물류") +rect(s, 7.7, 4.75, 5.08, 0.85, fill=RGBColor(0xFF,0xF6,0xE8), line=AMBER, line_w=1.0, shape=MSO_SHAPE.ROUNDED_RECTANGLE) +text(s, 7.85, 4.75, 4.8, 0.85, "[협의] wayfinding 비콘·IoT·사이니지 HW는 킨텍스 시설 인프라 협의 전제(C7, R-7). 미협의 시에도 코어 가치(WT-1~4)는 HW 독립.", size=8.8, color=AMBER, bold=True, anchor=MSO_ANCHOR.MIDDLE, line_spacing=0.95) +caption(s, "현장 운영 상황판 — 선택 기능(비콘·IoT·사이니지)은 시설 협의 전제, 코어는 HW 독립.") + +# S41 전체 아키텍처 (도식 ⑨) +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 시스템 장비구성", "확정 스택으로 이미 기동 중 — 도상이 아니라 동작하는 아키텍처다", "Ⅲ", "REQ-A-016·F-081") +band(1.45, 0.5, BLUE_LT, BLUE, "엣지/DMZ") +nd(2.15,1.5,4.3,0.4,"CDN·정적캐시",WHITE,INK,BLUE); nd(6.55,1.5,4.5,0.4,"WAF/Reverse Proxy(nginx)·TLS·레이트리밋",WHITE,INK,BLUE) +band(2.02, 0.5, BLUE_LT, BLUE, "역할별\n프론트") +for i,p in enumerate(["organizer","exhibitor","contractor","ops","admin","public/visitor"]): + nd(2.15+i*1.5,2.07,1.42,0.4,p,WHITE,(MUTED if p=="admin" else INK),(SLATE if p=="admin" else BLUE),7.6) +band(2.59, 0.46, BLUE, BLUE_DK, "SSO·RBAC") +nd(2.15,2.62,8.9,0.4,"JWT SSO + TOTP 2FA · 이중 RBAC(플랫폼/행사)",BLUE_LT,BLUE_DK,BLUE) +band(3.13, 0.86, WHITE, BLUE, "공유\n백엔드") +nd(2.15,3.2,8.9,0.34,"REST + WebSocket / STOMP",BLUE_LT,BLUE_DK,BLUE) +for i,t in enumerate(["룰엔진","배치·배선·PostGIS","옥션 M15","BI M16","CMS M17","공개 API(RO)"]): + nd(2.15+i*1.49,3.58,1.42,0.36,t,WHITE,INK,BLUE,7.4) +band(4.07, 0.5, PURPLE_LT, PURPLE, "비동기") +nd(2.15,4.12,3.0,0.4,"Redis 큐·순위·타이머·쿼터",WHITE,INK,PURPLE) +nd(5.3,4.12,2.9,0.4,"나노바나나 워커",PURPLE_LT,PURPLE,PURPLE); nd(8.3,4.12,2.75,0.4,"서류·EDM 워커",WHITE,INK,PURPLE) +band(4.64, 0.5, HALL_BG, BLUE_DK, "데이터") +nd(2.15,4.69,3.3,0.4,"PostgreSQL + PostGIS",WHITE,INK,BLUE_DK); nd(5.55,4.69,2.7,0.4,"읽기복제(BI·공개)",WHITE,INK,BLUE_DK); nd(8.35,4.69,2.7,0.4,"오브젝트 스토리지",WHITE,INK,BLUE_DK) +# 우측 외부 게이트 컬럼 +rect(s, 11.35, 1.45, 1.43, 3.69, fill=INK, shape=MSO_SHAPE.ROUNDED_RECTANGLE) +text(s, 11.35, 1.52, 1.43, 0.3, "외부 게이트", size=8.5, color=WHITE, bold=True, align=PP_ALIGN.CENTER) +for i,(g,live) in enumerate([("Gemini",True),("Claude",False),("PG 결제",False),("kxwp 릴레이",False),("등록업체 DB",False)]): + yy=1.9+i*0.62 + rect(s, 11.45, yy, 1.23, 0.5, fill=WHITE, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, 11.45, yy+0.02, 1.23, 0.3, g, size=8, color=INK, bold=True, align=PP_ALIGN.CENTER) + if live: chip(s, 11.6, yy+0.26, 0.95, 0.2, "라이브", GREEN, size=6.5) +caption(s, "6밴드 계층 + 외부 게이트 — 인프라·CI/CD·인증·PostGIS 코어·나노바나나 [검증됨].") + +# S42 단일 공간원천 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 데이터 요구사항", "부스 폴리곤·트렌치 포인트·배선 LineString은 하나의 원천에서만 산다", "Ⅲ", "REQ-N-008·017") +rect(s, 4.4, 1.7, 4.5, 1.0, fill=PURPLE, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) +icon(s, "postgis-spatial", 4.6, 1.9, 0.6, WHITE) +text(s, 5.3, 1.78, 3.5, 0.5, "PostGIS 단일 공간 원천", size=13, color=WHITE, bold=True) +text(s, 5.3, 2.24, 3.5, 0.4, "SRID 0 홀 로컬 미터 · GiST 인덱스", size=9, color=SUBLT) +srcs=[("M2 부스 폴리곤","booth-layout"),("M4 트렌치 포인트","postgis-spatial"),("M4 배선 LineString","wiring-power")] +for i,(t,icn) in enumerate(srcs): + x=1.0+i*3.9 + rect(s, x, 3.4, 3.5, 0.9, fill=BLUE_LT, line=BLUE, line_w=1.2, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + icon(s, icn, x+0.2, 3.6, 0.44, BLUE) + text(s, x+0.8, 3.4, 2.6, 0.9, t, size=10.5, color=BLUE_DK, bold=True, anchor=MSO_ANCHOR.MIDDLE) + line_conn(s, x+1.75, 3.4, 6.65, 2.7, color=SLATE, w=1.0) +bullets(s, 0.55, 4.7, 12.0, [ + "M2 폴리곤·M4 배선 매퍼가 권위 — 소비 모듈은 조회만·중복 저장 금지(REQ-N-017)", + "전 geom GiST 인덱스로 공간 쿼리 실시간(REQ-N-008)", + "검증 게이트 — ArchUnit·계약 검수로 중복 저장 방지", +], dot=PURPLE, gap=0.5, size=10.5) +caption(s, "공간 데이터 단일 원천 — 검증·시각화·정산·BI·wayfinding이 하나의 원천을 소비.") + +# S46 보안 개요 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 보안 요구사항", "AI가 만든 것은 표시하고, 남의 데이터는 차단한다 — REQ-S 20항목 전량 커버", "Ⅲ", "REQ-S 전량") +inv=[("외부 API 격리","Ollama 기본·Claude/Gemini만 승인 예외, egress DROP",BLUE_DK,"shield-security"), + ("워터마크 항상","AI 생성 이미지 watermarkRequired 불변 [검증됨]",PURPLE,"watermark"), + ("PII 격리","동의·마스킹·암호화·응답 제외·테넌트 격리",BLUE,"check-verify"), + ("테넌트 fail-closed","한 층이라도 불일치면 차단",TEAL,"tenant-building")] +cw=2.94 +for i,(t,d,cl,icn) in enumerate(inv): + x=0.55+i*(cw+0.16) + card(s, x, 1.6, cw, 2.5) + rect(s, x, 1.6, cw, 0.08, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + icon(s, icn, x+cw/2-0.3, 1.85, 0.6, cl) + text(s, x+0.1, 2.6, cw-0.2, 0.5, t, size=11, color=cl, bold=True, align=PP_ALIGN.CENTER, line_spacing=0.9) + text(s, x+0.15, 3.15, cw-0.3, 0.9, d, size=8.8, color=INK, align=PP_ALIGN.CENTER, line_spacing=1.0) +lead(s, 0.55, 4.45, 12.23, 0.62, "보안 성숙도 — 인증·워터마크·admin env는 [검증됨](설계가 아니라 동작하는 통제).", fill=INK, size=13) +kcards=[("100%","REQ-S 커버리지",GREEN),("4대","불변 원칙",BLUE),("20","보안 요구항목",PURPLE)] +for i,(v,l,cl) in enumerate(kcards): + x=0.55+i*4.11 + rect(s, x, 5.35, 3.97, 0.9, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x+0.3, 5.45, 1.5, 0.7, v, size=26, color=WHITE, bold=True, anchor=MSO_ANCHOR.MIDDLE) + text(s, x+2.0, 5.35, 1.8, 0.9, l, size=11, color=WHITE, bold=True, anchor=MSO_ANCHOR.MIDDLE) +caption(s, "불변 원칙 4대 + REQ-S 20항목 커버리지 100%.", y=6.55) + +# S47 보안영역 분리 (도식 ⑩) +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 보안 요구사항", "공개 DMZ는 쓰기 권한이 없고, 데이터존은 아웃바운드가 0이다", "Ⅲ", "REQ-S-020·018·N-018") +zones=[("인터넷",SLATE),("엣지\nCDN·WAF·DDoS",BLUE_LT),("DMZ(공개)\n공개LB·visitor GW\n쓰기 없음",BLUE), + ("내부망(인증)\nSSO/2FA·공유 백엔드",BLUE_DK),("AI 워커존\nRedis·나노바나나·Ollama\negress 제한",PURPLE), + ("데이터존(최내곽)\nPostgreSQL+PostGIS\n아웃바운드 전면 차단",INK)] +zw=1.9 +for i,(t,cl) in enumerate(zones): + x=0.55+i*(zw+0.06) + tc = INK if cl in (BLUE_LT,) else WHITE + fl = cl if cl not in (SLATE,) else RGBColor(0xE9,0xEC,0xF1) + rect(s, x, 2.3, zw, 2.7, fill=(fl if cl!=SLATE else RGBColor(0xE9,0xEC,0xF1)), line=(cl if cl!=BLUE_LT else BLUE), line_w=1.0+i*0.2, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + text(s, x+0.08, 2.4, zw-0.16, 2.5, t, size=8.6, color=(INK if cl in (SLATE,BLUE_LT) else WHITE), bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, line_spacing=1.0) + if i<5: text(s, x+zw-0.04, 3.4, 0.14, 0.5, "›", size=13, color=SLATE, bold=True, align=PP_ALIGN.CENTER) +# 상단 관리존 +rect(s, 0.55, 1.55, 12.23, 0.5, fill=NAVY, shape=MSO_SHAPE.ROUNDED_RECTANGLE) +text(s, 0.55, 1.55, 12.23, 0.5, "관리존 — 배스천·관측성 · VPN/허용IP+2FA · 인터넷 미도달", size=10, color=WHITE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +# 철칙 배지 +for i,t in enumerate(["DMZ → 데이터존 직접 접근 절대 금지","데이터존 아웃바운드 0 (유출경로 제거)","egress 승인 4목적지만 — Claude·Gemini·PG·SMTP, 그 외 DROP"]): + x=0.55+i*4.11 + rect(s, x, 5.25, 3.97, 0.7, fill=RGBColor(0xFC,0xE9,0xE7), line=RED, line_w=1.4, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x+0.1, 5.25, 3.77, 0.7, t, size=8.8, color=RED, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, line_spacing=0.92) +caption(s, "공개/내부 물리·논리 분리 · 데이터존 무egress로 유출경로 자체 제거.") + +# S48 인증·접근통제 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 보안 요구사항", "JWT+2FA는 이미 라이브, admin 비번은 env로 재시드, RBAC는 3중이다", "Ⅲ", "REQ-S-004~008·F-071") +bullets(s, 0.55, 1.6, 7.0, [ + "JWT(HS256)+TOTP 2FA(RFC6238)+로그인 실패 잠금 [검증됨: Flyway V7/V8]", + "admin 비번 env 재시드(AES-256-GCM, admin123 금지) [검증됨: env 시더]", + "행사 RBAC 3중 — 테넌트 격리 ⊃ 행사 RBAC ⊃ 열람/편집 게이트", + "admin/internal 엔드포인트 게이트(REQ-S-008)", + "미등록 업체 차단(403)과 연계(REQ-S-007)", +], dot=BLUE, gap=0.56, size=10.5) +rect(s, 8.0, 1.6, 4.78, 1.5, fill=INK, shape=MSO_SHAPE.ROUNDED_RECTANGLE) +text(s, 8.15, 1.7, 4.5, 0.35, "RBAC 3중 구조", size=12, color=WHITE, bold=True, align=PP_ALIGN.CENTER) +text(s, 8.15, 2.15, 4.5, 0.9, "테넌트(전시관) 격리\n⊃ 행사(Event) RBAC\n⊃ 열람/편집 게이트", size=10, color=SUBLT, bold=True, align=PP_ALIGN.CENTER, line_spacing=1.05) +for i,(t,d,cl) in enumerate([("JWT + RBAC","6역할 게이트",BLUE),("2FA / OTP","TOTP RFC6238 [검증됨]",PURPLE),("RBAC·감사 백오피스","F-071",BLUE_DK)]): + y=3.4+i*0.9 + rect(s, 8.0, y, 4.78, 0.75, fill=WHITE, line=cl, line_w=1.3, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, 8.2, y+0.1, 4.4, 0.3, t, size=11, color=cl, bold=True) + text(s, 8.2, y+0.42, 4.4, 0.28, [_segify(d)[0] if _segify(d) else {"t":d}] if False else _segify(d), size=9, color=MUTED) +caption(s, "JWT+2FA·admin env 재시드는 [검증됨: Flyway V7/V8] — 설계가 아니라 동작하는 통제.") + +# S49 AI·이미지 보안 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 보안 요구사항", "생성 이미지는 워터마크·금지 고지 불변, 외부 API 키는 워커 env에만 산다", "Ⅲ", "REQ-S-001·002·009") +titlecard(s, 0.55, 1.6, 6.05, 3.5, "워터마크 항상 [검증됨]", RED, [ + "M5 응답 watermarkRequired:true + text + notice", + "계약·심사 서류 사용 금지 고지 — 제거 불가", + "RAG 근거·인용·환각 차단(abstain)(A-017)", +], headfill=RED, bodysize=10, igap=0.6) +titlecard(s, 6.75, 1.6, 6.03, 3.5, "외부 API 격리", BLUE_DK, [ + "Ollama 기본 + Claude/Gemini만 승인 예외, egress 그 외 DROP(S-001)", + "GEMINI_API_KEY 워커 env only(백엔드 미취급)(S-002)", + "워커존 단일 egress — 유출 경로 최소화", +], headfill=BLUE_DK, bodysize=10, igap=0.6) +wm_badge(s, 0.55, 5.35, 12.23, 0.5) +caption(s, "워터마크 실물 + 외부 API 격리(워커존 단일 egress) — 시크릿·키값 미기재.", y=6.0) + +# S50 개인정보·감사 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 보안 요구사항", "PII는 동의·마스킹·암호화·응답 제외, 민감 액션은 전수 감사, 코드는 안전하게", "Ⅲ", "REQ-S-010~017·N-018") +titlecard(s, 0.55, 1.6, 6.05, 4.5, "개인정보(PII) 보호", BLUE, [ + "동의 분리(privacy/marketing/share)·최소수집(S-013)", + "*_enc AES-256-GCM·응답 완전 제외·보존/파기", + "자격증명·키 완전 제외(응답/로그/커밋 마스킹)(S-003)", + "스택트레이스 미노출(S-010)·DataAccessException 요약(S-011)", + "관측성 로그·메트릭·트레이스에 PII 미기록(N-018)", +], headfill=BLUE, bodysize=9.5, igap=0.56) +titlecard(s, 6.75, 1.6, 6.03, 4.5, "감사·안전코딩", PURPLE, [ + "민감 액션 감사 전수(TB_AUDIT_LOG tenant_id·@Audited AOP)(S-012)", + "입력 검증(S-014)·XSS/CSP(S-015)", + "인젝션 차단 MyBatis #{}(S-016)", + "IDOR/CSRF/JWT 회전(S-017)", + "의존성 SCA CI 게이트(S-019)", +], headfill=PURPLE, bodysize=9.5, igap=0.56) +caption(s, "PII 마스킹·암호화·응답 제외 + 민감 액션 전수 감사 + 안전코딩 통제.") + +# S56 격리 아키텍처 (도식 ⑪) +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 시스템 운영(테넌트 격리)", "한 층이라도 불일치하면 차단 — 컨텍스트→서비스→MyBatis→PostGIS 4층 방어", "Ⅲ", "REQ-S-018·N-020") +# 좌측 진입 +rect(s, 0.55, 2.0, 3.0, 1.3, fill=PURPLE_LT, line=PURPLE, line_w=1.3, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) +icon(s, "tenant-building", 0.75, 2.15, 0.44, PURPLE) +text(s, 0.75, 2.62, 2.7, 0.6, "요청 — 서브도메인(kintex./coex.) + JWT 소속 → 컨텍스트 해소(불일치 시 거부)", size=8.6, color=INK, bold=True, line_spacing=0.9) +line_conn(s, 3.55, 2.65, 4.1, 2.65, color=SLATE, w=1.5) +# 4층 스택 +layers=[("① 컨텍스트 필터","서브도메인+소속 불일치 거부",BLUE_LT,BLUE), + ("② 서비스 가드","tenant 스코프 검증",BLUE,WHITE), + ("③ MyBatis 인터셉터","tenant_id 자동 주입",BLUE_DK,WHITE), + ("④ PostGIS/쿼리","tenant_id 선두 복합 인덱스",PURPLE,WHITE)] +for i,(t,d,fl,tc) in enumerate(layers): + y=1.7+i*1.05 + rect(s, 4.1, y, 5.0, 0.9, fill=fl, line=(fl if tc==WHITE else BLUE), line_w=1.2, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + text(s, 4.35, y+0.12, 4.6, 0.35, t, size=11, color=tc, bold=True) + text(s, 4.35, y+0.48, 4.6, 0.32, d, size=9, color=(SUBLT if tc==WHITE else MUTED)) + if i<3: text(s, 6.5, y+0.88, 0.4, 0.22, "▼", size=11, color=SLATE, align=PP_ALIGN.CENTER) +# 우측 데이터 파티션 +rect(s, 9.35, 1.7, 3.43, 3.35, fill=WHITE, line=LINE, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) +text(s, 9.5, 1.85, 3.1, 0.3, "TB_* WHERE tenant_id = ctx", size=9.5, color=INK, bold=True) +rect(s, 9.55, 2.3, 3.0, 1.0, fill=BLUE_LT, line=BLUE, line_w=1.0, shape=MSO_SHAPE.ROUNDED_RECTANGLE) +text(s, 9.55, 2.3, 3.0, 1.0, "KINTEX (#1)", size=12, color=BLUE_DK, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +rect(s, 9.55, 3.45, 3.0, 1.0, fill=PURPLE_LT, line=PURPLE, line_w=1.0, shape=MSO_SHAPE.ROUNDED_RECTANGLE) +text(s, 9.55, 3.45, 3.0, 1.0, "COEX (#2)", size=12, color=PURPLE_DK, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +rect(s, 0.55, 5.4, 12.23, 0.55, fill=RGBColor(0xFC,0xE9,0xE7), line=RED, line_w=1.4, shape=MSO_SHAPE.ROUNDED_RECTANGLE) +text(s, 0.55, 5.4, 12.23, 0.55, "fail-closed — 한 층이라도 불일치면 차단 [구현 계획: 백필 전 단일테넌트 무중단 → 검증 후 필터 활성화]", size=10.5, color=RED, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +caption(s, "KINTEX #1 검증 → COEX #2 코드 배포 없이 데이터 온보딩. 기능 불변, 데이터·권한만 분리.") + +# S57 온보딩·2계층 관리자 +s = slide(); content_header(s, "Ⅲ. 기술·기능 · 시스템 운영(온보딩)", "코드 배포 없이 데이터 온보딩 6단계로 새 전시관을 연다", "Ⅲ", "REQ-F-077~079") +steps=["테넌트 생성","홀·구역 입력","요율 룰셋","규정 룰셋","마스터데이터","컨텍스트 활성화"] +sw=1.95 +for i,st in enumerate(steps): + x=0.55+i*(sw+0.1) + rect(s, x, 1.7, sw, 1.0, fill=BLUE_LT, line=BLUE, line_w=1.2, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + chip(s, x+sw/2-0.22, 1.55, 0.44, 0.32, str(i+1), BLUE, size=11) + text(s, x+0.08, 1.95, sw-0.16, 0.7, st, size=10, color=BLUE_DK, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, line_spacing=0.9) + if i<5: text(s, x+sw-0.03, 1.7, 0.16, 1.0, "›", size=15, color=SLATE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +titlecard(s, 0.55, 3.15, 6.05, 3.0, "2계층 관리자", PURPLE, [ + "플랫폼 슈퍼관리자 — 테넌트 스위처(F-079)", + "테넌트 관리자 — 단일 스코프", + "테넌트 컨텍스트 해소(F-078)", +], headfill=PURPLE, bodysize=10, igap=0.6) +titlecard(s, 6.75, 3.15, 6.03, 3.0, "재사용 기반", BLUE, [ + "온보딩 = 데이터 입력 수준(코드 배포 없음)(F-077)", + "공통코드·메뉴 관리(§5B, F-073) 재사용", + "홀·요율·규정 룰셋·마스터데이터만 주입", +], headfill=BLUE, bodysize=10, igap=0.6) +caption(s, "온보딩 6단계 + 2계층 관리자 — 코드 배포 없이 새 전시관 개설.") + +# ================================================================ +# Ⅳ 성능 및 품질 +# ================================================================ + +divider("Ⅳ", "성능 및 품질", "PERFORMANCE & QUALITY", ["성능·SLA·확장성", "품질·관측성", "인터페이스"], "정성 · 성능·품질", BLUE) + +# S51 성능·가용성 +s = slide(); content_header(s, "Ⅳ. 성능·품질 · 성능 요구사항", "코어 SLO 99.5%(성수기 99.9% 지향), 무중단 롤링·PITR·degraded로 버틴다", "Ⅳ", "REQ-N-001~005·011") +mets=[("99.5%","코어 SLO(성수기 99.9%)",BLUE),("2","백엔드 인스턴스 롤링",PURPLE),("PITR","PG 스탠바이·failover",TEAL),("degraded","3중 폴백 모드",AMBER)] +mw=2.94 +for i,(v,l,cl) in enumerate(mets): + x=0.55+i*(mw+0.16) + rect(s, x, 1.6, mw, 1.1, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + text(s, x, 1.72, mw, 0.5, v, size=22, color=WHITE, bold=True, align=PP_ALIGN.CENTER) + text(s, x, 2.28, mw, 0.34, l, size=9, color=WHITE, align=PP_ALIGN.CENTER) +bullets(s, 0.55, 3.0, 12.0, [ + "코어 SLO 99.5%(성수기 99.9% 지향), 무상태 백엔드+Redis 외부화(N-001)", + "백엔드 2인스턴스·헬스체크 LB·롤링 무중단(N-002) · PG 스탠바이 복제·자동 failover·PITR(N-003)", + "degraded — Gemini 장애=목 응답, Claude 장애=Ollama 폴백, PG 복제지연=프라이머리 폴백(N-005)", + "워커 장애 재큐(멱등)(N-011)", +], dot=BLUE, gap=0.55, size=10.5) +lead(s, 0.55, 5.4, 12.23, 0.6, "무중단·복원 — 롤링 배포·PITR·degraded 3중 폴백으로 성수기 부하를 버틴다.", fill=INK, size=13) +caption(s, "SLA 수치 + HA 구성 — 프론트·백엔드·Redis·PG·워커 다중화.") + +# S52 나노바나나 성능 +s = slide(); content_header(s, "Ⅳ. 성능·품질 · 성능 요구사항", "단건 평균 40초, 1024px 전처리·자동생성 한정·캐시·쿼터로 대량을 제어한다", "Ⅳ", "REQ-N-006·007") +mets=[("≤40s","단건 평균(전면 비동기)",PURPLE),("1024px","Canvas 다운스케일·JPEG 0.85",BLUE), + ("S1·S7","자동생성 한정",TEAL),("쿼터","성공 시에만 차감",GREEN)] +mw=2.94 +for i,(v,l,cl) in enumerate(mets): + x=0.55+i*(mw+0.16) + card(s, x, 1.6, mw, 2.0) + rect(s, x, 1.6, mw, 0.08, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x, 2.0, mw, 0.7, v, size=24, color=cl, bold=True, align=PP_ALIGN.CENTER) + text(s, x+0.12, 2.8, mw-0.24, 0.7, l, size=9.5, color=INK, align=PP_ALIGN.CENTER, line_spacing=1.0) +bullets(s, 0.55, 4.0, 12.0, [ + "단건 평균 ≤40s, 전면 비동기(WS 완료 푸시)(N-006)", + "전처리 — 클라 Canvas 1024px 다운스케일 + JPEG 0.85", + "대량 제어 — 자동생성 S1·S7 한정 + 동일 스키마해시 캐시 + 행사별 쿼터(N-007)", +], dot=PURPLE, gap=0.55, size=11) +caption(s, "렌더 성능 지표 — 40초·1024px·캐시 히트·쿼터로 비용/지연 제어.") + +# S43 확장성·비동기 +s = slide(); content_header(s, "Ⅳ. 성능·품질 · 성능·확장성", "워커는 큐 깊이로 독립 확장하고, BI·공개는 읽기복제로 오프로드한다", "Ⅳ", "REQ-N-009·010·011") +titlecard(s, 0.55, 1.6, 6.05, 4.5, "독립 확장 (워커)", PURPLE, [ + "나노바나나·서류·EDM 워커 = 큐 깊이 기반 증감(N-009)", + "워커 장애 재큐 — 멱등 Job(N-011)", + "GEMINI 워커존 단일 egress", + "역할별 프론트 번들 분리(F-081, 방식 확정 대기 [구현 계획])", +], headfill=PURPLE, bodysize=10, igap=0.62) +titlecard(s, 6.75, 1.6, 6.03, 4.5, "오프로드 (읽기복제·CDN)", BLUE, [ + "BI 집계·공개 조회·플로어플랜 열람 = 읽기복제 라우팅(N-010)", + "공개영역 CDN·요청률 상한(N-019)", + "무상태 백엔드 2인스턴스 롤링(N-002)", + "운영 프라이머리 보호 — 읽기 부하 분리", +], headfill=BLUE, bodysize=10, igap=0.62) +caption(s, "배포 토폴로지 — 프론트·백엔드 2인스턴스·워커 N·읽기복제·CDN.") + +# S53 접근성·다국어·테마·반응형 +s = slide(); content_header(s, "Ⅳ. 성능·품질 · 품질 요구사항", "WCAG 2.1 AA+KWCAG 2.2, 한/영/중/일, 라이트/다크, 데스크톱/모바일 전부", "Ⅳ", "REQ-N-012~016") +items=[("웹 접근성","WCAG 2.1 AA + 공공 KWCAG 2.2 병행(N-012)",BLUE,"check-verify"), + ("비시각 대안","캔버스/맵 데이터 테이블·키보드 부스 선택(N-013)",BLUE,"mobile"), + ("다국어(i18n)","한 기본+영/중/일·hreflang·로케일 포맷(N-014)",PURPLE,"document-rtm"), + ("라이트/다크","CSS 토큰 2벌·prefers-color-scheme(N-015)",PURPLE,"dashboard-chart"), + ("반응형","데스크톱=설계/에디터·모바일=현장/조회/승인(N-016)",TEAL,"mobile")] +for i,(t,d,cl,icn) in enumerate(items): + x=0.55+(i%3)*4.11; y=1.6+(i//3)*1.7 + card(s, x, y, 3.97, 1.5) + icon(s, icn, x+0.2, y+0.25, 0.44, cl) + text(s, x+0.8, y+0.2, 3.0, 0.4, t, size=11, color=cl, bold=True) + text(s, x+0.8, y+0.62, 3.0, 0.8, d, size=8.8, color=INK, line_spacing=1.0) +chip(s, 8.75, 3.3, 3.97, 1.5, "[구현 계획: 전면 스윕 대기]", SLATE, size=11) +caption(s, "접근성·다국어·테마·반응형 매트릭스 — 공공 KWCAG 병행.") + +# S54 관측성·데이터 +s = slide(); content_header(s, "Ⅳ. 성능·품질 · 품질·관측성", "로그·메트릭·트레이스에 PII·스택트레이스는 남기지 않고, BI는 배치 ETL로 정합한다", "Ⅳ", "REQ-N-018·019·021") +obs=[("수집","로그·메트릭·트레이스",BLUE),("저장","관리존 · PII·스택트레이스 미기록",PURPLE),("대시보드","관측성 · include-stacktrace: never",TEAL)] +for i,(t,d,cl) in enumerate(obs): + x=0.55+i*4.11 + rect(s, x, 1.7, 3.85, 1.2, fill=(BLUE_LT if cl==BLUE else (PURPLE_LT if cl==PURPLE else RGBColor(0xE1,0xF3,0xF1))), line=cl, line_w=1.3, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + text(s, x+0.15, 1.82, 3.55, 0.35, t, size=12, color=cl, bold=True, align=PP_ALIGN.CENTER) + text(s, x+0.15, 2.2, 3.55, 0.6, d, size=9, color=INK, align=PP_ALIGN.CENTER, line_spacing=0.95) + if i<2: text(s, x+3.85, 1.7, 0.26, 1.2, "›", size=16, color=SLATE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +bullets(s, 0.55, 3.4, 12.0, [ + "관측성 — 자격증명·PII·스택트레이스 미기록(include-stacktrace: never)(N-018)", + "BI 데이터마트 — 스타 스키마(FACT/DIM) 야간 배치 ETL 또는 읽기복제 적재(N-021)", + "KpiSnapshot(원천-집계 정합 오차 0) · 공개영역 CDN·요청률 상한(N-019)", +], dot=BLUE, gap=0.55, size=10.5) +caption(s, "관측성 파이프라인(수집→저장→대시보드) — PII·스택트레이스 미기록.") + +# S45 연동·마스터데이터 +s = slide(); content_header(s, "Ⅳ. 성능·품질 · 인터페이스 요구사항", "외부는 게이트웨이로, 룰셋·요율은 버전 데이터로 무중단 개정한다", "Ⅳ", "REQ-F-072·080") +titlecard(s, 0.55, 1.6, 6.05, 4.5, "연동 게이트웨이", BLUE, [ + "API·웹훅·CRM/ERP 연동(선택, F-080)", + "외부 게이트 — Gemini(워커존)·Claude(백엔드)", + "PG 결제·kxwp 릴레이·등록업체 DB 739", + "내부↔외부 경계는 게이트웨이 단일 통로", +], headfill=BLUE, bodysize=10, igap=0.62) +titlecard(s, 6.75, 1.6, 6.03, 4.5, "마스터데이터·룰셋 버전", PURPLE, [ + "룰셋·마스터데이터 버전관리(요율·규정 룰셋)", + "M18 백오피스·감사 기록으로 무중단 개정(F-072)", + "규정 개정 = 코드 배포 없이 데이터 버전 교체", + "요율 공식본은 [협의: C4]", +], headfill=PURPLE, bodysize=10, igap=0.62) +caption(s, "연동 인터페이스 맵 — 내부↔외부 게이트웨이 + 버전 데이터로 무중단 개정.") + +# ================================================================ +# Ⅴ 프로젝트 관리 +# ================================================================ + +divider("Ⅴ", "프로젝트 관리", "PROJECT MANAGEMENT", ["일정계획", "관리방법론·역량", "위험·이슈·품질형상"], "정성 · 사업관리", BLUE) + +# S58 일정 간트 (도식 ⑫) +s = slide(); content_header(s, "Ⅴ. 프로젝트 관리 · 일정계획", "Phase 1 코어 → Phase 2 워크플로/운영 → Phase 3 현장/확장, 게이트로 진행", "Ⅴ") +for i,(lb,cl) in enumerate([("완료",GREEN),("진행",AMBER),("예정",SLATE)]): + rect(s, 9.9+i*1.0, 1.4, 0.24, 0.24, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, 10.18+i*1.0, 1.38, 0.9, 0.28, lb, size=9, color=INK, anchor=MSO_ANCHOR.MIDDLE) +gx=4.3; gw=8.4; units=12; uw=gw/units +for i in range(units+1): + rect(s, gx+i*uw, 1.95, 0.008, 4.05, fill=RGBColor(0xF0,0xF1,0xF4)) +for i,lab in enumerate(["Phase 1 (~4M)","Phase 2 (~4M)","Phase 3 (~4M+)"]): + text(s, gx+i*4*uw, 1.7, 2.8, 0.24, lab, size=8.5, color=BLUE_DK, bold=True) +rows=[("P1","아키텍처(A)",0,3,GREEN,"완료"), + ("P1","공통레이어 B (2FA·시스템관리)",0.5,3,GREEN,"완료"), + ("P1","P0 코어 M2·M3·M4·M5",1.5,2.5,AMBER,"진행"), + ("P1"," ├ 스캐폴드·인증·매퍼·룰엔진·나노바나나",1.5,1.5,GREEN,"완료"), + ("P1"," └ 3안·병합·실데이터",3.0,1.0,AMBER,"진행"), + ("P2","옥션 M15·관람 M10",4,2,SLATE,"예정"), + ("P2","BI M16·관리자 M18",4.3,2,SLATE,"예정"), + ("P2","판매·서류·정산 M1·M6·M7·M9·CMS M12·M17",4.5,2.5,SLATE,"예정"), + ("P3","멀티테넌시·M11·M13·M14",8,2.5,SLATE,"예정"), + ("P3","배포 안정화·SM 이관",8.5,3,AMBER,"진행")] +ry=2.02; rh=0.375 +for i,(ph,nm,st,dur,cl,lab) in enumerate(rows): + y=ry+i*rh + if i%2==0: rect(s, 0.55, y-0.01, 12.23, rh-0.01, fill=ZEBRA) + text(s, 0.6, y, 0.5, rh, ph, size=7.5, color=BLUE_DK, bold=True, anchor=MSO_ANCHOR.MIDDLE) + text(s, 1.1, y, 3.2, rh, nm, size=7.6, color=INK, anchor=MSO_ANCHOR.MIDDLE) + bx=gx+st*uw; bw=max(dur*uw,0.28) + rect(s, bx, y+0.05, bw, rh-0.14, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, bx, y+0.03, bw, rh-0.1, lab, size=6.8, color=WHITE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +# 마일스톤 +for mx,ml in [(gx+0.5*uw,"G1"),(gx+0.9*uw,"G2"),(gx+4*uw,"P게이트"),(gx+8*uw,"QA"),(gx+12*uw,"오픈")]: + rect(s, mx-0.09, 5.85, 0.18, 0.18, fill=(GREEN if ml in("G1","G2") else BLUE), shape=MSO_SHAPE.DIAMOND) + text(s, mx-0.4, 6.02, 0.8, 0.2, ml, size=7, color=INK, bold=True, align=PP_ALIGN.CENTER) +nowx=gx+2.7*uw +rect(s, nowx, 1.95, 0.02, 4.05, fill=PURPLE) +text(s, nowx-0.4, 6.02, 0.8, 0.2, "현재", size=7.5, color=PURPLE, bold=True, align=PP_ALIGN.CENTER) +caption(s, "선행 게이트 통제 + Phase 게이트 QA 통과 후 진행. G1·G2 완료 — 실증 기반. 총 ~150 M/M.", y=6.45) + +# ---- Ⅴ 관리방법론 ---- +s = slide(); content_header(s, "Ⅴ. 프로젝트 관리 · 관리방법론", "PMBOK 기반 통합관리 + ITSM 운영 프로세스로 일정·품질·리스크를 통제한다", "Ⅴ") +mm=[("통합·범위관리","PMBOK 기반 착수→계획→실행→감시→종료, 범위기술서·WBS","booth-layout",BLUE), + ("일정·자원관리","Phase 게이트·마일스톤·번다운, 직군별 M/M 투입계획","dashboard-chart",PURPLE), + ("의사소통·보고","주간/월간 보고·이슈 에스컬레이션·주관기관 정례 협의","document-rtm",TEAL), + ("형상·산출물관리","Gitea 형상관리·산출물 목록·변경관리·감리 대응","check-verify",BLUE_DK)] +for i,(t,d,ic,cl) in enumerate(mm): + x=0.55+(i%2)*6.19; y=1.6+(i//2)*2.15 + card(s, x, y, 6.05, 1.9) + rect(s, x, y, 0.1, 1.9, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + icon(s, ic, x+0.3, y+0.35, 0.55, cl) + text(s, x+1.15, y+0.33, 4.7, 0.4, t, size=12.5, color=cl, bold=True) + text(s, x+1.15, y+0.9, 4.7, 0.85, d, size=9.5, color=INK, line_spacing=1.05) +lead(s, 0.55, 6.0, 12.23, 0.5, "관리방법론·관리역량 — 통합·범위·일정·의사소통·형상관리 표준 체계로 실행력 확보.", fill=INK, size=11.5) +caption(s, "관리방법론·관리역량 독립 절 — 표준 평가부문(프로젝트 관리) 정렬.", y=6.62) + +# S59 리스크 매트릭스 (도식 ⑭) +s = slide(); content_header(s, "Ⅴ. 프로젝트 관리 · 위험·이슈 관리", "약한 고리를 숨기지 않고 드러내 방어한다 — 선제 대응이 곧 신뢰다", "Ⅴ") +# 매트릭스 +mxx,myy,mww,mhh=2.2,1.7,6.3,4.3 +rect(s, mxx, myy, mww, mhh, fill=WHITE, line=LINE, shape=MSO_SHAPE.ROUNDED_RECTANGLE) +rect(s, mxx+mww/2, myy, mww/2, mhh/2, fill=RGBColor(0xFC,0xE9,0xE7)) # 우상 위험 +rect(s, mxx, myy+mhh/2, mww/2, mhh/2, fill=RGBColor(0xE3,0xF6,0xEC)) # 좌하 안전 +rect(s, mxx+mww/2, myy, 0.006, mhh, fill=LINE); rect(s, mxx, myy+mhh/2, mww, 0.006, fill=LINE) +text(s, mxx, myy+mhh+0.05, mww, 0.24, "발생가능성 →", size=8.5, color=MUTED, align=PP_ALIGN.CENTER) +text(s, mxx-0.55, myy, 0.5, mhh, "영향도 →", size=8.5, color=MUTED, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +bubbles=[("R-1",0.62,0.78,AMBER),("R-2",0.58,0.8,AMBER),("R-3",0.5,0.5,SLATE),("R-4",0.5,0.45,SLATE), + ("R-5",0.48,0.5,SLATE),("R-6",0.28,0.82,AMBER),("R-7",0.35,0.35,SLATE),("R-8",0.22,0.22,GREEN)] +for lb,px,py,cl in bubbles: + bx=mxx+px*mww-0.22; by=myy+(1-py)*mhh-0.22 + rect(s, bx, by, 0.44, 0.44, fill=cl, shape=MSO_SHAPE.OVAL, shadow=True) + text(s, bx, by, 0.44, 0.44, lb, size=8, color=WHITE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +# 우측 게이트·대응 +titlecard(s, 8.75, 1.7, 4.03, 4.3, "선행 게이트·대응", GREEN, [ + "G1 나노바나나 승인 [검증됨: 완료]", + "G2 배포서버 [검증됨: 완료]", + "R-1/2 외부API·CAD — 승인 게이트+degraded·가정 라벨", + "R-3 kxwp — 단계적 접근 · R-5 간판 — 후처리 합성", + "R-6 AI 오판 — 사람 확정 · R-8 확장 — 격리 레이어만", +], headfill=GREEN, bodysize=8.8, igap=0.62) +caption(s, "발생×영향 매트릭스에 R-1~R-8 배치 — 약한 고리를 선제 노출·방어(숨기지 않아 신뢰).") + +# S60 품질·형상관리 +s = slide(); content_header(s, "Ⅴ. 프로젝트 관리 · 품질·형상관리", "배포는 헬스체크로 지키고 실패하면 롤백, 의존성은 SCA 게이트로 막는다", "Ⅴ", "REQ-N-004·S-019") +gate=[("빌드","compileJava·tsc",BLUE),("테스트","점진 경계면 검증",PURPLE),("SCA","OWASP Dep-Check",AMBER), + ("헬스체크","health 200",GREEN),("롤백","실패 시 이전 jar",RED)] +for i,(t,d,cl) in enumerate(gate): + x=0.55+i*2.5 + rect(s, x, 1.8, 2.3, 1.1, fill=(BLUE_LT if cl==BLUE else (PURPLE_LT if cl==PURPLE else (RGBColor(0xFF,0xF6,0xE8) if cl==AMBER else (RGBColor(0xE3,0xF6,0xEC) if cl==GREEN else RGBColor(0xFC,0xE9,0xE7))))), + line=cl, line_w=1.3, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + text(s, x+0.1, 1.9, 2.1, 0.4, t, size=11, color=cl, bold=True, align=PP_ALIGN.CENTER) + text(s, x+0.1, 2.32, 2.1, 0.5, d, size=8.8, color=INK, align=PP_ALIGN.CENTER, line_spacing=0.9) + if i<4: text(s, x+2.3-0.05, 1.8, 0.2, 1.1, "›", size=15, color=SLATE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +bullets(s, 0.55, 3.3, 12.0, [ + "Fail-Safe 배포 — 백업→배포→헬스체크 200→실패 시 롤백(이전 jar 유지) [검증됨: deploy_kintex.sh](N-004)", + "QA 게이트 — 점진 경계면 검증·보안 불변·빌드 회귀(Phase 게이트 통과 후 진행)", + "SCA CI 게이트 — OWASP Dependency-Check 정기 스캔·패치(S-019)", + "형상관리 — Gitea zio/kintex·Conventional Commits·main 보호·환경 분리(dev/staging/prod)", +], dot=BLUE, gap=0.55, size=10.5) +caption(s, "품질 게이트 흐름 — 빌드→테스트→SCA→헬스체크→롤백.") + +# ================================================================ +# Ⅵ 프로젝트 지원 +# ================================================================ + +divider("Ⅵ", "프로젝트 지원", "PROJECT SUPPORT", ["인수인계·교육·기술지원", "유지보수(SM)·SLA", "장애대응·기밀보안"], "정성 · 사업지원", NAVY) + +# ---- Ⅵ 인수인계·교육·기술지원 ---- +s = slide(); content_header(s, "Ⅵ. 프로젝트 지원 · 인수인계·교육·기술지원", "구축 후 지속가능성 — 이관·교육·지원·하자보수를 표준 절차로 보장한다", "Ⅵ") +hv=[("인수인계","이관계획·검사 대상/방법·충족조건, 지식이전(운영자·개발자 지침서 PPT·프로그램 사양서)","closed-loop",BLUE), + ("교육훈련","운영자·관리자·사용자 대상 교육 — 내용·방법·기간·인원·횟수, 실습·매뉴얼 제공","org-people",PURPLE), + ("기술지원","지원 범위·수준·기술 매뉴얼, 서비스데스크(SR·문의) 채널·응답 기준","shield-security",TEAL), + ("하자보수","하자담보 기간 내 하자보수 범위·조치절차·대응(계약 조건 준수)","check-verify",BLUE_DK)] +for i,(t,d,ic,cl) in enumerate(hv): + x=0.55+(i%2)*6.19; y=1.6+(i//2)*2.15 + card(s, x, y, 6.05, 1.9) + rect(s, x, y, 0.1, 1.9, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + icon(s, ic, x+0.3, y+0.35, 0.55, cl) + text(s, x+1.15, y+0.33, 4.7, 0.4, t, size=12.5, color=cl, bold=True) + text(s, x+1.15, y+0.9, 4.7, 0.85, d, size=9.3, color=INK, line_spacing=1.05) +caption(s, "프로젝트 지원 4영역 — 인수인계·교육훈련·기술지원·하자보수. WORK_STATUS 인수인계 체계 활용.") + +# ---- Ⅵ 유지보수(SM)·SLA ---- +s = slide(); content_header(s, "Ⅵ. 프로젝트 지원 · 유지보수(SM)·SLA", "라이브 자동배포를 실적으로 — SLA·장애대응·정기점검을 ITSM 프로세스로 운영한다", "Ⅵ", "REQ-N-004") +sla=[("코어 서비스 가용성","99.5% (성수기 99.9% 지향)","월 가용성·health"), + ("장애 응답시간","P1 즉시·P2 30분·P3 4시간","티켓 타임스탬프"), + ("장애 복구시간(MTTR)","P1 ≤2h·P2 ≤1영업일","복구 완료 기록"), + ("배포 성공률","≥99% (Fail-Safe 자동 롤백)","배포 로그 게이트"), + ("나노바나나 큐 소진","best-effort(워커 스케일아웃)","큐 적체·처리량")] +table(s, 0.55, 1.6, 8.7, ["SLA 지표","목표","측정"], sla, [3.1,3.0,2.6], rowh=0.5, hsize=10, bsize=8.8) +titlecard(s, 9.45, 1.6, 3.33, 3.55, "운영 체계·조직", TEAL, [ + "ITSM — 요청(SR)·장애·변경·배포·문제(RCA)", + "조직 — 운영총괄+백/프론트+DB/인프라+AI워커+QA", + "근무 — 평일 상주 + 성수기(3~5·9~11월) 온콜", + "CI/CD 자동배포 [검증됨: deploy_kintex.sh]", +], headfill=TEAL, bodysize=8.8, igap=0.7) +lead(s, 0.55, 4.7, 8.7, 0.55, "월간 SLA 리포트(가용성·MTTR·티켓·배포) — 페널티 체계는 계약 조건에 따름(공고 확인).", fill=INK, size=11) +caption(s, "SM 운영 — SLA 5지표 + ITSM 조직. 자동배포는 라이브 실적(과장 아님).", y=6.5) + +# ---- Ⅵ 장애대응·비상대책 ---- +s = slide(); content_header(s, "Ⅵ. 프로젝트 지원 · 장애대응·비상대책", "등급분류→에스컬레이션→RCA, degraded·PITR·롤백으로 비상 상황을 흡수한다", "Ⅵ", "REQ-N-005") +inc=[("장애 등급·에스컬레이션","P1(중단)~P4(경미) 분류, 자동 알림(WS·알림센터)·온콜 에스컬레이션",RED,"risk-warning"), + ("RCA·재발방지","근본원인 분석 리포트·재발방지 티켓화, 감사로그·관측성 추적(PII 미기록)",PURPLE,"check-verify"), + ("degraded / BCP·DR","Gemini=목응답·Claude=Ollama 폴백·PG=failover+PITR·배포=자동 롤백",TEAL,"shield-security"), + ("정기점검·예방정비","DB 인덱스/복제·백업(PITR)·Redis AOF·워커 하트비트·TLS 만료·용량 점검",BLUE,"pipeline-flow")] +for i,(t,d,cl,ic) in enumerate(inc): + y=1.62+i*1.16 + card(s, 0.55, y, 12.23, 1.02) + rect(s, 0.55, y, 0.1, 1.02, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + icon(s, ic, 0.85, y+0.28, 0.48, cl) + text(s, 1.55, y+0.14, 4.0, 0.74, t, size=12, color=cl, bold=True, anchor=MSO_ANCHOR.MIDDLE) + text(s, 5.7, y+0.14, 6.9, 0.74, d, size=9.5, color=INK, anchor=MSO_ANCHOR.MIDDLE, line_spacing=1.0) +caption(s, "장애대응·비상대책(BCP/DR) — RPO 최소·RTO 분 단위, degraded 3중 폴백으로 무중단 지향.") + +# ---- Ⅵ 기밀보안(관리적) ---- +s = slide(); content_header(s, "Ⅵ. 프로젝트 지원 · 기밀보안(관리적)", "기술적 통제(Ⅲ) 위에 관리적·물리적 기밀보안 체계를 얹는다", "Ⅵ", "REQ-S-012") +sec=[("보안 조직·서약","보안책임자 지정·보안서약서·보안교육 정례",BLUE,"org-people"), + ("문서·산출물 보안","산출물 분류·접근통제·반출입 통제·형상 이력",PURPLE,"document-rtm"), + ("인력·물리 보안","출입통제·개발환경 망분리·퇴사자 권한 회수",TEAL,"tenant-building"), + ("감사·점검","민감 액션 전수 감사(TB_AUDIT_LOG)·정기 보안점검·SCA",BLUE_DK,"check-verify")] +for i,(t,d,cl,ic) in enumerate(sec): + x=0.55+(i%2)*6.19; y=1.6+(i//2)*1.95 + card(s, x, y, 6.05, 1.72) + rect(s, x, y, 6.05, 0.5, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x, y, 6.05, 0.5, t, size=12, color=WHITE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) + icon(s, ic, x+0.3, y+0.72, 0.5, cl) + text(s, x+1.0, y+0.66, 4.85, 0.95, d, size=9.8, color=INK, anchor=MSO_ANCHOR.MIDDLE, line_spacing=1.05) +lead(s, 0.55, 5.72, 12.23, 0.5, "관리적 보안 — 기술 보안(Ⅲ §3 보안 요구사항)과 분리 배치, 표준 채점 구조 정렬.", fill=INK, size=11.5) +caption(s, "기밀보안관리 — 관리적·물리적 통제(조직·문서·인력·감사). 기술적 보안은 Ⅲ §3.", y=6.55) + +# ================================================================ +# Ⅶ 그 밖의 사항 +# ================================================================ + +divider("Ⅶ", "그 밖의 사항", "OTHERS", ["멀티테넌시·확장", "상생협력·하도급", "기대효과"], "가점 · 상생·부가", PURPLE) + +# S55 멀티테넌트 비전 +s = slide(); content_header(s, "Ⅶ. 그 밖의 사항 · 멀티테넌시·확장", "KINTEX #1에서 검증하고, COEX #2로 확장하며, 제3전시장을 표준으로 맞는다", "Ⅶ") +road=[("KINTEX","기준 테넌트 #1 · 검증 완료",GREEN),("COEX","테넌트 #2 · 온보딩 대상",BLUE), + ("제3전시장","2028 · 178,000㎡",PURPLE),("타 전시관","국내 전시산업 표준 SaaS",SLATE)] +line_conn(s, 1.3, 2.9, 11.9, 2.9, color=SLATE, w=1.6) +for i,(t,d,cl) in enumerate(road): + x=0.7+i*3.1 + rect(s, x+1.15, 2.77, 0.26, 0.26, fill=cl, shape=MSO_SHAPE.OVAL) + card(s, x, 3.3, 2.85, 1.5) + rect(s, x, 3.3, 2.85, 0.08, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + icon(s, "tenant-building", x+0.2, 3.5, 0.44, cl) + text(s, x+0.8, 3.5, 1.9, 0.4, t, size=12, color=cl, bold=True) + text(s, x+0.2, 4.05, 2.5, 0.65, d, size=9, color=INK, line_spacing=1.0) +bullets(s, 0.55, 5.2, 12.0, [ + "개발 부담 최소화 — 멀티테넌시=격리 레이어만 추가, 기능 로직 불변(R-8)", +], dot=PURPLE, gap=0.4, size=11) +caption(s, "테넌트 확장 로드맵 — KINTEX→COEX→제3전시장→타 전시관 SaaS.") + +# ---- Ⅶ 상생협력·하도급 ---- +s = slide(); content_header(s, "Ⅶ. 그 밖의 사항 · 상생협력·하도급", "중소기업 참여·하도급 계획을 원칙으로 제시 — 구체 수치는 공고·컨소시엄 확정 시 기재", "Ⅶ") +titlecard(s, 0.55, 1.6, 6.05, 3.5, "상생협력 (정량 별표11)", BLUE, [ + "중소기업 공동수급체 참여 — 참여지분율 배점(최대 5점) 대응", + "지분율 50%↑=최고등급 지향 [공고·컨소 확정 시 기재]", + "중소기업 기술·인력 참여로 상생 생태계", + "구체 지분·업체는 [공고 확정 시 기재]", +], headfill=BLUE, bodysize=9.5, igap=0.66) +titlecard(s, 6.75, 1.6, 6.03, 3.5, "하도급 계획 (정성 적정성)", PURPLE, [ + "하도급 금액/계약금액 비율 적정성(배점 5점 이상)", + "20억원 이상 SW사업은 하도급 평가 제외 불가 — 계획서 필수", + "하도급 승인·관리·대금 직불 등 표준 준수", + "하도급 범위·업체·비율은 [공고 확정 시 기재]", +], headfill=PURPLE, bodysize=9.5, igap=0.66) +lead(s, 0.55, 5.3, 12.23, 0.62, "상생협력·하도급 — 일반 원칙 수준 제시, 구체 수치는 공고·컨소시엄 확정 후 확정 기재.", fill=INK, size=13) +caption(s, "정량 별표11(상생협력)·정성 하도급 적정성 대응. 구체 수치는 [공고 확정 시 기재](T3·T5).") + +# S61 정량 기대효과 (도식 ⑮) +s = slide(); content_header(s, "Ⅶ. 그 밖의 사항 · 기대효과", "견적 수일→즉시, 배치 수주→수 분, 검수 육안→자동, 결과는 사진으로", "Ⅶ", "REQ-F-002·007·009·017") +quant=[("홀 배정 견적","수일","즉시","document-rtm"),("배치도 초안","수일~수주","수 분","booth-layout"), + ("규정 검수","육안 검토","자동 플래깅","check-verify"),("유틸리티 신청","수기 작도","클릭+자동견적","wiring-power"), + ("시공 결과 예측","불가(외주)","표준 샷 자동생성","camera-render")] +qw=2.4 +for i,(k,a,b,icn) in enumerate(quant): + x=0.55+i*(qw+0.06) + card(s, x, 1.6, qw, 2.15) + icon(s, icn, x+qw/2-0.24, 1.75, 0.48, PURPLE) + text(s, x, 2.32, qw, 0.3, k, size=10, color=INK, bold=True, align=PP_ALIGN.CENTER) + text(s, x, 2.68, qw, 0.24, a, size=9.5, color=SLATE, align=PP_ALIGN.CENTER) + text(s, x, 2.94, qw, 0.24, "↓", size=13, color=PURPLE, bold=True, align=PP_ALIGN.CENTER) + text(s, x, 3.2, qw, 0.3, b, size=10.5, color=BLUE, bold=True, align=PP_ALIGN.CENTER) +imp=[("40초","단건 렌더",BLUE),("99.5%","코어 SLO",PURPLE),("142","REQ 커버",BLUE),("18","도메인 모듈",PURPLE)] +mw=2.94 +for i,(v,l,cl) in enumerate(imp): + x=0.55+i*(mw+0.16) + rect(s, x, 4.05, mw, 1.05, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + text(s, x+0.25, 4.15, 1.4, 0.85, v, size=26, color=WHITE, bold=True, anchor=MSO_ANCHOR.MIDDLE) + text(s, x+1.65, 4.05, mw-1.7, 1.05, l, size=10.5, color=WHITE, bold=True, anchor=MSO_ANCHOR.MIDDLE) +lead(s, 0.55, 5.4, 12.23, 0.6, "리드타임 수일→즉시·수 분, 검수 육안→자동 — 정량 개선을 숫자로 각인.", fill=INK, size=13) +caption(s, "5지표 Before/After + 임팩트 지표 스트립.") + +# S62 정성·전략 효과 +s = slide(); content_header(s, "Ⅶ. 그 밖의 사항 · 기대효과", "참가업체는 영업력을, 홀매니저는 시간을, 킨텍스는 데이터 주권을 얻는다", "Ⅶ") +qual=[("참가업체","사진급 자료로 영업력·수주력 강화",PURPLE,"camera-render"), + ("홀매니저","규정 검수 병목 해소로 처리량 증대",BLUE,"check-verify"), + ("킨텍스(운영사)","온프레미스 우선·외부 AI 격리로 데이터 주권 확보",TEAL,"shield-security"), + ("전시산업","국내 전시산업 표준 플랫폼화",NAVY,"tenant-building")] +for i,(who,d,cl,icn) in enumerate(qual): + x=0.55+(i%2)*6.19; y=1.65+(i//2)*2.25 + card(s, x, y, 6.05, 2.0) + rect(s, x, y, 0.1, 2.0, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + icon(s, icn, x+0.3, y+0.35, 0.6, cl) + text(s, x+1.15, y+0.35, 4.7, 0.5, who, size=14, color=cl, bold=True) + text(s, x+1.15, y+0.95, 4.7, 0.9, d, size=10.5, color=INK, line_spacing=1.05) +caption(s, "이해관계자별 정성·전략 효과 — 영업력·시간·데이터 주권·산업 표준화.") + +# S63 확장 비전·마무리 +s = slide(); content_header(s, "Ⅶ. 그 밖의 사항 · 기대효과·마무리", "킨텍스에서 검증하고, 코엑스로 확장하며, 다시 사진으로 컨펌한다", "Ⅶ", "REQ-F-077") +road=["KINTEX 검증","COEX 확장","제3전시장 표준","타 전시관 SaaS"] +for i,r in enumerate(road): + x=0.55+i*3.12 + rect(s, x, 1.6, 2.9, 0.7, fill=(PURPLE if i%2 else BLUE), shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + text(s, x, 1.6, 2.9, 0.7, r, size=11, color=WHITE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) + if i<3: text(s, x+2.9-0.05, 1.6, 0.24, 0.7, "›", size=16, color=SLATE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) +bullets(s, 0.55, 2.7, 12.0, [ + "확장 — COEX·제3전시장·타 전시관 SaaS 확장", + "재사용 — 검증된 공통 프레임워크(WISE/UIWS) 위에 도메인 코어 이식", +], dot=PURPLE, gap=0.5, size=11) +rect(s, 0.55, 3.9, 12.23, 1.7, fill=BLUE_DK, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) +rect(s, 8.5, 3.9, 4.28, 1.7, fill=PURPLE, shape=MSO_SHAPE.PARALLELOGRAM) +icon(s, "camera-render", 0.95, 4.35, 0.7, WHITE) +text(s, 1.9, 4.15, 8.0, 1.2, "“신청서를 내는 순간,\n시공 후 사진을 먼저 본다.”", size=24, color=WHITE, bold=True, line_spacing=1.05, anchor=MSO_ANCHOR.MIDDLE) +caption(s, "확장 비전 로드맵 + 클로징 — 킨텍스를 전시 운영 표준 플랫폼으로 전환.") + +# ================================================================ +# 부록 A/B/C +# ================================================================ + +divider("A", "부록", "APPENDIX", + ["확인 필요·협의", "REQ 커버리지", "100대 기능 성숙도"], "부록", NAVY) + +# 부록 A 확인필요 +s = slide(); content_header(s, "부록 A · 확인 필요·협의 사항", "가정·협의를 1장에 집약 — 발주처 협업 자세", "A") +rows=[("C1","평가배점·제출규격 (가정)","공공 SI 통례 기준, 공고 확인 시 재정렬"), + ("C2","kxwp API (REQ-F-022)","웹폼→HWP/PDF 완결, 릴레이만 킨텍스 IT 협의"), + ("C3","CAD·트렌치 실측 (REQ-F-016)","평면도 15장+CAD 확보, 미확보 구간 실측 협의"), + ("C4","인터넷 요율 공식본 (REQ-F-002)","2,250원/㎡ 가정, 공식 요율표 확인 필요"), + ("C5","나노바나나 G1 (완료)","소유자 승인·워커 라이브 [검증됨]"), + ("C6","코엑스 실측 (REQ-F-077)","COEX 온보딩 시 홀·요율·규정 데이터"), + ("C7","사이니지·비콘·IoT HW (F-070·052~055)","킨텍스 시설 인프라 협의 전제"), + ("C8","기타 협의","연동·데이터·운영 세부 협의 항목")] +table(s, 0.55, 1.6, 12.23, ["ID","확인·협의 항목","비고"], rows, [0.9,5.0,6.33], rowh=0.55, hsize=10) +caption(s, "모든 [가정]·[협의]를 1장 집약 → 정직성을 강점으로 전환(리스크 R-4 방어).", y=6.5) + +# 부록 B REQ 커버리지 +s = slide(); content_header(s, "부록 B · REQ 커버리지 매트릭스", "142 REQ ↔ 슬라이드 1:1 — 미반영 0", "B") +cov=[("REQ-F (기능)","81","81","0",BLUE),("REQ-A (AI)","20","20","0",PURPLE), + ("REQ-N (비기능)","21","21","0",TEAL),("REQ-S (보안)","20","20","0",BLUE_DK)] +cw=2.94 +for i,(t,tot,cvd,miss,cl) in enumerate(cov): + x=0.55+i*(cw+0.16) + card(s, x, 1.6, cw, 2.3) + rect(s, x, 1.6, cw, 0.5, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x, 1.6, cw, 0.5, t, size=11, color=WHITE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) + text(s, x, 2.25, cw, 0.7, cvd, size=34, color=cl, bold=True, align=PP_ALIGN.CENTER) + text(s, x, 3.05, cw, 0.3, f"/ {tot} 반영", size=10, color=INK, align=PP_ALIGN.CENTER) + chip(s, x+cw/2-0.7, 3.4, 1.4, 0.32, f"미반영 {miss}", GREEN, size=9) +rect(s, 0.55, 4.2, 12.23, 1.0, fill=GREEN, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) +text(s, 0.75, 4.32, 3.0, 0.76, "142", size=40, color=WHITE, bold=True, anchor=MSO_ANCHOR.MIDDLE) +text(s, 3.0, 4.2, 9.5, 1.0, "총 142 REQ 전량 반영 · 미반영 0 — 상세 RTM(REQ→주 반영 슬라이드)은 proposal_content.md RTM 반영표 참조", size=12, color=WHITE, bold=True, anchor=MSO_ANCHOR.MIDDLE, line_spacing=1.05) +caption(s, "QA는 이 표로 142 REQ 반영상태를 최종 검증 — 미반영 0.") + +# 부록 C 100대 기능 성숙도 +s = slide(); content_header(s, "부록 C · 100대 기능 성숙도", "기구현 63 · 부분 18 · 신규 19 — 정량 성숙도", "C") +mat=[("기구현","63","라이브·검증 완료",GREEN),("부분 구현","18","일부 완성·보강 필요",AMBER),("신규","19","설계 확정·구현 대기",SLATE)] +for i,(t,v,d,cl) in enumerate(mat): + x=0.55+i*4.11 + card(s, x, 1.7, 3.97, 2.6) + rect(s, x, 1.7, 3.97, 0.08, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x, 2.05, 3.97, 1.0, v, size=56, color=cl, bold=True, align=PP_ALIGN.CENTER) + text(s, x, 3.25, 3.97, 0.4, t, size=14, color=INK, bold=True, align=PP_ALIGN.CENTER) + text(s, x, 3.7, 3.97, 0.4, d, size=9.5, color=MUTED, align=PP_ALIGN.CENTER) +# stacked bar +rect(s, 0.55, 4.7, 12.23, 0.6, fill=HALL_BG, line=LINE, shape=MSO_SHAPE.ROUNDED_RECTANGLE) +total=100; x0=0.65; wtot=12.03 +segs=[(63,GREEN),(18,AMBER),(19,SLATE)] +cx=x0 +for v,cl in segs: + w=wtot*v/total + rect(s, cx, 4.78, w-0.03, 0.44, fill=cl, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, cx, 4.78, w-0.03, 0.44, str(v), size=12, color=WHITE, bold=True, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) + cx+=w +caption(s, "라이브 확인분(인프라·CI/CD·나노바나나·인증·워터마크·PostGIS 코어·평면도 자산)만 [검증됨].", y=5.7) + +# ================================================================ +# 부록 D · 화면 설계(안) 갤러리 +# ================================================================ + +def build_gallery(): + manifest_path = os.path.join(SCREENS, "screens_manifest.json") + scr_files = sorted(glob.glob(os.path.join(SCREENS, "*.png"))) + if not scr_files: + return 0 + meta = {} + group_order = [] + if os.path.exists(manifest_path): + data = json.load(open(manifest_path, encoding="utf-8")) + group_order = data.get("group_order", []) + meta = data.get("screens", {}) + # 폴더 재스캔 — 매니페스트에 없는 파일도 수록(파일명 기반 캡션) + by_group = {} + for fp in scr_files: + fn = os.path.basename(fp) + m = meta.get(fn) + if not m: + scrid = os.path.splitext(fn)[0] + m = {"scr":scrid, "module":"", "name":"", "group":"기타 화면", "device":"DESKTOP", "order":900} + by_group.setdefault(m["group"], []).append((fp, m)) + for g in by_group: by_group[g].sort(key=lambda t: t[1].get("order", 900)) + order = [g for g in group_order if g in by_group] + [g for g in by_group if g not in group_order] + total = sum(len(v) for v in by_group.values()) + + divider("D", "화면 설계(안) 갤러리", "SCREEN DESIGN GALLERY", + ["역할·모듈별 화면", "Google Stitch AI 시안", f"수록 {total}화면"], "부록 D", PURPLE) + # intro 고지 + s = slide(); content_header(s, "부록 D · 화면 설계(안) 갤러리", "역할·모듈별 화면 설계 시안 — 구현 시 조정될 수 있음", "D") + rect(s, 0.55, 1.6, 12.23, 1.3, fill=RGBColor(0xFF,0xF6,0xE8), line=AMBER, line_w=1.2, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + icon(s, "risk-warning", 0.85, 1.9, 0.55, AMBER) + text(s, 1.6, 1.78, 11.0, 0.4, "고지", size=13, color=AMBER, bold=True) + text(s, 1.6, 2.2, 11.0, 0.6, "본 화면은 Google Stitch 기반 AI 생성 디자인 시안이며, 실제 구현 시 조정될 수 있음. 화면 문자열·수치·데이터는 예시입니다.", size=11, color=INK, bold=True, line_spacing=1.05) + # 그룹 인덱스 + text(s, 0.55, 3.2, 12.0, 0.3, "수록 그룹", size=12, color=BLUE, bold=True) + for i, g in enumerate(order): + x=0.55+(i%3)*4.11; y=3.6+(i//3)*0.62 + cnt=len(by_group[g]) + rect(s, x, y, 3.97, 0.5, fill=CARD, line=LINE, shape=MSO_SHAPE.ROUNDED_RECTANGLE, shadow=True) + rect(s, x, y, 0.09, 0.5, fill=PURPLE, shape=MSO_SHAPE.ROUNDED_RECTANGLE) + text(s, x+0.25, y, 3.0, 0.5, g, size=10, color=INK, bold=True, anchor=MSO_ANCHOR.MIDDLE) + chip(s, x+3.35, y+0.1, 0.5, 0.3, str(cnt), PURPLE, size=8.5) + caption(s, f"총 {total}개 화면을 역할·모듈 그룹으로 수록 — SCR ID·화면명 캡션 병기.", y=6.55) + + # 그룹별 갤러리 슬라이드 + for g in order: + items = by_group[g] + device = items[0][1].get("device", "DESKTOP") + per = 4 if device == "MOBILE" else 3 + for c in range(0, len(items), per): + chunk = items[c:c+per] + s = slide(); content_header(s, "부록 D · 화면 설계(안) 갤러리", g, "D") + n=len(chunk) + if device == "MOBILE": + cw=2.9; gap=0.19; cardh=4.6; x0=(13.333-(n*cw+(n-1)*gap))/2 + for i,(fp,m) in enumerate(chunk): + x=x0+i*(cw+gap) + card(s, x, 1.55, cw, cardh) + img_fit(s, fp, x+0.12, 1.67, cw-0.24, cardh-0.7, frame=False) + chip(s, x+0.12, 1.55+cardh-0.42, 0.9, 0.3, m.get("scr",""), PURPLE, size=8) + text(s, x+1.1, 1.55+cardh-0.43, cw-1.2, 0.32, m.get("name",""), size=8.5, color=INK, bold=True, anchor=MSO_ANCHOR.MIDDLE) + else: + cw=3.95; gap=0.19; cardh=3.9; x0=(13.333-(n*cw+(n-1)*gap))/2 + for i,(fp,m) in enumerate(chunk): + x=x0+i*(cw+gap); y=1.65 + card(s, x, y, cw, cardh) + img_fit(s, fp, x+0.12, y+0.12, cw-0.24, cardh-0.75, frame=False) + chip(s, x+0.12, y+cardh-0.5, 1.0, 0.32, m.get("scr",""), PURPLE, size=9) + modtxt = m.get("module","") + text(s, x+1.2, y+cardh-0.51, cw-1.3, 0.34, [[{"t":m.get("name",""),"size":9.5,"color":INK,"bold":True}]], anchor=MSO_ANCHOR.MIDDLE) + if modtxt: + text(s, x+0.14, y+cardh-0.15, cw-0.28, 0.2, modtxt+" · 대상: "+g, size=7.5, color=MUTED) + caption(s, "Google Stitch AI 생성 디자인 시안 — 실제 구현 시 조정될 수 있음.", y=6.7) + return total + +gallery_count = build_gallery() + +# ================================================================ +# 저장 +# ================================================================ +OUT = r"C:\GUARDiA\workspace\kintex\docs\deliverables\제안서.pptx" +os.makedirs(os.path.dirname(OUT), exist_ok=True) +prs.save(OUT) +print("SAVED:", OUT) +print("TOTAL SLIDES:", len(prs.slides._sldIdLst)) +print("GALLERY SCREENS:", gallery_count) diff --git a/docs/deliverables/제안서/_gen/design_system.md b/docs/deliverables/제안서/_gen/design_system.md new file mode 100644 index 0000000..c30c600 --- /dev/null +++ b/docs/deliverables/제안서/_gen/design_system.md @@ -0,0 +1,242 @@ +# 킨텍스 자동전시시스템 구축 — 제안서 디자인 시스템 (Design System) + +> 작성: proposal-visual-designer · 작성일: 2026-07-11 · 버전 v1.0 +> 짝 문서: `visual_concepts.md`(도식 12종·표지·간지 시각 컨셉) · `assets/icons/*.svg`(선 아이콘 20종) · `proposal_outline.md`(63슬라이드) · `tech_advisory.md` §1-4(도식 사양) +> 목적: **디자인 템플릿 PPTX 부재** → KINTEX 브랜드 기반 디자인 시스템을 직접 정의. deck-designer(`proposal_deck.pptx` python-pptx)가 이 스펙을 벗어나지 않는다. +> 스타일 정합: 같은 사업 산출물 패밀리(`docs/deliverables/_gen/gen_dev_plan_pptx.py` 개발계획서)와 **동일 팔레트·폰트·16:9·도형 직접 작도** 톤 유지. 제안서는 개발계획서보다 **표지·간지 시각 임팩트를 1단계 상향**(수주 문서 특성). +> 원칙: 시크릿(키·비번·내부IP) 미기재. 과도한 장식 금지 — **평가위원 가독성 우선**. 명료성·위계·일관성 > 장식. + +--- + +## 0. 아트디렉션 한 줄 + +**"도면이 아니라 사진으로 컨펌한다"** — 전시장의 공간감(블루)과 AI 생성의 지능감(퍼플)을 대비시키되, 본문은 흰 여백과 카드로 **읽기 쉬운 공공 제안서**를 유지한다. 표지·간지·핵심 도식(3중 해자·나노바나나 파이프라인)에만 시각 에너지를 집중하고, 나머지는 절제한다. + +--- + +## 1. 컬러 팔레트 + +### 1-1. 주조·강조색 (Brand) + +| 토큰 | HEX | RGB | 역할 | WCAG(흰 배경 대비) | +|---|---|---|---|---| +| `BLUE` (KINTEX Blue) | **#0066B3** | 0,102,179 | **주조색** — 헤더 액센트바·섹션칩·주요 강조·표 헤더 | 5.3:1 (AA 본문/AAA 대형) | +| `BLUE_DK` (Deep) | **#00447A** | 0,68,122 | 표지/간지 배경·최심층 데이터존·강조 대비 | 8.9:1 (AAA) | +| `BLUE_LT` (Tint) | **#E1EFF9** | 225,239,249 | 블루 계열 카드 배경·밴드 배경·연한 강조 | 배경 전용 | +| `PURPLE` (AI Purple) | **#6D4AFF** | 109,74,255 | **강조색** — AI/나노바나나/지능 요소 전용·간지 포인트·2차 액센트 | 5.0:1 (AA) | +| `PURPLE_DK` | **#4A2FCC** | 74,47,204 | 퍼플 위 텍스트 대비 보강·AI 심층 | 7.4:1 (AAA) | +| `PURPLE_LT` (Tint) | **#ECE8FF** | 236,232,255 | AI 카드 배경·퍼플 밴드 배경 | 배경 전용 | + +> **색 규율(불변)**: 퍼플은 **AI·나노바나나·지능·예측** 맥락에만 쓴다(남발 금지). 블루=구조/공간/시스템/신뢰. 이 이원 대비가 "결정적 알고리즘(블루) + AI 보조(퍼플)" 3층 신뢰 프레이밍을 색으로 각인한다. + +### 1-2. 중립 그레이 스케일 (Neutral) + +| 토큰 | HEX | 명도 단계 | 역할 | +|---|---|---|---| +| `INK` | **#101828** | 950 | 본문 기본 텍스트·제목 | +| `MUTED` | **#667085** | 500 | 보조 텍스트·캡션·부제 | (흰 배경 4.6:1 AA) | +| `SLATE` | **#98A2B3** | 400 | 비활성·예정 상태·눈금·화살표 | +| `LINE` | **#E4E7EC** | 200 | 카드 테두리·구분선 | +| `BG` | **#F9FAFB** | 50 | 본문 슬라이드 페이지 배경 | +| `HALL_BG` | **#F2F4F7** | 100 | 데이터/평면도 영역 배경·표 zebra 짝수행 | +| `WHITE` | **#FFFFFF** | 0 | 카드·본문 배경·다크 배경 위 텍스트 | + +### 1-3. 상태색 (Status / Semantic) + +| 토큰 | HEX | 의미 | 사용처 | +|---|---|---|---| +| `GREEN` | **#129E63** | 완료·라이브·검증됨·통과 | 간트 완료바·"이미 돈다" 배지·QA 통과·라이브 실적 | +| `AMBER` | **#E08A00** | 진행·주의·중간 리스크 | 간트 진행바·리스크 매트릭스 중위험·확인필요 | +| `RED` | **#D92D20** | 차단·위험·실격 리스크·전기배선 | 등록 게이트 403·고위험·**S6 전기 배선 범례(적)** | +| `CYAN` | **#0BA5EC** | 정보·네트워크 배선 | **S6 네트워크 배선 범례(청)**·정보 배지 | +| `TEAL` | **#0E9384** | 급배수·부가 | **S6 급배수 배선 범례(녹)** — GREEN과 구분 위해 청록 | + +> **배선 3색 규약(도식 ⑥ PostGIS 오버레이·④ Before/After 배선 범례 고정)**: 전기=`RED #D92D20`, 네트워크=`CYAN #0BA5EC`, 급배수=`TEAL #0E9384`. tech_advisory §1-4 ⑥의 "적/청/녹"을 색맹 안전(적-청-청록 조합, 명도차 확보)으로 확정. 상태 GREEN(완료)과 배선 TEAL(급배수)을 분리해 혼동 방지. + +### 1-4. 접근성·색맹 안전 + +- 본문 텍스트(INK/MUTED)는 모두 흰/연한 배경에서 WCAG AA 이상. +- 다크 배경(BLUE_DK/BLUE) 위 텍스트는 WHITE 또는 `#C7DDF2`(표지 부제, 대비 확보) 사용. +- 상태·배선은 **색 단독 의존 금지** — 항상 텍스트 라벨/아이콘/패턴 병기(완료=✓·진행=●·차단=✕, 배선=색+실선/파선/점선 스타일 병기). +- 색맹(적록) 안전: 완료/위험을 GREEN/RED만으로 구분하지 않고 아이콘·위치로 이중 인코딩. + +--- + +## 2. 타이포그래피 + +### 2-1. 폰트 패밀리 + +| 용도 | 폰트 | 대체(fallback) | +|---|---|---| +| 국문 기본 | **맑은 고딕 (Malgun Gothic)** | Pretendard, 본고딕(Noto Sans KR) | +| 영문·숫자 | 맑은 고딕(동일 지정) | Segoe UI, Arial | + +> deck-designer는 개발계획서와 동일하게 `FONT = "맑은 고딕"`을 전 run에 지정하고, ``(East Asian) 명시로 한글 렌더 일관성 확보. 외부 폰트 임베드 없이 시스템 폰트로 결정론적 생성. + +### 2-2. 타입 위계 (16:9 · pt 기준) + +| 위계 | 크기(pt) | 굵기 | 색 | 자간·행간 | 사용처 | +|---|---|---|---|---|---| +| 표지 대제목 (Display) | **44** | Bold | WHITE | line 1.02 | 표지 사업명 2줄 | +| 간지 넘버 (Section No.) | **150** | Bold | BLUE_DK(음영) | — | 간지 배경 대형 숫자 | +| 간지 제목 (Divider Title) | **34** | Bold | WHITE | — | 간지 섹션 국문명 | +| 본문 슬라이드 제목 (H1) | **22** | Bold | INK | line 1.0 | content_header 타이틀 | +| 소제목 (H2) | **13~14** | Bold | BLUE/PURPLE | — | 카드 헤더·블록 제목 | +| 강조 배너 (Lead) | **16~18** | Bold | WHITE/INK | line 1.0 | 비전 배너·핵심 문장 | +| 본문 (Body) | **10.5~11** | Regular | INK | line 1.0 | 불릿·설명 | +| 표 셀 (Table) | **8.5~10** | Regular/Bold | INK/MUTED | line 0.92 | 표 내용 | +| 캡션·부제 (Caption) | **8~9.5** | Regular | MUTED | — | 도표 캡션·부가설명 | +| 킥커 (Kicker) | **11** | Bold | PURPLE | — | 헤더 상단 섹션 라벨(대문자 영문 병기) | +| 배지·칩 (Chip) | **8~10** | Bold | WHITE | — | 배점 배지·상태칩·우선순위 | +| 지표 수치 (Metric) | **26~46** | Bold | WHITE/BLUE | — | 기대효과·통계 대형 숫자 | +| 푸터 (Footer) | **8.5** | Regular | MUTED | — | 슬라이드 하단 | + +> **본문 최소 크기 10pt 하한**(투사 가독성). 표 셀만 예외적으로 8.5pt까지 허용하되 정보 밀도 높은 표에 한정. 캡션 8pt 하한. + +--- + +## 3. 그리드·여백 (16:9) + +### 3-1. 캔버스 + +- 슬라이드: **13.333 in × 7.5 in** (12192000 × 6858000 EMU), 와이드 16:9. +- deck-designer 좌표계는 개발계획서와 동일 `inch(v)=v*914400` 헬퍼 사용. + +### 3-2. 안전 마진·그리드 + +| 항목 | 값(in) | 비고 | +|---|---|---| +| 좌우 마진 | **0.55** | 콘텐츠 좌측단=0.55, 우측단=12.78 (폭 12.23) | +| 상단 (본문) | 헤더 하단 구분선 **1.28**, 콘텐츠 시작 **1.45~1.5** | content_header 아래 | +| 하단 | 푸터 **7.06**, 콘텐츠 하한 **6.9** | | +| 상단 액센트바 | y=0, 높이 **0.12**, BLUE | 전 본문 공통 | +| 컬럼 그리드 | **12 컬럼** 개념 (실전: 2·3·4·5·6분할) | 카드 폭=(12.23 - gap×(n-1))/n | +| 표준 gutter | **0.16~0.35** | 카드 간격 | + +### 3-3. 정렬·화이트스페이스 원칙 + +- **좌측 정렬 기본**. 중앙 정렬은 칩·배지·지표 수치·간지 한정. +- 카드는 항상 `LINE` 테두리 1pt + 라운드(ROUNDED_RECTANGLE) + 옅은 그림자(alpha 18%). 그림자는 카드·주요 노드에만(남발 금지). +- **한 슬라이드 1 메시지** — 도식 1개 또는 카드 2~4개 + 하단 캡션 1줄. 밀도 상한 준수(P3 나노바나나 슬라이드도 도식+캡션+방어배지까지). +- 여백은 위계 신호 — 섹션 간 0.3in 이상 공백 확보. 꽉 채우지 않는다. + +--- + +## 4. 슬라이드 4종 레이아웃 규격 + +### 4-1. 표지 (Cover) — S01 + +- 배경: `BLUE_DK` 풀블리드 + 우측 겹침 평행사변형 2매(`BLUE` 큰 것, `PURPLE` 작은 것)로 대각 에너지. **여기에 나노바나나 시공 예측 히어로 이미지(워터마크)를 우측 평행사변형 영역에 반투명 합성**(개발계획서 대비 상향 포인트, `visual_concepts.md` §표지 참조). +- 좌상: 원형 브랜드 마크(WHITE 원+PURPLE 코어) + "KINTEX · WISE AI" 15pt WHITE Bold. +- 문서종류 배지 2개: "기술제안서"(PURPLE) + "Technical Proposal"(딥블루). +- 대제목: 사업명 2줄 44pt WHITE Bold. 그 아래 슬로건 배너 강조. +- 하단 메타바: 사업명·기술스택·작성일 (라인 구분). +- **슬로건 각인**: "신청서를 내는 순간, 시공 후 사진을 먼저 본다." — 부제로 대형 배치. + +### 4-2. 간지 (Section Divider) — 각 P1~P9 앞 + +- 배경: `BLUE_DK` 풀블리드 + 우측 평행사변형 2매(BLUE/PURPLE). +- 좌측: 대형 섹션 넘버 **150pt**(BLUE_DK보다 살짝 밝은 `#2C4E82` 음영톤) + PURPLE 언더바 + 국문 제목 34pt + 영문 13pt. +- 우측: 해당 섹션 핵심 포인트 3개(PURPLE 원 불릿 + WHITE 12.5pt). +- **배점 배지**: 간지 우상단에 해당 섹션 평가배점 배지(예 "P3 · 기술제안 35점")를 추가 — 배점 규율 시각화(개발계획서엔 없던 제안서 전용 요소). + +### 4-3. 본문 (Content) — 표준 + +- `content_header(kicker, title, idx)`: 상단 액센트바(BLUE 0.12) + 섹션번호 칩(라운드, BLUE) + 킥커(PURPLE 11pt) + 제목(INK 22pt) + 구분선(1.28) + 푸터. +- 콘텐츠 영역: y 1.45~6.9. 카드/표/도식 배치. +- 하단 **캡션 1줄** 필수(도식 슬라이드) — MUTED 9pt, tech_advisory 각 도식 "캡션" 텍스트 그대로. +- REQ 배지(선택): 우상단에 해당 슬라이드 대응 REQ-ID 소형 배지(회색) — RTM 정합 가시화. + +### 4-4. 도식 (Diagram) — 핵심 12종 + +- 본문 헤더 동일 + 콘텐츠 전체를 단일 도식에 할애. +- 도형은 **python-pptx 직접 작도**(외부 이미지 금지, 개발계획서 원칙 계승). 노드=ROUNDED_RECTANGLE, 연결=화살표 텍스트("→"/"›") 또는 얇은 라인 rect, 아이콘=본 시스템 SVG(단색 stroke, 슬라이드에선 도형 근사 또는 SVG를 EMF/PNG 없이 도형으로 재현). +- 각 도식 상세는 `visual_concepts.md`에 좌표·색·라벨 수준으로 명세. + +--- + +## 5. 컴포넌트 스타일 + +| 컴포넌트 | 규칙 | +|---|---| +| **카드 (Card)** | ROUNDED_RECTANGLE, fill WHITE, line LINE 1pt, 그림자(alpha 18%, blur 90k, dist 38k). 헤더 있으면 상단 컬러 바(0.07~0.5) 또는 좌측 컬러 스트립(0.08~0.09). | +| **섹션 넘버 칩** | 0.62×0.62 라운드, BLUE(또는 PURPLE), WHITE 20pt Bold 중앙. | +| **배점 배지** | 라운드칩, fill=섹션색, WHITE 8~10pt Bold. "20점"/"35점" 등. 배점 큰 P3는 PURPLE 강조. | +| **상태 칩** | 라운드, 완료=GREEN·진행=AMBER·예정=SLATE·차단=RED. 텍스트+색 이중. | +| **불릿** | 작은 OVAL(0.09~0.11) 컬러 점 + 텍스트. 컬러=맥락색(블루/퍼플/상태). 이모지 불릿 금지 — **선 아이콘 또는 도형 점만**. | +| **콜아웃/배너** | 풀폭 라운드 rect, fill=BLUE(비전)/INK(권한구조)/PURPLE(AI강조), WHITE Bold 중앙. | +| **번호 배지** | 작은 OVAL, fill=색, WHITE 8pt Bold 숫자. 프로세스 스텝. | +| **프로세스 스텝** | 카드 나열 + 사이 화살표("›" 16pt SLATE). 좌→우 흐름. | +| **표 (Table)** | 헤더=BLUE 풀폭 라운드바 WHITE Bold, 본문 zebra(짝수행 `#FCFCFD`/HALL_BG), 행 구분 LINE 0.01, 셀 8.5~10pt. 강조행(낙찰 등)=BLUE_LT + Bold. | +| **아이콘** | 본 시스템 `assets/icons/*.svg` — 선(stroke) 스타일, 24×24, stroke-width 1.75, currentColor. 슬라이드 내 색=맥락색. | + +--- + +## 6. 차트 스타일 (BI 도식 · S38·S39·S61) + +- 라이브러리 톤: Recharts 목업 재현(막대·라인·도넛·KPI 카드). +- **시퀀셜(단일 계열)**: BLUE 계열 명도 그라데이션(#00447A→#0066B3→#4A90D9→#9CC3E8). +- **카테고리(다계열)**: BLUE / PURPLE / TEAL / AMBER / SLATE 순환(최대 5, 색맹 안전 순서). 6번째부터 명도 변주. +- **비교(Before/After·As-Is/To-Be)**: As-Is=SLATE(회색, 과거), To-Be=BLUE(현재/개선). 개선 화살표=PURPLE. +- **강조 수치**: 대형 Metric(26~46pt) + 단위 소형. KPI 카드는 BLUE/PURPLE 교차 fill + WHITE 수치. +- 축·그리드: SLATE 얇은 선, 라벨 8pt MUTED. 범례는 색+텍스트+마커 형태 병기. +- 도넛/파이: 최대 5조각, 나머지 "기타" 회색 통합. 중앙에 총계 수치. + +--- + +## 7. 아이콘 시스템 (선 스타일 SVG — 직접 제작) + +### 7-1. 공통 제작 규격 (전 20종 통일) + +- **viewBox**: `0 0 24 24` +- **fill**: `none` (면 채움 절대 금지) +- **stroke**: `currentColor` (슬라이드에서 맥락색 상속) +- **stroke-width**: `1.75` (전 아이콘 동일 시각 무게) +- **stroke-linecap**: `round`, **stroke-linejoin**: `round` +- **그리드 정렬**: 24 그리드, 여백 2(콘텐츠 영역 2~22), 코너 반경 통일감. +- **외부 라이브러리·폰트아이콘·온라인 생성 금지** — 전량 직접 패스 작도. +- 한 세트 통일 메타포: 기하 단순·동일 디테일 밀도(오버피팅 금지). + +### 7-2. 아이콘 20종 (최소 16종 요구 → 20종 제작) + +| # | 파일명 | 의미 | 주 사용 슬라이드 | +|---|---|---|---| +| 1 | `ai-sparkle.svg` | AI/스파클/지능 | 나노바나나·AI 전 슬라이드·간지 | +| 2 | `booth-layout.svg` | 부스/레이아웃/배치 | M2 플로어플랜·모듈맵 | +| 3 | `wiring-power.svg` | 배선/전기/유틸리티 | M4 배선·아키텍처 | +| 4 | `camera-render.svg` | 카메라/렌더링/시각화 | 나노바나나 샷세트·표지 | +| 5 | `auction-gavel.svg` | 옥션/경매 망치 | M15 옥션 폐루프 | +| 6 | `visitor-badge.svg` | 관람객/배지 | M10 관람·등록 | +| 7 | `shield-security.svg` | 보안/방패 | P5 보안·불변원칙 | +| 8 | `watermark.svg` | 워터마크 | AI 이미지 보안·워터마크 | +| 9 | `tenant-building.svg` | 테넌트/전시관/빌딩 | 멀티테넌시·확장 | +| 10 | `schedule-gantt.svg` | 일정/간트 | P8 일정·마일스톤 | +| 11 | `org-people.svg` | 조직/사람 | 추진체계도·페르소나 | +| 12 | `check-verify.svg` | 체크/검증/규정 | 규정검증·QA·커버리지 | +| 13 | `dashboard-chart.svg` | 대시보드/차트/BI | M16 경영분석·기대효과 | +| 14 | `mobile.svg` | 모바일/반응형 | 현장·모바일·접근성 | +| 15 | `document-rtm.svg` | 문서/서류/RTM | M6 서류·RTM·커버리지 | +| 16 | `risk-warning.svg` | 리스크/경고 | 리스크 매트릭스·확인필요 | +| 17 | `postgis-spatial.svg` | 공간데이터/PostGIS/폴리곤 | 단일 공간원천·배선 | +| 18 | `pipeline-flow.svg` | 파이프라인/큐/비동기 | 나노바나나 파이프라인·아키텍처 | +| 19 | `network-zone.svg` | 망분리/보안영역 | 보안영역 분리도 | +| 20 | `closed-loop.svg` | 폐루프/순환 | 생애주기 폐루프·옥션 | + +> 16종 요구 대비 **20종 제작**(공간데이터·파이프라인·망분리·폐루프 4종 추가 — 킨텍스 도식 핵심 메타포 보강). + +### 7-3. deck-designer 아이콘 사용 지침 + +- python-pptx는 SVG 직접 임베드가 어려우므로, 각 아이콘은 **(a) 슬라이드 헤더/칩 옆 시각 앵커**로 쓸 때는 대응 도형(원+선) 근사 작도, **(b) 아이콘 자체가 콘텐츠일 때**는 SVG를 사전 PNG 변환(cairosvg/inkscape) 후 삽입 가능. 변환 시 stroke 색=맥락색으로 렌더. +- 색 상속: 아이콘 stroke는 배치 맥락색(블루=구조, 퍼플=AI, 상태색=상태)으로 지정. + +--- + +## 8. deck-designer 전달 요약 (준수 계약) + +1. **팔레트 상수**를 §1 표 그대로 코드 상단에 정의(개발계획서 `gen_dev_plan_pptx.py`와 동일 변수명 재사용 + PURPLE_DK·RED·CYAN·TEAL 추가). +2. **폰트** 맑은 고딕 전 run + East Asian 지정. +3. **레이아웃 4종**(§4) 헬퍼 함수화: `cover()`, `divider(no,kr,en,points,score)`, `content_header()`, 도식별 함수. +4. **12종 도식 + 표준 3종**(추진체계·리스크·기대효과)은 `visual_concepts.md` 좌표·라벨대로 작도. 재해석 금지. +5. **색 규율**: 퍼플=AI 전용, 배선 3색 고정(적/청/청록), 상태색 의미 고정. +6. **가독성 우선**: 본문 10pt 하한, 한 슬라이드 1메시지, 캡션 1줄, 여백 확보. +7. **보안**: 시크릿·내부IP 도식/라벨에 미기재. 외부 API는 "승인 예외"로만 표기. diff --git a/docs/deliverables/제안서/_gen/fetch_screens.py b/docs/deliverables/제안서/_gen/fetch_screens.py new file mode 100644 index 0000000..02aa4c3 --- /dev/null +++ b/docs/deliverables/제안서/_gen/fetch_screens.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +""" +Stitch 화면 스크린샷 다운로드 + 매니페스트 생성 +- MCP list_screens 결과(제목→SCR/모듈/그룹 매핑)의 screenshot.downloadUrl을 assets/screens/ 로 저장 +- screens_manifest.json 갱신(파일명→title·scr·module·group·device·order) +- build_deck.py 는 assets/screens/ + manifest 를 재스캔해 갤러리 자동 재구성 +재실행: 새 화면이 생기면 MCP 재조회 후 SCREENS 갱신하여 다시 실행. +""" +import os, json, urllib.request, ssl + +BASE = os.path.dirname(os.path.abspath(__file__)) +OUT = os.path.join(BASE, "assets", "screens") +os.makedirs(OUT, exist_ok=True) + +# title -> (scr, module, korean_name, group, device) +META = { + "Login & Workspace Selection - KINTEX AI System": ("SCR-01","공통","로그인 & 행사 워크스페이스 선택","공통·인증","DESKTOP"), + "Organizer Dashboard - KINTEX AI System": ("SCR-02","M1","주최자 대시보드","주최자","DESKTOP"), + "Booth Layout Editor - KINTEX AI System": ("SCR-03","M2","부스 배치 에디터","주최자","DESKTOP"), + "Layout Comparison - KINTEX AI System": ("SCR-04","M2","배치안 비교(S7 조감)","주최자","DESKTOP"), + "Exhibition Schedule - KINTEX AI System (Updated Icons)": ("SCR-15","M1·M6","전시 일정 관리","주최자","DESKTOP"), + "Exhibitor Home - KINTEX AI System": ("SCR-05","M1","참가업체 부스 홈","참가업체","DESKTOP"), + "Booth Design Studio - KINTEX AI System": ("SCR-06","M3","부스 설계 스튜디오","참가업체","DESKTOP"), + "Utility Wiring View - KINTEX AI System": ("SCR-07","M4","유틸리티 배선 뷰","참가업체","DESKTOP"), + "Utility Order Summary - KINTEX AI System": ("SCR-08","M4","유틸리티 신청 요약·위치표시도","참가업체","DESKTOP"), + "Compliance Report - KINTEX AI System": ("SCR-09","M2","규정 검증 리포트","장치업체","DESKTOP"), + "Manager Approval Queue - KINTEX AI System": ("SCR-10","M6","홀매니저 승인 큐","홀매니저·운영","DESKTOP"), + "Review Details - KINTEX AI System": ("SCR-11","M6","홀매니저 검수 상세","홀매니저·운영","DESKTOP"), + "Hall Operations - KINTEX AI System (Updated Icons)": ("SCR-14","M14","홀 현장운영 대시보드","홀매니저·운영","DESKTOP"), + "Visualization Gallery - KINTEX AI System": ("SCR-12","M5","시각화 갤러리","시각화·전역","DESKTOP"), + "Business Intelligence - KINTEX AI System (Updated Icons)": ("SCR-13","M16","경영분석 대시보드","경영분석","DESKTOP"), + "Admin Dashboard - KINTEX AI System (Updated Icons)": ("SCR-16","M18","관리자 대시보드","관리자 백오피스","DESKTOP"), + "Component Guide - KINTEX AI System (Updated Icons)": ("SCR-17","디자인","컴포넌트 가이드(스타일가이드)","스타일가이드","DESKTOP"), + "Contractor On-site Checklist - KINTEX AI System": ("SCR-M1","현장","시공업체 현장 체크리스트","모바일 현장","MOBILE"), + "Manager Field Inspection - KINTEX AI System": ("SCR-M2","현장","홀매니저 현장 검수","모바일 현장","MOBILE"), +} + +# title -> screenshot downloadUrl (from MCP list_screens; 최신 조회분) +URLS = { + "Login & Workspace Selection - KINTEX AI System":"https://lh3.googleusercontent.com/aida/AP1WRLtUqdYm2030_UAU-An_JAmVNGl2eTumZ5vNnz9T5WeXoyFc7pvkO4RQPoHLdsFqg4shnjDOxWNOMGVPtMLH8A_SUNvd7GFISwRGX1vZ8hMkZIsiU4DPDg-6qV6EpX1j0qHjpu9zHPyWtO_6nWcRDGaOsweZTkjvZ2UeTD0GgyqCETLufFh69ZQvlcuOpM0VSH7spqLDwPq-hpoWme6S_WBSg9b6ygHB3lUvfkOgs5wWtPOgIcZ6bCn1ZB8", + "Organizer Dashboard - KINTEX AI System":"https://lh3.googleusercontent.com/aida/AP1WRLtAyvwUEakGIhFdDB_6cQqB8DzBPnb7TdrSUBehA1gVEzNKg-ppC3sF1LcgF_vr9bceJ3voOhAcUcC5CYbSiPb0IjMoHHpwfCqm5rqI9vTqHjdvIpg69oMO09Rx_wF0k_XCY6P9doDNj8SaW5TjcsbuvGT4NHO-5uBDeT65_MF-ZTdRZ_jF2mugRi0KqBS5dnAvnJhQH-UFdIO3v_Wtaj8hkXkvS--sth05JgI1hNMUZJrjHGiROzBGxw", + "Booth Layout Editor - KINTEX AI System":"https://lh3.googleusercontent.com/aida/AP1WRLvOGbKVWZuHy5ALELagNRlBkIwl8byuXEe1LcPgKuP7o5XaRZrsE6UTVJC821aK01hdrs19oson_NDDMnoo7nqU6kgu5NgJJdxK6cdF5lmzr2jziNxWEwHDPoibYcIeAFsCaIZy49a6mYUzrY2ZhQDqAT0AZ3YV8Cfq_dMkuyaGaHvKRBt_1cbRRFa0MgZsN9l1Ed6w6GPKLjKF7Sw3fOpdYxTwhLz6BrpIBBkNYsk97t7nzA9Hv2mTHw", + "Layout Comparison - KINTEX AI System":"https://lh3.googleusercontent.com/aida/AP1WRLvUxlOFlFr0MwnaD8KN10xT9gsFq0_wyilol_aWYLj2Ev_kHhNKJ5PHug_6KwEemQtsQjZDEP8zEPpkdZvUq-TTOubFN3NStmGaIlf1-GvpPzq5uLMGrneKXsp7ccThjFjq556VQhhr2WHlyqlSEhtx37cd0i9Iggo3GfPwcNYNUMd6kizoWzKTy_LMvTjhMAdMGwblLvMN1bYDhoQ75Aty2eSwf92NSzsLccQPk5EGw_GicpZRenkeDQ", + "Exhibition Schedule - KINTEX AI System (Updated Icons)":"https://lh3.googleusercontent.com/aida/AP1WRLthlJCkcQzW168tISpRl5BVhGWN6aZ-dTxxpnJYLqrWUQ132vn-w0x23XA_y8JF7e-q28ZqqJy_Z9tqc2J_OK99-RPYpT7nbFmoD2H-NC7MBHRp7RSegRK-hE5WKT3r8MNtFPG1PvcDIdvSiNPqy_YYcdOCYDvjwVZAPmhgBSiWFyZTZjB6Plwq6et0F5SIZQThhmK_lFcy0K9Jcodwk2YiCcIET47cTYj02BpEieNO5RK7gj6fsL3OonI", + "Exhibitor Home - KINTEX AI System":"https://lh3.googleusercontent.com/aida/AP1WRLvzY0N-4aD4E4apccqfR3yNCRkuFKEOc4O4uJIbkaHQQrDi-gDwKS5pFJPEvcAKBfrGgi10XY32J6VSfgiX_AzVomJDuoinMjWzTi_XSXSzJgravcI-ABUo-ep_p9rdNP2lX7T01WqML0uhOYGD2jlhjhusVpqsYBYsRmFhi6NhQMYqUZdBH_ndL9YW6g6wAOObXXVGKgMUBr0d-YHI0FyhKM0uAi1CYQ2QQiNDSJtZdtOHS6yn44MwUhs", + "Booth Design Studio - KINTEX AI System":"https://lh3.googleusercontent.com/aida/AP1WRLu1TWc00TspuC4jpGfgrvt9_kRQIWg84Zr4FW1l_YVePzu5jTqkYR7UmO1Xw9nuydukCbwIh3OiOqpedk9Tt4fwrTQkqrxJEZYNmM3dr-GRhvbYhO2UFrmlJzhdMeFtXuTKnv3nTqzWyTgBySTbXYncfySbTSzC06dleCMKamOHEgGI0M60g_9LBT-STycoHohAFWuUY2Z4XIlkN0gJJ0B0P3y9JTEX7S3RTiiO8RNhAoBskY2ZjQId7TI", + "Utility Wiring View - KINTEX AI System":"https://lh3.googleusercontent.com/aida/AP1WRLt0_fkmB3ACojGDXezlhbpya-s-re7WgfEAXim10VWfAMNWet_cpx3addY23p2Kzcd-1NXVbgmQh-5tGokg19E0ui7H5yU2IVbU28GOquQu-ngiRv6CpAcMtQfe-zjzfrSOA1DT2mT-zQTUYd068i6HwJJv5734uU4hFuvLU0xCExlfe8kxnp5Ct8IfC11Aoh_jLvPMCqsMmOux0mtYRf4Sp4hEaBfJr1BMwIX4dAlvpTV-PJxiJ_M5Ymo", + "Utility Order Summary - KINTEX AI System":"https://lh3.googleusercontent.com/aida/AP1WRLtyOGoy4l69iClGRq0bO8uTbAjZx54sF890NtTmAKPztU6OwKtfsUDZ8c_KcynLP1btwWj1VMXUu0MHKCx75n5gCNpxuRRpwAgdoQM6Mxzwt-TuWLyAhM4CW7MXKJEpVVA0vQmXjqV6hM177yZ0kTJ6aN0u2C-mvzELug_hDensEwivvFZn4OHfK1UF3HY7GxuPLZB4smGXiMqHH3vRGD1feNV1USWxfTGq0G5JhIu79TI1mMyTbmrtvg4", + "Compliance Report - KINTEX AI System":"https://lh3.googleusercontent.com/aida/AP1WRLuh3R_GPiSwqoywspJfxh9c8o-4qNRFGsRQJ6hNtS4OyvqArAB3AVT4ZDkQrJjZPutTFFG0k7JNr_egmfBAfUn_LjOO5AB-eqTA3MoAdGxmqEa7qThF7hCIz2lfKInkL4N-GSrNdZtBnJMb95f9sRUDzNaLk-wQZZcUv2ee6Uo1CvWEu5mdYScTal09vaepqghDUi2Td8oxzTjQ_dcRGUHDcZoncSuvPg2fPhHECW99CiTwD3RMU2es470", + "Manager Approval Queue - KINTEX AI System":"https://lh3.googleusercontent.com/aida/AP1WRLt0jyggUFD_uIa47eZ71yDp7_r-yDJxUvGJcxuBhlHcjPsilp_Su2XDR17WyNcxPWdd5t_6nJCIkd9JjblfA8ENMW2QvuszG7RawM33gvFJG5uS8_JFoctdLz8Oq1WDAcdJH3ObRgv3EDDfqFY9LXvAnzKA8d2qsR31fz5ulTfulgUyCUdckbSdheECcc1lrtx4TLwafiwUggI1y8zDNVHtOcJuw4cG9OWqxMxreCghnJ3D4YthwnWUAQ", + "Review Details - KINTEX AI System":"https://lh3.googleusercontent.com/aida/AP1WRLtZn9UwuYCpWjWC9ZlUKYKZO6-8LWF92u8BZhUpgNrIjPQVa2NiS6zv5Zz9k2NQSPYCWdj2OQBRpB7u1hNi3AmMvObMtvvewMBeeDrDInB22eFS6DcbuT_Goa5bsxMTIWp0jx5PKR2rGZtp-78nHn2NNi7p96d_2ddXJ3eBtwAq-NRFL7jbuFbGWrIW0wFkJ8ThMazQ33UxOFsLmD_PXCrnWyt_NcNO-ans631jlKL-VdL_FfKBNDaxylw", + "Hall Operations - KINTEX AI System (Updated Icons)":"https://lh3.googleusercontent.com/aida/AP1WRLtVuCoXA2RksHSQq2vVewDWWsoduCoY9CD0n9rVvsD-ShiGsQCPBCFJWakyIjNNPqF9GASb3u5rs3bqHSUd_kk15d_014FfzpYuiWyrjTleULMsFDsnhaW9n-jpO7_ayRndbZWh8zBjpZ2zVuUReCYRFP_BVwr2O3RYyKCEVXcY6l6dzMywa3EozvEhV87GSS-CxKhm4cBb5RcI7j_5j4IgFj9RYxDzq89agjhTxjsWA9DIx5lq32BSof0", + "Visualization Gallery - KINTEX AI System":"https://lh3.googleusercontent.com/aida/AP1WRLuuyZPo--qWn5qMTYI0fWcrBj1LuMzudztIvctYqof9RweLOLVb1Xu7a-xTUB615pRKZp-AAOPQZgRcqQUN6bT_XIyykoLT4yFQXXOxMqIXI-FulW61CdiBOfo6U43Z9YI37oXm_aFtV9PsEgPrsjj3aIzNYxxtSAkOJzVx-G215-uAVdcikNeYoPvnSkgoBP5OjzR5futn48YmVMNsEmbVXe0YVIZbwQOvlIa31TDNPiw2xzJyvdGUwrg", + "Business Intelligence - KINTEX AI System (Updated Icons)":"https://lh3.googleusercontent.com/aida/AP1WRLubNXF75G8McZ1gryw7VDigsKOl63B9nuVSi6_tJCXAYF4ZIhEuJlNfptxhTWSxP5CwN5cUWxHVnnviC-qO8pxChg_Xf5GpImd-UTXb_JIdqzGT2dtr0qkNN15FqPMvk4WenixdezsLNsU4moxl72lOoqJvxHi0xuBp4SmRzJNTd1Z7XK29ycdk-80LCfvPBHZrbT2iGZGreshY63kpwu4dlZarjt_xQO1qqTm_ZYkpIM79xJPMT-jMNyQ", + "Admin Dashboard - KINTEX AI System (Updated Icons)":"https://lh3.googleusercontent.com/aida/AP1WRLu3zdb3wXg6Dvq77ymBp4iT7wU7uo9G5t8cfb5X2_TZr0XNtST2AnmFqsrZO56E1p1Xz6xbQesdd_59tfcpsoUMkB5WO1fja-HFLK06JtFeGkZxitnG-87qCgauSPphlsjOtSHaEiZmPfbg5yh-a5PelIKe2bHjM-FmX4hm7_UItkgaC-FoEBEfsNwHnALPBbWvz6u8ZZhuXceh8G0V_SSH0ks9t75boEooOPg15xEJ4KszZHdlb2OFCl0", + "Component Guide - KINTEX AI System (Updated Icons)":"https://lh3.googleusercontent.com/aida/AP1WRLsLW88myjTGHETfGth2ywdFnjE3y692dNnxaDKncS_DwVuqegjWfznVhrKE8VXJLSWkmIiqREk13m-FKKAK7nwJGAtUX2r7f54KrcEd0Na2B-xFqEqzQovlfFi2tbxletF3WKJUqNGp_IHkvlghOymIz7IBUOeA5UABGGqfJdSBGIso2Fqh1jX5Pu0LEfP1HsfL167lTgS4t1oe94hDp9QC-MQgD2U-KOYdoUaZ_WINLtFeZ5-3Uvo05YI", + "Contractor On-site Checklist - KINTEX AI System":"https://lh3.googleusercontent.com/aida/AP1WRLtA_bsgM_D2rk4HbtM-snlKWWvXP8Lm4dGEvLQcGFgf6tFBkHXiK5fiT-T2UCzS46RkEwV8GDjM3sHFRfh65PQ4Ssnj-p5DVhZO0JCx3_jmTDumyl3kYbL5ssEU15psKPJ8tU_yX-MlUelq-Yhh6lgkGYqbTFUy8aQYD5M3F-FUAKQLUjSTb_SqHHg4dae9RqB6otbfl5Y0KiA4QDkAURFWBgJnJeOmuONOr-r6BTKS4ZPmu7DnAXQPYK0", + "Manager Field Inspection - KINTEX AI System":"https://lh3.googleusercontent.com/aida/AP1WRLtStbjv9lr4kBFrhu9LuUu7yXXGrFg_8HKk4DPRjSpxcslk4GPz85moG6zJzCQrt_tVWRi255BLH9NKp8wH-W_kBcPEy9_T4xVBPbYkytnT6oHIMW5HXz0OAkhq1Izk-EI7Xj_-FfAhKUpjgAXhg_7sGZMrkD6sXgVk57W6-fZNmN-OqYY2872tL-JK_EgVAdY7joxaUoqVOizVZB2Mw_ElFBRTFCPz3iO8UTwhQs2q55OYSqP-n0in7pc", +} + +# 갤러리 그룹 순서 +GROUP_ORDER = ["공통·인증","주최자","참가업체","장치업체","홀매니저·운영","시각화·전역","경영분석","관리자 백오피스","스타일가이드","모바일 현장"] + +def scr_num(scr): + s = scr.replace("SCR-","") + if s.startswith("M"): return 100+int(s[1:]) + return int(s.split("·")[0]) if s[0].isdigit() else 999 + +ctx = ssl.create_default_context() +ctx.check_hostname = False +ctx.verify_mode = ssl.CERT_NONE + +def slug(scr, kor): + return scr.replace("·","_") + ".png" + +manifest = {} +ok = fail = 0 +for title, meta in META.items(): + scr, module, kor, group, device = meta + url = URLS.get(title) + fn = slug(scr, kor) + fp = os.path.join(OUT, fn) + if url: + try: + req = urllib.request.Request(url, headers={"User-Agent":"Mozilla/5.0"}) + data = urllib.request.urlopen(req, context=ctx, timeout=60).read() + with open(fp, "wb") as f: + f.write(data) + ok += 1 + except Exception as e: + print("FAIL", scr, title, repr(e)[:80]); fail += 1 + continue + elif not os.path.exists(fp): + print("SKIP(no url, no file)", scr); continue + manifest[fn] = {"scr":scr,"module":module,"name":kor,"group":group,"device":device, + "title":title,"order":scr_num(scr)} + +with open(os.path.join(OUT, "screens_manifest.json"), "w", encoding="utf-8") as f: + json.dump({"group_order":GROUP_ORDER,"screens":manifest}, f, ensure_ascii=False, indent=1) + +print(f"DOWNLOADED ok={ok} fail={fail} manifest={len(manifest)} -> {OUT}") diff --git a/docs/deliverables/제안서/_gen/g2b_standard_toc.md b/docs/deliverables/제안서/_gen/g2b_standard_toc.md new file mode 100644 index 0000000..ad6e27c --- /dev/null +++ b/docs/deliverables/제안서/_gen/g2b_standard_toc.md @@ -0,0 +1,342 @@ +# 나라장터(g2b) 정보시스템 구축 부문 — 표준 제안서 목차·평가배점 조사 및 킨텍스 제안서 재편 매핑 + +> 작성: rfp-analyst · 작성일: 2026-07-12 · 목적: 킨텍스 제안서(P1~P9, 63슬라이드) 목차 재편 근거 +> 원칙: **확인된 1차 출처(법령·실제 RFP)만 사실로 기재**, 그 외는 [가정]/[통례] 표기. 시크릿 미기재. +> 대상 제안서 파일은 **읽기만**(수정 금지) — 본 문서는 매핑·권고만 산출. +> 짝 문서: `proposal_outline.md`(현행 P1~P9) · `rfp_analysis.md`(§4 배점 가정) · `tech_advisory.md`(§5 WBS·§6 SM) · `rtm.md` + +--- + +## 0. 핵심 결론 (요약) + +1. **표준 목차의 단일 출처**는 조달청 「협상에 의한 계약 제안서평가 세부기준」 **[별지 제5호서식] 제안서 서식(예시: 소프트웨어개발·유지관리사업)** — 7개 대장(Ⅰ 일반현황 ~ Ⅶ 그 밖의 사항)이다. 이 목차가 **평가부문 = 제안서 장(章)**으로 1:1 정렬된다. +2. **정성평가 평가항목의 단일 출처**는 같은 세부기준 **[별표 3의2] 소프트웨어 및 시스템 개발사업** — "정보시스템 구축"에 해당하는 표준 평가표. 부문: **전략 및 방법론 / 수행계획(기술·기능) / 수행기반 / 프로젝트 관리 / 프로젝트 지원 / 하도급 / 필수 제안**. +3. **배점은 세부기준이 고정하지 않는다.** 제9조⑤에 따라 **수요기관이 항목별 배점한도를 결정**(항목당 30점 초과 금지, 하도급 5점 이상, 국산제품 활용 2점 이내). 정보화사업 총 배점은 「행정기관·공공기관 정보시스템 구축·운영 지침」 **제18조**에 따라 **기술 90(정성 70 + 정량 20) / 가격 10**(원칙), HW 비중 50% 이상 사업은 **기술 80 / 가격 20** 허용. +4. **현행 킨텍스 제안서의 80/20 배점 가정(rfp_analysis §4)은 정보화 표준(90/10)과 다르다** — 실제 공고 확인 전까지 [가정]이며, SW 중심 사업이면 90/10이 표준. (본 문서는 지적만, proposal 파일 수정 없음.) +5. 현행 63슬라이드는 **표준 7대장에 전부 매핑 가능**하나, **신설이 필요한 장 4개**(Ⅰ 일반현황 / Ⅴ·Ⅵ 프로젝트 관리·지원 보강 / 상생협력·하도급 / 정량평가 대응)가 있다. 미배치 슬라이드 0. + +--- + +## 1. 조달청 기술평가 표준 항목·배점 (출처·연도 명시) + +### 1-1. 전체 배점 체계 (법령 확정 사실) + +| 구분 | 배점 | 출처(조항) | +|---|---|---| +| 종합 = 기술능력평가 + 입찰가격평가 | 100 | 세부기준 제9조① | +| 기술능력평가 | **80점** (세부기준 원칙) / 정보화사업은 **90점**(지침 제18조) | 세부기준 제9조①1 · 지침 제18조 | +| 입찰가격평가 | 20점(원칙) / 정보화 10점 | 세부기준 제9조①2 | +| ─ 정성평가 | (기술 90 기준) **70점** | 실제 RFP 표본 §1 | +| ─ 정량평가 | **20점 이내**(총 배점한도) | 세부기준 제9조④ | +| HW 비중 50%↑ 예외 | 기술 80 / 가격 20 허용 | 지침 제18조 | + +> **출처 정본**: 조달청 「협상에 의한 계약 제안서평가 세부기준」(조달청지침, 최신 개정 **2024. 9. 6. 시행**; 2017. 6. 1. 최초 시행). 정보화 총배점은 「행정기관 및 공공기관 정보시스템 구축·운영 지침」(행정안전부고시 제2024-66호, **2024. 8. 28. 시행**) 제18조. + +### 1-2. 정성평가 표준 평가표 — [별표 3의2] 소프트웨어 및 시스템 개발사업 (정보시스템 구축 표준) + +> **세부기준은 각 세부항목에 고정 점수를 부여하지 않는다**(수요기관이 배점한도 결정). 아래는 **평가항목 ↔ 세부평가항목 구조**(법령 원문 그대로). 배점 예시는 §1-3 실제 RFP 표본 참조. + +| 평가항목(부문) | 세부평가항목 | 채점 관점(평가위원이 무엇을 보는가) | +|---|---|---| +| **전략 및 방법론** | 사업이해도 | 사업 목표·특성 부합, 구체성·적절성. (기획용역 ISP 수행자 참여 시 1등급 하향) | +| | 추진전략 | 수행 일정·위험요소 고려한 추진전략 타당성 | +| | 추진체계 | 수행조직(전문업체·기술지원·공동수급체·하도급) 역할·책임·품질확보·협력 방안 | +| | 사업추진방법론 | 방법론 구체성·적절성, 적용사례·경험, 단계별 산출물 제시 | +| **수행계획**(≈기술 및 기능) | 시스템 요구사항 | 장비 규격 충족·인터페이스·확장성·공급/설치·유지관리 | +| | 국산제품 활용 기여도 | 국산장비 도입방안 적절성·국내기업 지원 (배점 **2점 이내**, 국내입찰 한정) | +| | 기능 요구사항 | 기능·기대·제약 대비 구현방안 구체성·실현가능성 | +| | 성능 요구사항 | 성능충족 구현·테스트·방법론·분석도구 | +| | 인터페이스 요구사항 | 타 시스템 연계 방안·사용자 UI 분석/설계/구현/테스트 | +| | 유지관리 정책 | 제조사 유지관리(기간·비용·부품·보증) | +| **수행기반** | 적용기술 | 적용 기술의 확장·실현 가능성 | +| | 개발환경 | 장비·작업장소 등 인프라 준비·대응 | +| | 보안 요구사항 | 기술적 보안 구현(설계→구현→검증 단계 반영) | +| | 제약사항 | 기술·표준(**표준 프레임워크 적용 포함**)·언어·방법론·법제도·안전관리 제약 대응 | +| **프로젝트 관리** | 일정관리 | 수행기간·세부일정·단계별 산출물 연계 | +| | 품질관리 | 품질관리 범위·절차·점검, 품질보증 인증 근거 | +| | 기밀보안관리 | 물리적·관리적 보안 체계·대책 | +| | 위험 및 이슈 관리 | 위험·이슈 식별·분석·절차·대응 | +| **프로젝트 지원** | 인수인계 | 인계 전략·검사 대상/방법·충족조건·인계계획 | +| | 교육훈련 | 운영자·관리자·사용자 교육 내용·방법·기간·인원·횟수 | +| | 기술지원 | 지원 범위·수준·기술 매뉴얼 | +| | 하자보수 계획 | 하자담보 기간 내 하자보수 범위·조치절차·대응 | +| **하도급** | 하도급 계획의 적정성 | 하도급 금액/계약금액 비율 적정성 (배점 **5점 이상 필수**; **20억원 이상 SW사업은 제외 불가**) | +| **필수 제안** | (수요기관 지정) | 제안요청 필수사항 반영 여부 | + +### 1-3. 정량평가 항목 (별표 8~14, 총 20점 이내) + +| 정량 항목 | 출처 | 비고 | +|---|---|---| +| 경영상태 | 별표8 | 기업신용평가 | +| 수행실적 | 별표9 | 동일·유사 사업 실적 | +| 책임성·성실성 | 별표10 | | +| **상생협력** | **별표11** | 중소기업 공동수급체 참여 지분율 — 50%↑=5.0점 … 35%미만=1.0점 (**최대 5점**). 중소기업 단독=최고등급, 참여지분 0=0점 | +| 상용SW 유지관리 하도급금액 적정성 | 별표12 | | +| SW기술자료 임치 | 별표13 | | +| 정량 필수제안 | 별표14 | | + +### 1-4. 실제 RFP 배점 표본 (구체 숫자 예시) — g2b R25BK00879799 (정보시스템 구축, HW 포함형, 30p 이내) + +> 표본은 90/10(기술 90+가격 10) 채택. 부문 세분은 수요기관 재량임을 실증. + +| 구분 | 평가항목 | 배점 | +|---|---|---| +| 정량(20) | 보유인력 5 · 경영상태 5 · 수행실적 5 · 사회적책임 3 · 지리적거리 2 | 20 | +| 정성(70) | 사업의 이해도(10) · 시스템 구성(20) · 시스템 기능(20) · 운영방안(10) · 사업관리 및 지원(10) | 70 | +| 가격(10) | 입찰가격평가 | 10 | + +--- + +## 2. 정보시스템 부문 표준 제안서 목차 (장·절 구조) + +### 2-1. 표준 목차 정본 — [별지 제5호서식] 제안서 서식(예시: 소프트웨어개발·유지관리사업) + +> 출처: 세부기준 별지 제5호서식(법령 원문). **평가부문과 장 구조가 일치**하도록 설계됨. 각 절 옆은 대응 평가항목(별표 3의2). + +``` +Ⅰ. 일반현황 + 1. 입찰자 일반현황 (일반현황·주요 연혁·자본금·매출액) + 2. 해당 사업의 수행조직 및 업무분장 → [정성] 추진체계 / [정량] 경영·실적 + 3. 해당 사업의 핵심투입인력 및 이력사항 → [정량] 보유인력 +Ⅱ. 전략 및 방법론 + 1. 사업 이해도 → 전략및방법론·사업이해도 + 2. 추진전략 → 추진전략·추진체계 + 3. 적용기술 → 수행기반·적용기술 + 4. 표준 프레임워크 적용 → 수행기반·제약사항(표준FW) + 5. 개발 방법론 → 사업추진방법론 +Ⅲ. 기술 및 기능 + 1. 시스템 장비구성 요구사항 → 수행계획·시스템 요구사항 + 2. 기능 요구사항 → 수행계획·기능 요구사항 + 3. 보안 요구사항 → 수행기반·보안 요구사항 + 4. 데이터 요구사항 → (기능/데이터) + 5. 시스템 운영 요구사항 + 6. 제약사항 → 수행기반·제약사항 +Ⅳ. 성능 및 품질 + 1. 성능 요구사항 → 수행계획·성능 요구사항 + 2. 품질 요구사항 → 프로젝트관리·품질관리 + 3. 인터페이스 요구사항 → 수행계획·인터페이스 요구사항 + 4. 테스트 요구사항 +Ⅴ. 프로젝트 관리 + 1. 관리방법론 + 2. 관리역량 + 3. 일정계획 → 프로젝트관리·일정관리 + 4. 개발장비 +Ⅵ. 프로젝트 지원 + 1. 품질보증 → 프로젝트관리·품질관리 + 2. 시험운영 + 3. 교육훈련 → 프로젝트지원·교육훈련 + 4. 유지보수 → 프로젝트지원·기술지원/하자보수 + 5. 기밀보안 → 프로젝트관리·기밀보안관리 + 6. 비상대책 +Ⅶ. 그 밖의 사항 → 기대효과·확장·상생협력 등 +``` + +### 2-2. 실제 RFP 표본의 목차 요구 (간소형 예시) — g2b R25BK00879799 (30p 이내) + +``` +Ⅰ. 사업의 이해 : 과제수행목표·제안개요·제안사현황·추진체계및전략·제안의특징및장점 +Ⅱ. 시스템 관련사항: 총괄시스템구성전략·기능별시스템구성및기능·성능구현 사전운영방안·향후활용방안 +Ⅲ. 사업관리 및 지원: 사업관리(보고·일정·위험)·시스템지원방안(교육·기술지원·유지보수) +Ⅳ. 첨부자료 +※ "발주처 요청 외 제안사가 중요하다고 판단한 목차·내용은 별도 기술하고 근거자료 첨부" +``` + +> **판독**: 소형·HW형 RFP는 별지 5호서식을 3~4장으로 압축한다. **대형 SW 구축**은 별지 5호서식 7대장을 그대로 쓰는 경향. 킨텍스 규모(전 전시 파이프라인)는 **7대장 채택 권장**. + +### 2-3. 장별 "무엇을 담는가" (평가위원 채점 관점 요약) + +| 장 | 담을 내용 | 채점 포인트 | +|---|---|---| +| Ⅰ 일반현황 | 제안사 개요·실적·재무, 수행조직도·R&R, 핵심인력 이력 | 정량(보유인력·경영·실적) 근거 + 조직 신뢰 | +| Ⅱ 전략·방법론 | 사업이해도, 추진전략/체계, 적용기술, 표준FW, 개발방법론 | "우리가 사업을 제대로 이해했고, 검증된 방법으로 한다"는 확신. **차별화(Win Theme) 메시지의 1차 노출 지점** | +| Ⅲ 기술·기능 | 요구기능 구현방안, 시스템 구성, 보안·데이터, 제약 대응 | 요구사항 대비 구현 구체성·실현가능성. **최다 배점 통례 → 기능 차별화 총력** | +| Ⅳ 성능·품질 | 성능충족·테스트, 품질보증, 인터페이스, 가용성/SLA | 정량 목표치·검증방법 제시 | +| Ⅴ 프로젝트 관리 | 관리방법론·역량, 일정계획, 위험·이슈, 품질관리 | 일정 준수·리스크 통제 실행력 | +| Ⅵ 프로젝트 지원 | 인수인계, 교육, 기술지원, **유지보수(SM)**, 기밀보안, 비상대책 | 구축 후 지속가능성·이관·운영 | +| Ⅶ 그 밖의 사항 | 기대효과, 확장, 상생협력·하도급, 부가제안 | 정성 가점·정책부합 | + +--- + +## 3. 재편 매핑표 — 현행 킨텍스 P1~P9 (63슬라이드) → 표준 7대장 + +> 규칙: 각 슬라이드를 표준 장·절로 이동. **차별화(나노바나나·AI 폐루프)는 배점 높은 Ⅲ(기술·기능) + Ⅱ(전략·방법론) 접점에 배치**해 노출 극대화. 미배치 0. + +### 3-1. 전면부 (표지·요약) + +| 현행 | 표준 배치 | 비고 | +|---|---|---| +| S01 표지 | 표지 | 유지 | +| S02 제안 개요 | **Ⅰ 일반현황 §1 앞 or 제안개요 간지** | 제안사 소개는 Ⅰ으로 흡수 | +| S03 목차 | 목차 | 7대장 인덱스로 재구성 | +| S04 제안 핵심요약(3중 해자) | **Ⅱ 전략·방법론 §2 추진전략** 도입(요약 간지) | Win Theme 조기 각인 | +| S05 배점 대응 맵 | 목차 직후 간지 | 표준 배점(90/10)으로 갱신 권고 | +| S06 [가정] 고지 간지 | 부록 or 서두 노트 | 유지 | + +### 3-2. P1 사업이해 → Ⅱ 전략·방법론 §1 + +| 현행 | 표준 배치 | +|---|---| +| S07 사업 배경·목적 | **Ⅱ §1 사업 이해도** | +| S08 As-Is 프로세스 병목 | **Ⅱ §1 사업 이해도** | +| S09 이해관계자·페르소나 | **Ⅱ §1 사업 이해도** | +| S10 To-Be 목표(정량) | **Ⅱ §1 사업 이해도** (→ 효과 지표는 Ⅶ와 연계) | + +### 3-3. P2 추진전략 → Ⅱ 전략·방법론 §2·§5 + Ⅰ + +| 현행 | 표준 배치 | +|---|---| +| S11 비전·포지셔닝 | **Ⅱ §2 추진전략** | +| S12 3중 해자 전략 | **Ⅱ §2 추진전략** (차별화 앵커) | +| S13 Win Theme 5선 | **Ⅱ §2 추진전략** (배점 정렬 배지 병기) | +| S14 전시 생애주기 폐루프 | **Ⅱ §5 개발 방법론**(생애주기 방법론) | +| S15 추진체계·수행조직 | **Ⅰ 일반현황 §2 수행조직·업무분장** (+ Ⅱ §2 추진체계 교차) | + +### 3-4. P3 기술제안 (25슬라이드) → Ⅲ 기술·기능 중심 + Ⅱ 적용기술 + Ⅳ 일부 + +> **핵심 전략**: 나노바나나·AI 폐루프는 **Ⅱ §3 적용기술**(방법론·차별화 관점)과 **Ⅲ §2 기능 요구사항**(구현 관점) **두 장에 걸쳐 노출** → 전략및방법론·기술및기능 양쪽 배점 동시 획득. + +| 현행 | 표준 배치 | +|---|---| +| S16 전체 모듈맵 | **Ⅲ 기술·기능 도입부**(기능 조망) | +| **S17~S23 나노바나나 시공예측(7)** | **Ⅱ §3 적용기술**(S17 개요·S19 구조보존·S20 파이프라인·S23 AI신뢰) + **Ⅲ §2 기능 요구사항**(S18 샷세트·S21 Before/After·S22 RenderJob 방어). **7슬라이드 절대 유지** | +| S24 플로어플랜 스튜디오(M2) | **Ⅲ §2 기능 요구사항** (+ 적용기술 교차) | +| S25 배치 규정 자동검증 | **Ⅲ §2 기능 요구사항** | +| S26 부스 설계 스튜디오(M3) | **Ⅲ §2 기능 요구사항** | +| S27 유틸리티 설계(M4)·PostGIS 배선 | **Ⅲ §2 기능 요구사항** (+ Ⅲ §4 데이터 요구사항 교차) | +| S28 위치표시도·유틸리티 신청 | **Ⅲ §2 기능 요구사항** | +| S29 옥션 개요·폐루프 | **Ⅲ §2 기능 요구사항** (차별화 폐루프) | +| S30 역경매·실시간 순위 | **Ⅲ §2 기능 요구사항** | +| S31 종합평가 낙찰 | **Ⅲ §2 기능 요구사항** | +| S32 등록 게이트·발주 전환 | **Ⅲ §2 기능 요구사항** (+ Ⅲ §3 보안 교차) | +| S33 판매·홀배정·견적(M1) | **Ⅲ §2 기능 요구사항** | +| S34 서류·마일스톤(M6) | **Ⅲ §2 기능 요구사항** (+ Ⅲ §5 시스템 운영 교차) | +| S35 관람객 등록·배지·리드(M10) | **Ⅲ §2 기능 요구사항** | +| S36 비즈매칭·마케팅·공개사이트(M11·12·17) | **Ⅲ §2 기능 요구사항** | +| S37 정산·결제(M9) | **Ⅲ §2 기능 요구사항** | +| S38 경영분석 BI-1(M16) | **Ⅲ §2 기능 요구사항** (+ Ⅲ §4 데이터 교차) | +| S39 경영분석 BI-2(M16) | **Ⅲ §2 기능 요구사항** | +| S40 현장운영·물류(M8·13·14) | **Ⅲ §2 기능 요구사항** | + +### 3-5. P4 아키텍처 → Ⅱ §3·§4 + Ⅲ §1·§4·§5 + +| 현행 | 표준 배치 | +|---|---| +| S41 전체 아키텍처 | **Ⅲ §1 시스템 장비구성 요구사항** (+ Ⅱ §3 적용기술) | +| S42 단일 공간 데이터 원천(PostGIS) | **Ⅲ §4 데이터 요구사항** | +| S43 확장성·비동기 | **Ⅳ §1 성능 요구사항** (+ Ⅶ 확장 연계) | +| S44 AI 플랫폼 라우팅(Claude→Ollama) | **Ⅱ §3 적용기술** | +| S45 연동·마스터데이터 | **Ⅳ §3 인터페이스 요구사항** (+ Ⅲ §5 시스템 운영) | + +### 3-6. P5 보안·개인정보 → Ⅲ §3 + Ⅴ·Ⅵ 기밀보안 + +> 표준은 **기술적 보안 = Ⅲ §3 보안 요구사항**, **관리적 기밀보안 = Ⅴ 기밀보안관리 / Ⅵ §5 기밀보안**으로 분리. 현행 P5를 분할 배치. + +| 현행 | 표준 배치 | +|---|---| +| S46 보안 개요·불변 원칙 | **Ⅲ §3 보안 요구사항** (개요) | +| S47 보안영역 분리(망 구성) | **Ⅲ §3 보안 요구사항** (+ Ⅲ §1 구성) | +| S48 인증·접근통제(2FA·RBAC) | **Ⅲ §3 보안 요구사항** | +| S49 AI·이미지 보안(워터마크) | **Ⅲ §3 보안 요구사항** (차별화 보안) | +| S50 개인정보·감사·안전코딩 | **Ⅲ §3 보안 요구사항** + **Ⅴ §? 기밀보안관리 / Ⅵ §5 기밀보안** (관리적 요소 이관) | + +### 3-7. P6 비기능 → Ⅳ 성능·품질 + +| 현행 | 표준 배치 | +|---|---| +| S51 성능·가용성 SLA | **Ⅳ §1 성능 요구사항** | +| S52 나노바나나 성능 | **Ⅳ §1 성능 요구사항** | +| S53 접근성·다국어·테마·반응형 | **Ⅳ §2 품질 요구사항** | +| S54 관측성·데이터 | **Ⅳ §2 품질 요구사항** (+ Ⅴ 관리 연계) | + +### 3-8. P7 멀티테넌시·확장 → Ⅲ §5 + Ⅶ + +| 현행 | 표준 배치 | +|---|---| +| S55 멀티테넌트 SaaS 비전 | **Ⅶ 그 밖의 사항**(확장 비전) | +| S56 테넌트 격리 아키텍처 | **Ⅲ §5 시스템 운영 요구사항** (+ Ⅲ §3 보안 격리) | +| S57 온보딩·2계층 관리자 | **Ⅲ §5 시스템 운영 요구사항** | + +### 3-9. P8 사업관리·일정·조직 → Ⅴ 프로젝트 관리 + Ⅵ + +| 현행 | 표준 배치 | +|---|---| +| S58 추진 일정·Phase | **Ⅴ §3 일정계획** | +| S59 선행 게이트·리스크 관리 | **Ⅴ §1 관리방법론 / 위험·이슈 관리** | +| S60 품질·형상관리 | **Ⅴ §2 관리역량(품질관리)** + **Ⅵ §1 품질보증** | + +### 3-10. P9 기대효과 → Ⅶ 그 밖의 사항 + +| 현행 | 표준 배치 | +|---|---| +| S61 정량 기대효과 | **Ⅶ 그 밖의 사항** | +| S62 정성·전략 효과 | **Ⅶ 그 밖의 사항** | +| S63 확장 비전·마무리 | **Ⅶ 그 밖의 사항** | + +### 3-11. 매핑 커버리지 요약 + +| 표준 장 | 배치된 현행 슬라이드 | 소계 | +|---|---|---| +| 표지·목차 | S01·S03·S05·S06 | 4 | +| Ⅰ 일반현황 | S02·S15 (+ **신설 필요**) | 2 | +| Ⅱ 전략·방법론 | S04·S07~S14·S17·S19·S20·S23·S41(교차)·S44 | 14 | +| Ⅲ 기술·기능 | S16·S18·S21·S22·S24~S40·S42·S45(교차)·S46~S50·S56·S57 | 34 | +| Ⅳ 성능·품질 | S43·S51~S54 | 5 | +| Ⅴ 프로젝트 관리 | S58·S59·S60 | 3 | +| Ⅵ 프로젝트 지원 | S50(관리적 일부)·S60(품질보증) (+ **대폭 신설 필요**) | ~1 | +| Ⅶ 그 밖의 사항 | S55·S61·S62·S63 | 4 | +| **미배치** | — | **0** | + +--- + +## 4. 표준 목차 채택 시 신설 필요 장(章)과 내용 소스 + +> 현행 63슬라이드가 **표준 대비 취약하거나 부재**한 영역. 실제 공고 시 감점·실격 방지를 위해 신설. + +| 신설/보강 대상 | 이유 | 내용 소스(지목) | +|---|---|---| +| **Ⅰ 일반현황 (신설)** | 제안사 일반현황·연혁·자본금·매출, 수행조직도·R&R, **핵심투입인력 이력**은 정량평가(보유인력·경영·실적) 근거. 현행에 사실상 부재(S02·S15 부분). | `tech_advisory §5-2` 직군별 M/M 산정 → 투입인력표. 제안사 실적은 발주 확인 후 확보(⚠확인필요) | +| **Ⅵ 프로젝트 지원 (대폭 신설)** | 인수인계·교육훈련·기술지원·**유지보수(SM)**·비상대책은 표준 정성 부문. 현행 P8이 품질/형상만 얇게 다룸. | `tech_advisory §6 SM 운영 체계`(SLA·장애대응·정기점검·CI/CD 운영·ITSM 프로세스·조직 R&R §6-1) · §5-1 WBS(SM 이관·인수인계) | +| **Ⅴ 프로젝트 관리 보강** | 표준은 관리방법론·관리역량·위험/이슈를 독립 부문으로 배점. 현행 배점 2점 가정으로 과소. | `tech_advisory §5 WBS·공수` · `proposal_strategy §4 리스크` | +| **상생협력·하도급 (신설)** | 정량 별표11(중소기업 참여지분율, 최대 5점)·정성 하도급 계획 적정성(5점 이상). **20억↑ SW사업은 하도급 평가 제외 불가**. 현행 없음. | 공동수급/중소기업 참여 계획·하도급 계획서(별지 제14호서식) — 컨소시엄 구성 확정 후(⚠확인필요) | +| **정량평가 대응 절 (신설)** | 보유인력·경영상태·수행실적·사회적책임은 필수 증빙 미제출 시 최하점. 별첨 근거 필요. | Ⅰ 일반현황 + 별첨(증빙) — 발주 확인 후 | +| **표준 프레임워크 적용 절 (Ⅱ §4)** | 별표3의2 제약사항에 "표준 프레임워크 적용 포함" 명시. 공공 SW 필수 관점. | 확정 스택(Spring Boot/React) — 전자정부 표준FW 적용 여부는 ⚠확인필요(현재 스택은 GUARDiA 표준) | + +--- + +## 5. 재편 권고 (Win Theme 노출 극대화) + +1. **7대장 채택**: 킨텍스 규모(전 전시 생애주기)는 별지 5호서식 7대장 구조가 정합. 현행 P1~P9를 §3 매핑대로 재배열. +2. **나노바나나(S17~S23) 이중 노출**: Ⅱ §3 적용기술(방법론·차별화)과 Ⅲ §2 기능 요구사항(구현) 양쪽에 배치 → **전략및방법론 + 기술및기능 배점 동시 겨냥**. 7슬라이드 축소 금지. +3. **AI 폐루프(배치·설계·배선·옥션 S24~S32)**: Ⅲ §2 기능 요구사항에 집중 배치(최다 배점 장). 폐루프 차별화 메시지를 기능 채점표에 직접 정렬. +4. **보안 분할**: 기술적 보안 → Ⅲ §3, 관리적 기밀보안 → Ⅴ·Ⅵ. 표준 채점 구조에 맞춰 배점 누수 방지. +5. **Ⅵ 프로젝트 지원 신설**로 "구축 후 지속가능성"(SM·교육·이관) 확보 — 공공 평가위원 필수 확인 항목. +6. **배점 표기 갱신**: 현행 80/20 가정 → 정보화 표준 90/10(정성70+정량20)로 갱신 권고(실제 공고 확인 시 확정). *proposal 파일 수정은 별도 지시 필요 — 본 문서는 근거만 제공.* + +--- + +## 6. 출처 URL 전체 목록 + +**1차 출처 (법령·실제 문서 — 본문 근거)** +- 조달청 협상에 의한 계약 제안서평가 세부기준 (국가법령정보센터): https://law.go.kr/LSW/admRulLsInfoP.do?admRulSeq=2100000088849 +- 조달청 협상에 의한 계약 제안서평가 세부기준 PDF (별표3의2·별표11·별지5호서식 원문 추출): https://bidform.co.kr/updata/notifile/ab689c32028cee2185e44dcd24c0fb89.pdf +- 실제 나라장터 정보시스템 구축 RFP 제안서 작성요령(배점·목차 표본, g2b R25BK00879799): https://www.g2b.go.kr/pn/pnp/pnpe/UntyAtchFile/downloadFile.do?bidPbancNo=R25BK00879799&bidPbancOrd=000&fileType=&fileSeq=3 +- 행정기관 및 공공기관 정보시스템 구축·운영 지침 제18조(평가배점) (국가법령정보센터): https://www.law.go.kr/LSW//admRulInfoP.do?admRulSeq=2100000246404&chrClsCd=010201 +- 정보시스템 구축·운영 지침 제18조(평가배점) — 국민건강보험공단 법령DB: https://www.nhis.or.kr/lm/lmxsrv/law/joHistoryContent.do?SEQ=1541&SEQ_CONTENTS=4250027&DATE_START=20240828&DATE_END=20190823 + +**참고 출처 (통례·가이드)** +- KOSA 소프트웨어 사업 가이드북 v3.0: https://www.sw.or.kr/upload/common/027d281c-2a7a-4886-b96b-e9ad04c7a309.pdf +- 공공 SW사업 제안요청서 작성 예시(SW 법제도 반영): https://smallake.kr/wp-content/uploads/2023/03/붙임공공SW사업-제안요청서-작성-예시.pdf +- NIPA SW사업 단계별 발주 가이드: https://www.nipa.kr/home/2-7-1-1/7089 +- 조달청 협상에 의한 계약 제안서평가 세부기준(2026.1.26. 시행 안내, 도로교통공단): https://www.koroad.or.kr/main/board/22/305400/board_view.do + +--- + +## 7. 확인 필요 (삭제 금지) + +| # | 항목 | 사유 | +|---|---|---| +| T1 | 실제 킨텍스 공고의 배점·목차 강제 여부 | 본 문서는 표준·표본 근거. 실제 공고가 별지 5호서식과 다른 목차를 강제할 수 있음 | +| T2 | 정보화(SW중심) vs HW중심 판정 | 90/10 vs 80/20 결정. 킨텍스 시스템은 SW 중심 → 90/10 추정, 공고 확인 필요 | +| T3 | 컨소시엄·중소기업 참여·하도급 구성 | 상생협력(별표11)·하도급(별표3의2) 대응은 컨소시엄 확정 후 작성 | +| T4 | 전자정부 표준프레임워크 적용 요구 여부 | 별표3의2 제약사항에 표준FW 명시 — 현행 스택(GUARDiA 표준)과 정합성 공고 확인 | +| T5 | 사업금액 20억원 이상 여부 | 20억↑이면 하도급 평가항목 제외 불가(세부기준 제9조⑤ 단서) | diff --git a/docs/deliverables/제안서/_gen/icon_raster.py b/docs/deliverables/제안서/_gen/icon_raster.py new file mode 100644 index 0000000..cdd7028 --- /dev/null +++ b/docs/deliverables/제안서/_gen/icon_raster.py @@ -0,0 +1,239 @@ +# -*- coding: utf-8 -*- +""" +경량 SVG(stroke) -> PNG 래스터라이저 (cairo 불필요, PIL만 사용) +- assets/icons/*.svg (viewBox 0 0 24 24, fill none, stroke currentColor, stroke-width 1.75, round cap/join) +- 지원: M/m L/l H/h V/v C/c S/s A/a Z/z, , +- 렌더: 고배율 supersample 후 LANCZOS 다운스케일, 라운드 캡/조인 = 두꺼운 라인 + 정점 원 +- 색: stroke=맥락색(RGB). fill 없음(선 아이콘). +재사용: from icon_raster import render_icon; render_icon('ai-sparkle', (r,g,b), out_png, px=192) +""" +import os, re, math +from PIL import Image, ImageDraw + +ICON_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", "icons") + +_num = re.compile(r'[-+]?(?:\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?') + +def _nums(s): + return [float(x) for x in _num.findall(s)] + +# ---- cubic / arc flattening ---- +def _cubic(p0, p1, p2, p3, n=18): + pts = [] + for i in range(1, n+1): + t = i/n; mt = 1-t + x = mt**3*p0[0] + 3*mt*mt*t*p1[0] + 3*mt*t*t*p2[0] + t**3*p3[0] + y = mt**3*p0[1] + 3*mt*mt*t*p1[1] + 3*mt*t*t*p2[1] + t**3*p3[1] + pts.append((x, y)) + return pts + +def _arc(p0, rx, ry, phi, large, sweep, p1, n=24): + # endpoint -> center parameterization (SVG spec) + if rx == 0 or ry == 0: + return [p1] + phi = math.radians(phi) + cosp, sinp = math.cos(phi), math.sin(phi) + dx = (p0[0]-p1[0])/2.0; dy = (p0[1]-p1[1])/2.0 + x1p = cosp*dx + sinp*dy; y1p = -sinp*dx + cosp*dy + rx, ry = abs(rx), abs(ry) + lam = x1p*x1p/(rx*rx) + y1p*y1p/(ry*ry) + if lam > 1: + s = math.sqrt(lam); rx *= s; ry *= s + num = rx*rx*ry*ry - rx*rx*y1p*y1p - ry*ry*x1p*x1p + den = rx*rx*y1p*y1p + ry*ry*x1p*x1p + co = math.sqrt(max(0.0, num/den)) if den else 0.0 + if large == sweep: + co = -co + cxp = co*rx*y1p/ry; cyp = -co*ry*x1p/rx + cx = cosp*cxp - sinp*cyp + (p0[0]+p1[0])/2.0 + cy = sinp*cxp + cosp*cyp + (p0[1]+p1[1])/2.0 + def ang(ux, uy, vx, vy): + d = math.sqrt((ux*ux+uy*uy)*(vx*vx+vy*vy)) + c = max(-1.0, min(1.0, (ux*vx+uy*vy)/d)) if d else 1.0 + a = math.acos(c) + if ux*vy - uy*vx < 0: a = -a + return a + th1 = ang(1, 0, (x1p-cxp)/rx, (y1p-cyp)/ry) + dth = ang((x1p-cxp)/rx, (y1p-cyp)/ry, (-x1p-cxp)/rx, (-y1p-cyp)/ry) + if not sweep and dth > 0: dth -= 2*math.pi + if sweep and dth < 0: dth += 2*math.pi + pts = [] + for i in range(1, n+1): + th = th1 + dth*i/n + x = cosp*rx*math.cos(th) - sinp*ry*math.sin(th) + cx + y = sinp*rx*math.cos(th) + cosp*ry*math.sin(th) + cy + pts.append((x, y)) + return pts + +# flag-aware arc arg regex: rx ry rot large sweep(single 0/1) x y (repeatable) +_NN = r'[-+]?(?:\d*\.\d+|\d+\.?)' +_ARC = re.compile( + r'(' + _NN + r')[,\s]*(' + _NN + r')[,\s]*(' + _NN + r')[,\s]*' + r'([01])[,\s]*([01])[,\s]*(' + _NN + r')[,\s]*(' + _NN + r')') + +def _parse_path(d): + """반환: list of subpaths, each subpath = list of (x,y) polyline points.""" + chunks = re.findall(r'([MmLlHhVvCcSsAaZz])([^MmLlHhVvCcSsAaZz]*)', d) + subs = []; cur = [] + x = y = 0.0; sx = sy = 0.0 + prev_ctrl = None; prev_cmd = None + for cmd, arg in chunks: + rel = cmd.islower(); c = cmd.upper() + if c == 'A': + for m in _ARC.finditer(arg): + rx, ry, rot, large, sweep, nx, ny = (float(m.group(k)) for k in range(1, 8)) + if rel: nx += x; ny += y + cur += _arc((x, y), rx, ry, rot, int(large), int(sweep), (nx, ny)) + x, y = nx, ny + prev_cmd = c; prev_ctrl = None; continue + vals = _nums(arg) + if c == 'Z': + cur.append((sx, sy)); x, y = sx, sy + subs.append(cur); cur = [] + prev_cmd = c; prev_ctrl = None; continue + j = 0 + first_pair = True + while j < len(vals) or (c in ('M', 'L', 'C', 'S', 'H', 'V') and False): + if c == 'M': + nx, ny = vals[j], vals[j+1]; j += 2 + if rel: nx += x; ny += y + if first_pair: + if cur: subs.append(cur) + cur = [(nx, ny)]; sx, sy = nx, ny + else: + cur.append((nx, ny)) + x, y = nx, ny; first_pair = False + elif c == 'L': + nx, ny = vals[j], vals[j+1]; j += 2 + if rel: nx += x; ny += y + cur.append((nx, ny)); x, y = nx, ny + elif c == 'H': + nx = vals[j]; j += 1 + if rel: nx += x + cur.append((nx, y)); x = nx + elif c == 'V': + ny = vals[j]; j += 1 + if rel: ny += y + cur.append((x, ny)); y = ny + elif c == 'C': + x1, y1, x2, y2, nx, ny = vals[j:j+6]; j += 6 + if rel: x1+=x; y1+=y; x2+=x; y2+=y; nx+=x; ny+=y + cur += _cubic((x, y), (x1, y1), (x2, y2), (nx, ny)) + prev_ctrl = (x2, y2); x, y = nx, ny + elif c == 'S': + x2, y2, nx, ny = vals[j:j+4]; j += 4 + if rel: x2+=x; y2+=y; nx+=x; ny+=y + if prev_cmd in ('C', 'S') and prev_ctrl: + x1 = 2*x - prev_ctrl[0]; y1 = 2*y - prev_ctrl[1] + else: + x1, y1 = x, y + cur += _cubic((x, y), (x1, y1), (x2, y2), (nx, ny)) + prev_ctrl = (x2, y2); x, y = nx, ny + else: + break + if j >= len(vals): + break + prev_cmd = c + if c not in ('C', 'S'): + prev_ctrl = None + if cur: subs.append(cur) + return subs + +def _circle_pts(cx, cy, r, n=48): + return [(cx + r*math.cos(2*math.pi*i/n), cy + r*math.sin(2*math.pi*i/n)) for i in range(n+1)] + +def _rect_pts(x, y, w, h, rx=0, transform=None, n=6): + rx = min(rx, w/2, h/2) if rx else 0 + pts = [] + if rx <= 0: + pts = [(x, y), (x+w, y), (x+w, y+h), (x, y+h), (x, y)] + else: + def arc(cx, cy, a0, a1): + return [(cx+rx*math.cos(math.radians(a)), cy+rx*math.sin(math.radians(a))) + for a in [a0 + (a1-a0)*k/n for k in range(n+1)]] + pts += [(x+rx, y)] + pts += [(x+w-rx, y)] + pts += arc(x+w-rx, y+rx, -90, 0) + pts += [(x+w, y+h-rx)] + pts += arc(x+w-rx, y+h-rx, 0, 90) + pts += [(x+rx, y+h)] + pts += arc(x+rx, y+h-rx, 90, 180) + pts += [(x, y+rx)] + pts += arc(x+rx, y+rx, 180, 270) + if transform: + m = re.match(r'rotate\(\s*([-\d.]+)\s+([-\d.]+)\s+([-\d.]+)\s*\)', transform) + if m: + ang = math.radians(float(m.group(1))); ox = float(m.group(2)); oy = float(m.group(3)) + ca, sa = math.cos(ang), math.sin(ang) + pts = [((px-ox)*ca-(py-oy)*sa+ox, (px-ox)*sa+(py-oy)*ca+oy) for px, py in pts] + return pts + +def _extract(svg_text): + """SVG -> list of polylines (in 24-unit viewBox coords).""" + polys = [] + for m in re.finditer(r']*\bd="([^"]+)"', svg_text): + polys += _parse_path(m.group(1)) + for m in re.finditer(r']*>', svg_text): + a = m.group(0) + cx = re.search(r'cx="([-\d.]+)"', a); cy = re.search(r'cy="([-\d.]+)"', a); r = re.search(r'r="([-\d.]+)"', a) + if cx and cy and r: + polys.append(_circle_pts(float(cx.group(1)), float(cy.group(1)), float(r.group(1)))) + for m in re.finditer(r']*>', svg_text): + a = m.group(0) + def g(k, d=0.0): + mm = re.search(k+r'="([-\d.]+)"', a); return float(mm.group(1)) if mm else d + tr = re.search(r'transform="([^"]+)"', a) + polys.append(_rect_pts(g('x'), g('y'), g('width'), g('height'), g('rx', 0), + tr.group(1) if tr else None)) + return polys + +_cache = {} +def render_icon(name, rgb, out_png, px=192, stroke_w=1.75, pad=1.0): + """name: 파일명(확장자 무관). rgb: (r,g,b) 0-255. out_png 저장. 이미 있으면 재사용.""" + key = (name, tuple(rgb), px) + if key in _cache and os.path.exists(out_png): + return out_png + path = os.path.join(ICON_DIR, name if name.endswith('.svg') else name+'.svg') + with open(path, 'r', encoding='utf-8') as f: + svg = f.read() + polys = _extract(svg) + SS = 4 # supersample + W = px*SS + scale = W/24.0 + img = Image.new('RGBA', (W, W), (0, 0, 0, 0)) + dr = ImageDraw.Draw(img) + col = (int(rgb[0]), int(rgb[1]), int(rgb[2]), 255) + lw = max(1, int(round(stroke_w*scale))) + rcap = lw/2.0 + for poly in polys: + if len(poly) < 2: + continue + sp = [(px_*scale, py_*scale) for px_, py_ in poly] + dr.line(sp, fill=col, width=lw, joint='curve') + # round caps/joins via dots at each vertex + for (vx, vy) in sp: + dr.ellipse([vx-rcap, vy-rcap, vx+rcap, vy+rcap], fill=col) + img = img.resize((px, px), Image.LANCZOS) + img.save(out_png) + _cache[key] = out_png + return out_png + +if __name__ == "__main__": + # 테스트: 20종 x 1색 몽타주 + outdir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "_iconpng") + os.makedirs(outdir, exist_ok=True) + names = sorted(f[:-4] for f in os.listdir(ICON_DIR) if f.endswith('.svg')) + cols = 5 + cell = 96 + mont = Image.new('RGBA', (cols*cell, ((len(names)+cols-1)//cols)*cell), (255, 255, 255, 255)) + from PIL import ImageDraw as _ID + md = _ID.Draw(mont) + for i, nm in enumerate(names): + outp = os.path.join(outdir, nm+".png") + render_icon(nm, (0x00, 0x66, 0xB3), outp, px=72) + ic = Image.open(outp) + cx = (i % cols)*cell + 12; cy = (i//cols)*cell + 6 + mont.alpha_composite(ic, (cx, cy)) + md.text((cx, cy+74), nm[:14], fill=(60, 60, 60)) + mont.convert('RGB').save(os.path.join(outdir, "_montage.png")) + print("OK", len(names), "icons ->", os.path.join(outdir, "_montage.png")) diff --git a/docs/deliverables/제안서/_gen/proposal_content.md b/docs/deliverables/제안서/_gen/proposal_content.md new file mode 100644 index 0000000..47babbf --- /dev/null +++ b/docs/deliverables/제안서/_gen/proposal_content.md @@ -0,0 +1,998 @@ +# 킨텍스 자동전시시스템 구축 — 제안서 본문 (Proposal Content · 슬라이드 단위) + +> 작성: proposal-writer · 작성일: 2026-07-11 · 버전 v1.0 +> 입력: `proposal_outline.md`(63슬라이드 배점 가중 목차) · `proposal_strategy.md`(Win Theme 5·리스크 R-1~R-8) · `tech_advisory.md`(§0 라이브 실적/구현 계획 구분·도식 12종 사양·NFR 21·보안 20·공수 ~150M/M·SM) · `rfp_analysis.md`+`rtm.md`(REQ 142) +> 산출 규격: 슬라이드별 [번호·섹션·헤드라인(3초 메시지)·본문 불릿(근거)·도표 지시(tech_advisory 도식 ID)·대응 REQ·출처]. 문체 = **주장 → 근거(라이브 실적/설계 문서) → 효과**. 과장 금지 — tech_advisory §0 구분표에 따라 **[검증됨]**(구축 완료·라이브)과 **[구현 계획]**(설계 확정·미완)을 표기 라벨로 명확 구분. +> 보안 불변: 시크릿(키·비번·IP·SSH) 미기재. AI 생성 이미지는 워터마크·고지 정책 명시. +> deck-designer 지침: 도식 지시의 "도식ID"는 `tech_advisory.md §1-4`의 번호(①~⑫)와 1:1. 아이콘 전량 선(stroke) SVG. + +--- + +## 표기 범례 (전 슬라이드 공통) + +- **[검증됨]** = WORK_STATUS(2026-07-11) 라이브 확인분. "이미 기동 중". +- **[구현 계획]** = 설계·데이터모델 확정, 구현 대기. "표준대로 채운다". +- **[협의]** = 발주처 협의·확인 필요(⚠) 항목. 정직 고지 대상. +- **REQ** 열 = 해당 슬라이드가 충족하는 요구사항 ID(RTM 반영 근거). + +--- + +# 0. 표지·목차 (S01~S06) + +## S01 · 표지 +- **섹션**: 표지 +- **헤드라인**: **"신청서를 내는 순간, 시공 후 사진을 먼저 본다."** +- **본문** + - 사업명: 킨텍스(KINTEX) 자동전시시스템 구축 + - 서브 슬로건: "설계 → 시각화 → 발주 → 시공 → 운영 → 분석. 킨텍스에서 한 흐름으로 끝난다." + - 제안사·제안일 표기 영역(로고 자리) +- **도표 지시**: 배경 = 나노바나나 시공 예측 히어로 이미지(Before 빈 부스 → After 시공 사진). **워터마크 항상 표기**("AI 생성 예상 이미지 — 실제 시공과 다를 수 있음. 계약·심사 서류 사용 금지"). 도식ID 없음(히어로). +- **REQ**: REQ-A-001, REQ-S-009 +- **출처**: strategy §0, PLANNING §1-2 + +## S02 · 제안 개요 +- **섹션**: 표지 +- **헤드라인**: "우리는 도면이 아니라 사진으로 컨펌하고, 그 사진으로 발주까지 종결한다." +- **본문** + - 우리는 누구: GUARDiA 표준 프레임워크(WISE/UIWS) 검증 자산 위에 전시 도메인 코어를 얹은 팀 + - 왜 우리인가: ①나노바나나 시공 예측 ②PostGIS 실측 공간데이터 ③공사 옥션 폐루프 — **세 결합을 이미 라이브로 검증** [검증됨] + - 차별점 1줄: "말이 아니라 이미 돈다" — 인프라·인증·PostGIS 코어·나노바나나·자동배포가 기동 중 +- **도표 지시**: 제안사 핵심 자산 아이콘 3종(선 SVG) — 시공예측·공간데이터·옥션폐루프. +- **REQ**: REQ-A-001, REQ-N-008, REQ-F-025 +- **출처**: tech_advisory §0-1, strategy §0 + +## S03 · 목차 +- **섹션**: 표지 +- **헤드라인**: "배점을 따라 읽으십시오 — 제안서 무게가 곧 배점 배분입니다." +- **본문** + - P1 사업이해 · P2 추진전략 · P3 기술제안 · P4 아키텍처 · P5 보안·개인정보 · P6 비기능 · P7 멀티테넌시·확장 · P8 사업관리·일정·조직 · P9 기대효과 + - P3(기술제안)이 전체 25슬라이드(≈40%) — 배점 35점 정렬 +- **도표 지시**: 목차 인덱스(9섹션) + 각 섹션 배점 배지 병기. 도식ID 없음. +- **REQ**: (내비게이션 — 개별 REQ 없음) +- **출처**: outline 배분 총괄표 + +## S04 · 제안 핵심 요약(1p) +- **섹션**: 표지 +- **헤드라인**: "단일 요소는 모방할 수 있으나, 세 결합은 재현하기 어렵다 — 우리만의 해자." +- **본문** + - Win Theme 5선: WT-1 시공 예측 · WT-2 배치·설계·배선 3안+규정검증 · WT-3 옥션 폐루프 · WT-4 보안 3중 격리 · WT-5 멀티테넌트 SaaS + - 3중 해자: 나노바나나 시공 예측 ∩ PostGIS 실측 공간데이터 ∩ 공사 옥션 폐루프 + - 배점의 44%(35/80)가 P3에 집중 → 제안 무게 집중 근거 +- **도표 지시**: **도식① 3중 해자 벤다이어그램**(3원 60% 겹침, 중앙 교집합 "재현 난이도 높은 결합 = 우리만의 해자(Moat)"). tech_advisory §1-4 ①. +- **REQ**: REQ-A-001·002, REQ-N-008·017, REQ-F-025 +- **출처**: strategy §3-3, tech_advisory §1-4 ① + +## S05 · 배점 대응 맵 +- **섹션**: 표지 +- **헤드라인**: "우리 제안은 배점이 큰 곳에 정확히 무게를 실었다." +- **본문** + - AI 시각화·설계(핵심) 20점 → WT-1·WT-2 전면(P3 나노바나나 7슬라이드+배치·설계·배선 5슬라이드) + - 기능 구현 15점 → 모듈맵 1장 조망 + 옥션·관람·BI 상세 + - 아키텍처 10·보안 10·비기능 8·사업이해·전략 10·멀티테넌시 5·사업관리 2 +- **도표 지시**: 배점-섹션 정렬 매트릭스(80점 히트맵). 도식ID 없음(인포그래픽). +- **REQ**: (배점 정렬 — 전 REQ 계열 조망) +- **출처**: strategy §2, outline 배분 총괄 + +## S06 · [가정] 고지 간지 +- **섹션**: 표지 +- **헤드라인**: "가정은 숨기지 않고 드러냅니다 — 실제 공고 확인 시 즉시 재정렬합니다." +- **본문** + - 실제 RFP 부재 → 평가배점·제출규격은 공공 SI 통례 기준 **[가정]** (리스크 R-4 정면 방어) + - 목차는 안전 정렬(사업이해→전략→기술→아키→보안→비기능→확장→관리→기대효과) + - 확인 필요 8항목(C1~C8)은 부록 A에 집약 → 정직성을 강점화 +- **도표 지시**: 간단 노트 카드(리스크 R-4 방어 문구). 도식ID 없음. +- **REQ**: (투명 고지 — 개별 REQ 없음) +- **출처**: strategy §4 R-4, rfp_analysis §4·§5 + +--- + +# P1. 사업이해 (S07~S10) + +## S07 · 사업 배경·목적 +- **섹션**: P1 사업이해 +- **헤드라인**: "108,011㎡의 아시아 3위 전시장, 준비는 여전히 HWP·CAD 수작업이다." +- **본문** + - 킨텍스 규모: 현 108,011㎡ → 2028년 제3전시장 완공 시 178,000㎡(국내 최대·아시아권 상위) + - 현행 병목: 부스 배치는 CAD 외주 수작업, 신고서류는 HWP 수기, 배선·위치표시도 육안 작도 + - 목적: 전시 준비 전 과정을 AI로 자동화해 리드타임·오류·외주비용을 동시 절감 +- **도표 지시**: 킨텍스 규모 인포그래픽(면적·홀 수·연간 행사 규모 지표 카드). 도식ID 없음. +- **REQ**: (사업 맥락 — 개별 REQ 없음) +- **출처**: PLANNING §1-1 + +## S08 · As-Is 프로세스 병목 +- **섹션**: P1 사업이해 +- **헤드라인**: "D-150부터 D-7까지, 마디마다 사람이 기다리고 CAD를 외주한다." +- **본문** + - D-150 판매·견적: 견적 산출을 담당자가 수기 회신 → 대기 발생 + - D-30 배치·설계: CAD 외주 수일~수주, 규정 위반은 홀매니저 육안 검수 병목 + - D-25 유틸리티: 전기·네트워크·급배수 신청이 개별 채널로 파편화 + - D-7 제출·검수: kxwp 제출·서류 육안 검토 +- **도표 지시**: **As-Is 타임라인 다이어그램**(D-데이별 Pain Point 표시). 도식ID 없음(표준 타임라인). +- **REQ**: (병목 진단 — 개별 REQ 없음, To-Be 근거) +- **출처**: PLANNING §3-1·3-2 + +## S09 · 이해관계자·페르소나 +- **섹션**: P1 사업이해 +- **헤드라인**: "6역할+2관리자, 각자의 과업·고통·기대를 정확히 안다." +- **본문** + - 주최자(organizer): 배치·행사 총괄 — CAD 수작업 고통 + - 참가업체(exhibitor): 도면을 못 읽어 개장일에 결과 첫 대면 — 시공 예측 니즈 + - 공사·장치업체(contractor): 리스트+엑셀 매칭, 견적 비교 부재 + - 홀매니저(ops): 규정 육안 검수 병목 + - 관람객(visitor): 등록·배지·현장 체크인 + - 일반 대중(public): 공개 홍보·플로어플랜 열람 + - +플랫폼 관리자·테넌트 관리자 +- **도표 지시**: 페르소나 카드 6종(과업·Pain·기대 3행). 도식ID 없음. +- **REQ**: REQ-F-081(역할별 포털의 근거) +- **출처**: PLANNING §2 + +## S10 · To-Be 목표(정량) +- **섹션**: P1 사업이해 +- **헤드라인**: "견적은 즉시, 배치는 수 분, 검수는 자동, 결과는 사진으로." +- **본문** + - 견적: 수일 대기 → **즉시**(규칙엔진 2,250원/㎡ 자동 계산) + - 배치: 수주 CAD 외주 → **수 분 3안 자동생성** + - 규정 검수: 육안 → **제출 전 자동 플래깅** + - 위치표시도: 수기 작도 → **좌표 클릭 자동 작도** + - 시공 결과: 개장일 첫 대면 → **신청 시점 사진 예측** +- **도표 지시**: As-Is→To-Be 대비표(정량 개선 5행). 도식ID 없음(표). +- **REQ**: REQ-F-002, REQ-F-007, REQ-F-009, REQ-F-017, REQ-A-001 +- **출처**: PLANNING §1-3 + +--- + +# P2. 추진전략 (S11~S15) + +## S11 · 비전·포지셔닝 +- **섹션**: P2 추진전략 +- **헤드라인**: "도면과 표를 보여주는 전시테크가 아니라, 사진으로 컨펌하는 베뉴 운영 플랫폼." +- **본문** + - 기존 전시테크는 도면·3D 뷰어 수준 → 우리는 **사진급 시공 예측**으로 의사결정 + - 단일 폐루프: 설계 자료가 곧 발주 근거 → 발주까지 한 흐름에서 종결 + - 데이터 주권: 온프레미스 Ollama 기본, 외부 AI는 승인 예외만 +- **도표 지시**: 비전 슬로건 대형 타이포. 도식ID 없음. +- **REQ**: (포지셔닝 — 개별 REQ 없음) +- **출처**: PLANNING §1-2, strategy §0 + +## S12 · 3중 해자 전략 +- **섹션**: P2 추진전략 +- **헤드라인**: "셋 중 하나는 흉내낼 수 있어도, 셋의 결합은 재현 난이도가 높다." +- **본문** + - 원A 나노바나나 시공 예측: image-to-image 구조보존·40초·S1~S7 [검증됨: G1 승인·워커 라이브] + - 원B PostGIS 실측 공간데이터: 부스 폴리곤·트렌치 포인트·배선 LineString 단일 원천 [검증됨: M2~M5 매퍼 라이브] + - 원C 공사 옥션 폐루프: AI 자료→응찰→낙찰→발주 자동전환 [구현 계획: Phase D] +- **도표 지시**: **도식① 3중 해자 벤다이어그램**(S04와 동일·상세 재강조). tech_advisory §1-4 ①. +- **REQ**: REQ-A-001·002, REQ-N-008·017, REQ-F-025·032 +- **출처**: strategy §3-3, tech_advisory §0-1·§1-4 ① + +## S13 · Win Theme 5선 +- **섹션**: P2 추진전략 +- **헤드라인**: "다섯 개의 차별화 메시지가 배점 다섯 곳을 정확히 겨눈다." +- **본문** + - WT-1 "도면이 아니라 사진으로 컨펌한다" — 배점 20(AI 시각화 핵심) + - WT-2 "수 분 내 3안, 제출 전 규정 자동검증" — 배점 20+15 교차 + - WT-3 "사진 수준 자료로 응찰하고 발주까지 끝낸다" — 배점 15(폐루프) + - WT-4 "AI가 만든 것은 표시하고, 남의 데이터는 차단한다" — 배점 10(보안) + - WT-5 "코드 배포 없이 데이터 온보딩만으로 새 전시관을 연다" — 배점 5(확장) +- **도표 지시**: Win Theme 5카드(각 카드에 배점 배지). 도식ID 없음. +- **REQ**: REQ-A-001, REQ-F-007·025, REQ-S-009·018, REQ-F-077 +- **출처**: strategy §1 + +## S14 · 전시 생애주기 폐루프 +- **섹션**: P2 추진전략 +- **헤드라인**: "설계 → 시각화 → 발주 → 시공 → 운영 → 분석이 하나의 순환으로 닫힌다." +- **본문** + - 판매·기획(M1) → 설계·시각화(M2~M5) → 발주·계약(M15·M6·M9) → 참가·관람(M10·M11) → 현장운영(M8·M13·M14) → 사후·경영(M16) + - 각 단계 산출물이 다음 단계 입력 → 재입력·중복 작업 제거 + - 분석(M16)이 다음 행사 기획(M1)으로 환류 +- **도표 지시**: 생애주기 폐루프 순환도(M모듈 매핑). 도식ID 없음(순환도). +- **REQ**: (생애주기 조망 — 상세 REQ는 P3에서 반영) +- **출처**: PLANNING §1-2-1 + +## S15 · 추진체계·수행조직 +- **섹션**: P2 추진전략 +- **헤드라인**: "거버넌스·아키텍트·코어·도메인·AI·QA·DevOps가 게이트로 맞물린다." +- **본문** + - 거버넌스: 총괄 PM · PMO · 개발 PM + - 아키텍트 풀: AA · SA · TA · DA · NA(5종 아키텍처 확정 완료) + - 실행: 공통·코어(백엔드·프론트·DB) · 도메인(옥션·관람·CMS·BI·관리자) · AI·시각화 · QA · DevOps + - 게이트: 선행 게이트(G1·G2) + Phase 게이트 QA 통과 +- **도표 지시**: **추진체계도(조직도)** — 거버넌스+아키텍트+실행팀 계층. tech_advisory §1-4 말미(추가 표준 도식). +- **REQ**: REQ-N-004(품질 게이트) +- **출처**: 하네스 팀 구성, tech_advisory §5-1 + +--- + +# P3. 기술제안 (S16~S40, 25슬라이드 · 배점 35 · 최다 집중) + +## P3-A. 모듈 조망 + +## S16 · 전체 모듈맵 +- **섹션**: P3 기술제안 +- **헤드라인**: "18개 모듈+공통 레이어를 한 장으로 조망 — P0 코어 4개가 심장이다." +- **본문** + - P0 코어(강조): M2 플로어플랜·M3 부스설계·M4 유틸리티·M5 나노바나나 + - P1 도메인: M1 판매·M6 서류·M7 등록·M9 정산·M15 옥션·M10 관람·M12/M17 CMS·M16 BI·M18 관리자 + - P2 확장: M8 물류·M11 비즈매칭·M13 wayfinding·M14 현장 IoT + - **공통/시스템관리 레이어(§5B) — 전 모듈 선행 기반** [검증됨: WISE 이식 Flyway V1~V9]: 공통코드·메뉴(F-073), 공통 업무모듈 일지·일정·쪽지·공지·검색(F-074), 회의록 STT·업무보고 통계 PDF(F-075), 통합 알림센터 WebSocket(F-076) + - 멀티테넌시(§1A): tenant_id 격리 기반 [구현 계획] + - 100대 기능 성숙도: 기구현 63·부분 18·신규 19(정량) +- **도표 지시**: **도식② 모듈맵(생애주기 6단계 × 우선순위 P0/P1/P2 매트릭스)** + 하단 공통 레이어 띠. tech_advisory §1-4 ②. +- **REQ**: REQ-F-073·074·075·076, 전 모듈 조망 +- **출처**: rfp_analysis §2-1, tech_advisory §1-4 ②·§0 + +## P3-B. 나노바나나 시공 예측 — WT-1 (S17~S23, 7슬라이드 · 축소 금지) + +## S17 · 나노바나나 개요 +- **섹션**: P3 기술제안(WT-1) +- **헤드라인**: "시공 전에 사진으로 의사결정한다 — 경쟁 전시테크가 못 하는 차별화." +- **본문** + - 문제: 참가업체는 도면을 못 읽어 개장일에야 결과를 처음 본다(PLANNING §2) + - 해법: image-to-image로 빈 부스(도면/실측)를 시공 후 사진으로 예측 + - 실증: Gemini 라이브(G1 소유자 승인 완료), `gemini-3.1-flash-image-preview` 워커 상주 [검증됨] + - 효과: 조감도 외주(비용·시간) 대체, 신청 시점 의사결정 +- **도표 지시**: 히어로 Before/After 실물(워터마크 표기). 도식ID 없음(히어로). +- **REQ**: REQ-A-001 +- **출처**: strategy §1 WT-1, tech_advisory §0-1·§2 WT-1 + +## S18 · 표준 샷세트 S1~S7 +- **섹션**: P3 기술제안(WT-1) +- **헤드라인**: "정면·야간·통로·내부·Before/After·배선·홀전경 — 7컷을 평균 40초에." +- **본문** + - S1 정면 부스 전경 / S2 야간 조명 연출(조도 배치안 반영) / S3 통로 시점 / S4 부스 내부 / S5 Before/After / S6 배선 오버레이 / S7 홀 전경 + - 자동생성은 비용·품질 제어 위해 **S1·S7 한정**, 나머지는 온디맨드 [구현 계획: 샷세트 파이프라인] + - 모든 컷에 워터마크·고지 항상 포함 +- **도표 지시**: 샷세트 7컷 그리드(각 컷 워터마크 배지). 도식ID 없음(그리드). +- **REQ**: REQ-A-001, REQ-F-019(조명 조도 배치안) +- **출처**: tech_advisory §2 WT-1, PLANNING §6 + +## S19 · image-to-image 구조보존 +- **섹션**: P3 기술제안(WT-1) +- **헤드라인**: "골격·치수·통로·카메라 앵글은 잠그고, 스타일·재질만 사실화한다." +- **본문** + - 참조 이미지 `inlineData` + 구조화 프롬프트 사전(BOOTH_TYPES·BOOTH_STYLES·FIXTURE_LAYERS) + - **보존(잠금)**: 부스 골격·치수·통로·카메라 앵글 → 왜곡·과장 방지 + - **교체(사실화)**: 스타일·재질·마감만 → 사진 리얼리티 + - 검증 패턴: ReRoomAI image-to-image 보존/교체 분리 이식(reroomai-source.md) +- **도표 지시**: 보존/교체 파라미터 도식(잠금 항목 vs 교체 항목 2열). 도식ID 없음. +- **REQ**: REQ-A-002, REQ-A-003 +- **출처**: tech_advisory §2 WT-1, docs/analysis/reroomai-source.md + +## S20 · AI 파이프라인 아키텍처 +- **섹션**: P3 기술제안(WT-1) +- **헤드라인**: "생성은 전면 비동기 — 사용자는 대기하지 않고, 완료는 WebSocket으로 밀어준다." +- **본문** + - 흐름: 사용자 요청 → Spring RenderJob 생성·쿼터 확인 → Redis 큐(leftPush) → Python 워커(BLPOP) → Gemini image-to-image → 워터마크 후처리·S6 로컬 PIL 래스터 → 오브젝트 스토리지 → pub/sub → 백엔드 relay → WebSocket `/topic/render/{jobId}` → 프론트 완료 푸시 + - degraded 분기: G1 미승인/Gemini 장애 시 워커 목(mock) 응답·구조·워터마크 유지(REQ-N-005) + - 성공 시에만 쿼터 차감, `GEMINI_API_KEY`는 워커 env only +- **도표 지시**: **도식③ 나노바나나 파이프라인 플로우(8박스 좌→우)**. tech_advisory §1-4 ③. +- **REQ**: REQ-A-007, REQ-N-006 +- **출처**: tech_advisory §1-4 ③·§2 WT-1 + +## S21 · Before/After·배선 오버레이 +- **섹션**: P3 기술제안(WT-1) +- **헤드라인**: "드래그 한 번으로 빈 부스와 시공 후를 비교하고, 배선을 색으로 겹쳐 본다." +- **본문** + - Before/After: 좌우 분할 카드 + 중앙 드래그 핸들, ARIA slider·키보드 좌우 조작(WCAG AA) + - S6 배선 오버레이: Gemini 미경유, 백엔드/워커 로컬 PIL **결정적 래스터 합성**(좌표 정확성·비용/지연 제외) + - 색상 규약: 전기=적색, 네트워크=청색, 급배수=녹색 +- **도표 지시**: **도식④ Before/After 슬라이더**(좌 "Before: 빈 부스", 우 "After: 시공 후 예상(AI 생성·워터마크)", 하단 워터마크 배지). tech_advisory §1-4 ④. +- **REQ**: REQ-A-004, REQ-A-005 +- **출처**: tech_advisory §1-4 ④·§2 WT-1 + +## S22 · RenderJob 방어·품질 +- **섹션**: P3 기술제안(WT-1) +- **헤드라인**: "다층 방어로 실패를 흡수하고, 성공했을 때만 쿼터를 쓴다." +- **본문** + - 크기가드·mimeType 자동감지·SAFETY 분기·친화적 한글 에러 + - 간판 한글 렌더 실패 시 **간판영역 후처리 합성**(리스크 R-5 방어) + - 대량 생성 제어: 자동생성 S1·S7 한정 + 동일 스키마해시 캐시 + 행사별 쿼터(성공 시만 차감) +- **도표 지시**: RenderJob 상태 시퀀스(방어 계층 표시). 도식ID 없음(시퀀스). +- **REQ**: REQ-A-006, REQ-A-008, REQ-N-007 +- **출처**: tech_advisory §2 WT-1, strategy §4 R-5 + +## S23 · AI 신뢰 원칙 +- **섹션**: P3 기술제안(WT-1) +- **헤드라인**: "결정적 알고리즘이 중심, LLM은 보조, 최종 확정은 사람 — 워터마크는 불변." +- **본문** + - 3층 신뢰: 결정적 알고리즘(제약 솔버·PostGIS) 중심 + LLM 보조 + 사람 최종 확정 + - 워터마크 항상 포함(`watermarkRequired:true`), 계약·심사 서류 사용 금지 고지 제거 불가 + - AI 답변은 RAG 근거·인용·환각 차단(abstain)으로 오판 리스크 차단(리스크 R-6 방어) +- **도표 지시**: AI 3층 신뢰 구조 도식(결정론→LLM→사람). 도식ID 없음. +- **REQ**: REQ-S-009, REQ-A-017 +- **출처**: tech_advisory §2 WT-2·WT-4, strategy §4 R-6 + +## P3-C. 배치·설계·배선 AI 자동화 — WT-2 (S24~S28, 5슬라이드) + +## S24 · 플로어플랜 스튜디오(M2) +- **섹션**: P3 기술제안(WT-2) +- **헤드라인**: "제약 솔버가 상이한 목표로 정확히 3안 — 사람이 선택·병합·확정한다." +- **본문** + - 3안 자동생성: **결정적 제약 솔버**(비-LLM)가 통로 효율/프리미엄 부스/균형 등 목표별 생성, LLM은 조건해석만(REQ-A-009) + - 선택/병합 편집 + 최종안 버전기록·부스좌표 확정·초대링크(REQ-F-008·010) + - M2 매퍼(PostGIS 공간 SQL) [검증됨], 3안 생성·병합·집계 API [구현 계획] +- **도표 지시**: **도식⑤ 3안 비교 화면**(3열 카드·각 카드 최적화 목표·미니 배치도·지표, 하단 액션바 선택/병합/재검증). tech_advisory §1-4 ⑤. +- **REQ**: REQ-F-007·008·010, REQ-A-009 +- **출처**: tech_advisory §1-4 ⑤·§2 WT-2 + +## S25 · 배치 규정 자동검증 +- **섹션**: P3 기술제안(WT-2) +- **헤드라인**: "피난통로·바닥하중·비상구를 제출 전에 자동으로 플래깅한다." +- **본문** + - 룰엔진(`compliance-v*.json` 버전 데이터) + PostGIS 공간 판정: 통로폭 `ST_Distance/ST_Buffer`, 비상구 `ST_Intersects`, 홀 이탈 `ST_Contains`, 바닥하중 홀별 + - 병합 후 재검증 필수, 위반 시 `COMPLIANCE_BLOCKED`(422) + - 원칙: 규정검증=플래깅까지, 구조안전 판정은 구조기술사/킨텍스(Non-Goal 명시, 리스크 R-6) +- **도표 지시**: 규정 위반 플래그 대시보드(위반 항목·홀별 하중·비상구 교차 목록). 도식ID 없음(대시보드). +- **REQ**: REQ-F-009, REQ-A-010 +- **출처**: tech_advisory §2 WT-2, strategy §4 R-6 + +## S26 · 부스 설계 스튜디오(M3) +- **섹션**: P3 기술제안(WT-2) +- **헤드라인**: "조립부스 3D 프리뷰·독립부스 3안, 높이·리깅·방염·이격은 사전 검증." +- **본문** + - 조립부스 옵션·3D 프리뷰(REQ-F-011), 독립부스 설계 3안·선택/병합·버전(REQ-F-012) + - 설계 규정 사전검증: 높이 5m·리깅 6.5~8.5m·방염·이격(REQ-F-013) + - 도면 업로드 비전 추출·검증(REQ-F-014·A-020) +- **도표 지시**: 설계 3안 + 규정 체크리스트(높이·리깅·방염·이격). 도식ID 없음. +- **REQ**: REQ-F-011·012·013·014, REQ-A-020 +- **출처**: tech_advisory §2 WT-2, PLANNING §M3 + +## S27 · 유틸리티 설계(M4) +- **섹션**: P3 기술제안(WT-2) +- **헤드라인**: "기기→kW→분전반을 자동 산출하고, 트렌치→분전반 최단 배선을 PostGIS가 그린다." +- **본문** + - 전기 용량·분전반 자동산출: 기기목록→kW 합산→분전반 산출(REQ-F-015) + - 배선 경로: 최근접 트렌치 KNN(`geom <-> point`)→최단 배선 LineString(`ST_Length`, 통로 횡단 최소 휴리스틱)(REQ-F-016) + - 실측 근거: 홀별 평면도 JPG 15장 + CAD "평면,트렌치.dwg" 확보 [검증됨], 미확보 구간은 "가정 좌표(실측 대기)" 라벨(리스크 R-2) +- **도표 지시**: **도식⑥ PostGIS 배선 오버레이**(부스 폴리곤·트렌치 포인트◆·분전반▣·색상별 LineString, 전기 적/네트 청/급배수 녹). tech_advisory §1-4 ⑥. +- **REQ**: REQ-F-015, REQ-F-016 +- **출처**: tech_advisory §1-4 ⑥·§2 WT-2, strategy §4 R-2 + +## S28 · 위치표시도·유틸리티 신청 +- **섹션**: P3 기술제안(WT-2) +- **헤드라인**: "좌표 클릭으로 위치표시도를 자동 작도하고, 신청·견적은 D-25 역산으로 챙긴다." +- **본문** + - 위치표시도 자동생성: 좌표 클릭 자동 작도, 수기 작도 폐지(REQ-F-017) + - 네트워크·급배수·압축공기 신청 + 마감 리마인더(D-25 역산)(REQ-F-018) + - 자동 견적 연동 +- **도표 지시**: 위치표시도 자동생성 예시(좌표 클릭 → 작도 결과). 도식ID 없음. +- **REQ**: REQ-F-017, REQ-F-018 +- **출처**: tech_advisory §2 WT-2, PLANNING §M4 + +## P3-D. 공사 옥션 폐루프 — WT-3 (S29~S32, 4슬라이드) + +## S29 · 옥션 개요·폐루프 +- **섹션**: P3 기술제안(WT-3) +- **헤드라인**: "AI가 만든 설계 자료가 곧 응찰 근거이고, 한 흐름에서 발주까지 끝난다." +- **본문** + - AI 자료 패키지(M2 배치+M3 설계+M4 배선/BOQ+M5 시공예측 이미지)가 응찰 근거(`attached_refs`) + - 옥션 유형 설정형(REVERSE 역경매/RFQ/FIXED), 물량서(BOQ) 자동산출(REQ-F-031) + - 데이터모델: `TB_AUCTION 1─N TB_QUOTATION ─ TB_AWARD` [구현 계획: Phase D-M15] +- **도표 지시**: **도식⑦ 옥션 폐루프 흐름도**(AI 자료 패키지→옥션 개설→등록 게이트→견적 제출→실시간 순위→종합평가 낙찰→발주 자동전환). tech_advisory §1-4 ⑦. +- **REQ**: REQ-F-025·026, REQ-F-031 +- **출처**: tech_advisory §1-4 ⑦·§2 WT-3 + +## S30 · 역경매·실시간 순위 +- **섹션**: P3 기술제안(WT-3) +- **헤드라인**: "라운드·마감·최저가·내 위치를 실시간으로, 자동마감까지." +- **본문** + - 실시간 순위 = Redis 정렬셋 + WebSocket `/topic/auction/{auctionId}` 델타 푸시 + - 라운드 마감 = Redis 타이머(자동마감) + - 익명 옵션·내 위치 표시(REQ-F-027) + - 스캐폴드 4계층·큐·WS 패턴 확정으로 실현성 입증 [구현 계획] +- **도표 지시**: 실시간 순위 보드 목업(업체 순위·최저가·잔여 시간). 도식ID 없음(목업). +- **REQ**: REQ-F-027 +- **출처**: tech_advisory §2 WT-3 + +## S31 · 종합평가 낙찰 +- **섹션**: P3 기술제안(WT-3) +- **헤드라인**: "가격만이 아니라 평판·납기까지 가중 스코어로 투명하게 낙찰한다." +- **본문** + - 가중 스코어: 가격+평판+납기(`weight` jsonb, 옥션별 설정형, 예: 가격 0.6/평판 0.25/납기 0.15)(REQ-F-028) + - 항목별 비교표·선정 사유 제시 + - 등록업체 AI 매칭 추천(REQ-F-030), 물량서(BOQ) 근거(REQ-F-031) +- **도표 지시**: **도식⑧ 종합평가 스코어 비교표**(업체 행 × 평가항목 열 + 가중 종합점수 + 낙찰 하이라이트). tech_advisory §1-4 ⑧. +- **REQ**: REQ-F-028, REQ-F-030, REQ-F-031 +- **출처**: tech_advisory §1-4 ⑧·§2 WT-3 + +## S32 · 등록 게이트·발주 전환 +- **섹션**: P3 기술제안(WT-3) +- **헤드라인**: "미등록 업체는 응찰 자체가 차단(403)되고, 낙찰은 계약·발주로 자동 전환된다." +- **본문** + - 등록 게이트: 미등록 업체 응찰 원천 차단 `NOT_REGISTERED_COMPANY`(403), M7이 `TB_COMPANY.kintex_registered` 검증 권위 → 킨텍스 "등록업체 시공 필수" 규정을 시스템이 강제(REQ-S-007) + - 발주 전환: Award → 계약/발주 자동전환(M6·M9 연동, 이벤트 디커플·순환 금지)(REQ-F-032) +- **도표 지시**: 등록 검증 시퀀스 + 발주 전환 흐름. 도식ID 없음(시퀀스). +- **REQ**: REQ-F-029, REQ-F-032, REQ-S-007 +- **출처**: tech_advisory §2 WT-3·§4 REQ-S-007 + +## P3-E. 판매·서류·워크플로 (S33~S34) + +## S33 · 판매·홀배정·견적(M1) +- **섹션**: P3 기술제안 +- **헤드라인**: "가용성은 실시간 캘린더로, 견적은 규칙엔진으로 즉시, 신청은 웹폼→HWP로." +- **본문** + - 홀/반홀 가용성 실시간 캘린더(REQ-F-001) + - 규칙엔진 자동 견적(2,250원/㎡, 요율 공식본 [협의: C4])(REQ-F-002) + - 배정신청 웹폼→HWP 자동생성(REQ-F-003), 부스 판매 인벤토리(REQ-F-004), 온라인 셀프 선택·판매(REQ-F-005) + - 임대계약 전자서명(선택, REQ-F-006) +- **도표 지시**: 견적 규칙엔진 계산 흐름(면적×요율→견적). 도식ID 없음. +- **REQ**: REQ-F-001·002·003·004·005·006 +- **출처**: PLANNING §M1, rfp_analysis(C4 요율) + +## S34 · 서류·마일스톤(M6) +- **섹션**: P3 기술제안 +- **헤드라인**: "D-150/30/25/7을 역산해 알리고, 웹폼은 HWP/PDF로, 검수는 AI가 돕는다." +- **본문** + - 마일스톤 자동생성·역산 알림(REQ-F-020), 신고서류 웹폼→HWP/PDF 자동생성 7종(REQ-F-021) + - 서류 버전·전자결재 워크플로(REQ-F-023), OCR 계약·납품서 자동등록(REQ-F-024·A-020) + - AI 서류 검수(누락·불일치)(REQ-A-011), 규정 자연어 챗봇(근거·인용)(REQ-A-012) + - kxwp 제출 릴레이: 웹폼→HWP/PDF까지 API 무관하게 완결, 릴레이 단계만 킨텍스 IT 협의 [협의: C2, 리스크 R-3](REQ-F-022) +- **도표 지시**: 마일스톤 역산 타임라인(D-데이별 서류·알림). 도식ID 없음(타임라인). +- **REQ**: REQ-F-020·021·022·023·024, REQ-A-011·012 +- **출처**: tech_advisory §2, strategy §4 R-3 + +## P3-F. 관람·참가 (S35~S36) + +## S35 · 관람객 등록·배지·리드(M10) +- **섹션**: P3 기술제안 +- **헤드라인**: "사전등록→모바일 배지→현장 체크인→리드까지, 오프라인에서도 끊기지 않는다." +- **본문** + - 온라인 사전등록(유형별·중복검증)(REQ-F-037), 모바일 배지/QR 발급(REQ-F-038) + - 현장 QR 체크인·즉석 인쇄·집계(REQ-F-039), **오프라인 체크인 폴백**(REQ-F-040) + - 참가업체 리드캡처(REQ-F-041), AI 리드 스코어링·분류(REQ-F-042·A-018), 세그먼트 EDM(REQ-F-043) + - 티켓발권·AI폼빌더·스마트배지(선택, REQ-F-044) +- **도표 지시**: 등록→체크인→리드 여정도. 도식ID 없음(여정도). +- **REQ**: REQ-F-037·038·039·040·041·042·043·044, REQ-A-018 +- **출처**: PLANNING §M10, tech_advisory §7 + +## S36 · 비즈매칭·마케팅·공개사이트(M11·M12·M17) +- **섹션**: P3 기술제안 +- **헤드라인**: "AI가 매칭을 추천하고, 다국어 공개사이트·마이크로사이트가 SEO로 관람객을 모은다." +- **본문** + - AI 비즈매칭 추천(REQ-F-045·A-018), 미팅 슬롯·성과 리포트(REQ-F-046), 이벤트 모바일앱·세션·채팅·설문(REQ-F-047) + - 공개 홍보 사이트(SEO·다국어)(REQ-F-048), 공개 인터랙티브 플로어플랜(REQ-F-049), 세그먼트 EDM·캠페인 자동화(REQ-F-050), 스폰서십 패키지·대시보드(REQ-F-051) + - CMS 게시 워크플로·버전(REQ-F-067), 마이크로사이트(REQ-F-068), 다국어 콘텐츠·hreflang(REQ-F-069) + - AI 카피·이미지 초안·다국어 번역(REQ-A-015) +- **도표 지시**: 공개사이트 + 마이크로사이트 목업. 도식ID 없음(목업). +- **REQ**: REQ-F-045·046·047·048·049·050·051·067·068·069, REQ-A-015·018 +- **출처**: PLANNING §M11·M12·M17, tech_advisory §1-2 + +## P3-G. 정산·경영분석·현장 (S37~S40) + +## S37 · 정산·결제(M9) +- **섹션**: P3 기술제안 +- **헤드라인**: "납부는 스케줄로, 결제는 PG로, 예치금은 실사용까지 투명하게 정산한다." +- **본문** + - 납부 스케줄 자동생성·알림(REQ-F-056), 유틸리티·부대 PG 결제(REQ-F-057) + - 예치금 실사용 정산 투명화(REQ-F-058), 세금계산서·옥션 수수료 정산(REQ-F-059) + - 환불·취소 규정 자동(선택, REQ-F-060) +- **도표 지시**: 정산 흐름도(납부→결제→예치금 정산→세금계산서). 도식ID 없음. +- **REQ**: REQ-F-056·057·058·059·060 +- **출처**: PLANNING §M9 + +## S38 · 경영분석 BI(M16)-1 +- **섹션**: P3 기술제안 +- **헤드라인**: "가동률·매출구성·행사별 P&L·㎡당 수익을 운영사 관점 한 화면에." +- **본문** + - 홀·기간별 가동률 대시보드(REQ-F-061), 매출 구성·행사별 P&L(REQ-F-062) + - 전시장 ROI·RevPAD·㎡당 수익(REQ-F-063) + - 데이터: BI 집계·조회는 읽기복제 오프로드(운영 프라이머리 보호) +- **도표 지시**: BI 대시보드 목업(Recharts — 가동률·매출구성·P&L·RevPAD). 도식ID 없음(목업). +- **REQ**: REQ-F-061·062·063 +- **출처**: PLANNING §M16, tech_advisory §3 REQ-N-010 + +## S39 · 경영분석 BI(M16)-2 +- **섹션**: P3 기술제안 +- **헤드라인**: "리텐션·LTV·참가사 ROI를 권한 격리로, AI가 수요를 예측하고 KPI를 브리핑한다." +- **본문** + - 참가사 리텐션·LTV 코호트(REQ-F-064), 참가업체 관점 ROI(권한 격리)(REQ-F-065), 경영진 KPI 대시보드·드릴다운(REQ-F-066) + - AI 수요예측·수율/동적가격(REQ-A-013), AI KPI 브리핑·자연어 조회 Text-to-SQL(REQ-A-014) + - BI 마트는 개인 식별자 비반입(집계만), 참가업체는 자사 데이터만(격리) +- **도표 지시**: KPI 드릴다운 + AI 인사이트 카드. 도식ID 없음. +- **REQ**: REQ-F-064·065·066, REQ-A-013·014 +- **출처**: PLANNING §M16, tech_advisory §4 REQ-S-013 + +## S40 · 현장운영·물류(M8·M13·M14) +- **섹션**: P3 기술제안 +- **헤드라인**: "반입/반출 슬롯·통행증 QR·wayfinding·이상탐지 — 선택 기능은 시설 협의 전제로." +- **본문** + - 반입/반출 슬롯 예약(REQ-F-033), 통행증 QR·중량물 우선(REQ-F-034), 지게차·부대장비 렌탈(REQ-F-035), 철거 대기열 시뮬레이션(REQ-F-036) + - 실내 wayfinding·POI·경로(REQ-F-052), 실시간 혼잡 모니터·예측(REQ-F-053·A-019), 홀 전력부하·주차 점유(REQ-F-054), 안전 위반·이상탐지(REQ-F-055·A-019) + - 사이니지 콘텐츠 배포(REQ-F-070) + - **[협의]**: wayfinding 비콘·IoT·사이니지 HW는 킨텍스 시설 인프라 협의 전제(C7, 리스크 R-7). 미협의 시에도 코어 가치(WT-1~4)는 HW 독립 +- **도표 지시**: 현장 운영 상황판(혼잡·전력·안전·물류 슬롯). 도식ID 없음(상황판). +- **REQ**: REQ-F-033·034·035·036·052·053·054·055·070, REQ-A-019 +- **출처**: PLANNING §M8·M13·M14, strategy §4 R-7 + +--- + +# P4. 아키텍처·기술스택 (S41~S45, 배점 10) + +## S41 · 전체 아키텍처 +- **섹션**: P4 아키텍처 +- **헤드라인**: "확정 스택으로 이미 기동 중 — 도상이 아니라 동작하는 아키텍처다." +- **본문** + - 4-Tier + 사이드카: React 18/19(Vite·TS) 역할별 분리 → SSO(JWT+2FA)·이중 RBAC → 공유 Spring Boot 3.2.5(Java 17)+MyBatis 모듈러 모놀리스 → PostgreSQL+PostGIS(+읽기복제)/Redis/오브젝트 스토리지 + - 사이드카: 나노바나나 Python 워커(이미지) + Claude AI(AiTextRouter·Ollama 폴백)(텍스트) + - 실증: 인프라·CI/CD·인증·PostGIS 코어·나노바나나 [검증됨] +- **도표 지시**: **도식⑨ 시스템 아키텍처 다이어그램(6밴드 계층 + 우측 외부 게이트 컬럼)**. tech_advisory §1-4 ⑨. +- **REQ**: REQ-A-016, REQ-F-081(역할별 프론트) +- **출처**: tech_advisory §1-1·§1-4 ⑨·§0-1 + +## S42 · 단일 공간 데이터 원천 +- **섹션**: P4 아키텍처 +- **헤드라인**: "부스 폴리곤·트렌치 포인트·배선 LineString은 하나의 원천에서만 산다." +- **본문** + - M2 폴리곤·M4 배선 매퍼가 권위, 소비 모듈은 조회만·중복 저장 금지(REQ-N-017) + - PostGIS 단일 공간 원천(SRID 0 홀 로컬 미터), 전 `geom` GiST 인덱스 실시간(REQ-N-008) + - 검증 게이트: ArchUnit·계약 검수로 중복 저장 방지 +- **도표 지시**: 공간 데이터 원천 모델(폴리곤·포인트·LineString 단일 원천). 도식ID 없음(개념 모델). +- **REQ**: REQ-N-008, REQ-N-017 +- **출처**: tech_advisory §3(N-008·017), data.md §0-2 + +## S43 · 확장성·비동기 +- **섹션**: P4 아키텍처 +- **헤드라인**: "워커는 큐 깊이로 독립 확장하고, BI·공개는 읽기복제로 오프로드한다." +- **본문** + - 워커 독립 스케일: 나노바나나·서류·EDM 워커 큐 깊이 기반 증감(REQ-N-009) + - 읽기복제 오프로드: BI 집계·공개 조회·플로어플랜 열람 읽기복제 라우팅(REQ-N-010) + - 공개영역 CDN·요청률 상한(REQ-N-019), 워커 장애 재큐(멱등 Job)(REQ-N-011) + - 역할별 프론트 번들 분리(REQ-F-081, 방식 확정 대기 [구현 계획]) +- **도표 지시**: 배포 토폴로지도(프론트·백엔드 2인스턴스·워커 N·읽기복제·CDN). 도식ID 없음(토폴로지). +- **REQ**: REQ-N-009·010·011·019, REQ-F-081 +- **출처**: tech_advisory §3, system.md §3-1 + +## S44 · AI 플랫폼 라우팅 +- **섹션**: P4 아키텍처 +- **헤드라인**: "Claude 기본, 장애·폐쇄망이면 Ollama 폴백 — LLM 직접호출은 금지, 중앙 경유만." +- **본문** + - `AiTextRouter`: Claude 기본(`api.anthropic.com` 승인 예외) → Ollama 폴백(REQ-A-016) + - 나노바나나는 큐/콜백만(백엔드는 이미지 미취급), degraded 시 목 응답(REQ-A-007, N-005) + - AiTextRouter/AiConfig는 UIWS 패턴 [구현 계획: 착수 대기] +- **도표 지시**: AI 라우터 폴백 흐름(Claude→실패→Ollama). 도식ID 없음. +- **REQ**: REQ-A-007, REQ-A-016 +- **출처**: tech_advisory §1-2 AI(텍스트)·§6 + +## S45 · 연동·마스터데이터 +- **섹션**: P4 아키텍처 +- **헤드라인**: "외부는 게이트웨이로, 룰셋·요율은 버전 데이터로 무중단 개정한다." +- **본문** + - API·웹훅·CRM/ERP 연동 게이트웨이(선택, REQ-F-080) + - 룰셋·마스터데이터 버전관리(요율·규정 룰셋), M18 백오피스·감사 기록으로 무중단 개정(REQ-F-072) + - 외부 게이트: Gemini(워커존)·Claude(백엔드)·PG 결제·kxwp 릴레이·등록업체 DB 739 +- **도표 지시**: 연동 인터페이스 맵(내부↔외부 게이트웨이). 도식ID 없음. +- **REQ**: REQ-F-072, REQ-F-080 +- **출처**: tech_advisory §1-2, §6-3 + +--- + +# P5. 보안·개인정보 (S46~S50, 배점 10 · WT-4) + +## S46 · 보안 개요·불변 원칙 +- **섹션**: P5 보안·개인정보 +- **헤드라인**: "AI가 만든 것은 표시하고, 남의 데이터는 차단한다 — REQ-S 20항목 전량 커버." +- **본문** + - 불변 원칙 4대: 외부 API 격리 · 워터마크 항상 · PII 격리 · 테넌트 fail-closed + - 보안 성숙도: 인증·워터마크·admin env는 [검증됨](설계가 아니라 동작하는 통제) + - REQ-S 20항목 커버리지 100% +- **도표 지시**: REQ-S 20항목 커버리지 표(항목·충족방안·상태). 도식ID 없음(표). +- **REQ**: REQ-S 전량(001~020) +- **출처**: tech_advisory §4·§0-1 + +## S47 · 보안영역 분리 +- **섹션**: P5 보안·개인정보 +- **헤드라인**: "공개 DMZ는 쓰기 권한이 없고, 데이터존은 아웃바운드가 0이다." +- **본문** + - 존 계층: 인터넷→엣지(CDN·WAF)→DMZ(공개, 쓰기 없음)→내부망(인증)→AI 워커존(egress 제한)→데이터존(최내곽, 아웃바운드 전면 차단) + - 철칙: DMZ→데이터존 직접 접근 절대 금지, 데이터존 아웃바운드 0(유출 경로 제거) + - egress 화이트리스트: 승인 4목적지만(Claude·Gemini·PG·SMTP), 그 외 DROP + - fail-closed 다층 테넌트 격리와 정합(REQ-S-018) +- **도표 지시**: **도식⑩ 보안영역 분리도(존 다이어그램 + 관리존 + egress 컬럼)**. tech_advisory §1-4 ⑩. +- **REQ**: REQ-S-020, REQ-S-018, REQ-N-018 +- **출처**: tech_advisory §1-4 ⑩·§4, network.md §2 + +## S48 · 인증·접근통제 +- **섹션**: P5 보안·개인정보 +- **헤드라인**: "JWT+2FA는 이미 라이브, admin 비번은 env로 재시드, RBAC는 3중이다." +- **본문** + - JWT(HS256)+TOTP 2FA(RFC6238)+로그인 실패 잠금 [검증됨: Flyway V7/V8](REQ-S-005) + - admin 비번 env 재시드(AES-256-GCM, admin123 금지) [검증됨: env 시더](REQ-S-004) + - 행사 RBAC 3중(테넌트 격리 ⊃ 행사 RBAC, 열람/편집 게이트)(REQ-S-006), admin/internal 엔드포인트 게이트(REQ-S-008) + - RBAC·감사·시스템설정 백오피스(REQ-F-071) + - 미등록 업체 차단(403)과 연계(REQ-S-007) +- **도표 지시**: 인증 흐름 + RBAC 3중 구조. 도식ID 없음. +- **REQ**: REQ-S-004·005·006·007·008, REQ-F-071 +- **출처**: tech_advisory §4·§0-1(라이브) + +## S49 · AI·이미지 보안 +- **섹션**: P5 보안·개인정보 +- **헤드라인**: "생성 이미지는 워터마크·금지 고지 불변, 외부 API 키는 워커 env에만 산다." +- **본문** + - 워터마크 항상: M5 응답 `watermarkRequired:true`+text+notice(계약·심사 서류 금지), 제거 불가 [검증됨](REQ-S-009) + - 외부 API 정책: Ollama 기본 + Claude/Gemini만 승인 예외, egress 그 외 DROP(REQ-S-001) + - `GEMINI_API_KEY` 워커 env only(백엔드 미취급, 워커존 단일 egress)(REQ-S-002) + - RAG 근거·인용·환각 차단(abstain)(REQ-A-017) +- **도표 지시**: 워터마크 실물 + 외부 API 격리(워커존 단일 egress). 도식ID 없음. +- **REQ**: REQ-S-001·002·009, REQ-A-017 +- **출처**: tech_advisory §4·§2 WT-4 + +## S50 · 개인정보·감사·안전코딩 +- **섹션**: P5 보안·개인정보 +- **헤드라인**: "PII는 동의·마스킹·암호화·응답 제외, 민감 액션은 전수 감사, 코드는 안전하게." +- **본문** + - PII: 동의 분리(privacy/marketing/share)·최소수집·`*_enc` AES-256-GCM·응답 완전 제외·보존/파기(REQ-S-013) + - 자격증명·키 완전 제외(응답/로그/커밋 마스킹)(REQ-S-003), 스택트레이스 미노출(REQ-S-010), DataAccessException 요약 매핑(REQ-S-011) + - 민감 액션 감사 전수(`TB_AUDIT_LOG` tenant_id 포함, `@Audited` AOP)(REQ-S-012) + - 안전코딩: 입력 검증(REQ-S-014)·XSS/CSP(REQ-S-015)·인젝션 차단 MyBatis `#{}`(REQ-S-016)·IDOR/CSRF/JWT 회전(REQ-S-017) + - 관측성: 로그·메트릭·트레이스에 PII/스택트레이스 미기록(REQ-N-018) +- **도표 지시**: PII 마스킹 예시 + 감사로그 표. 도식ID 없음. +- **REQ**: REQ-S-003·010·011·012·013·014·015·016·017, REQ-N-018 +- **출처**: tech_advisory §4, data.md §5 + +--- + +# P6. 비기능 (S51~S54, 배점 8) + +## S51 · 성능·가용성 SLA +- **섹션**: P6 비기능 +- **헤드라인**: "코어 SLO 99.5%(성수기 99.9% 지향), 무중단 롤링·PITR·degraded로 버틴다." +- **본문** + - 코어 SLO 99.5%(성수기 99.9% 지향), 무상태 백엔드+Redis 외부화(REQ-N-001) + - 백엔드 2인스턴스·헬스체크 LB·롤링 무중단(REQ-N-002), PG 스탠바이 복제·자동 failover·PITR(REQ-N-003) + - degraded 모드: Gemini 장애=목 응답, Claude 장애=Ollama 폴백, PG 복제지연=프라이머리 폴백(REQ-N-005) + - 워커 장애 재큐(멱등)(REQ-N-011) +- **도표 지시**: SLA 수치표 + HA 구성도(프론트·백엔드·Redis·PG·워커 다중화). 도식ID 없음(표+구성도). +- **REQ**: REQ-N-001·002·003·005·011 +- **출처**: tech_advisory §3·§6-2, system.md §3-2 + +## S52 · 나노바나나 성능 +- **섹션**: P6 비기능 +- **헤드라인**: "단건 평균 40초, 1024px 전처리·자동생성 한정·캐시·쿼터로 대량을 제어한다." +- **본문** + - 단건 평균 ≤40s, 전면 비동기(WS 완료 푸시)(REQ-N-006) + - 전처리: 클라 Canvas 1024px 다운스케일 + JPEG 0.85 + - 대량 제어: 자동생성 S1·S7 한정 + 동일 스키마해시 캐시 + 행사별 쿼터(성공 시만 차감)(REQ-N-007) +- **도표 지시**: 렌더 성능 지표 카드(40초·1024px·캐시 히트·쿼터). 도식ID 없음. +- **REQ**: REQ-N-006, REQ-N-007 +- **출처**: tech_advisory §3, system.md §3-3 + +## S53 · 접근성·다국어·테마·반응형 +- **섹션**: P6 비기능 +- **헤드라인**: "WCAG 2.1 AA+KWCAG 2.2, 한/영/중/일, 라이트/다크, 데스크톱/모바일 전부." +- **본문** + - 접근성: WCAG 2.1 AA + 공공 KWCAG 2.2 병행(REQ-N-012), 캔버스/맵 비시각 대안(데이터 테이블·키보드 부스 선택)(REQ-N-013) + - 다국어: i18n 외부화(한 기본+영/중/일)·hreflang·로케일 포맷(REQ-N-014) + - 테마: 라이트/다크 CSS 토큰 2벌·prefers-color-scheme(REQ-N-015) + - 반응형: 데스크톱=설계/에디터, 모바일=현장/조회/승인(REQ-N-016) + - [구현 계획: 전면 스윕 대기] +- **도표 지시**: 접근성·다국어 매트릭스. 도식ID 없음(매트릭스). +- **REQ**: REQ-N-012·013·014·015·016, REQ-F-069(다국어 정합) +- **출처**: tech_advisory §3, PLANNING §8 + +## S54 · 관측성·데이터 +- **섹션**: P6 비기능 +- **헤드라인**: "로그·메트릭·트레이스에 PII·스택트레이스는 남기지 않고, BI는 배치 ETL로 정합한다." +- **본문** + - 관측성: 로그·메트릭·트레이스 관리존 수집, 자격증명·PII·스택트레이스 미기록(`include-stacktrace: never`)(REQ-N-018) + - BI 데이터마트: 스타 스키마(FACT/DIM) 야간 배치 ETL 또는 읽기복제 적재, KpiSnapshot(원천-집계 정합 오차 0)(REQ-N-021) + - 공개영역 CDN·요청률 상한과 정합(REQ-N-019) +- **도표 지시**: 관측성 파이프라인(수집→저장→대시보드). 도식ID 없음. +- **REQ**: REQ-N-018, REQ-N-021, REQ-N-019 +- **출처**: tech_advisory §3, data.md §6, tech.md §5 + +--- + +# P7. 멀티테넌시·확장 (S55~S57, 배점 5 · WT-5) + +## S55 · 멀티테넌트 SaaS 비전 +- **섹션**: P7 멀티테넌시·확장 +- **헤드라인**: "KINTEX #1에서 검증하고, COEX #2로 확장하며, 제3전시장을 표준으로 맞는다." +- **본문** + - KINTEX=기준 테넌트 #1, COEX=테넌트 #2(온보딩 대상) + - 제3전시장(2028, 178,000㎡) 확장 + 국내 전시산업 표준 플랫폼화 + - 개발 부담 최소화: 멀티테넌시=격리 레이어만 추가, 기능 로직 불변(리스크 R-8) +- **도표 지시**: 테넌트 확장 로드맵(KINTEX→COEX→제3전시장→타 전시관). 도식ID 없음(로드맵). +- **REQ**: (비전 — 상세 REQ는 S56·S57) +- **출처**: strategy §1 WT-5·§4 R-8, PLANNING §1A + +## S56 · 테넌트 격리 아키텍처 +- **섹션**: P7 멀티테넌시·확장 +- **헤드라인**: "한 층이라도 불일치하면 차단 — 컨텍스트→서비스→MyBatis→PostGIS 4층 방어." +- **본문** + - 격리 축: `tenant_id`(전시관) ⊃ `event_id`(행사) ⊃ 행사 RBAC 3중 + - fail-closed 4층: ①컨텍스트 필터(서브도메인+소속, 불일치 거부)→②서비스 가드→③MyBatis 인터셉터(tenant_id 자동 주입)→④PostGIS(tenant_id 선두 복합 인덱스)(REQ-S-018) + - tenant_id 선두 복합 인덱스로 격리 쿼리 성능(REQ-N-020) + - [구현 계획: 스키마·컨텍스트 구현 대기, 백필 전 단일테넌트 무중단→검증 후 필터 활성화] +- **도표 지시**: **도식⑪ 멀티테넌시 격리 아키텍처도(수직 4층 방어 스택 + 좌측 테넌트 컨텍스트 진입)**. tech_advisory §1-4 ⑪. +- **REQ**: REQ-F-077·078, REQ-S-018, REQ-N-020 +- **출처**: tech_advisory §1-3·§1-4 ⑪ + +## S57 · 온보딩·2계층 관리자 +- **섹션**: P7 멀티테넌시·확장 +- **헤드라인**: "코드 배포 없이 데이터 온보딩 6단계로 새 전시관을 연다." +- **본문** + - 온보딩: 코드 배포 없이 데이터 온보딩(홀·요율·규정 룰셋·마스터데이터 입력 수준)(REQ-F-077) + - 2계층 관리자: 플랫폼 슈퍼관리자(테넌트 스위처) / 테넌트 관리자(단일 스코프)(REQ-F-079) + - 테넌트 컨텍스트 해소(REQ-F-078) + - 공통코드·메뉴 관리(§5B, REQ-F-073) 기반 재사용 +- **도표 지시**: 온보딩 6단계 도식 + 테넌트 스위처 화면. 도식ID 없음(단계 도식). +- **REQ**: REQ-F-077·078·079, REQ-F-073 +- **출처**: tech_advisory §1-3, strategy §1 WT-5 + +--- + +# P8. 사업관리·일정·조직 (S58~S60, 배점 2) + +## S58 · 추진 일정·Phase +- **섹션**: P8 사업관리·일정·조직 +- **헤드라인**: "Phase 1 코어 → Phase 2 워크플로/운영 → Phase 3 현장/확장, 게이트로 진행." +- **본문** + - Phase 1(~4M): 아키텍처(A)·공통레이어(B, 2FA/시스템관리)·P0 코어(C: M2·M3·M4·M5) + - Phase 2(~4M): 옥션 M15·관람 M10·BI M16·관리자 M18·판매/서류/정산 M1/6/7/9·CMS M12/17 + - Phase 3(~4M+): 멀티테넌시·M11·M13·M14·배포 안정화·SM 이관 + - 공수: 총 ~150 M/M 규모(핵심 146 + PMO/QA 4~8), 라이브 스캐폴드로 Phase A/B 공수 실측 절감 + - [주의: 예산·사업기간은 실제 RFP 부재로 가정, 공고 확인 시 재정렬] +- **도표 지시**: **도식⑫ 일정 간트(Phase × 모듈 + 마일스톤 다이아몬드 G1·G2·Phase 게이트·QA 게이트·오픈)**. tech_advisory §1-4 ⑫. +- **REQ**: (일정 — 실행력 근거) +- **출처**: tech_advisory §1-4 ⑫·§5, PLANNING §9 + +## S59 · 선행 게이트·리스크 관리 +- **섹션**: P8 사업관리·일정·조직 +- **헤드라인**: "약한 고리를 숨기지 않고 드러내 방어한다 — 선제 대응이 곧 신뢰다." +- **본문** + - 선행 게이트: G1 나노바나나 승인 [검증됨: 완료]·G2 배포서버 [검증됨: 완료] + - 리스크 R-1~R-8 정면 방어: 외부 API(승인 게이트+degraded 폴백)·CAD 실측(가정 라벨+협의 선행)·kxwp(단계적 접근)·배점 가정(투명 고지)·이미지 품질(후처리 합성)·AI 오판(사람 확정)·HW 연동(협의 전제)·확장 부담(격리 레이어만) + - 확인 필요 8항목(C1~C8) 관리 +- **도표 지시**: **리스크 매트릭스(발생×영향 2×2에 R-1~R-8·C1~C8 배치)** + 게이트. tech_advisory §1-4 말미(추가 표준 도식). +- **REQ**: (리스크 관리 — 방어 논리) +- **출처**: strategy §4, rfp_analysis §6, tech_advisory §0 + +## S60 · 품질·형상관리 +- **섹션**: P8 사업관리·일정·조직 +- **헤드라인**: "배포는 헬스체크로 지키고 실패하면 롤백, 의존성은 SCA 게이트로 막는다." +- **본문** + - Fail-Safe 배포: 백업→배포→헬스체크 200→실패 시 롤백(이전 jar 유지) [검증됨: deploy_kintex.sh](REQ-N-004) + - QA 게이트: 점진 경계면 검증·보안 불변·빌드 회귀(Phase 게이트 통과 후 진행) + - SCA CI 게이트: OWASP Dependency-Check 정기 스캔·패치(REQ-S-019) + - 형상관리: Gitea `zio/kintex`·Conventional Commits·main 보호·환경 분리(dev/staging/prod) +- **도표 지시**: 품질 게이트 흐름(빌드→테스트→SCA→헬스체크→롤백). 도식ID 없음. +- **REQ**: REQ-N-004, REQ-S-019 +- **출처**: tech_advisory §6-5·§0-1(라이브), §4 REQ-S-019 + +--- + +# P9. 기대효과 (S61~S63, 가점) + +## S61 · 정량 기대효과 +- **섹션**: P9 기대효과 +- **헤드라인**: "견적 수일→즉시, 배치 수주→수 분, 검수 육안→자동, 결과는 사진으로." +- **본문** + - 견적: 수일 대기 → 즉시(규칙엔진) + - 배치: 수주 CAD 외주 → 수 분 3안 자동생성 + - 규정 검수: 육안 → 제출 전 자동 플래깅 + - 위치표시도: 수기 → 좌표 클릭 자동 작도 + - 시공 결과: 개장일 첫 대면 → 신청 시점 사진 예측 +- **도표 지시**: **기대효과 정량 인포그래픽(5지표 Before/After)**. tech_advisory §1-4 말미(추가 표준 도식). +- **REQ**: REQ-F-002·007·009·017, REQ-A-001 +- **출처**: PLANNING §1-3, strategy §5 + +## S62 · 정성·전략 효과 +- **섹션**: P9 기대효과 +- **헤드라인**: "참가업체는 영업력을, 홀매니저는 시간을, 킨텍스는 데이터 주권을 얻는다." +- **본문** + - 참가업체: 사진급 자료로 영업력·수주력 강화 + - 홀매니저: 규정 검수 병목 해소로 처리량 증대 + - 킨텍스: 온프레미스 우선·외부 AI 격리로 데이터 주권 확보 + - 산업: 국내 전시산업 표준 플랫폼화 +- **도표 지시**: 이해관계자별 효과 카드. 도식ID 없음. +- **REQ**: (정성 효과 — 전략) +- **출처**: strategy §3 + +## S63 · 확장 비전·마무리 +- **섹션**: P9 기대효과 +- **헤드라인**: "킨텍스에서 검증하고, 코엑스로 확장하며, 다시 사진으로 컨펌한다." +- **본문** + - 확장: COEX·제3전시장·타 전시관 SaaS 확장 + - 재사용: 검증된 공통 프레임워크(WISE/UIWS) 위에 도메인 코어 이식 + - 클로징: "신청서를 내는 순간, 시공 후 사진을 먼저 본다." +- **도표 지시**: 확장 비전 로드맵 + 클로징 슬로건 대형 타이포. 도식ID 없음. +- **REQ**: REQ-F-077(확장 근거) +- **출처**: strategy §1 WT-5 + +--- + +# 부록 (선택 삽입) + +## 부록 A · 확인 필요·협의 사항 +- C1 평가배점·제출규격(가정) · C2 kxwp API(REQ-F-022) · C3 CAD·트렌치 실측(REQ-F-016 정확도) · C4 인터넷 요율 공식본(REQ-F-002) · C5 나노바나나 G1(완료) · C6 코엑스 실측(REQ-F-077) · C7 사이니지·비콘·IoT HW(REQ-F-070·052~055) · C8 기타 협의 +- 정직성 어필: 모든 [가정]·[협의]를 1장 집약 → 발주처 협업 자세 + +## 부록 B · REQ 커버리지 매트릭스 +- 아래 "RTM 반영표" 참조(142 REQ ↔ 슬라이드 1:1) + +## 부록 C · 100대 기능 성숙도 +- 기구현 63 · 부분 18 · 신규 19(정량, rfp_analysis §4) + +--- + +# RTM 반영표 (REQ → 슬라이드 · 142 REQ 전량) + +> 규칙: 각 REQ의 **주 반영 슬라이드**(굵게) + 보조 슬라이드. QA는 이 표로 142 REQ 반영상태 ☑ 최종 검증. 미반영 0. + +## REQ-F (기능 81) + +| REQ | 요약 | 반영 슬라이드 | +|---|---|---| +| REQ-F-001 | 홀 가용성 캘린더 | **S33** | +| REQ-F-002 | 규칙엔진 견적 | **S33** · S10·S61 | +| REQ-F-003 | 웹폼→HWP | **S33** | +| REQ-F-004 | 부스판매 인벤토리 | **S33** | +| REQ-F-005 | 온라인 셀프선택 | **S33** | +| REQ-F-006 | 임대계약 전자서명 | **S33** | +| REQ-F-007 | 배치 3안 자동생성 | **S24** · S10·S61·S13 | +| REQ-F-008 | 배치안 선택/병합 | **S24** | +| REQ-F-009 | 배치 규정 검증·재검증 | **S25** · S10·S61 | +| REQ-F-010 | 최종안 버전·좌표·초대링크 | **S24** | +| REQ-F-011 | 조립부스 3D 프리뷰 | **S26** | +| REQ-F-012 | 독립부스 3안·버전 | **S26** | +| REQ-F-013 | 설계 규정 사전검증 | **S26** | +| REQ-F-014 | 도면 비전 추출·검증 | **S26** | +| REQ-F-015 | 전기용량·분전반 산출 | **S27** | +| REQ-F-016 | 배선경로 PostGIS 최단 | **S27** · S42 | +| REQ-F-017 | 위치표시도 자동생성 | **S28** · S10·S61 | +| REQ-F-018 | 네트워크·급배수·압축공기 신청 | **S28** | +| REQ-F-019 | 조명 조도 배치안 | **S18** | +| REQ-F-020 | 마일스톤 역산 알림 | **S34** | +| REQ-F-021 | 신고서류 웹폼→HWP/PDF | **S34** | +| REQ-F-022 | kxwp 릴레이 ⚠ | **S34** · S59(리스크 R-3) | +| REQ-F-023 | 서류 버전·전자결재 | **S34** | +| REQ-F-024 | OCR 계약·납품서 | **S34** | +| REQ-F-025 | 역경매 옥션 개설 | **S29** · S12·S13 | +| REQ-F-026 | AI 자료 기반 응찰·PDF | **S29** | +| REQ-F-027 | 실시간 순위·자동마감 | **S30** | +| REQ-F-028 | 종합평가 낙찰 스코어 | **S31** | +| REQ-F-029 | 등록업체 게이트 | **S32** | +| REQ-F-030 | 등록업체 AI 매칭 | **S31** | +| REQ-F-031 | 물량서 BOQ 산출 | **S31** · S29 | +| REQ-F-032 | 낙찰→발주 자동전환 | **S32** · S12 | +| REQ-F-033 | 반입/반출 슬롯 | **S40** | +| REQ-F-034 | 통행증 QR | **S40** | +| REQ-F-035 | 지게차·렌탈 | **S40** | +| REQ-F-036 | 철거 대기열 시뮬 | **S40** | +| REQ-F-037 | 사전등록 | **S35** | +| REQ-F-038 | 모바일 배지/QR | **S35** | +| REQ-F-039 | 현장 체크인·집계 | **S35** | +| REQ-F-040 | 오프라인 체크인 폴백 | **S35** · S51 | +| REQ-F-041 | 리드캡처 | **S35** | +| REQ-F-042 | AI 리드 스코어링 | **S35** | +| REQ-F-043 | 세그먼트 EDM | **S35** | +| REQ-F-044 | 티켓발권·스마트배지 | **S35** | +| REQ-F-045 | AI 비즈매칭 | **S36** | +| REQ-F-046 | 미팅 슬롯·리포트 | **S36** | +| REQ-F-047 | 이벤트 모바일앱 | **S36** | +| REQ-F-048 | 공개 홍보 사이트 | **S36** | +| REQ-F-049 | 인터랙티브 플로어플랜 | **S36** | +| REQ-F-050 | 세그먼트 EDM 캠페인 | **S36** | +| REQ-F-051 | 스폰서십 패키지 | **S36** | +| REQ-F-052 | wayfinding | **S40** | +| REQ-F-053 | 혼잡 모니터·예측 | **S40** | +| REQ-F-054 | 전력부하·주차 | **S40** | +| REQ-F-055 | 안전 이상탐지 | **S40** | +| REQ-F-056 | 납부 스케줄 | **S37** | +| REQ-F-057 | PG 결제 | **S37** | +| REQ-F-058 | 예치금 정산 | **S37** | +| REQ-F-059 | 세금계산서·수수료 | **S37** | +| REQ-F-060 | 환불·취소 규정 | **S37** | +| REQ-F-061 | 가동률 대시보드 | **S38** | +| REQ-F-062 | 매출·P&L | **S38** | +| REQ-F-063 | ROI·RevPAD·㎡당 수익 | **S38** | +| REQ-F-064 | 리텐션·LTV | **S39** | +| REQ-F-065 | 참가업체 ROI 격리 | **S39** | +| REQ-F-066 | 경영진 KPI 드릴다운 | **S39** | +| REQ-F-067 | CMS 게시 워크플로 | **S36** | +| REQ-F-068 | 마이크로사이트 | **S36** | +| REQ-F-069 | 다국어 콘텐츠·hreflang | **S36** · S53 | +| REQ-F-070 | 사이니지 배포 ⚠ | **S40** · S59 | +| REQ-F-071 | RBAC·감사 백오피스 | **S48** | +| REQ-F-072 | 룰셋·마스터데이터 버전 | **S45** | +| REQ-F-073 | 공통코드·메뉴 | **S16** · S57 | +| REQ-F-074 | 공통 업무모듈 | **S16** | +| REQ-F-075 | 회의록 STT·업무보고 PDF | **S16** | +| REQ-F-076 | 통합 알림센터 WebSocket | **S16** | +| REQ-F-077 | 멀티테넌트 격리·온보딩 | **S56·S57** · S55·S63 | +| REQ-F-078 | 테넌트 컨텍스트 해소 | **S56** · S57 | +| REQ-F-079 | 2계층 관리자 | **S57** | +| REQ-F-080 | API·웹훅·CRM/ERP 연동 | **S45** | +| REQ-F-081 | 역할별 프론트 포털 | **S43** · S41·S09 | + +## REQ-A (AI 20) + +| REQ | 요약 | 반영 슬라이드 | +|---|---|---| +| REQ-A-001 | 샷세트 S1~S7 | **S17·S18** · S01·S12·S61 | +| REQ-A-002 | image-to-image 구조보존 | **S19** · S12 | +| REQ-A-003 | 구조화 프롬프트 사전 | **S19** | +| REQ-A-004 | S6 배선 오버레이 래스터 | **S21** | +| REQ-A-005 | Before/After 슬라이더 | **S21** | +| REQ-A-006 | RenderJob 방어 | **S22** | +| REQ-A-007 | 비동기 큐·WebSocket | **S20** · S44 | +| REQ-A-008 | 간판 텍스트 검수·후처리 | **S22** | +| REQ-A-009 | 배치 3안(제약 솔버+LLM) | **S24** | +| REQ-A-010 | AI 규정 검증 | **S25** · S26 | +| REQ-A-011 | AI 서류 검수 | **S34** | +| REQ-A-012 | 규정 챗봇(근거·인용) | **S34** | +| REQ-A-013 | AI 수요예측·동적가격 | **S39** | +| REQ-A-014 | KPI 브리핑·Text-to-SQL | **S39** | +| REQ-A-015 | AI 카피·번역 | **S36** | +| REQ-A-016 | AI 라우터(Claude→Ollama) | **S44** · S41 | +| REQ-A-017 | RAG·인용·환각 차단 | **S49** · S23 | +| REQ-A-018 | AI 리드 스코어·매칭 | **S35·S36** | +| REQ-A-019 | 현장 이상탐지·예측 | **S40** | +| REQ-A-020 | 도면 비전·OCR 등록 | **S26·S34** | + +## REQ-N (비기능 21) + +| REQ | 요약 | 반영 슬라이드 | +|---|---|---| +| REQ-N-001 | SLO 99.5% | **S51** | +| REQ-N-002 | 2인스턴스 롤링 무중단 | **S51** · S43 | +| REQ-N-003 | PG 스탠바이·PITR | **S51** | +| REQ-N-004 | Fail-Safe 배포 | **S60** | +| REQ-N-005 | degraded 모드 | **S51** · S20·S44 | +| REQ-N-006 | 나노바나나 40초·1024px | **S52** · S20 | +| REQ-N-007 | 대량 생성 제어 | **S52** · S22 | +| REQ-N-008 | 공간쿼리 GiST 실시간 | **S42** · S12 | +| REQ-N-009 | 워커 독립 스케일 | **S43** | +| REQ-N-010 | BI/공개 읽기복제 | **S43** · S38 | +| REQ-N-011 | 워커 재큐(멱등) | **S43** · S51 | +| REQ-N-012 | WCAG 2.1 AA·KWCAG 2.2 | **S53** | +| REQ-N-013 | 캔버스 비시각 대안 | **S53** | +| REQ-N-014 | 다국어 i18n·hreflang | **S53** | +| REQ-N-015 | 라이트/다크 테마 | **S53** | +| REQ-N-016 | 반응형 | **S53** | +| REQ-N-017 | 단일 공간 원천 | **S42** | +| REQ-N-018 | 관측성·미기록 | **S54** · S50 | +| REQ-N-019 | 공개 CDN·요청률 상한 | **S43** · S54 | +| REQ-N-020 | tenant_id 선두 복합 인덱스 | **S56** | +| REQ-N-021 | BI 데이터마트 배치 ETL | **S54** · S38 | + +## REQ-S (보안 20) + +| REQ | 요약 | 반영 슬라이드 | +|---|---|---| +| REQ-S-001 | 외부 API 정책 | **S49** · S47 | +| REQ-S-002 | GEMINI 키 워커 env only | **S49** | +| REQ-S-003 | 자격증명·키 완전 제외 | **S50** | +| REQ-S-004 | admin 비번 env 재시드 | **S48** | +| REQ-S-005 | JWT+2FA·실패 잠금 | **S48** | +| REQ-S-006 | 행사 RBAC 3중 | **S48** | +| REQ-S-007 | 미등록 업체 차단(403) | **S32** · S48 | +| REQ-S-008 | admin/internal 게이트 | **S48** | +| REQ-S-009 | 이미지 워터마크 항상 | **S49** · S23·S01 | +| REQ-S-010 | 스택트레이스 미노출 | **S50** | +| REQ-S-011 | DataAccessException 요약 | **S50** | +| REQ-S-012 | 감사로그 전수 | **S50** | +| REQ-S-013 | PII 동의·마스킹·암호화 | **S50** · S39 | +| REQ-S-014 | 입력 검증 | **S50** | +| REQ-S-015 | XSS·CSP | **S50** | +| REQ-S-016 | 인젝션 차단 | **S50** | +| REQ-S-017 | IDOR·CSRF·JWT 회전 | **S50** | +| REQ-S-018 | fail-closed 테넌트 격리 | **S56** · S47 | +| REQ-S-019 | 의존성 SCA CI 게이트 | **S60** · S50 | +| REQ-S-020 | 보안영역 분리 | **S47** | + +--- + +## 커버리지 요약 + +| 유형 | REQ 수 | 반영 | 미반영 | +|---|---|---|---| +| REQ-F (기능) | 81 | 81 | 0 | +| REQ-A (AI) | 20 | 20 | 0 | +| REQ-N (비기능) | 21 | 21 | 0 | +| REQ-S (보안) | 20 | 20 | 0 | +| **총계** | **142** | **142** | **0** | + +**슬라이드 총계**: 63(S01~S63) + 부록 3(A·B·C) +**RTM 커버리지**: 142/142 반영, **미반영 0** +**과장 방지 준수**: 라이브 확인분(인프라·CI/CD·나노바나나·인증·워터마크·PostGIS 코어·평면도 자산)만 [검증됨], 도메인 모듈·멀티테넌시·집계 API·i18n/접근성 전면 적용은 [구현 계획]으로 구분 표기. 시크릿(키·비번·IP·SSH) 전면 미기재. AI 생성 이미지는 전 슬라이드에서 워터마크·금지 고지 정책 명시. diff --git a/docs/deliverables/제안서/_gen/proposal_outline.md b/docs/deliverables/제안서/_gen/proposal_outline.md new file mode 100644 index 0000000..ec46235 --- /dev/null +++ b/docs/deliverables/제안서/_gen/proposal_outline.md @@ -0,0 +1,210 @@ +# 킨텍스 자동전시시스템 구축 — 제안서 목차 (Proposal Outline · PPT) + +> 작성: proposal-strategist · 작성일: 2026-07-11 · 버전 v1.0 +> 짝 문서: `proposal_strategy.md`(Win Theme·평가대응·리스크) · `rtm.md`(REQ↔섹션 매핑) · `rfp_analysis.md`(배점·규격) +> 형식: **PowerPoint(.pptx) 기술제안서**, 분량 자율(권장 40~80p) → **목표 ~63슬라이드**. 실제 공고 확인 시 재정렬(rfp_analysis C1). +> 목차 코드: P1 사업이해 · P2 추진전략 · P3 기술제안 · P4 아키텍처 · P5 보안·개인정보 · P6 비기능 · P7 멀티테넌시·확장 · P8 사업관리·일정·조직 · P9 기대효과 (RTM 정합). +> 배분 원칙: **배점 가중** — P3(35점) ≈ 40%, P4·P5(각 10점) 각 ~8%, P6(8점) ~6%, P1+P2(10점) ~16%, P7(5점) ~5%, P8(2점) ~5%, P9 ~5%. + +--- + +## 슬라이드 배분 총괄 (배점 정렬) + +| 구간 | 목차 | 평가배점(가정) | 슬라이드 수 | 비중 | 핵심 Win Theme | +|---|---|---|---|---|---| +| 표지·목차·오버헤드 | — | — | 6 | 10% | 슬로건 각인 | +| P1 | 사업이해 | 10(P1+P2 공유) | 4 | 6% | 도메인 이해 | +| P2 | 추진전략 | 10(P1+P2 공유) | 5 | 8% | 3중 해자 | +| **P3** | **기술제안** | **20+15=35** | **25** | **40%** | **WT-1·2·3 총력** | +| P4 | 아키텍처·기술스택 | 10 | 5 | 8% | 확정 스택·공간원천 | +| P5 | 보안·개인정보 | 10 | 5 | 8% | WT-4 | +| P6 | 비기능 | 8 | 4 | 6% | SLA 수치 | +| P7 | 멀티테넌시·확장 | 5 | 3 | 5% | WT-5 | +| P8 | 사업관리·일정·조직 | 2 | 3 | 5% | 실행력·게이트 | +| P9 | 기대효과 | 가점 | 3 | 5% | 정량 ROI | +| **합계** | | **80(+가격20)** | **63** | 100% | | + +--- + +## 0. 표지·목차 (6슬라이드) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 기획 | +|---|---|---|---| +| S01 | 표지 | 사업명 + 슬로건 "신청서를 내는 순간, 시공 후 사진을 먼저 본다" | 나노바나나 시공 예측 히어로 이미지(워터마크) 배경 | +| S02 | 제안 개요 | 우리는 누구·왜 우리인가 3줄 | 제안사 로고·핵심 자산 아이콘(선 SVG) | +| S03 | 목차 | P1~P9 네비게이션 | 목차 인덱스(9섹션 배점 배지 병기) | +| S04 | 제안 핵심 요약(1p) | Win Theme 5선 + 3중 해자 한눈에 | **3중 해자 벤다이어그램**(시공예측∩PostGIS∩옥션폐루프) | +| S05 | 배점 대응 맵 | 우리 제안이 배점 어디를 어떻게 겨냥하는가 | **배점-섹션 정렬 매트릭스**(80점 히트맵) | +| S06 | [가정] 고지 간지 | 배점·규격 가정 투명 고지·공고 시 재정렬 | 간단 노트 카드(리스크 R-4 방어) | + +--- + +## P1. 사업이해 (4슬라이드 · 배점 사업이해·추진전략 10) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ/근거 | +|---|---|---|---|---| +| S07 | 사업 배경·목적 | 킨텍스 108,011㎡(2028년 178,000㎡), 전시 준비 여전히 HWP·CAD 수작업 | 킨텍스 규모 인포그래픽 | PLANNING §1-1 | +| S08 | As-Is 프로세스 병목 | D-150/30/25/7 타임라인의 Pain Point(견적 대기·CAD 외주·kxwp 육안검수·유틸리티 파편화) | **As-Is 타임라인 다이어그램**(D-데이별 병목 표시) | PLANNING §3-1·3-2 | +| S09 | 이해관계자·페르소나 | 6역할+2관리자 계층의 과업·고통·기대 | **페르소나 카드 6종**(주최자·참가·업체·홀매니저·관람객·대중) | PLANNING §2 | +| S10 | To-Be 목표(정량) | 견적 즉시·배치 수분·규정 자동검증·위치표시도 자동·시공 예측 | **As-Is→To-Be 대비표**(정량 개선 5행) | PLANNING §1-3 | + +--- + +## P2. 추진전략 (5슬라이드 · 배점 P1과 공유) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ/근거 | +|---|---|---|---|---| +| S11 | 비전·포지셔닝 | "도면이 아니라 사진으로 컨펌한다" 베뉴 운영 플랫폼 | 비전 슬로건 대형 타이포 | PLANNING §1-2 | +| S12 | **3중 해자 전략** | 시공예측∩PostGIS∩옥션폐루프 결합의 재현 난이도 | **3원 벤다이어그램(재강조·상세)** | strategy §3-3 | +| S13 | Win Theme 5선 | WT-1~5 슬로건·배점 정렬 | **Win Theme 5카드**(배점 배지 병기) | strategy §1 | +| S14 | 전시 생애주기 폐루프 | 설계→시각화→발주→시공→운영→분석 한 흐름 | **생애주기 폐루프 순환도**(M모듈 매핑) | PLANNING §1-2-1 | +| S15 | 추진체계·수행조직 | 아키텍트·코어·도메인·AI·QA·DevOps 팀 + 게이트 | **추진체계도(조직도)** | 하네스 팀 구성 | + +--- + +## P3. 기술제안 (25슬라이드 · 배점 AI시각화·설계 20 + 기능구현 15 = 35 · **최다 집중**) + +### P3-A. 모듈 조망 (1) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ | +|---|---|---|---|---| +| S16 | 전체 모듈맵 | M1~M18+§5B+§1A 한 장 조망, P0 코어 강조 | **모듈맵(생애주기×우선순위 매트릭스)** | rfp_analysis §2-1 | + +### P3-B. 나노바나나 시공 예측 — WT-1 최우선 (7) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ | +|---|---|---|---|---| +| S17 | 나노바나나 개요 | "시공 전에 사진으로 의사결정" 경쟁 미보유 차별화 | 히어로 Before/After 실물 | REQ-A-001 | +| S18 | 표준 샷세트 S1~S7 | 정면·야간·통로·내부·Before/After·배선·홀전경 | **샷세트 7컷 그리드**(워터마크) | REQ-A-001, F-019 | +| S19 | image-to-image 구조보존 | 골격·치수·통로·앵글 잠금, 스타일만 사실화 | **보존/교체 파라미터 도식** | REQ-A-002·003 | +| S20 | AI 파이프라인 아키텍처 | Spring 큐→Redis→Python 워커→오브젝트스토리지→WebSocket | **나노바나나 파이프라인 플로우** | REQ-A-007, N-006 | +| S21 | Before/After·배선 오버레이 | 드래그 슬라이더(ARIA), S6 백엔드 래스터 합성(전기적·네트청·급배수녹) | Before/After 슬라이더 + 배선 색상 범례 | REQ-A-004·005 | +| S22 | RenderJob 방어·품질 | 다층 크기가드·SAFETY 분기·간판 한글 후처리·성공 시만 쿼터 | **RenderJob 상태 시퀀스**(방어 계층) | REQ-A-006·008 | +| S23 | AI 신뢰 원칙 | 결정적 알고리즘+LLM 보조+사람 확정, 워터마크 불변 | AI 3층 신뢰 구조 도식 | REQ-S-009, A-017 | + +### P3-C. 배치·설계·배선 AI 자동화 — WT-2 (5) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ | +|---|---|---|---|---| +| S24 | 플로어플랜 스튜디오(M2) | 부스 배치 3안 자동생성·선택/병합·버전 | **3안 비교 화면 목업** | REQ-F-007·008·010, A-009 | +| S25 | 배치 규정 자동검증 | 피난통로·바닥하중 홀별·비상구·복층·소방 병합 후 재검증 | **규정 위반 플래그 대시보드** | REQ-F-009, A-010 | +| S26 | 부스 설계 스튜디오(M3) | 조립 3D 프리뷰·독립부스 3안·규정 사전검증(높이·리깅·방염·이격)·도면 비전추출 | 설계 3안+규정 체크리스트 | REQ-F-011~014, A-020 | +| S27 | 유틸리티 설계(M4) | 기기→kW→분전반 자동산출, 트렌치→분전반 PostGIS 최단 배선 | **PostGIS 배선 경로 오버레이** | REQ-F-015·016 | +| S28 | 위치표시도·유틸리티 신청 | 좌표 클릭 자동 작도(수기 폐지)·자동 견적·D-25 역산 | 위치표시도 자동생성 예시 | REQ-F-017·018 | + +### P3-D. 공사 옥션 폐루프 — WT-3 (4) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ | +|---|---|---|---|---| +| S29 | 옥션 개요·폐루프 | AI 설계자료→응찰 근거→발주까지 한 흐름 | **옥션 폐루프 흐름도**(M2~M5→M15→M6·M9) | REQ-F-025·026 | +| S30 | 역경매·실시간 순위 | 라운드·마감·최저가·내 위치(익명 옵션)·자동마감 | **실시간 순위 보드 목업** | REQ-F-027 | +| S31 | 종합평가 낙찰 | 가격+평판+납기 가중 스코어·항목별 비교표 | **종합평가 스코어 비교표** | REQ-F-028·030·031 | +| S32 | 등록 게이트·발주 전환 | 미등록 업체 응찰 원천 차단(403)·낙찰→계약/발주 자동전환 | **등록 검증 시퀀스** + 발주 전환 | REQ-F-029·032, S-007 | + +### P3-E. 판매·서류·워크플로 (2) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ | +|---|---|---|---|---| +| S33 | 판매·홀배정·견적(M1) | 가용성 캘린더·규칙엔진 견적(2,250원/㎡)·웹폼→HWP·셀프 부스선택 | 견적 규칙엔진 계산 흐름 | REQ-F-001~005 | +| S34 | 서류·마일스톤(M6) | D-150/30/25/7 역산·웹폼→HWP/PDF 7종·AI 서류검수·kxwp 릴레이(⚠협의)·전자결재·OCR | 마일스톤 역산 타임라인 | REQ-F-020~024, A-011 | + +### P3-F. 관람·참가 (2) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ | +|---|---|---|---|---| +| S35 | 관람객 등록·배지·리드(M10) | 사전등록·모바일 배지/QR·현장 체크인·오프라인 폴백·리드캡처·세그먼트 EDM | 등록→체크인→리드 여정도 | REQ-F-037~043 | +| S36 | 비즈매칭·마케팅·공개사이트(M11·M12·M17) | AI 비즈매칭·SEO 다국어 공개사이트·인터랙티브 플로어플랜·마이크로사이트·CMS 게시 워크플로 | 공개사이트+마이크로사이트 목업 | REQ-F-045·048~051·067~069 | + +### P3-G. 정산·경영분석·현장 (4) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ | +|---|---|---|---|---| +| S37 | 정산·결제(M9) | 납부 스케줄·PG 결제·예치금 실사용 투명 정산·세금계산서·옥션 수수료 | 정산 흐름도 | REQ-F-056~059 | +| S38 | 경영분석 BI(M16)-1 | 가동률·매출구성·행사별 P&L·RevPAD·㎡당 수익(운영사 관점) | **BI 대시보드 목업(Recharts)** | REQ-F-061~063 | +| S39 | 경영분석 BI(M16)-2 | 리텐션·LTV 코호트·참가사 ROI(권한 격리)·경영진 KPI·AI 수요예측·KPI 브리핑·Text-to-SQL | KPI 드릴다운 + AI 인사이트 카드 | REQ-F-064~066, A-013·014 | +| S40 | 현장운영·물류(M8·M13·M14) | 반입/반출 슬롯·통행증 QR·wayfinding·혼잡/전력/안전 이상탐지(선택·협의 전제) | 현장 운영 상황판 | REQ-F-033~036·052~055, A-019 | + +--- + +## P4. 아키텍처·기술스택 (5슬라이드 · 배점 10) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ | +|---|---|---|---|---| +| S41 | 전체 아키텍처 | 확정 스택 React18/19+Spring Boot 3.x+MyBatis+PostgreSQL/PostGIS+Redis+나노바나나 Python 워커 | **시스템 아키텍처 다이어그램**(전 계층) | rfp_analysis §1, REQ-A-016 | +| S42 | 단일 공간 데이터 원천 | M2폴리곤·M4배선 매퍼 권위, 소비 모듈 조회만·중복 금지, PostGIS GiST 실시간 | **공간 데이터 원천 모델**(폴리곤·포인트·LineString) | REQ-N-008·017 | +| S43 | 확장성·비동기 | 워커 독립스케일(큐 깊이)·읽기복제 BI 오프로드·공개영역 CDN·역할별 프론트 분리 | **배포 토폴로지도** | REQ-N-009·010·019, F-081 | +| S44 | AI 플랫폼 라우팅 | Claude 기본→Ollama 폴백·중앙경유·LLM 직접호출 금지, 나노바나나 큐/콜백 | **AI 라우터 폴백 흐름** | REQ-A-007·016 | +| S45 | 연동·마스터데이터 | API·웹훅·CRM/ERP 게이트웨이·룰셋/마스터데이터 버전관리·무중단 개정 | 연동 인터페이스 맵 | REQ-F-072·080 | + +--- + +## P5. 보안·개인정보 (5슬라이드 · 배점 10 · WT-4) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ | +|---|---|---|---|---| +| S46 | 보안 개요·불변 원칙 | "AI가 만든 것은 표시, 남의 데이터는 차단" REQ-S 20 커버리지 | **REQ-S 20항목 커버리지 표** | REQ-S 전량 | +| S47 | 보안영역 분리 | 공개 DMZ 쓰기 불가·데이터존 직결 불가·DMZ↔내부 HTTPS만 | **보안영역 분리도(망 구성)** | REQ-S-020, N-018 | +| S48 | 인증·접근통제 | JWT+2FA OTP(TOTP)·실패 잠금·admin 비번 env 재시드·RBAC 3중·admin/internal 게이트 | 인증 흐름 + RBAC 3중 구조 | REQ-S-004~008 | +| S49 | AI·이미지 보안 | 나노바나나 워터마크 항상·계약/심사 금지 고지·외부 API 워커 env only·RAG 환각차단 | **워터마크 실물** + 외부 API 격리 | REQ-S-001·002·009, A-017 | +| S50 | 개인정보·감사·안전코딩 | PII 동의·마스킹·AES-256-GCM·응답 제외·감사로그 전수·XSS/인젝션/IDOR·SCA 게이트·스택트레이스 미노출 | PII 마스킹 예시 + 감사로그 표 | REQ-S-010~017·019 | + +--- + +## P6. 비기능 (4슬라이드 · 배점 8) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ | +|---|---|---|---|---| +| S51 | 성능·가용성 SLA | SLO 99.5%(성수기 99.9%)·백엔드 2인스턴스 롤링·PG 스탠바이+PITR·degraded 모드 | **SLA 수치표** + HA 구성도 | REQ-N-001~005·011 | +| S52 | 나노바나나 성능 | 평균 40초·1024px+JPEG 0.85 전처리·자동생성 S1·S7 한정·캐시·쿼터 | 렌더 성능 지표 카드 | REQ-N-006·007 | +| S53 | 접근성·다국어·테마·반응형 | WCAG 2.1 AA+KWCAG 2.2·비시각 대안·i18n 한/영/중/일·hreflang·라이트/다크·데스크톱/모바일 | 접근성·다국어 매트릭스 | REQ-N-012~016 | +| S54 | 관측성·데이터 | 로그·메트릭·트레이스(PII/스택트레이스 미기록)·BI 데이터마트 배치 ETL/읽기복제 | 관측성 파이프라인 | REQ-N-018·021 | + +--- + +## P7. 멀티테넌시·확장 (3슬라이드 · 배점 5 · WT-5) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ | +|---|---|---|---|---| +| S55 | 멀티테넌트 SaaS 비전 | KINTEX #1 검증→COEX 확장, 제3전시장 대비 표준 플랫폼 | 테넌트 확장 로드맵 | §1A, WT-5 | +| S56 | 테넌트 격리 아키텍처 | tenant_id 전파·fail-closed 다층 격리(컨텍스트→서비스→MyBatis→PostGIS)·선두 복합 인덱스 | **멀티테넌시 격리 아키텍처도** | REQ-F-077·078, S-018, N-020 | +| S57 | 온보딩·2계층 관리자 | 코드 배포 없이 데이터 온보딩 6단계·플랫폼/테넌트 관리자·테넌트 스위처 | **온보딩 6단계 도식** | REQ-F-077·079 | + +--- + +## P8. 사업관리·일정·조직 (3슬라이드 · 배점 2) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ | +|---|---|---|---|---| +| S58 | 추진 일정·Phase | Phase 1 코어(~4M)·2 워크플로/운영(~4M)·3 현장/확장(~4M+) | **일정 간트 차트**(Phase×모듈) | PLANNING §9 | +| S59 | 선행 게이트·리스크 관리 | G1 나노바나나 승인·G2 배포서버·확인필요 8항목(C1~C8) 관리 | **리스크 매트릭스**(발생×영향) + 게이트 | strategy §4, rfp_analysis §6 | +| S60 | 품질·형상관리 | Fail-Safe 배포(헬스체크·롤백)·QA 게이트·SCA CI·경계면 검증 | 품질 게이트 흐름 | REQ-N-004, S-019 | + +--- + +## P9. 기대효과 (3슬라이드 · 가점) + +| # | 슬라이드 | 핵심 메시지 | 그래픽/도표 | REQ/근거 | +|---|---|---|---|---| +| S61 | 정량 기대효과 | 견적 수일→즉시·배치 수주→수분·검수 육안→자동·위치표시도 자동·시공 예측 가능 | **기대효과 정량 인포그래픽**(5지표 Before/After) | PLANNING §1-3 | +| S62 | 정성·전략 효과 | 참가업체 영업력·홀매니저 병목 해소·데이터 주권·전시산업 표준화 | 이해관계자별 효과 카드 | strategy §3 | +| S63 | 확장 비전·마무리 | COEX·제3전시장·타 전시관 SaaS 확장, 슬로건 재각인 | 확장 비전 로드맵 + 클로징 슬로건 | WT-5 | + +--- + +## 부록 (선택 삽입) + +| 항목 | 내용 | 근거 | +|---|---|---| +| A. 확인 필요·협의 사항 | C1~C8([가정]·⚠확인필요) 집약 — 정직성 어필, 리스크 R-1~R-8 방어 요약 | rfp_analysis §6, strategy §4 | +| B. REQ 커버리지 매트릭스 | 142 REQ(F81·A20·N21·S20)↔P1~P9 반영 표(RTM 요약) | rtm.md | +| C. 100대 기능 성숙도 | 기구현 63·부분 18·신규 19 정량 | rfp_analysis §4 | + +--- + +## deck-designer·writer 전달 핵심 + +- **필수 도식 12종**(반드시 제작): ①3중 해자 벤다이어그램(S04·S12) ②모듈맵(S16) ③나노바나나 파이프라인 플로우(S20) ④Before/After 슬라이더(S21) ⑤3안 비교 화면(S24) ⑥PostGIS 배선 오버레이(S27) ⑦옥션 폐루프 흐름도(S29) ⑧종합평가 스코어 비교표(S31) ⑨시스템 아키텍처 다이어그램(S41) ⑩보안영역 분리도(S47) ⑪멀티테넌시 격리 아키텍처도(S56) ⑫일정 간트(S58). +- **추진체계도**(S15)·**리스크 매트릭스**(S59)·**기대효과 인포그래픽**(S61)은 공공 제안 표준 필수. +- **아이콘**: 전량 선(line/stroke) 스타일 SVG 직접 제작(외부 라이브러리 금지) — proposal-visual-designer 산출 준수. +- **RTM 정합 검증**: 각 슬라이드 REQ 매핑을 rtm.md 반영상태(☐→☑)로 갱신. 142 REQ 누락 0 — qa가 본 목차의 REQ 열로 교차 점검. +- **배점 규율**: P3(S16~S40, 25슬라이드)가 전체의 40%. 나노바나나(S17~S23) 7슬라이드는 절대 축소 금지(최고 배점 20). 선택 기능(S40 등)은 압축 유지. diff --git a/docs/deliverables/제안서/_gen/proposal_qa.md b/docs/deliverables/제안서/_gen/proposal_qa.md new file mode 100644 index 0000000..4ea23e6 --- /dev/null +++ b/docs/deliverables/제안서/_gen/proposal_qa.md @@ -0,0 +1,117 @@ +# 제안서 최종 QA 보고 — 킨텍스 자동전시시스템 (나라장터 표준 7대장 재조립판) + +> QA: proposal-qa · 일자: 2026-07-12 · 대상: `docs/deliverables/제안서.pptx` (97슬라이드) + `_workspace/proposal/build_deck.py` +> 검증 방법: python-pptx 텍스트 추출(`_qa_extract.py`) + REQ range 전개 대조(`_qa_rtm.py`) + 구조/배점/라벨 스캔(`_qa_struct.py`) + PowerPoint COM PNG 렌더(`render_check.py`) 시각 확인. +> **최종 판정: 승인(PASS)** — 중대 결함 3건 수정 완료·재빌드·재검증. 잔여 이슈는 발주처 확인 항목([가정]/[협의])뿐(정직하게 라벨링됨). + +--- + +## 종합 결과 + +| # | 검증 항목 | 판정 | 비고 | +|---|---|---|---| +| 1 | 표준 목차 정합(7대장·신설 9슬라이드) | ✅ PASS | Ⅰ~Ⅶ 순차, 신설 9종 전량 실재 | +| 2 | RTM 커버리지(142 REQ) | ✅ PASS(수정 후) | 142/142. 결함 3건(F-008·F-010·F-026) 수정 | +| 3 | 배점 정렬(90/10) | ✅ PASS | 80/20·35/80 잔재 0, 재정렬 각주 존재 | +| 4 | 정직성 라벨 | ✅ PASS | tech_advisory §0과 일치 | +| 5 | 보안(노출/워터마크) | ✅ PASS | 자격증명 노출 0, AI 고지 존재 | +| 6 | 구조 품질(목차·간지·번호) | ✅ PASS | 목차↔장 순서·배점 배지 정합 | + +**수정 건수: 3건**(build_deck.py 3개 편집 → 재빌드 → COM 재렌더 → 통과) + +--- + +## 1. 표준 목차 정합 — PASS + +7대장이 `g2b_standard_toc.md` §2-1(별지 제5호서식)과 순서·구조 일치. 각 장 앞 섹션 간지(7개) 배치. + +| 장 | 슬라이드 | 섹션 간지 | +|---|---|---| +| Ⅰ 일반현황 | S6~S9 | S5 GENERAL STATUS | +| Ⅱ 전략·방법론 | S11~S25 | S10 STRATEGY & METHODOLOGY | +| Ⅲ 기술·기능 | S27~S56 | S26 TECHNOLOGY & FUNCTION | +| Ⅳ 성능·품질 | S58~S63 | S57 PERFORMANCE & QUALITY | +| Ⅴ 프로젝트 관리 | S65~S68 | S64 PROJECT MANAGEMENT | +| Ⅵ 프로젝트 지원 | S70~S73 | S69 PROJECT SUPPORT | +| Ⅶ 그 밖의 사항 | S75~S79 | S74 멀티테넌시·확장 | + +**신설 9슬라이드 전량 실재·내용 소스 정합:** +투입인력 M/M(S7·tech_advisory §5-2) · 정량평가(S9) · 표준FW(S24) · 관리방법론(S66 PMBOK) · 인수인계교육(S70) · SM/SLA(S71 §6) · 장애비상(S72) · 기밀보안(S73) · 상생협력(S76 별표11). + +--- + +## 2. RTM 커버리지 — PASS(수정 후 142/142) + +REQ 배지가 range 표기(예: `REQ-F-073~076`, 연속 `REQ-F-045~051·067~069`)를 포함하므로 range 전개 후 대조. 이전 QA에서 모호했던 7건 우선 확정: + +| REQ | 최초 상태 | 확정 결과 | +|---|---|---| +| F-008 배치안 선택/병합 편집 | 콘텐츠 O(S31)·배지 X | **수정**: S31 배지에 008 추가 | +| F-010 최종안 버전기록·좌표확정·초대링크 | 콘텐츠 X·배지 X (진성 누락) | **수정**: S31에 4번째 플로우 칩 "[최종안 확정·초대링크]" + 캡션 + 배지 010 추가 | +| F-026 AI자료 기반 견적서 응찰·PDF·버전 | 콘텐츠 O(S36)·배지 X | **수정**: S36 배지에 026 추가 | +| F-032 낙찰→발주 자동전환 | 배지 O(S39) | 이상 없음 | +| A-003 구조화 프롬프트 보존/교체 | 배지 O(S20) | 이상 없음 | +| A-005 Before/After 슬라이더 | 배지 O(S29) | 이상 없음 | +| A-008 간판 텍스트 비전 검수 | 배지 O(S30) | 이상 없음 | + +**range 전개 후 잔여 유일 진성 누락 = F-010**(초대링크/최종안 확정 콘텐츠·배지 모두 부재) → 콘텐츠+배지 동시 보강으로 해소. + +수정 후 union(단독 토큰 + range 전개) 대조: **142/142 전량 반영, 미반영 0.** 부록 B(S82) "미반영 0" 표기가 사실과 일치함(수정 전에는 F-008/010/026 미배지로 과장 소지 → 해소). + +--- + +## 3. 배점 정렬 — PASS + +- 표기 일관: **기술 90(정성70+정량20) / 가격 10** (S3 배점맵, S4 [가정] 간지). `기술 80`·`가격 20`·`80/20`·`35/80` 잔재 **0건**. +- 재정렬 각주 존재: S3 "실제 공고 확인 시 재정렬", S4·S7·S81 동일 취지. 정보화 지침 제18조 원칙값 근거 명기. +- S3 배점맵이 각 부문↔장(Ⅱ·Ⅲ최다·Ⅳ·Ⅴ·Ⅵ·Ⅰ·Ⅶ) 정확 매핑. + +--- + +## 4. 정직성 라벨 — PASS + +표본: [검증됨] 16 · [구현 계획] 4 · [협의] 2 · [가정] 5 · [Non-Goal] 1. `tech_advisory §0`(라이브 실적 vs 구현 계획)과 일치: +- **[검증됨]**(라이브): 나노바나나 Gemini 워커(S17·19), PostGIS 매퍼(S17), JWT+2FA(S52), CI/CD Fail-Safe(S24), 인프라·코어(S48) — §0-1과 일치. +- **[구현 계획]**: 옥션 M15 폐루프(S17·36·37 "Phase D-M15"), 멀티테넌시(S27), F-081 프론트 분리(S60) — §0-2와 일치. 과장(구현 완료 오기) 0. + +--- + +## 5. 보안 — PASS + +- 전 슬라이드 텍스트 스캔: IPv4/서버IP · `sk-`/`AIza` API키값 · SSH계정 · 비밀번호 값 노출 **0건**. +- AI 생성/워터마크 고지: 갤러리 도입부(S85) "본 화면은 Google Stitch 기반 AI 생성 디자인 시안…" 고지 박스 존재. M5 이미지 워터마크 불변(REQ-S-009) [검증됨] S22·50·53. 갤러리 전 시안(S85~97) "AI 생성" 고지 병기. + +--- + +## 6. 구조 품질 — PASS + +- 목차(S2 "나라장터 정보시스템 표준 7대장")↔실제 장 순서·슬라이드 번호 정합. +- 간지 배점 배지(S3): 부문↔장 매핑·배점 숫자 정확. +- 부록 A(100대 기능 성숙도)·B(REQ 매트릭스)·C(가정·협의 집약)·D(화면 갤러리) 순 구성. + +--- + +## 수정 내역 (build_deck.py) + +| 슬라이드 | 편집 | 커버 REQ | +|---|---|---| +| S31 배치 3안 | 배지 `REQ-F-007·A-009`→`REQ-F-007·008·010·A-009`; 액션칩 3→4([최종안 확정·초대링크] 추가); 캡션에 F-008·F-010 근거 명시 | F-008, F-010 | +| S36 옥션 폐루프 | 배지 `REQ-F-025·031`→`REQ-F-025·026·031` (콘텐츠 "견적서 제출 PDF·버전" 기존재) | F-026 | + +재빌드(97슬라이드) → COM 렌더 → S31/S36 시각 확인(오버플로·깨짐 없음, 4칩 균등 배치). + +--- + +## 잔여 이슈 (결함 아님 — 발주처 확인 항목) + +`g2b_standard_toc.md §7` T1~T5 및 부록 C 집약대로 정직 라벨링됨. QA 통과를 막지 않음: +- 배점 90/10, 예산·M/M(~150), 투입인력 실명·단가 → [가정], 공고 확정 시 재정렬/기재 +- 상생협력·하도급 구체 지분 → [공고·컨소 확정 시 기재] +- wayfinding 비콘·IoT·사이니지 HW(F-070·052~055) → [협의] 시설 인프라 전제 +- kxwp 연동(F-022) → ⚠확인필요 + +--- + +## 최종 판정: **승인(PASS)** + +7대장 표준 목차·신설 9슬라이드 완비, RTM 142/142(수정 3건 후), 배점 90/10 일관, 정직성 라벨 정합, 보안 노출 0, AI 고지 존재. 실제 공고 확인 시 배점·목차·투입계획 재정렬만 반영하면 제출 가능. diff --git a/docs/deliverables/제안서/_gen/proposal_strategy.md b/docs/deliverables/제안서/_gen/proposal_strategy.md new file mode 100644 index 0000000..c9141ea --- /dev/null +++ b/docs/deliverables/제안서/_gen/proposal_strategy.md @@ -0,0 +1,150 @@ +# 킨텍스 자동전시시스템 구축 — 수주 전략서 (Proposal Strategy) + +> 작성: proposal-strategist · 작성일: 2026-07-11 · 버전 v1.0 +> 입력: `rfp_analysis.md`(REQ 142 · 배점 가정 기술80/가격20) · `rtm.md`(P1~P9 매핑) · `docs/PLANNING.md` §1~§2 +> 원칙: **배점이 전략을 지배한다.** 과장·허위 금지 — rfp_analysis에 근거 있는 주장만 기재. 시크릿(키·비번·내부IP) 미기재. +> 성격: 실제 RFP 부재 → 평가배점·제출규격은 **[가정]**(공공 SI 통례). 실제 공고 확인 시 교체. + +--- + +## 0. 전략 요약 (Executive Summary) + +**한 문장 포지셔닝**: 킨텍스 자동전시시스템은 "도면과 표를 보여주는" 기존 전시테크가 아니라, **"신청서를 내는 순간 시공 후 사진을 먼저 보여주고, 그 사진으로 발주까지 종결하는" 유일한 폐루프 플랫폼**이다. + +**수주 논리 3단**: +1. **배점의 44%(35/80)가 P3 기술제안**(AI 시각화·설계 20 + 기능 구현 15)에 몰려 있다 → 제안서 분량·메시지·그래픽의 40% 이상을 P3에, 그중 절반을 나노바나나+M2~M5 폐루프에 집중한다. +2. 경쟁(글로벌 전시테크·기존 공공 SI)은 **나노바나나 시공 예측 + PostGIS 실측 공간데이터 + 옥션 폐루프**의 결합을 재현할 수 없다 → 이 3결합을 "우리만의 해자(moat)"로 전면화한다. +3. 공공 발주처의 최대 리스크(외부 API·개인정보·안전서류 오용)를 **선제 방어 논리**(G1 승인 게이트+degraded 폴백, AI 워터마크 불변, PII·테넌트 3중 격리)로 무장해 감점을 원천 차단한다. + +**슬로건 후보(표지·간지용)**: +- 메인: **"신청서를 내는 순간, 시공 후 사진을 먼저 본다."** (PLANNING §1-2 비전 직인용) +- 서브: **"설계 → 시각화 → 발주 → 시공 → 운영 → 분석. 킨텍스에서 한 흐름으로 끝난다."** + +--- + +## 1. Win Theme (차별화 메시지 5선) + +> 각 Win Theme = ①발주처 핵심 니즈 ②우리 차별화 메시지(슬로건) ③배점 정렬 ④근거(REQ/PLANNING) ⑤증빙 방식. 배점 가중 순으로 배열. + +### WT-1. 시공 전에 사진으로 의사결정한다 — 나노바나나 시공 예측 (최우선 · 배점 20) + +- **발주처 니즈**: 참가업체·주최자가 "도면을 읽지 못해 개장일에야 결과를 처음 본다"(PLANNING §2 참가업체 Pain). 조감도 외주는 비용·시간. +- **슬로건**: **"도면이 아니라 사진으로 컨펌한다."** +- **차별화 메시지**: image-to-image 구조보존(골격·치수·통로·카메라 앵글 잠금, 스타일만 사실화)으로 표준 샷세트 S1~S7(정면·야간조명·통로·내부·Before/After·배선 오버레이·홀전경)을 평균 40초에 자동 생성. **경쟁 전시테크가 보유하지 못한 기능**(rfp_analysis §4 win 우선순위 ①). +- **배점 정렬**: "AI 시각화·설계 자동화(핵심 차별화) 20점" 직격. 대응 REQ-A-001~008, REQ-F-019. +- **증빙**: Before/After 드래그 슬라이더 실물 캡처, 샷세트 예시 이미지(워터마크 포함), RenderJob 파이프라인 도식. + +### WT-2. 배치·설계·배선을 AI가 3안 자동생성하고 규정을 자동검증한다 (배점 20+15 교차) + +- **발주처 니즈**: 주최자 CAD 수작업 수일~수주, 홀매니저 육안 규정 검수 병목(PLANNING §1-3, §3-2). +- **슬로건**: **"수 분 내 3안, 제출 전 규정 자동검증."** +- **차별화 메시지**: 제약 솔버+LLM 조건해석으로 부스 배치/부스 설계 각 3안 자동생성·선택/병합·버전관리(REQ-F-007~013). 규정(피난통로·바닥하중 홀별·높이 5m·리깅 6.5~8.5m·방염·이격)을 제출 전 자동 플래깅. PostGIS 최단경로로 트렌치→분전반 배선·위치표시도 자동 작도(수기 폐지, REQ-F-015~017). +- **배점 정렬**: AI 시각화·설계(핵심) 20 + 기능 구현 15의 코어. 대응 REQ-A-009·010·020, REQ-F-007~018. +- **증빙**: 3안 비교 화면, 규정 위반 플래그 대시보드, PostGIS 배선 경로 오버레이, "사람이 최종 확정"(AI는 보조) 명시. + +### WT-3. AI 설계자료가 곧 발주 근거가 된다 — 공사 옥션 폐루프 (배점 15 · 폐루프 핵심) + +- **발주처 니즈**: 등록업체 739개가 단순 리스트+엑셀, 매칭·견적 비교 부재(PLANNING §3-2). +- **슬로건**: **"사진 수준 자료로 응찰하고, 한 흐름에서 발주까지 끝낸다."** +- **차별화 메시지**: M2~M5가 생성한 배치·설계·배선/BOQ·시공 예측 이미지가 곧 역경매 응찰 근거. 실시간 순위·종합평가 낙찰(가격+평판+납기)→계약/발주 자동전환(REQ-F-025~032). **미등록 업체 응찰 원천 차단(403)** 으로 킨텍스 "등록업체 시공 필수" 규정을 시스템이 강제. +- **배점 정렬**: 기능 구현 15 + 보안(등록 게이트). 대응 REQ-F-025~032, REQ-S-007. +- **증빙**: 옥션 흐름도(설계자료→응찰→실시간순위→낙찰→발주), 종합평가 스코어 비교표, 등록 게이트 차단 시퀀스. + +### WT-4. 공공이 안심하는 AI — 워터마크·PII·테넌트 3중 격리 불변 (배점 10) + +- **발주처 니즈**: 생성 이미지의 계약·심사 서류 오용 우려, 관람객/리드 개인정보 보호, 다전시관 데이터 혼입 방지. +- **슬로건**: **"AI가 만든 것은 반드시 표시하고, 남의 데이터는 원천 차단한다."** +- **차별화 메시지**: M5 이미지 응답에 워터마크 **항상** 포함(watermarkRequired:true·계약/심사 서류 금지 고지, REQ-S-009). PII 동의·마스킹·AES-256-GCM·응답 완전 제외(REQ-S-013). fail-closed 다층 테넌트 격리(컨텍스트 필터→서비스 가드→MyBatis 인터셉터→PostGIS, REQ-S-018). 외부 API는 Ollama 기본+Claude/Gemini만 승인 예외(REQ-S-001). +- **배점 정렬**: 보안·개인정보 10점. 대응 REQ-S 20항목 전량. +- **증빙**: 보안영역 분리도(DMZ/내부망), 워터마크 실물, 감사로그 전수 표, PII 마스킹 예시. + +### WT-5. 킨텍스에서 검증하고 코엑스로 확장한다 — 멀티테넌트 SaaS (배점 5 · 미래가치) + +- **발주처 니즈**: 킨텍스 제3전시장(2028, 178,000㎡) 확장 + 국내 전시산업 표준 플랫폼화. +- **슬로건**: **"코드 배포 없이 데이터 온보딩만으로 새 전시관을 연다."** +- **차별화 메시지**: KINTEX=기준 테넌트 #1, COEX=테넌트 #2 온보딩 6단계(마스터데이터 입력 수준). tenant_id 전파·2계층 관리자(플랫폼/테넌트)·컨텍스트 해소(REQ-F-077~079). 기능은 전부 보존, 데이터·권한만 전시관 단위 분리. +- **배점 정렬**: 멀티테넌시·확장성 5점 + 사업 미래 비전. 대응 REQ-F-077~079, REQ-N-020, REQ-S-018. +- **증빙**: 멀티테넌시 격리 아키텍처, 온보딩 6단계 도식, 테넌트 스위처 화면. + +--- + +## 2. 평가항목별 대응 전략 (배점 가중) + +> 각 평가부문에 "무엇을·어떻게 보여줄지". 정량 항목=수치, 정성 항목=스토리. 배점 큰 순. + +| # | 평가부문 | 배점 | 대응 전략 (증빙·실적·방법론·도표) | 주요 REQ | 목차 | +|---|---|---|---|---|---| +| 1 | **AI 시각화·설계 자동화(핵심)** | **20** | WT-1·WT-2 전면. 나노바나나 파이프라인 도식 + Before/After 실물 + 3안 생성·규정검증·PostGIS 배선 화면. "결정적 알고리즘 중심(제약 솔버) + LLM 보조 + 사람 최종확정" 3층 구조로 **AI 신뢰성** 강조 | REQ-A-001~010·020, F-007~019 | P3 | +| 2 | **기능 구현(M1~M18)** | 15 | 모듈맵 1장으로 전 모듈 조망 → 배점 큰 옥션(WT-3)·관람·BI를 상세, 선택(P2) 기능은 "구현 로드맵"으로 간결. 100대 기능 성숙도(기구현 63·부분 18·신규 19) **정량 제시** | REQ-F 전량, 특히 F-025~032 | P3 | +| 3 | **AI 설계 자동화(폐루프)** | (20 내) | WT-3. 옥션 흐름도 + 종합평가 스코어 비교표 + 발주 자동전환. AI 자료→응찰 근거 연결이 **경쟁이 못 하는 폐루프** | REQ-F-025~032, S-007 | P3 | +| 4 | 아키텍처·기술스택 | 10 | 확정 스택(React18/19+Spring Boot 3.x+MyBatis+PostgreSQL/PostGIS+Redis+나노바나나 Python 워커) 정합. 단일 공간 원천(M2폴리곤·M4배선 매퍼 권위)·워커 독립스케일·읽기복제 오프로드·역할별 프론트 분리 도식 | REQ-N-008~010·017·019, A-007·016, F-072·080·081 | P4 | +| 5 | 보안·개인정보(불변) | 10 | WT-4. REQ-S 20항목 커버리지 표 + 보안영역 분리도 + 워터마크·PII·감사로그·2FA. **감점/실격 리스크를 정면 방어** | REQ-S 20 전량, A-006·017 | P5 | +| 6 | 비기능(성능·가용성·접근성·다국어) | 8 | SLO 99.5%(성수기 99.9% 지향)·백엔드 2인스턴스 롤링 무중단·PG 스탠바이+PITR·나노바나나 40초/1024px·WCAG 2.1 AA+KWCAG 2.2·i18n 한/영/중/일·라이트/다크. **수치 SLA 표** | REQ-N 21 전량 | P6 | +| 7 | 멀티테넌시·확장성(COEX) | 5 | WT-5. 격리 아키텍처 + 온보딩 6단계 + tenant_id 선두 복합 인덱스. 제3전시장·타 전시관 확장 미래가치 | REQ-F-077~079, N-020, S-018 | P7 | +| 8 | 사업이해·추진전략 | 10 | As-Is 병목(HWP·CAD 수작업·kxwp·유틸리티 파편화) → To-Be 정량목표(견적 즉시·배치 수분·위치표시도 자동) 대비표. **킨텍스 실무 프로세스 정확 이해**(D-150/30/25/7 타임라인)로 도메인 신뢰 확보 | 전체 맥락 | P1·P2 | +| 9 | 사업관리·품질·일정 | 2 | Phase 1~3(코어→워크플로/운영→현장/확장) 간트 + QA 게이트 + Fail-Safe 배포 + 선행게이트(G1·G2) 관리. 배점 낮으나 실행력 신뢰 | REQ-N-004, S-019 | P8 | +| — | 기대효과 | (가점) | To-Be 정량 개선(견적 수일→즉시, 배치 수주→수분, 검수 육안→자동) + ROI·표준화·확장 스토리 | 목표표(§1-3) | P9 | + +**분량 배분 원칙**: P3(35점)에 전체 슬라이드의 ~40%, 그중 절반을 나노바나나+M2~M5. P4·P5(각 10점) 각 ~8%, P6(8점) ~6%, P1+P2(10점) ~16%, P7(5점) ~5%, P8(2점) ~5%, P9 ~5%. 선택 기능은 압축. + +--- + +## 3. 경쟁사 대비 강점 (Competitive Positioning) + +> 근거 있는 비교만. 경쟁을 폄하하지 않고 "우리가 결합한 것"을 강조. + +### 3-1. 글로벌 전시테크(ExpoPlatform·VenueSight·Swapcard·RainFocus 등) 대비 + +| 축 | 글로벌 전시테크 | 킨텍스 자동전시시스템 | 근거 | +|---|---|---|---| +| 시공 결과 시각화 | 도면·3D 뷰어 수준, 사진급 시공 예측 **미보유** | 나노바나나 image-to-image 구조보존 사진 생성 | PLANNING §1-2·§6, WT-1 | +| 공간 데이터 | 좌표·구역 관리 | **PostGIS 실측**(부스 폴리곤·트렌치 포인트·배선 LineString) 단일 원천 | REQ-N-008·017, data.md | +| 발주 연결 | 리드/매칭까지, 공사 발주 폐루프 약함 | AI 설계자료→역경매 응찰→낙찰→발주 자동전환 폐루프 | WT-3, §M15 | +| 킨텍스 도메인 정합 | 범용 글로벌 규격 | 킨텍스 규정(높이 5m·리깅·방염·바닥하중)·요율(2,250원/㎡)·D-데이 타임라인 내재화 | PLANNING §3, §7-1 | +| 데이터 주권 | 해외 SaaS·데이터 국외 | 온프레미스 Ollama 기본, 외부 AI는 승인 예외만·워커 env 격리 | REQ-S-001·002 | + +**메시지**: "글로벌 전시테크의 기능(부스판매·리드·비즈매칭·BI)은 이식하되, 그들이 못 하는 **실측 공간데이터×시공 예측 이미지×옥션 폐루프**를 관통시켰다." + +### 3-2. 기존 공공 SI(범용 웹시스템 구축) 대비 + +| 축 | 범용 SI | 킨텍스 자동전시시스템 | 근거 | +|---|---|---|---| +| AI 내재화 | 챗봇·검색 부가 수준 | 배치 3안·규정검증·시공 예측·수요예측이 **핵심 업무 자동화** | REQ-A 20항목 | +| 공간 연산 | 일반 CRUD | PostGIS GiST 실시간 공간쿼리(트렌치 KNN·통로버퍼·비상구 교차) | REQ-N-008 | +| 표준 프레임워크 | 개별 구축 | GUARDiA 표준(WISE/UIWS) 공통·시스템관리·JWT+2FA 이식으로 검증된 자산 재사용 | REQ-F-071~076, §5B | +| 확장성 | 단일 기관 | 멀티테넌트 SaaS(COEX 온보딩)로 재사용·표준화 | WT-5, §1A | + +**메시지**: "범용 SI가 아니라 전시 도메인 전용 AI 자동화 플랫폼. 검증된 공통 프레임워크(UIWS/WISE) 위에 도메인 코어(M2~M5)와 폐루프(M15)를 얹어 **개발 리스크와 기간을 동시에 단축**한다." + +### 3-3. 우리만의 3중 해자(Moat) — 한 장 요약 + +**나노바나나 시공 예측 이미지 ∩ PostGIS 실측 공간데이터 ∩ 공사 옥션 폐루프** — 이 세 가지의 결합은 단일 요소로는 모방 가능하나 **셋의 결합은 재현 난이도가 높다**. 제안서 P3 도입부에 "3원 벤다이어그램" 1장으로 각인. + +--- + +## 4. 리스크 방어 논리 ([가정]·⚠확인필요 정면 대응) + +> 평가위원이 반드시 파고들 "약한 고리"를 **선제적으로 드러내고 방어**한다. 숨기면 감점, 정면 대응하면 신뢰. + +| # | 리스크(발주처 우려) | 방어 논리 (정면 대응) | 근거 | 제안서 위치 | +|---|---|---|---|---| +| R-1 | **G1 나노바나나 Gemini 외부 API 미승인 시 핵심 기능 붕괴?** | "승인 게이트 + degraded 폴백" 2중 설계. G1 미승인/Gemini 장애 시 워커 **목(mock) 응답·구조·워터마크 유지**로 화면·워크플로 계속 동작(REQ-N-005). 승인 확보를 **선행 게이트로 프로젝트 관리**(kintex-pm 통제). 외부 API는 워커 env only·백엔드 미취급으로 보안 격리 | REQ-S-001·002, N-005, C5 | P3 도입·P5·P8 | +| R-2 | **CAD·트렌치 실측 데이터 미확보로 배선·배치 정확도 의심?** | 미확보 정직 고지 + "공개 스펙 기반 가정 그리드 + '가정' 라벨"로 데모, **실측 반영을 킨텍스 협의 선행작업으로 명시**. 확보 자산(홀별 평면도 JPG 15장·CAD DWG "평면,트렌치.dwg")으로 실현성 입증 | C3, PLANNING R4, CLAUDE.md 확보자산 | P3 배선·P8 | +| R-3 | **kxwp/kxfp 폐쇄형 API 미공개로 제출 연동 불가?** | "초기 수동 릴레이 → 목표 API 연동" 단계적 접근. 웹폼→HWP/PDF 자동생성까지는 API 무관하게 완결, 릴레이 단계만 킨텍스 IT 협의(⚠확인필요 명시). 리스크를 범위·일정에 반영 | REQ-F-022, C2 | P3 서류·P8 | +| R-4 | **평가배점·제출규격이 가정이라 목차 정합성 의심?** | 배점 가정을 **투명 고지**하고 "실제 공고 확인 시 목차·분량 즉시 재정렬" 유연성 제시. 목차는 공공 SI 통례(사업이해→전략→기술→아키→보안→비기능→확장→관리→기대효과)로 안전 정렬 | rfp_analysis §4·§5, C1 | P1·목차 간지 | +| R-5 | **간판 한글 텍스트 등 생성 이미지 품질 편차?** | 간판 텍스트 비전 오탈자 검수 + 한글 렌더 실패 시 **간판영역 후처리 합성**(REQ-A-008). 자동생성은 S1·S7 한정·캐시·쿼터로 품질/비용 제어(REQ-N-007) | REQ-A-008, N-007, R5 | P3 AI·P6 | +| R-6 | **AI 환각·오판(규정 오검증·설계 오류) 책임?** | "AI는 보조, 사람이 최종 확정" 원칙 불변. 규정검증=플래깅까지, 구조안전 판정은 구조기술사/킨텍스(Non-Goal 명시). AI 답변은 RAG 근거·인용·환각 차단(abstain)(REQ-A-017) | Non-Goal §1-4, REQ-A-017 | P3·P5 | +| R-7 | **사이니지 HW·비콘·IoT 센서 연동 불확실?** | 선택(P2) 기능으로 분류, "킨텍스 시설 인프라 협의 전제" 명시. 미협의 시에도 코어 가치 불변(WT-1~4는 HW 독립) | REQ-F-070·052~055, C7 | P3 현장·P8 | +| R-8 | **다전시관 확장이 개발 부담을 키우지 않나?** | 멀티테넌시=격리 레이어만 추가(tenant_id 전파), 기능 로직 불변. 백필 전 단일테넌트 무중단 동작, 검증 후 필터 활성화(회귀 방지) | §1A-5, REQ-F-077 | P7 | + +**방어 원칙**: 모든 [가정]·⚠확인필요 항목은 제안서 부록 "확인 필요·협의 사항" 1장으로 집약해 **정직성**을 오히려 강점화(발주처와의 협업 자세 어필). + +--- + +## 5. writer·deck-designer 전달 지침 + +- **메시지 우선순위**: WT-1 > WT-2 > WT-3 > WT-4 > WT-5 순으로 슬라이드 무게. P3 도입부에 "3중 해자" 벤다이어그램 필수. +- **정량 강조**: 견적 수일→즉시, 배치 수주→수분, 검수 육안→자동, 40초 렌더, SLO 99.5%, REQ 142 커버리지 등 숫자를 표지·간지·기대효과에 반복 노출. +- **AI 신뢰 프레이밍**: "결정적 알고리즘(제약 솔버·PostGIS) 중심 + LLM 보조 + 사람 최종확정" 3층을 모든 AI 슬라이드 캡션에 삽입 → 공공 AI 불안 해소. +- **RTM 정합**: 전 142 REQ가 P1~P9 어딘가에 반영되도록 목차(§proposal_outline.md)의 REQ 매핑을 준수. 누락 0. +- **금지**: 시크릿·내부IP·미확보 데이터의 확정적 서술 금지. 미확보는 "가정/협의 전제" 라벨 필수. diff --git a/docs/deliverables/제안서/_gen/render_check.py b/docs/deliverables/제안서/_gen/render_check.py new file mode 100644 index 0000000..55c907c --- /dev/null +++ b/docs/deliverables/제안서/_gen/render_check.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +"""PowerPoint COM 렌더링 검증 — 전 슬라이드 PNG export.""" +import sys, os, glob +import win32com.client as win32 + +PPTX = sys.argv[1] if len(sys.argv) > 1 else r"C:\GUARDiA\workspace\kintex\docs\deliverables\제안서.pptx" +OUT = sys.argv[2] if len(sys.argv) > 2 else r"C:\Users\ython\AppData\Local\Temp\claude\C--GUARDiA-workspace-kintex\85f77606-5d61-424b-8a38-f8b61b56b54c\scratchpad\render" +os.makedirs(OUT, exist_ok=True) +for f in glob.glob(os.path.join(OUT, "*.png")): + try: os.remove(f) + except: pass + +app = win32.Dispatch("PowerPoint.Application") +try: + app.Visible = True +except Exception: + pass +pres = app.Presentations.Open(PPTX, ReadOnly=True, Untitled=False, WithWindow=False) +n = pres.Slides.Count +for i in range(1, n+1): + pres.Slides(i).Export(os.path.join(OUT, f"s{i:03d}.png"), "PNG", 1280, 720) +pres.Close(); app.Quit() +print("RENDERED", n, "slides ->", OUT) diff --git a/docs/deliverables/제안서/_gen/rfp_analysis.md b/docs/deliverables/제안서/_gen/rfp_analysis.md new file mode 100644 index 0000000..4a858d0 --- /dev/null +++ b/docs/deliverables/제안서/_gen/rfp_analysis.md @@ -0,0 +1,366 @@ +# 킨텍스 자동전시시스템 구축 — 요구사항 분석서 (가상 RFP 기반) + +> 작성: rfp-analyst · 작성일: 2026-07-11 · 버전 v1.0 +> **성격**: 실제 RFP 문서는 부재하며, 발주처(킨텍스, 한국국제전시장)의 내부 기획 문서를 "가상 RFP"의 요구사항 원천으로 삼아 제안서 작성·평가 대응용으로 구조화 추출한 것이다. +> **근거 문서(출처)**: `docs/PLANNING.md`(v3.0), `docs/FEATURE_BACKLOG_100.md`(v1.1), `docs/SECURITY.md`, `docs/architecture/{app,system,tech,data,network}.md`, `CLAUDE.md`(kintex 섹션). +> **원칙**: 문서에 없는 요구는 발명하지 않는다(각 REQ에 출처 병기). 비밀번호·키·IP 등 시크릿은 미기재. 가정(assumption)은 "[가정]"으로 명시. + +--- + +## 1. 사업 개요 (가정 포함) + +| 항목 | 내용 | 근거/비고 | +|---|---|---| +| 사업명 | 킨텍스 자동전시시스템(Exhibition Automation Platform) 구축 | PLANNING §1-2-1 | +| 발주처(가정) | 킨텍스(KINTEX, 한국국제전시장) — 기준 테넌트 #1 | PLANNING §1A-1 | +| 사업 목적 | 전시장 운영 전 주기(홀 배정→부스 배치→장치공사 설계→전기/조명→네트워크/유틸리티 배선→반입/반출→관람객·정산·경영분석)를 AI로 자동 설계·검증하고, 시공 결과를 나노바나나(Gemini 이미지 생성)로 "공사 후 사진"처럼 사전 시각화 | PLANNING §1-2 | +| 정체성 | 부스 시공 도구를 넘어 전시 기획·판매·시공·운영·관람·사후분석 전 주기를 아우르는 베뉴 운영 플랫폼 + 다중 전시관(Venue) 멀티테넌트 SaaS(KINTEX #1, COEX 온보딩) | PLANNING §1-2-1·§1A | +| 범위 모듈 | 코어 M2~M5(P0), 판매·발주·정산 M1·M6·M7·M9·M15, 관람·참가 M8·M10~M14, 경영·콘텐츠·관리 M16~M18, 공통/시스템관리 레이어 §5B, 멀티테넌시 §1A | PLANNING §4-1 | +| 확정 기술스택 | React 18/19(Vite·TS) + Spring Boot 3.x(Java 17) + MyBatis + PostgreSQL(PostGIS) + Redis + 나노바나나 Python 워커 사이드카 | PLANNING §8, CLAUDE.md | +| AI 플랫폼 | 텍스트=Claude 기본(AiTextRouter/AiConfig, `ANTHROPIC_API_KEY` env) → Ollama 폴백 / 이미지=나노바나나(Gemini `gemini-3.1-flash-image-preview`) | FEATURE_BACKLOG §0, PLANNING §6-4 | +| 사용자 역할 | 6 행사역할(주최자·참가업체·장치/시공업체·홀매니저·관람객·일반대중) + 2 관리자계층(테넌트 관리자·플랫폼 슈퍼관리자) | PLANNING §2·§1A-4 | +| 로드맵(가정) | Phase 1 코어(~4개월)·Phase 2 워크플로/운영(~4개월)·Phase 3 현장/확장(~4개월+) | PLANNING §9 | +| 선행 게이트 | G1 나노바나나 Gemini 승인(외부 API), G2 개발/배포 서버(kintex.zioinfo.co.kr, PostGIS+Redis) | CLAUDE.md, PLANNING §10 R12 | + +**[가정] 명시 항목**: 예산·계약방식·정확한 사업기간·평가배점·제출규격은 실제 RFP가 없어 공공 SI 통례를 가정한다(§4·§5). + +--- + +## 2. 과업 범위 + +### 2-1. 기능 과업 범위 (모듈별) + +| 계열 | 모듈 | 우선순위 | 범위 요지 | 출처 | +|---|---|---|---|---| +| 코어(불변) | M2 플로어플랜 스튜디오 | P0 | 부스 배치 3안 자동생성·선택/병합·규정 자동검증·버전 | PLANNING §M2 | +| 코어 | M3 부스 설계 스튜디오 | P0 | 조립/독립부스 설계 3안·규정 사전검증·도면 비전추출 | PLANNING §M3 | +| 코어 | M4 유틸리티 설계 | P0 | 전기·조명 용량/분전반/배선(M4a), 네트워크·급배수·압축공기·위치표시도(M4b) | PLANNING §M4 | +| 코어 | M5 나노바나나 시각화 | P0 | 시공 후 예상사진 표준 샷세트(S1~S7)·Before/After·워터마크 | PLANNING §M5·§6 | +| 판매·발주 | M1 홀 배정·자동견적 | P1 | 가용성 캘린더·규칙엔진 견적·배정신청 서식 | PLANNING §M1 | +| 판매·발주 | M6 서류·마일스톤 | P1 | D-150/30/25/7 역산·웹폼→HWP/PDF·AI 서류검수·kxwp 릴레이 | PLANNING §M6 | +| 판매·발주 | M7 등록업체 매칭 | P1 | 14분류×739개 업체 추천·RFQ·등록업체 검증 | PLANNING §M7 | +| 판매·발주 | M15 공사/장치 옥션 | P1(핵심) | 역경매·견적서(Quotation) 응찰·실시간 순위·종합평가 낙찰·발주전환 | PLANNING §M15 | +| 판매·발주 | M9 정산·결제 | P1 | 납부스케줄·PG결제·예치금 실사용 정산·세금계산서 | PLANNING §M9 | +| 물류 | M8 반입/반출 물류 | P2 | 슬롯예약·통행증 QR·중량물 우선·지게차 | PLANNING §M8 | +| 관람 | M10 관람객 등록·배지·리드 | P1 | 사전등록·모바일 배지/QR·현장 체크인·리드캡처·오프라인 폴백 | PLANNING §M10 | +| 관람 | M11 비즈니스 매칭 | P2 | AI 미팅추천·슬롯예약·성과 리포트 | PLANNING §M11 | +| 관람 | M12 마케팅·공개 홍보사이트 | P1 | SEO·다국어 공개사이트·인터랙티브 플로어플랜·세그먼트 EDM | PLANNING §M12 | +| 관람 | M13 wayfinding | P2 | 실내 내비(블루닷/존레벨)·POI 검색·경로 | PLANNING §M13 | +| 현장 | M14 현장운영 | P2 | 혼잡·전력부하·주차·안전위반 플래그 | PLANNING §M14 | +| 경영 | M16 경영분석 BI | P1(승격) | 가동률·매출구성·P&L·RevPAD·리텐션/LTV·수요예측·KPI(운영사+참가사 관점 분리) | PLANNING §M16·§M16-1 | +| 경영 | M17 CMS | P1 | 콘텐츠·공지·마이크로사이트·다국어·게시 워크플로·사이니지 | PLANNING §M17 | +| 관리 | M18 관리자 백오피스 | P1 | RBAC·감사·마스터데이터·룰셋 버전관리 | PLANNING §M18 | +| 공통 | §5B 공통/시스템관리 레이어 | P1(선행기반) | UIWS 표준 이식: 시스템관리·공통 업무모듈·JWT+2FA/OTP | PLANNING §5B | +| 멀티테넌시 | §1A 다중 전시관 SaaS | P1 | tenant_id 격리·컨텍스트 해소·2계층 관리자·온보딩 | PLANNING §1A·§8-2 | + +### 2-2. 비기능 과업 범위 + +| 축 | 범위 | 출처 | +|---|---|---| +| 성능 | RenderJob 평균 40초·1024px 전처리, PostGIS GiST 실시간 응답, 읽기복제 BI 오프로드 | system.md §3-3, PLANNING §6-5 | +| 가용성/HA | 코어 경로 SLO 99.5%(성수기 99.9% 지향), 백엔드 최소 2인스턴스·롤링 무중단, PG 프라이머리-스탠바이+PITR, degraded 모드 | system.md §3-2 | +| 확장성 | 워커 독립 스케일(큐 깊이 기반), 공개영역 CDN, 역할별 프론트 번들 분리 | system.md §3-1 | +| 접근성 | WCAG 2.1 AA(핵심여정 AAA 지향), 공공 KWCAG 2.2 병행 | FEATURE_BACKLOG §6-N1 | +| 다국어 | 한(기본)+영/중/일, i18n 외부화·hreflang·로케일 포맷 | FEATURE_BACKLOG §6-N3 | +| 테마 | CSS 토큰 라이트/다크 2벌·시스템 연동 | FEATURE_BACKLOG §6-N4 | +| 공간데이터 | 부스 폴리곤·트렌치 포인트·배선 LineString 단일 PostGIS 원천 | data.md, PLANNING §7-3 | +| 보안 | §3 참조(REQ-S) | SECURITY.md | + +### 2-3. 범위 제외(Non-Goals) + +- 킨텍스 임대계약 법적 전자계약 체결(Phase 3 이후 검토) — 초기엔 견적·서류 준비까지. (PLANNING §1-4) +- 구조계산서의 구조 안전성 최종 판정(AI는 항목 체크·누락 검출까지, 판정은 구조기술사/킨텍스). (PLANNING §1-4·§M3) +- 소방 법규 최종 유권해석·승인(시스템은 사전 필터). (PLANNING §M2) +- 신규 전시관 고유 도메인 로직 자동생성(온보딩은 마스터데이터 입력 수준). (PLANNING §1-4·§1A-5) + +--- + +## 3. 요구사항 목록 + +> ID 체계: 기능 `REQ-F-###`, 비기능 `REQ-N-###`, 보안 `REQ-S-###`, AI `REQ-A-###`. +> 유형: **필수** / **선택**(P2·확장·조건부). 확인 필요 항목은 "⚠확인필요"로 표기(삭제 금지). + +### 3-1. 기능 요구사항 (REQ-F) + +#### M1 판매·홀배정·견적 +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-001 | 홀/반홀 가용성 실시간 캘린더 조회(행사일정 DB 연동) | 필수 | F001, §M1 | +| REQ-F-002 | 규칙엔진 자동 견적(2,250원/㎡×면적×일수×성수기/비수기/1전시장 계수+초과시간+예치금 15~20%) | 필수 | F002, §M1 | +| REQ-F-003 | 배정신청 웹폼 → 킨텍스 제출 서식(HWP) 자동 생성 | 필수 | F004, §M1 | +| REQ-F-004 | 부스 판매 인벤토리 관리(부스 단위 판매/홀드/예약 상태) | 필수 | F005 | +| REQ-F-005 | 온라인 부스 셀프 선택·판매(인터랙티브 맵) | 필수 | F006 | +| REQ-F-006 | 임대계약 전자서명 워크플로 | 선택 | F007(Phase3, Non-Goal 완화) | + +#### M2 플로어플랜 스튜디오 (P0) +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-007 | 홀 선택·조건 입력 후 부스 배치 정확히 3안 자동생성(제약 솔버, 상이한 최적화 목표) | 필수 | F008, §M2 | +| REQ-F-008 | 배치안 선택 또는 구역/블록 병합 편집(안별 레이어 토글·드래그) | 필수 | F009, §M2 | +| REQ-F-009 | 배치 규정 자동검증(피난통로·바닥하중 홀별·비상구·복층가능홀·소방 체크리스트), 병합 후 재검증 | 필수 | F010, §M2 | +| REQ-F-010 | 최종안 버전 기록(선택/병합 출처 안번호 추적)·부스별 좌표/번호 확정·참가업체 초대 링크 발급 | 필수 | §M2 | + +#### M3 부스 설계 스튜디오 (P0) +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-011 | 조립부스 옵션(간판·가구·조명) 웹 선택·3D 프리뷰 | 필수 | F012, §M3 | +| REQ-F-012 | 독립부스 레이아웃·파라메트릭 구조 3안 자동생성·선택/병합·버전 기록 | 필수 | F011, §M3 | +| REQ-F-013 | 설계 규정 사전검증(높이 5m·리깅 6.5~8.5m·복층 1/2·방염·이격 30/60cm·금지작업) 제출 전 플래깅 | 필수 | F013, §M3 | +| REQ-F-014 | 도면(PDF/이미지) 업로드 비전 추출·치수/구조 검증("참고용 검증" 라벨) | 필수 | F014, §M3 | + +#### M4 유틸리티 설계 (P0) +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-015 | 기기목록→kW 합산→분전반 용량/수량 자동 산출 | 필수 | F015, §M4a | +| REQ-F-016 | 최근접 트렌치→분전반 배선 경로 자동생성(통로 횡단 최소화, PostGIS 최단) | 필수 | F016, §M4 | +| REQ-F-017 | 유틸리티 위치표시도 자동생성(좌표 클릭, 수기 작도 폐지) | 필수 | F017, §M4b | +| REQ-F-018 | 네트워크·급배수·압축공기 신청·자동견적·마감(D-25) 역산 리마인더 | 필수 | F038, §M4b | +| REQ-F-019 | 조명 조도목표별 배치안 제안(전시품 강조/상담존) | 선택 | F018, §M4a | + +#### M6 서류·마일스톤 +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-020 | D-150/30/25/7 마일스톤 자동생성·역산 알림 | 필수 | F021, §M6 | +| REQ-F-021 | 신고서류 7종+ 웹폼→HWP/PDF 자동생성(킨텍스 제출 형식) | 필수 | F022, §M6 | +| REQ-F-022 | kxwp 제출 파일 릴레이·업로드 안내(초기 수동 릴레이, 목표 API) ⚠확인필요(폐쇄형 API 미공개) | 필수 | F027, §M6·R3 | +| REQ-F-023 | 서류 버전·다단계 전자결재 워크플로 | 필수 | F028, §5B | +| REQ-F-024 | OCR 계약·납품서 자동 등록 | 필수 | F026 | + +#### M15 공사/장치 옥션 (P1 핵심) +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-025 | 역경매 옥션 개설·라운드·마감(유형 설정형: 역경매/단일라운드 RFQ/고정가 비교) | 필수 | F029, §M15 | +| REQ-F-026 | AI 생성 자료(M2배치·M3설계·M4배선/BOQ·M5이미지) 열람 기반 견적서(Quotation) 제출·PDF·버전 | 필수 | F030, §M15 | +| REQ-F-027 | 실시간 순위·최저가·내 위치 노출(익명 옵션)·라운드 종료 자동마감 | 필수 | F031, §M15 | +| REQ-F-028 | 종합평가 낙찰 스코어(가격+평판+납기 가중)·항목별 비교표 | 필수 | F032, §M15 | +| REQ-F-029 | 등록업체 검증 게이트 — 미등록 업체 응찰 원천 차단 | 필수 | F033, §M15·§M7 | +| REQ-F-030 | 등록업체 AI 매칭 추천(규모·업종·지역) | 필수 | F034, §M7 | +| REQ-F-031 | 물량서(BOQ) 설계기반 자동산출 | 필수 | F035, §M4·§M15 | +| REQ-F-032 | 낙찰(Award)→계약/발주 문서 자동전환(M6·M9 연동) | 필수 | F036, §M15 | + +#### M8 물류 +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-033 | 반입/반출 하역장 슬롯 예약제 | 선택 | F039, §M8 | +| REQ-F-034 | 통행증 QR 발급·중량물 우선배치 | 선택 | F040, §M8 | +| REQ-F-035 | 지게차·부대장비 신청 연동, 부대물품 렌탈 주문 | 선택 | F041·F042, §M8 | +| REQ-F-036 | 철거 피크 대기열 시뮬레이션 | 선택 | F044, §M8 | + +#### M10 관람객 등록·배지·리드 +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-037 | 온라인 사전등록(유형별 폼·중복 검증) | 필수 | F045, §M10 | +| REQ-F-038 | 모바일 배지/QR 발급 | 필수 | F047, §M10 | +| REQ-F-039 | 현장 QR 체크인·즉석 배지 인쇄·실시간 입장 집계 | 필수 | F048, §M10 | +| REQ-F-040 | 오프라인 체크인 폴백(현장 네트워크 장애 대비 후동기화) | 필수 | F049, §M10, network.md | +| REQ-F-041 | 참가업체 리드캡처(배지 QR 스캔·관심도·메모) | 필수 | F050, §M10 | +| REQ-F-042 | AI 리드 스코어링·자동 분류 | 선택 | F051 | +| REQ-F-043 | 리드 팔로업 세그먼트 EDM 자동 | 필수 | F052, §M10·§M12 | +| REQ-F-044 | 티켓 발권·유료 등록 결제, AI 폼빌더, 스마트배지 | 선택 | F053·F046·F054 | + +#### M11 비즈매칭·이벤트앱 +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-045 | AI 비즈매칭 추천(프로필·intent) | 선택 | F055, §M11 | +| REQ-F-046 | 미팅 슬롯 예약·일정관리·성과 리포트 | 선택 | F056·F062, §M11 | +| REQ-F-047 | 이벤트 모바일앱(일정·부스·프로필), 세션·아젠다, 인앱 채팅, 실시간 설문 | 선택 | F057~F061 | + +#### M12 마케팅·공개 홍보사이트 +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-048 | 공개 홍보 사이트(SEO·다국어 한/영/중/일·SSR/정적) | 필수 | F063, §M12 | +| REQ-F-049 | 공개 인터랙티브 플로어플랜(M2 데이터 부산물) | 필수 | F064, §M12 | +| REQ-F-050 | 세그먼트 EDM·캠페인 자동화·리마인더 | 필수 | F065, §M12 | +| REQ-F-051 | 스폰서십 패키지·판매·이행 관리 + 스폰서 대시보드 | 필수 | F070·F071 | + +#### M13·M14 현장/wayfinding +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-052 | 실내 wayfinding(블루닷/존레벨 폴백)·POI 검색·경로안내 | 선택 | F072·F073, §M13 | +| REQ-F-053 | 실시간 입장·혼잡 모니터·오버플로 예측 | 선택 | F074, §M14 | +| REQ-F-054 | 홀 전력부하 집계·에너지 모니터, 주차 점유 연동 | 선택 | F075·F077, §M14 | +| REQ-F-055 | 안전 위반·소음·금지작업 자동 플래그·신고, 현장 이상탐지 알림 | 선택 | F076·F079, §M14 | + +#### M9 정산·결제 +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-056 | 납부 스케줄(계약금/중도금/잔금/예치금) 자동생성·알림 | 필수 | F080, §M9 | +| REQ-F-057 | 유틸리티·부대 PG 결제 | 필수 | F081, §M9 | +| REQ-F-058 | 예치금 대비 실사용(검침) 정산 투명화 | 필수 | F082, §M9 | +| REQ-F-059 | 세금계산서·정산 리포트 자동, 옥션 수수료 정산 연동 | 필수 | F083·F084, §M9 | +| REQ-F-060 | 환불·취소 규정 자동 적용 | 선택 | F085 | + +#### M16 경영분석 BI +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-061 | 홀·기간별 가동률(occupancy) 대시보드(반홀 분할·성수기 구분) | 필수 | F086, §M16-1① | +| REQ-F-062 | 매출 구성(임대·유틸리티·부대·옥션 수수료)·행사별 P&L | 필수 | F087, §M16-1②③ | +| REQ-F-063 | 전시장 ROI·RevPAD·㎡당 수익(㎡ 정규화) | 필수 | F088, §M16-1④ | +| REQ-F-064 | 참가사 리텐션·LTV 코호트 | 필수 | F089, §M16-1⑤ | +| REQ-F-065 | 참가업체 관점 ROI(리드 기반) — 운영사 관점과 대시보드/권한 격리 | 필수 | F091, §M16-1 | +| REQ-F-066 | 경영진 KPI 대시보드(목표 대비 실적·드릴다운) | 필수 | F093, §M16-1⑦ | + +#### M17 CMS +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-067 | 전시 콘텐츠·공지 게시 워크플로(초안→검수→게시)·버전관리 | 필수 | F068, §M17 | +| REQ-F-068 | 참가업체 마이크로사이트(부스·제품·나노바나나 예상샷) | 필수 | F067, §M17 | +| REQ-F-069 | 다국어(한/영/중/일) 콘텐츠 관리·hreflang | 필수 | F069, §M17 | +| REQ-F-070 | 디지털 사이니지 콘텐츠 중앙 배포 ⚠확인필요(사이니지 HW 연동 킨텍스 협의) | 선택 | F078, §M17 | + +#### M18·§5B·§1A 관리·공통·멀티테넌시 +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-F-071 | RBAC·감사로그·시스템설정 백오피스(admin. 웹 전용) | 필수 | F094, §M18·§5B-1 | +| REQ-F-072 | 룰셋·마스터데이터(홀·요율·규정·부스표준) 버전관리·무중단 개정 | 필수 | F095, §M18 | +| REQ-F-073 | 공통코드·메뉴 관리(도메인 코드: 홀/부스유형/공종14/유틸요금) | 필수 | §5B-1 | +| REQ-F-074 | 공통 업무모듈: 업무일지·일정·쪽지·공지·의견·통합검색 | 필수 | F098, §5B-2 | +| REQ-F-075 | 회의록(녹음→STT→회의록 PDF), 일/주/월/분기/연 업무보고·통계 PDF | 필수 | §5B-2 | +| REQ-F-076 | 통합 알림센터(마감 D-데이·낙찰·승인·결제, WebSocket) | 필수 | §5B-2 | +| REQ-F-077 | 멀티테넌트 격리·전시관 온보딩(코드 배포 없이 데이터 온보딩 6단계) | 필수 | F096, §1A·§8-2 | +| REQ-F-078 | 테넌트 컨텍스트 해소(서브도메인 우선+사용자소속 보조, 불일치 거부) | 필수 | §1A-3 | +| REQ-F-079 | 2계층 관리자(플랫폼 슈퍼관리자 테넌트스위처 / 테넌트 관리자 단일스코프) | 필수 | §1A-4 | +| REQ-F-080 | API·웹훅·CRM/ERP 연동 게이트웨이 | 선택 | F099 | +| REQ-F-081 | 역할별 프론트 포털 분리(organizer·exhibitor·contractor·ops·admin·public+visitor) 공유 디자인시스템 상속 | 필수 | §2-1, §8-1 | + +### 3-2. AI 요구사항 (REQ-A) + +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-A-001 | 나노바나나 시공 예상 사진 표준 샷세트(S1 정면·S2 야간·S3 통로·S4 내부·S5 Before/After·S7 홀전경) 생성 | 필수 | F019, §6-3 | +| REQ-A-002 | image-to-image 구조보존(참조이미지 inlineData+지시문) — 골격/치수/통로/카메라 앵글 잠금, 스타일만 사실화 | 필수 | §6-4 | +| REQ-A-003 | 구조화 프롬프트 사전(BOOTH_TYPES·BOOTH_STYLES·FIXTURE_LAYERS) 조립·보존/교체 명시 분리 | 필수 | §6-4 | +| REQ-A-004 | S6 배선 오버레이 백엔드 래스터 합성 우선(전기 적·네트워크 청·급배수 녹, 좌표 정확) | 필수 | §6-3 | +| REQ-A-005 | Before/After 드래그 슬라이더(빈 부스↔시공 후, ARIA·키보드) | 필수 | F020, §6-5 | +| REQ-A-006 | RenderJob 방어(다층 크기가드·mimeType 자동감지·SAFETY 분기·친화적 한글 에러·성공 시에만 쿼터 차감) | 필수 | §6-5 | +| REQ-A-007 | 단계별 로딩 UX(골격인식→집기→배선→렌더) aria-live 순환·비동기 큐·WebSocket 완료 푸시 | 필수 | §6-5, §8 | +| REQ-A-008 | 간판 텍스트 비전 오탈자 검수 + 한글 렌더 실패 시 간판영역 후처리 합성 | 필수 | §6-4, R5 | +| REQ-A-009 | 부스 배치 3안 AI 자동생성(제약 솔버 + LLM 조건해석, 결정적 알고리즘 중심) | 필수 | F008, §M2 | +| REQ-A-010 | AI 규정 자동검증(배치·설계 규정 위반 플래깅) | 필수 | F010·F013 | +| REQ-A-011 | AI 서류 검수(누락·배치도-계획서 불일치 검출) | 필수 | F023, §M6 | +| REQ-A-012 | 규정 자연어 챗봇(근거·인용 기반) | 선택 | F025 | +| REQ-A-013 | AI 수요예측·수율/동적가격 시뮬레이션 | 필수 | F090·F003, §M16-1⑥ | +| REQ-A-014 | AI 경영진 KPI 요약·인사이트 브리핑 자동, 자연어 조회(Text-to-SQL) | 필수/선택 | F093/F092 | +| REQ-A-015 | AI 카피·이미지 초안 생성, 다국어 콘텐츠 자동번역+검수 | 필수 | F066·F069, §M12·§M17 | +| REQ-A-016 | AI 플랫폼 라우터(Claude 기본→Ollama 폴백)·중앙경유·LLM 직접호출 신설 금지 | 필수 | F100, §6, FEATURE_BACKLOG §0 | +| REQ-A-017 | AI 답변 근거(RAG)·인용·환각 차단(abstain) | 필수 | FEATURE_BACKLOG §0 | +| REQ-A-018 | AI 리드 스코어링, 비즈매칭 추천, 세션/부스 추천 | 선택 | F051·F055·F059 | +| REQ-A-019 | 현장 이상탐지·혼잡/철거 대기열 예측 | 선택 | F074·F044·F079 | +| REQ-A-020 | 도면 비전 추출(치수·구조), OCR 문서 자동등록 | 필수 | F014·F026 | + +### 3-3. 비기능 요구사항 (REQ-N) + +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-N-001 | 코어 인증·설계·조회 경로 가용성 SLO 99.5%(성수기 99.9% 지향) | 필수 | system.md §3-2 | +| REQ-N-002 | 백엔드 최소 2 인스턴스+헬스체크 LB·롤링 무중단 배포 | 필수 | system.md §3-2 | +| REQ-N-003 | PostgreSQL 프라이머리-스탠바이 스트리밍 복제+자동 failover+PITR 백업 | 필수 | system.md §3-2 | +| REQ-N-004 | Fail-Safe 배포(백업→배포→헬스체크 200→실패 시 롤백) | 필수 | system.md §3-2 | +| REQ-N-005 | degraded 모드(G1 미승인/Gemini 장애 시 워커 목 응답·구조·워터마크 유지, Claude 실패 시 Ollama 폴백) | 필수 | system.md §3-2 | +| REQ-N-006 | 나노바나나 생성 성능: 평균 40초 목표·1024px 다운스케일+JPEG 0.85 전처리 | 필수 | system.md §3-3, §6-5 | +| REQ-N-007 | 대량 동시 생성 제어: 자동생성 S1·S7 한정·동일 스키마해시 캐시·행사별 RenderJob 쿼터 | 필수 | system.md §3-3, R6 | +| REQ-N-008 | 공간쿼리 성능: 전 geom 컬럼 GiST 인덱스(트렌치 KNN·통로버퍼·비상구 교차 실시간) | 필수 | data.md §3-4 | +| REQ-N-009 | 워커 독립 스케일(큐 깊이 기반 증감), 백엔드 응답성과 분리 | 필수 | system.md §3-1 | +| REQ-N-010 | BI·공개조회·플로어플랜 열람 읽기복제 오프로드(운영 프라이머리 보호) | 필수 | system.md §3-1, §8-1 | +| REQ-N-011 | 워커 장애 시 가시성 타임아웃 후 재큐(멱등 Job) | 필수 | system.md §3-2 | +| REQ-N-012 | 웹접근성 WCAG 2.1 AA(핵심여정 AAA 지향)·공공 KWCAG 2.2 병행 | 필수 | FEATURE_BACKLOG §6-N1 | +| REQ-N-013 | 캔버스/맵 비시각 대안(데이터 테이블·검색·키보드 선택) 필수 제공 | 필수 | FEATURE_BACKLOG §6-N1 | +| REQ-N-014 | 다국어 i18n 외부화(한 기본+영/중/일)·로케일 전환·hreflang·로케일 포맷 | 필수 | FEATURE_BACKLOG §6-N3 | +| REQ-N-015 | 라이트/다크 테마 CSS 토큰 2벌·prefers-color-scheme 연동·선택 영속 | 필수 | FEATURE_BACKLOG §6-N4 | +| REQ-N-016 | 반응형(데스크톱=설계/에디터, 모바일=현장/조회/승인) | 필수 | PLANNING §8, §2-1 | +| REQ-N-017 | 단일 공간 원천(M2폴리곤·M4배선 매퍼 권위, 소비 모듈 조회만·중복 저장 금지) | 필수 | app.md, data.md | +| REQ-N-018 | 관측성(로그·메트릭·트레이스) 관리존 수집, 로그에 자격증명·PII·스택트레이스 미기록 | 필수 | network.md, tech.md | +| REQ-N-019 | 공개영역 CDN·요청률 상한·slowloris 타임아웃(가용성 계층 방어) | 필수 | network.md §7 | +| REQ-N-020 | tenant_id 선두 복합 인덱스 표준화(격리 쿼리 성능) | 필수 | §8-2 | +| REQ-N-021 | BI 데이터마트(스타 스키마 Fact/Dim) 야간 배치 ETL 또는 읽기복제 적재 | 필수 | data.md, §M16-1 | + +### 3-4. 보안 요구사항 (REQ-S) + +| REQ-ID | 요구사항 | 유형 | 출처 | +|---|---|---|---| +| REQ-S-001 | 외부 API 정책: 온프레미스 Ollama 기본, Claude(api.anthropic.com)·Gemini(나노바나나)만 승인 예외, 그 외 금지 | 필수 | SECURITY.md §1 | +| REQ-S-002 | GEMINI_API_KEY 나노바나나 Python 워커 env only(백엔드 미취급), Spring은 큐/콜백만 | 필수 | SECURITY.md §1 | +| REQ-S-003 | 자격증명·키·내부IP·SSH·워커토큰 응답/로그/에러/커밋 완전 제외·마스킹 | 필수 | SECURITY.md §2 | +| REQ-S-004 | admin 비밀번호 env `ADMIN_PASSWORD_ENC`(AES-256-GCM)+별도 키파일→기동 시 BCrypt 재시드, 하드코딩 시드 금지 | 필수 | SECURITY.md §3 | +| REQ-S-005 | JWT(HS256)+2차 인증 OTP/EMAIL(TOTP RFC6238)+로그인 실패 잠금(관리자 해제) | 필수 | SECURITY.md §4, §5B-3 | +| REQ-S-006 | 행사 단위 RBAC(열람=멤버/홀매니저, 편집=역할별 게이트) — 테넌트 격리 ⊃ 행사 RBAC 3중 | 필수 | SECURITY.md §4, §2 | +| REQ-S-007 | 미등록 장치업체 초대·응찰 차단(NOT_REGISTERED_COMPANY 403) | 필수 | SECURITY.md §4, §M15 | +| REQ-S-008 | `/api/admin/**`=ADMIN 게이트, `/api/internal/**`=워커 공유 시크릿(X-Worker-Token)만 | 필수 | SECURITY.md §4 | +| REQ-S-009 | M5 나노바나나 이미지 응답 항상 watermarkRequired:true+watermarkText+notice(계약·심사 서류 금지) | 필수 | SECURITY.md §5, §6-6 | +| REQ-S-010 | 오류 응답 스택트레이스·relation/컬럼명·내부경로 미노출(ApiResponse.error 요약만) | 필수 | SECURITY.md §6 | +| REQ-S-011 | DataAccessException @RestControllerAdvice로 INTERNAL 요약 매핑(테이블/컬럼 누출 차단) | 필수 | SECURITY.md §6, system.md | +| REQ-S-012 | 민감 액션(승인·낙찰·설계변경·룰셋개정·리드접근·로그인/권한변경) TB_AUDIT_LOG 전수(tenant_id 포함) | 필수 | SECURITY.md §7, §6-N2 | +| REQ-S-013 | PII(관람객·리드) 동의·보존정책·최소수집·마스킹·응답 완전 제외, `*_enc` AES-256-GCM | 필수 | data.md §5, R10 | +| REQ-S-014 | 입력 검증(Bean Validation 화이트리스트·파일 MIME/크기 가드) | 필수 | FEATURE_BACKLOG §6-N2 | +| REQ-S-015 | XSS 방지(React 이스케이프·dangerouslySetInnerHTML 금지·CMS sanitize·CSP) | 필수 | FEATURE_BACKLOG §6-N2 | +| REQ-S-016 | 인젝션 차단(MyBatis `#{}` 강제·`${}` 금지, PostGIS/명령/LDAP) | 필수 | FEATURE_BACKLOG §6-N2 | +| REQ-S-017 | IDOR 방지(리소스 소유·tenant_id 검증), CSRF/SameSite·JWT 만료·회전 | 필수 | FEATURE_BACKLOG §6-N2 | +| REQ-S-018 | fail-closed 다층 테넌트 격리(컨텍스트 필터→서비스 가드→MyBatis 공통 인터셉터→PostGIS) | 필수 | §8-2 | +| REQ-S-019 | 의존성 취약점 SCA(OWASP Dependency-Check) CI 게이트·정기 패치 | 필수 | FEATURE_BACKLOG §6-N2 | +| REQ-S-020 | 보안영역 분리(공개 DMZ 쓰기권한 없음·데이터존 직결 불가, DMZ↔내부 HTTPS만·DB 프로토콜 횡단 금지) | 필수 | network.md | + +--- + +## 4. 평가 관점 (공공 SI 표준 배점 — 가정) + +> 실제 RFP·평가표가 없어 공공 정보화 SI 통례를 가정한다. **[가정]** — 실제 공고 확인 시 교체. + +| 구분 | 평가부문 | 배점(가정) | win theme 우선순위 근거 | +|---|---|---|---| +| 기술 | 사업이해·추진전략 | 10 | 전시 도메인·As-Is 병목 이해(§3) | +| 기술 | **AI 시각화·설계 자동화(핵심 차별화)** | **20** | M2~M5 P0 코어 + 나노바나나 시공 예측(경쟁 전시테크 미보유 폐루프) | +| 기술 | 기능 구현(M1~M18 전 모듈) | 15 | 100대 기능(이미 63·부분 18·신규 19) | +| 기술 | 아키텍처·기술스택 | 10 | 확정 스택 정합·PostGIS 공간데이터·Python 워커 사이드카 | +| 기술 | 보안·개인정보(SECURITY 불변) | 10 | REQ-S 20항목·워터마크·PII·테넌트 격리 | +| 기술 | 비기능(성능·가용성·접근성·다국어) | 8 | SLO 99.5%·WCAG AA·KWCAG·i18n | +| 기술 | 멀티테넌시·확장성(COEX 온보딩) | 5 | §1A SaaS 확장 | +| 기술 | 사업관리·품질·일정 | 2 | Phase 1~3·QA 게이트 | +| **기술 소계** | | **80** | | +| 가격 | 입찰가격 | 20 | | +| **총계** | | **100** | | + +**win theme 우선순위(배점 가중)**: ① 나노바나나 시공 예측 시각화(최고 차별화, 20점) → ② 부스 배치·설계·배선 AI 자동화 폐루프(M2~M5) → ③ 공사 옥션(M15) 발주 종결 → ④ 보안·개인정보·워터마크(공공 신뢰) → ⑤ 멀티테넌트 SaaS 확장. + +--- + +## 5. 제출 규격 (가정) + +> 실제 RFP 규격이 없어 공공 SI 제안 통례를 가정한다. **[가정]** — 실제 공고 확인 시 교체. + +| 항목 | 가정값 | 비고 | +|---|---|---| +| 제안서 형식 | PowerPoint(.pptx) 기술제안서 | proposal-builder 파이프라인 정합 | +| 분량 | 자율(권장 40~80p) | 실제 공고 확인 필요 | +| 목차 | 사업이해→추진전략→기술제안(AI 시각화·설계·옥션·관람·BI)→아키텍처→보안→비기능→멀티테넌시→사업관리→기대효과 | §4 배점 정합 | +| 서식 | 발주처 지정 시 준수, 미지정 시 표준 제안 템플릿 | ⚠확인필요 | +| 필수 도식 | 모듈맵(§4)·아키텍처(§8)·나노바나나 파이프라인(§6)·옥션 플로우(§M15)·추진체계·일정(Phase 1~3) | PLANNING 근거 | +| 제출 부수·마감 | ⚠확인필요(실제 공고) | — | +| 자격요건 | ⚠확인필요(실적·인증 — CSAP/ISMS 등 공공 요건 가능성) | — | + +--- + +## 6. 확인 필요·상충 항목 (삭제 금지) + +| # | 항목 | 사유 | +|---|---|---| +| C1 | 예산·계약방식·사업기간·평가배점·제출규격 | 실제 RFP 부재 — 전부 가정, 공고 확인 시 교체 | +| C2 | kxwp/kxfp API 연동 | 폐쇄형·API 미공개, 킨텍스 IT 협의 필수(R3) — 초기 수동 릴레이 | +| C3 | 트렌치·CAD 실측 데이터 | 미확보, 공개 스펙 기반 가정 그리드+'가정' 라벨(R4) | +| C4 | 인터넷 요금 정합성(150,000원 vs KT 80,000원 병존) | 킨텍스 확인 필요(R8) | +| C5 | 나노바나나 Gemini 외부 API 승인(G1) | 미승인 시 온프레미스 폴백 검토(R12) | +| C6 | 코엑스 등 신규 전시관 홀·요율·규정 실측 | 미확보, 온보딩 시 입력·근거 없는 추정 금지(§1A-5) | +| C7 | 사이니지 HW·비콘(wayfinding)·IoT 센서 연동 | 킨텍스 시설 인프라 협의 전제(M13·M14·M17) | +| C8 | 자격요건(공공 인증 CSAP/ISMS 등) | 실제 공고 확인 필요 | + +--- + +## 부록. REQ 총계 + +| 유형 | 개수 | +|---|---| +| REQ-F (기능) | 81 | +| REQ-A (AI) | 20 | +| REQ-N (비기능) | 21 | +| REQ-S (보안) | 20 | +| **총계** | **142** | + diff --git a/docs/deliverables/제안서/_gen/rtm.md b/docs/deliverables/제안서/_gen/rtm.md new file mode 100644 index 0000000..b48f731 --- /dev/null +++ b/docs/deliverables/제안서/_gen/rtm.md @@ -0,0 +1,196 @@ +# 요구사항 추적표 (RTM) — 킨텍스 자동전시시스템 제안서 + +> 작성: rfp-analyst · 작성일: 2026-07-11 · 버전 v1.0 +> 짝 문서: `rfp_analysis.md`(요구사항 정의). 본 RTM은 **REQ-ID ↔ 제안서 목차 섹션 1:1 매핑 준비 + 평가부문 매핑 + 반영 상태**의 단일 진실원천이다. +> 사용법: writer/deck-designer가 각 REQ를 제안서 본문/슬라이드에 반영하며 "제안서 섹션" 및 "반영상태(☐미반영/◑작성중/☑완료)"를 갱신한다. QA는 전 REQ 반영 여부를 이 표로 교차 점검한다. +> 제안서 목차 코드: **P1**사업이해 · **P2**추진전략 · **P3**기술제안(AI 시각화·설계·옥션·관람·BI) · **P4**아키텍처 · **P5**보안·개인정보 · **P6**비기능 · **P7**멀티테넌시·확장 · **P8**사업관리·일정·조직 · **P9**기대효과. (평가부문은 rfp_analysis §4 배점 기준) + +--- + +## 1. 기능 요구사항 (REQ-F) + +| REQ-ID | 요구사항 요약 | 유형 | 모듈 | 제안서 섹션(준비) | 평가부문 | 반영상태 | +|---|---|---|---|---|---|---| +| REQ-F-001 | 홀/반홀 가용성 실시간 캘린더 | 필수 | M1 | P3 판매·견적 | 기능 구현 | ☐ | +| REQ-F-002 | 규칙엔진 자동 견적 | 필수 | M1 | P3 판매·견적 | 기능 구현 | ☐ | +| REQ-F-003 | 배정신청 웹폼→HWP 자동생성 | 필수 | M1 | P3 판매·견적 | 기능 구현 | ☐ | +| REQ-F-004 | 부스 판매 인벤토리 관리 | 필수 | M1/M2 | P3 판매·견적 | 기능 구현 | ☐ | +| REQ-F-005 | 온라인 부스 셀프 선택·판매 | 필수 | M2 | P3 판매·견적 | 기능 구현 | ☐ | +| REQ-F-006 | 임대계약 전자서명 | 선택 | M6/M9 | P3 판매·견적 | 기능 구현 | ☐ | +| REQ-F-007 | 부스 배치 3안 자동생성 | 필수 | M2 | P3 AI 시각화·설계 | AI 시각화·설계(핵심) | ☐ | +| REQ-F-008 | 배치안 선택/병합 편집 | 필수 | M2 | P3 AI 시각화·설계 | AI 시각화·설계(핵심) | ☐ | +| REQ-F-009 | 배치 규정 자동검증·병합 후 재검증 | 필수 | M2 | P3 AI 시각화·설계 | AI 시각화·설계(핵심) | ☐ | +| REQ-F-010 | 최종안 버전기록·부스좌표 확정·초대링크 | 필수 | M2 | P3 AI 시각화·설계 | AI 시각화·설계(핵심) | ☐ | +| REQ-F-011 | 조립부스 옵션·3D 프리뷰 | 필수 | M3 | P3 AI 시각화·설계 | AI 시각화·설계(핵심) | ☐ | +| REQ-F-012 | 독립부스 설계 3안·선택/병합·버전 | 필수 | M3 | P3 AI 시각화·설계 | AI 시각화·설계(핵심) | ☐ | +| REQ-F-013 | 설계 규정 사전검증(높이·리깅·방염·이격) | 필수 | M3 | P3 AI 시각화·설계 | AI 시각화·설계(핵심) | ☐ | +| REQ-F-014 | 도면 업로드 비전 추출·검증 | 필수 | M3 | P3 AI 시각화·설계 | AI 시각화·설계(핵심) | ☐ | +| REQ-F-015 | 전기 용량·분전반 자동산출 | 필수 | M4a | P3 AI 시각화·설계 | AI 시각화·설계(핵심) | ☐ | +| REQ-F-016 | 배선 경로 자동생성(PostGIS 최단) | 필수 | M4 | P3 AI 시각화·설계 | AI 시각화·설계(핵심) | ☐ | +| REQ-F-017 | 위치표시도 자동생성 | 필수 | M4b | P3 AI 시각화·설계 | AI 시각화·설계(핵심) | ☐ | +| REQ-F-018 | 네트워크·급배수·압축공기 신청·마감 리마인더 | 필수 | M4b | P3 AI 시각화·설계 | 기능 구현 | ☐ | +| REQ-F-019 | 조명 조도 배치안 제안 | 선택 | M4a | P3 AI 시각화·설계 | AI 시각화·설계 | ☐ | +| REQ-F-020 | 마일스톤 자동생성·역산 알림 | 필수 | M6 | P3 서류·워크플로 | 기능 구현 | ☐ | +| REQ-F-021 | 신고서류 웹폼→HWP/PDF 자동생성 | 필수 | M6 | P3 서류·워크플로 | 기능 구현 | ☐ | +| REQ-F-022 | kxwp 제출 파일 릴레이 ⚠확인필요 | 필수 | M6 | P3 서류·워크플로 | 기능 구현 | ☐ | +| REQ-F-023 | 서류 버전·전자결재 워크플로 | 필수 | M6/§5B | P3 서류·워크플로 | 기능 구현 | ☐ | +| REQ-F-024 | OCR 계약·납품서 자동등록 | 필수 | AI | P3 서류·워크플로 | 기능 구현 | ☐ | +| REQ-F-025 | 역경매 옥션 개설·라운드·마감 | 필수 | M15 | P3 공사 옥션 | AI 시각화·설계(폐루프) | ☐ | +| REQ-F-026 | AI 자료 기반 견적서 응찰·PDF·버전 | 필수 | M15 | P3 공사 옥션 | AI 시각화·설계(폐루프) | ☐ | +| REQ-F-027 | 실시간 순위·자동마감 | 필수 | M15 | P3 공사 옥션 | 기능 구현 | ☐ | +| REQ-F-028 | 종합평가 낙찰 스코어·비교표 | 필수 | M15 | P3 공사 옥션 | 기능 구현 | ☐ | +| REQ-F-029 | 등록업체 검증 게이트(응찰 차단) | 필수 | M15/M7 | P3 공사 옥션 / P5 보안 | 보안·개인정보 | ☐ | +| REQ-F-030 | 등록업체 AI 매칭 추천 | 필수 | M7 | P3 공사 옥션 | 기능 구현 | ☐ | +| REQ-F-031 | 물량서(BOQ) 자동산출 | 필수 | M4/M15 | P3 공사 옥션 | AI 시각화·설계 | ☐ | +| REQ-F-032 | 낙찰→계약·발주 자동전환 | 필수 | M15 | P3 공사 옥션 | 기능 구현 | ☐ | +| REQ-F-033 | 반입/반출 슬롯 예약 | 선택 | M8 | P3 참가·물류 | 기능 구현 | ☐ | +| REQ-F-034 | 통행증 QR·중량물 우선 | 선택 | M8 | P3 참가·물류 | 기능 구현 | ☐ | +| REQ-F-035 | 지게차·부대장비·렌탈 주문 | 선택 | M8 | P3 참가·물류 | 기능 구현 | ☐ | +| REQ-F-036 | 철거 대기열 시뮬레이션 | 선택 | M8 | P3 참가·물류 | AI 시각화·설계 | ☐ | +| REQ-F-037 | 온라인 사전등록(유형별·중복검증) | 필수 | M10 | P3 관람 | 기능 구현 | ☐ | +| REQ-F-038 | 모바일 배지/QR 발급 | 필수 | M10 | P3 관람 | 기능 구현 | ☐ | +| REQ-F-039 | 현장 QR 체크인·즉석 인쇄·집계 | 필수 | M10 | P3 관람 | 기능 구현 | ☐ | +| REQ-F-040 | 오프라인 체크인 폴백 | 필수 | M10 | P3 관람 / P6 비기능 | 비기능 | ☐ | +| REQ-F-041 | 참가업체 리드캡처 | 필수 | M10 | P3 관람 | 기능 구현 | ☐ | +| REQ-F-042 | AI 리드 스코어링·분류 | 선택 | AI | P3 관람 | AI 시각화·설계 | ☐ | +| REQ-F-043 | 리드 팔로업 세그먼트 EDM | 필수 | M10/M12 | P3 관람 | 기능 구현 | ☐ | +| REQ-F-044 | 티켓발권·AI폼빌더·스마트배지 | 선택 | M10 | P3 관람 | 기능 구현 | ☐ | +| REQ-F-045 | AI 비즈매칭 추천 | 선택 | M11 | P3 관람 | AI 시각화·설계 | ☐ | +| REQ-F-046 | 미팅 슬롯·성과 리포트 | 선택 | M11 | P3 관람 | 기능 구현 | ☐ | +| REQ-F-047 | 이벤트 모바일앱·세션·채팅·설문 | 선택 | M11 | P3 관람 | 기능 구현 | ☐ | +| REQ-F-048 | 공개 홍보 사이트(SEO·다국어) | 필수 | M12 | P3 마케팅·공개 | 기능 구현 | ☐ | +| REQ-F-049 | 공개 인터랙티브 플로어플랜 | 필수 | M12 | P3 마케팅·공개 | 기능 구현 | ☐ | +| REQ-F-050 | 세그먼트 EDM·캠페인 자동화 | 필수 | M12 | P3 마케팅·공개 | 기능 구현 | ☐ | +| REQ-F-051 | 스폰서십 패키지·대시보드 | 필수 | M12/M16 | P3 마케팅·공개 | 기능 구현 | ☐ | +| REQ-F-052 | 실내 wayfinding·POI·경로 | 선택 | M13 | P3 현장운영 | 기능 구현 | ☐ | +| REQ-F-053 | 실시간 혼잡 모니터·예측 | 선택 | M14 | P3 현장운영 | AI 시각화·설계 | ☐ | +| REQ-F-054 | 홀 전력부하·주차 점유 | 선택 | M14 | P3 현장운영 | 기능 구현 | ☐ | +| REQ-F-055 | 안전 위반·이상탐지 알림 | 선택 | M14 | P3 현장운영 | AI 시각화·설계 | ☐ | +| REQ-F-056 | 납부 스케줄 자동생성·알림 | 필수 | M9 | P3 정산 | 기능 구현 | ☐ | +| REQ-F-057 | 유틸리티·부대 PG 결제 | 필수 | M9 | P3 정산 | 기능 구현 | ☐ | +| REQ-F-058 | 예치금 실사용 정산 투명화 | 필수 | M9 | P3 정산 | 기능 구현 | ☐ | +| REQ-F-059 | 세금계산서·옥션 수수료 정산 | 필수 | M9 | P3 정산 | 기능 구현 | ☐ | +| REQ-F-060 | 환불·취소 규정 자동 | 선택 | M9 | P3 정산 | 기능 구현 | ☐ | +| REQ-F-061 | 홀·기간별 가동률 대시보드 | 필수 | M16 | P3 경영 BI | 기능 구현 | ☐ | +| REQ-F-062 | 매출 구성·행사별 P&L | 필수 | M16 | P3 경영 BI | 기능 구현 | ☐ | +| REQ-F-063 | 전시장 ROI·RevPAD·㎡당 수익 | 필수 | M16 | P3 경영 BI | 기능 구현 | ☐ | +| REQ-F-064 | 참가사 리텐션·LTV 코호트 | 필수 | M16 | P3 경영 BI | 기능 구현 | ☐ | +| REQ-F-065 | 참가업체 관점 ROI(권한 격리) | 필수 | M16 | P3 경영 BI / P5 보안 | 기능 구현 | ☐ | +| REQ-F-066 | 경영진 KPI 대시보드·드릴다운 | 필수 | M16 | P3 경영 BI | 기능 구현 | ☐ | +| REQ-F-067 | CMS 게시 워크플로·버전 | 필수 | M17 | P3 마케팅·공개 | 기능 구현 | ☐ | +| REQ-F-068 | 참가업체 마이크로사이트 | 필수 | M17 | P3 마케팅·공개 | 기능 구현 | ☐ | +| REQ-F-069 | 다국어 콘텐츠·hreflang | 필수 | M17 | P3 마케팅·공개 / P6 | 비기능 | ☐ | +| REQ-F-070 | 사이니지 콘텐츠 배포 ⚠확인필요 | 선택 | M17 | P3 현장운영 | 기능 구현 | ☐ | +| REQ-F-071 | RBAC·감사·시스템설정 백오피스 | 필수 | M18/§5B | P5 보안 / P8 관리 | 보안·개인정보 | ☐ | +| REQ-F-072 | 룰셋·마스터데이터 버전관리 | 필수 | M18 | P4 아키텍처 / P8 | 아키텍처 | ☐ | +| REQ-F-073 | 공통코드·메뉴 관리 | 필수 | §5B | P8 관리 | 기능 구현 | ☐ | +| REQ-F-074 | 공통 업무모듈(일지·일정·쪽지·공지·검색) | 필수 | §5B | P8 관리 | 기능 구현 | ☐ | +| REQ-F-075 | 회의록(STT)·업무보고 통계 PDF | 필수 | §5B | P8 관리 | 기능 구현 | ☐ | +| REQ-F-076 | 통합 알림센터(WebSocket) | 필수 | §5B | P8 관리 | 기능 구현 | ☐ | +| REQ-F-077 | 멀티테넌트 격리·전시관 온보딩 | 필수 | §1A | P7 멀티테넌시 | 멀티테넌시·확장 | ☐ | +| REQ-F-078 | 테넌트 컨텍스트 해소 | 필수 | §1A | P7 멀티테넌시 | 멀티테넌시·확장 | ☐ | +| REQ-F-079 | 2계층 관리자(플랫폼/테넌트) | 필수 | §1A | P7 멀티테넌시 / P5 | 멀티테넌시·확장 | ☐ | +| REQ-F-080 | API·웹훅·CRM/ERP 연동 게이트웨이 | 선택 | 연동 | P4 아키텍처 | 아키텍처 | ☐ | +| REQ-F-081 | 역할별 프론트 포털 분리 | 필수 | §2-1 | P4 아키텍처 | 아키텍처 | ☐ | + +## 2. AI 요구사항 (REQ-A) + +| REQ-ID | 요구사항 요약 | 유형 | 모듈 | 제안서 섹션(준비) | 평가부문 | 반영상태 | +|---|---|---|---|---|---|---| +| REQ-A-001 | 나노바나나 시공 예상사진 샷세트 S1~S7 | 필수 | M5 | P3 AI 시각화(핵심) | AI 시각화·설계(핵심) | ☐ | +| REQ-A-002 | image-to-image 구조보존(골격/앵글 잠금) | 필수 | M5 | P3 AI 시각화(핵심) | AI 시각화·설계(핵심) | ☐ | +| REQ-A-003 | 구조화 프롬프트 사전·보존/교체 분리 | 필수 | M5 | P3 AI 시각화(핵심) | AI 시각화·설계(핵심) | ☐ | +| REQ-A-004 | S6 배선 오버레이 백엔드 래스터 합성 | 필수 | M5 | P3 AI 시각화(핵심) | AI 시각화·설계(핵심) | ☐ | +| REQ-A-005 | Before/After 드래그 슬라이더 | 필수 | M5 | P3 AI 시각화(핵심) | AI 시각화·설계(핵심) | ☐ | +| REQ-A-006 | RenderJob 방어(크기가드·SAFETY·쿼터) | 필수 | M5 | P3 AI 시각화 / P5 보안 | 보안·개인정보 | ☐ | +| REQ-A-007 | 단계별 로딩·비동기 큐·WebSocket 푸시 | 필수 | M5 | P4 아키텍처 | 아키텍처 | ☐ | +| REQ-A-008 | 간판 텍스트 비전 검수·후처리 합성 | 필수 | M5 | P3 AI 시각화 | AI 시각화·설계 | ☐ | +| REQ-A-009 | 부스 배치 3안 AI(제약 솔버+LLM) | 필수 | M2 | P3 AI 시각화·설계 | AI 시각화·설계(핵심) | ☐ | +| REQ-A-010 | AI 규정 자동검증(배치·설계) | 필수 | M2/M3 | P3 AI 시각화·설계 | AI 시각화·설계 | ☐ | +| REQ-A-011 | AI 서류 검수(누락·불일치) | 필수 | M6 | P3 서류·워크플로 | AI 시각화·설계 | ☐ | +| REQ-A-012 | 규정 자연어 챗봇(근거·인용) | 선택 | AI | P3 서류·워크플로 | AI 시각화·설계 | ☐ | +| REQ-A-013 | AI 수요예측·수율/동적가격 | 필수 | M16 | P3 경영 BI | AI 시각화·설계 | ☐ | +| REQ-A-014 | AI KPI 브리핑·자연어 조회(Text-to-SQL) | 필수/선택 | M16 | P3 경영 BI | AI 시각화·설계 | ☐ | +| REQ-A-015 | AI 카피·이미지 초안·다국어 번역 | 필수 | M12/M17 | P3 마케팅·공개 | AI 시각화·설계 | ☐ | +| REQ-A-016 | AI 플랫폼 라우터(Claude→Ollama 폴백) | 필수 | §6 | P4 아키텍처 / P5 보안 | 아키텍처 | ☐ | +| REQ-A-017 | AI 근거(RAG)·인용·환각 차단 | 필수 | §6 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-A-018 | AI 리드 스코어·매칭·추천 | 선택 | M10/M11 | P3 관람 | AI 시각화·설계 | ☐ | +| REQ-A-019 | 현장 이상탐지·혼잡/철거 예측 | 선택 | M14/M8 | P3 현장운영 | AI 시각화·설계 | ☐ | +| REQ-A-020 | 도면 비전 추출·OCR 문서 등록 | 필수 | M3/AI | P3 AI 시각화·설계 | AI 시각화·설계 | ☐ | + +## 3. 비기능 요구사항 (REQ-N) + +| REQ-ID | 요구사항 요약 | 유형 | 제안서 섹션(준비) | 평가부문 | 반영상태 | +|---|---|---|---|---|---| +| REQ-N-001 | 코어 가용성 SLO 99.5%(성수기 99.9%) | 필수 | P6 비기능 | 비기능 | ☐ | +| REQ-N-002 | 백엔드 2인스턴스·롤링 무중단 | 필수 | P4 아키텍처 / P6 | 비기능 | ☐ | +| REQ-N-003 | PG 스탠바이 복제·failover·PITR | 필수 | P4 아키텍처 / P6 | 비기능 | ☐ | +| REQ-N-004 | Fail-Safe 배포(헬스체크·롤백) | 필수 | P8 사업관리 | 사업관리·품질 | ☐ | +| REQ-N-005 | degraded 모드(목 응답·폴백) | 필수 | P4 아키텍처 / P6 | 비기능 | ☐ | +| REQ-N-006 | 나노바나나 40초·1024px 전처리 | 필수 | P6 비기능 | 비기능 | ☐ | +| REQ-N-007 | 대량 생성 제어(S1·S7·캐시·쿼터) | 필수 | P6 비기능 | 비기능 | ☐ | +| REQ-N-008 | 공간쿼리 GiST 실시간 | 필수 | P4 아키텍처 | 아키텍처 | ☐ | +| REQ-N-009 | 워커 독립 스케일 | 필수 | P4 아키텍처 | 아키텍처 | ☐ | +| REQ-N-010 | BI/공개 읽기복제 오프로드 | 필수 | P4 아키텍처 | 아키텍처 | ☐ | +| REQ-N-011 | 워커 장애 재큐(멱등 Job) | 필수 | P4 아키텍처 / P6 | 비기능 | ☐ | +| REQ-N-012 | WCAG 2.1 AA·KWCAG 2.2 | 필수 | P6 비기능 | 비기능 | ☐ | +| REQ-N-013 | 캔버스/맵 비시각 대안 | 필수 | P6 비기능 | 비기능 | ☐ | +| REQ-N-014 | 다국어 i18n·hreflang·로케일 포맷 | 필수 | P6 비기능 | 비기능 | ☐ | +| REQ-N-015 | 라이트/다크 테마 CSS 토큰 | 필수 | P6 비기능 | 비기능 | ☐ | +| REQ-N-016 | 반응형(데스크톱/모바일) | 필수 | P6 비기능 | 비기능 | ☐ | +| REQ-N-017 | 단일 공간 원천(중복 저장 금지) | 필수 | P4 아키텍처 | 아키텍처 | ☐ | +| REQ-N-018 | 관측성(로그·PII/스택트레이스 미기록) | 필수 | P5 보안 / P6 | 비기능 | ☐ | +| REQ-N-019 | 공개영역 CDN·요청률 상한 | 필수 | P4 아키텍처 / P6 | 비기능 | ☐ | +| REQ-N-020 | tenant_id 선두 복합 인덱스 | 필수 | P7 멀티테넌시 / P4 | 멀티테넌시·확장 | ☐ | +| REQ-N-021 | BI 데이터마트 배치 ETL/읽기복제 | 필수 | P4 아키텍처 | 아키텍처 | ☐ | + +## 4. 보안 요구사항 (REQ-S) + +| REQ-ID | 요구사항 요약 | 유형 | 제안서 섹션(준비) | 평가부문 | 반영상태 | +|---|---|---|---|---|---| +| REQ-S-001 | 외부 API 정책(Ollama 기본·Claude/Gemini 예외) | 필수 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-S-002 | GEMINI_API_KEY 워커 env only | 필수 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-S-003 | 자격증명·키 응답/로그/커밋 완전 제외 | 필수 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-S-004 | admin 비번 env 재시드(AES-256-GCM) | 필수 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-S-005 | JWT+2FA OTP(TOTP)·실패 잠금 | 필수 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-S-006 | 행사 RBAC(테넌트 격리 ⊃ 행사 3중) | 필수 | P5 보안 / P7 | 보안·개인정보 | ☐ | +| REQ-S-007 | 미등록 업체 차단(403) | 필수 | P5 보안 / P3 옥션 | 보안·개인정보 | ☐ | +| REQ-S-008 | admin/internal 엔드포인트 게이트 | 필수 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-S-009 | M5 이미지 워터마크 항상 포함 | 필수 | P5 보안 / P3 AI | 보안·개인정보 | ☐ | +| REQ-S-010 | 오류 응답 스택트레이스 미노출 | 필수 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-S-011 | DataAccessException 요약 매핑 | 필수 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-S-012 | 민감 액션 감사로그 전수(tenant_id) | 필수 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-S-013 | PII 동의·보존·마스킹·AES-256-GCM | 필수 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-S-014 | 입력 검증(Bean Validation·파일 가드) | 필수 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-S-015 | XSS 방지·CSP·CMS sanitize | 필수 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-S-016 | 인젝션 차단(MyBatis #{} 강제) | 필수 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-S-017 | IDOR 방지·CSRF·JWT 회전 | 필수 | P5 보안 | 보안·개인정보 | ☐ | +| REQ-S-018 | fail-closed 다층 테넌트 격리 | 필수 | P7 멀티테넌시 / P5 | 멀티테넌시·확장 | ☐ | +| REQ-S-019 | 의존성 SCA CI 게이트 | 필수 | P5 보안 / P8 | 사업관리·품질 | ☐ | +| REQ-S-020 | 보안영역 분리(DMZ/내부망) | 필수 | P4 아키텍처 / P5 | 보안·개인정보 | ☐ | + +--- + +## 5. 커버리지 요약 + +| 유형 | REQ 수 | 필수 | 선택 | +|---|---|---|---| +| REQ-F (기능) | 81 | 62 | 19 | +| REQ-A (AI) | 20 | 15 | 5 | +| REQ-N (비기능) | 21 | 21 | 0 | +| REQ-S (보안) | 20 | 20 | 0 | +| **총계** | **142** | **118** | **24** | + +**제안서 섹션 커버리지 목표**: P3(기술제안)에 최다 REQ 집중(AI 시각화·설계 win theme), P5(보안)에 REQ-S 20 + 관련 REQ-A/F, P4(아키텍처)에 REQ-N/A 인프라 항목, P7(멀티테넌시)에 §1A 계열. QA는 전 142개 REQ의 반영상태가 ☑ 완료되었는지 본 표로 최종 검증한다. + +## 6. 확인 필요 REQ (제안 전 발주처 협의) + +| REQ-ID | 확인 사항 | rfp_analysis 참조 | +|---|---|---| +| REQ-F-022 | kxwp API 연동(폐쇄형·미공개) | C2 | +| REQ-F-070 | 사이니지 HW 연동 | C7 | +| REQ-F-052/053/054/055 | wayfinding 비콘·IoT 센서 인프라 | C7 | +| REQ-A-001~008 | 나노바나나 Gemini 승인(G1) — 미승인 시 온프레미스 폴백 | C5 | +| REQ-F-002 | 인터넷 요금 정합성·요율 공식본 | C4 | +| REQ-F-077 | 코엑스 등 신규 전시관 실측 데이터 | C6 | + diff --git a/docs/deliverables/제안서/_gen/tech_advisory.md b/docs/deliverables/제안서/_gen/tech_advisory.md new file mode 100644 index 0000000..2cf7e97 --- /dev/null +++ b/docs/deliverables/제안서/_gen/tech_advisory.md @@ -0,0 +1,374 @@ +# 킨텍스 자동전시시스템 구축 — 기술·아키텍처 자문서 (Tech Advisory) + +> 작성: proposal-tech-advisor(아키텍처 허브) · 작성일: 2026-07-11 · 버전 v1.0 +> 입력: `rfp_analysis.md`(REQ 142)·`rtm.md`·`proposal_strategy.md`+`proposal_outline.md`(Win Theme 5·필수 도식 12종)·**`docs/architecture/{app,system,tech,data,network}.md`**(AA/SA/TA/DA/NA 확정 아키텍처 5종)·`docs/PLANNING.md` v3.0·`docs/SECURITY.md`·`docs/WORK_STATUS.md`(라이브 실적)·kintex `CLAUDE.md`(스택 확정). +> **성격**: 아키텍처 전문가 풀(AA·SA·TA·DA·NA)이 이미 확정한 5종 아키텍처를 **재발명하지 않고**, 제안서(writer·visual-designer·deck-designer)용으로 **종합·상충 조정·재구성**한 기술 자문. 전문가 풀 산출물이 이미 충분해 추가 소집(kintex-sa/ta/da) 불요 — 공백(SM 운영·SLA·WBS/공수·도식 사양)만 본 문서가 저술. +> **원칙(불변)**: ①과장 금지 — WORK_STATUS 라이브 확인분만 "구축 완료/검증됨", 나머지는 "구현 계획". ②시크릿(키·비번·내부IP) 미기재. ③실현 가능성 우선 — 확정 스택·기존 스캐폴드·이식 자산으로 뒷받침. + +--- + +## 0. 기술 신뢰성 기반 — 라이브 실적 vs 구현 계획 (과장 방지 핵심) + +> 평가위원 최대 관심 = "제안이 말뿐인가, 실제로 되는가". 본 절이 그 답이다. WORK_STATUS(2026-07-11) 라이브 확인분과 구현 계획을 **명확히 구분**한다. 제안서 P8(사업관리)·P4(아키텍처) 신뢰 근거로 인용. + +### 0-1. 구축 완료·라이브 (검증됨 — "이미 돈다") + +| 영역 | 라이브 실적 | 검증 근거 | +|---|---|---| +| **개발/배포 인프라** | `kintex.zioinfo.co.kr` TLS + 백엔드 8021 + PostGIS + Redis + 나노바나나 워커 systemd 상주 | WORK_STATUS §4 인프라(라이브) | +| **CI/CD 자동배포** | Gitea webhook → `deploy_kintex.sh`(bootJar+vite build→배포→health→롤백). push 시 자동배포 | WORK_STATUS §2·§7 | +| **나노바나나 이미지 생성** | Gemini 라이브(G1 소유자 승인 완료), `gemini-3.1-flash-image-preview` 워커 | WORK_STATUS §2·§4 | +| **인증(JWT/RBAC/2FA)** | JWT+RBAC 6역할 + TOTP OTP + 로그인 실패 잠금 + admin env 시더(admin123 금지) | WORK_STATUS §4, Flyway V7/V8 | +| **P0 코어 매퍼(PostGIS)** | M2~M5 매퍼 배선(501 해소)·룰엔진·공간 SQL | WORK_STATUS §4 백엔드(라이브) | +| **공통 레이어(WISE 이식)** | 시스템관리·공통 업무기능·공개 인증(register/forgot/reset) | Flyway V1~V9(테이블 39) | +| **프론트(Stitch 반영)** | 로그인(히어로+CI+회원가입/비번찾기/아이디기억) + 부스 설계 스튜디오·대시보드·갤러리·신규 8+5화면 | WORK_STATUS §4·§6 | +| **평면도/CAD 자산** | 홀별 평면도 JPG 15 + CAD(제1전시장 "평면,트렌치.dwg") 확보 → 트렌치 실측 원천 | WORK_STATUS §4, CLAUDE.md 확보자산 | + +→ **메시지**: "제안 아키텍처는 도상이 아니라 **이미 기동 중인 시스템**이다. 스캐폴드·인증·PostGIS 코어·나노바나나·자동배포 파이프라인이 라이브로 검증됐다." (전시테크/범용 SI가 제시하지 못하는 실증 우위) + +### 0-2. 구현 계획 (설계 확정·미완 — "표준대로 채운다") + +| 영역 | 상태 | 근거 | +|---|---|---| +| 도메인 모듈 M15 옥션·M10 관람·M12/17 CMS·M16 BI·M18 관리자 | 설계 확정, 구현 대기(Phase D) | IMPLEMENTATION_BACKLOG Phase D | +| 멀티테넌시(tenant_id 전파·컨텍스트 해소) | 데이터모델 확정, 스키마·컨텍스트 구현 대기 | WORK_STATUS §6, data.md §1A | +| 실데이터 집계 전환(신규 5화면 샘플→API) | 화면 이식 완료, 집계 API 미구축 | WORK_STATUS §6, UNDEVELOPED_BACKLOG §1 | +| 접근성/i18n/테마 전면 적용 | NFR 표준 확정, 전면 스윕 대기 | WORK_STATUS §6 | +| 역할별 프론트 번들 분리 | 방식 확정 대기(모노레포 vs 서브패스) | tech.md §9-5 | +| AiTextRouter/AiConfig(텍스트 AI) | 설계 확정(UIWS 패턴), 착수 대기 | tech.md §6-1·R-T7 | + +→ **원칙**: 위 항목은 제안서에서 **"구현 계획"**으로만 서술. "구현 완료"로 오기 금지(감점/신뢰 훼손 리스크). + +--- + +## 1. 목표 아키텍처 종합 (5종 아키텍처 → 제안서 재구성) + +### 1-1. 목표 아키텍처 4-Tier + 사이드카 (한 문장) + +**React 18/19(Vite·TS) 역할별 분리 프론트 → SSO(JWT+2FA)·이중 RBAC → 공유 Spring Boot 3.2.5(Java 17)+MyBatis 모듈러 모놀리스 → PostgreSQL+PostGIS 단일 공간 원천(+읽기복제) / Redis 비동기 큐 / 오브젝트 스토리지**, 그 위에 **나노바나나 Python 워커 사이드카**(이미지 생성)와 **Claude AI(AiTextRouter·Ollama 폴백)**(텍스트 지능)를 **얇은 큐/HTTP 계약으로 결합**한다. (app.md §1·§10, system.md §1~§2, tech.md §1) + +### 1-2. 계층별 종합 (전문가 풀 산출 통합) + +| 계층 | 구성(확정) | 권위 문서 | 핵심 근거 | +|---|---|---|---| +| **표현(App)** | 역할별 6프론트(organizer·exhibitor·contractor·ops·admin·public/visitor) 번들 분리 + 공유 디자인시스템/컴포넌트/api-client 상속. 데스크톱=설계·에디터, 모바일=현장·조회·승인 | app.md §10, system.md §2-1 | 최소권한·공격면 축소, 중복구현 금지 | +| **인증·인가** | 단일 JWT SSO(HS256, jjwt 0.12.5) + TOTP 2FA(RFC6238) + 로그인 실패 잠금 + **이중 RBAC**(플랫폼 `plat`/행사 `roles·hm`) | app.md §6, tech.md §7 | WISE/UIWS 이식(재설계 금지) | +| **애플리케이션(백엔드)** | 공유 Spring Boot **모듈러 모놀리스**(`com.zioinfo.kintex.module.mN`, 4계층 Controller/Service/Mapper/DTO) + 룰엔진 + 배치/배선 엔진(PostGIS) + 옥션·BI·CMS 서비스 | app.md §1~§5·§10-2 | 단일 공유 백엔드·경로/RBAC로 역할 표면 분리 | +| **비동기** | Redis 큐(RenderJob·서류·EDM·알림) + 옥션 실시간 순위/타이머 + 캐시/쿼터/WS 세션 상관. STOMP over WebSocket 실시간 푸시 | app.md §8·§9, system.md §6-3 | 백엔드 무상태화 → 수평 확장 | +| **AI(이미지)** | 나노바나나 Python 워커(google-genai, `gemini-3.1-flash-image-preview`) — image-to-image 구조보존 + 워터마크 후처리 + S6 로컬 PIL 래스터 | tech.md §1-3, system.md ADR-1 | google-genai=Python SDK, Java 재구현 회피 | +| **AI(텍스트)** | `AiTextRouter`: Claude 기본(`api.anthropic.com` 승인 예외) → **Ollama 폴백**(폐쇄망/장애). 부스 배치는 **제약 솔버 주도**, LLM은 조건해석만 | tech.md §6 | 결정론 우선·환각 차단·데이터 주권 | +| **데이터** | PostgreSQL+PostGIS 단일 공간 원천(부스 Polygon·트렌치 Point·배선 LineString, SRID 0) + 프라이머리-스탠바이 복제 + 읽기복제(BI·공개 오프로드) + BI 데이터마트(스타 스키마) | data.md §2~§6 | 단일 공간 원천 불변·운영/분석 분리 | +| **저장(바이너리)** | 오브젝트 스토리지(도면·생성이미지·서식·PDF·콘텐츠) — 경로만 DB, CDN 프론팅 | data.md §0-1, system.md §2-1 | 대용량 독립 확장 | +| **네트워크·보안영역** | 4존+관리존(엣지·DMZ·내부망·AI워커·데이터·관리) 계층 방어, DMZ→데이터존 직결 금지, egress 화이트리스트(Claude·Gemini·PG·SMTP) | network.md §2~§5 | 공개/내부 물리·논리 분리·폐쇄망 지향 | + +### 1-3. 멀티테넌시 격리 구조 (다중 전시관 SaaS) + +- **격리 축**: `tenant_id`(전시관: KINTEX #1·COEX #2…) ⊃ `event_id`(행사) ⊃ 행사 RBAC(역할). 3중 격리. +- **fail-closed 다층 방어**(REQ-S-018): ①테넌트 컨텍스트 필터(서브도메인 우선+사용자소속 보조, 불일치 거부) → ②서비스 가드 → ③MyBatis 공통 인터셉터(tenant_id 자동 주입) → ④PostGIS/쿼리(선두 복합 인덱스). 어느 한 층이라도 불일치면 차단. +- **온보딩**: 코드 배포 없이 **데이터 온보딩**(홀·요율·규정 룰셋·마스터데이터 입력). 기능 로직 불변. (app.md §6, data.md §4-4, system.md §3-1 멀티테넌시) +- **주의(현실)**: 멀티테넌시는 **구현 계획**(WORK_STATUS §6). 제안 시 "데이터모델 확정→스키마 tenant_id→컨텍스트 배선" 3단계 로드맵으로 서술, 백필 전 단일테넌트 무중단 동작→검증 후 필터 활성화(회귀 방지). + +### 1-4. 필수 도식 12종 — 작도 사양 (deck-designer 직접 작도용) + +> 각 도식의 **박스·연결·라벨 텍스트**를 명세. visual-designer(선 SVG 아이콘)·deck-designer(python-pptx)가 재해석 없이 작도. 모든 라벨은 한국어, 아이콘은 선(stroke) 스타일. + +#### ① 3중 해자 벤다이어그램 (S04·S12) +- **형태**: 3원 교집합 벤다이어그램. 3개 동일 크기 원 60% 겹침. +- **원 라벨**: 원A "나노바나나 시공 예측 이미지"(부제: image-to-image 구조보존·40초·S1~S7), 원B "PostGIS 실측 공간데이터"(부제: 부스 폴리곤·트렌치 포인트·배선 LineString 단일 원천), 원C "공사 옥션 폐루프"(부제: AI 자료→응찰→낙찰→발주 자동전환). +- **중앙 교집합(3원 겹침)**: 강조 배지 "재현 난이도 높은 결합 = 우리만의 해자(Moat)". 2원 교집합에는 회색 "단일 요소는 모방 가능". +- **하단 캡션**: "셋의 결합은 경쟁 전시테크·범용 SI가 재현하기 어렵다." + +#### ② 모듈맵 — 생애주기 × 우선순위 매트릭스 (S16) +- **형태**: 가로축=전시 생애주기 6단계(판매·기획 → 설계·시각화 → 발주·계약 → 참가·관람 → 현장운영 → 사후·경영), 세로축=우선순위(P0 코어 / P1 / P2). +- **박스(모듈 칩)**: P0행에 **M2 플로어플랜·M3 부스설계·M4 유틸리티·M5 나노바나나**(강조색·굵은 테두리). P1행 M1·M6·M7·M9·M15(옥션 강조)·M10·M12·M16·M17·M18·§5B 공통·§1A 멀티테넌시. P2행 M8·M11·M13·M14. +- **하단 레이어 띠**: "공통/시스템관리 레이어(§5B) — 전 모듈 선행 기반" + "멀티테넌시(§1A) — tenant_id 격리". +- **캡션**: "18개 모듈 + 공통 레이어를 한 장으로 조망. P0 4개가 심장." + +#### ③ 나노바나나 파이프라인 플로우 (S20) +- **형태**: 좌→우 수평 플로우, 8박스. +- **박스·라벨**: `[사용자: 렌더 요청]` → `[Spring 백엔드: RenderJob 생성·쿼터 확인]` → `[Redis 큐 kintex:renderjob:queue(leftPush)]` → `[나노바나나 Python 워커(BLPOP 소비)]` → `[Gemini image-to-image(G1 승인·라이브)]` → `[워터마크 후처리·S6 로컬 PIL 래스터]` → `[오브젝트 스토리지 적재]` → `[pub/sub → 백엔드 relay → WebSocket/STOMP /topic/render/{jobId}]` → `[프론트: 완료 푸시·갤러리 갱신]`. +- **분기 주석**: 워커 하단에 점선 "degraded: G1 미승인/Gemini 장애 시 목(mock) 응답·구조·워터마크 유지". "성공 시에만 쿼터 차감". +- **보안 배지**: `GEMINI_API_KEY`는 워커 env only(백엔드 미취급). +- **캡션**: "이미지 생성 전면 비동기 — 사용자 동기 대기 없음, 평균 40초." + +#### ④ Before/After 슬라이더 (S21) +- **형태**: 좌우 분할 이미지 카드 + 중앙 세로 드래그 핸들. +- **라벨**: 좌 "Before: 빈 부스(도면/실측)", 우 "After: 시공 후 예상(AI 생성·워터마크)". 핸들 "드래그로 비교". +- **접근성 배지**: "ARIA slider·키보드 좌우 조작 지원(WCAG AA)". +- **하단**: 워터마크 텍스트 예시 배지 "AI 생성 예상 이미지 — 실제 시공과 다를 수 있음. 계약·심사 서류 사용 금지." + +#### ⑤ 3안 비교 화면 (S24) +- **형태**: 3열 카드(안1·안2·안3) + 상단 공통 홀 정보 바 + 하단 액션 바. +- **카드 라벨**: 각 카드 상단 "안 N — 최적화 목표"(예: 안1 "통로 효율 최대", 안2 "프리미엄 부스 최대", 안3 "균형"). 카드 본문 미니 배치도 썸네일 + 지표(판매면적 ㎡·부스 수·규정 위반 0/N). +- **액션 바**: `[안 선택]` `[구역/블록 병합 편집]` `[병합 후 재검증]`. +- **캡션**: "제약 솔버가 상이한 최적화 목표로 정확히 3안 생성. 사람이 선택·병합·최종 확정." + +#### ⑥ PostGIS 배선 오버레이 (S27) +- **형태**: 홀 평면도 위 배선 경로 오버레이. 부스 폴리곤(연회색) + 트렌치 포인트(◆) + 분전반(▣) + 배선 LineString(색상별). +- **색상 범례**: 전기=적색, 네트워크=청색, 급배수=녹색(S6 규약 정합). +- **주석 배지**: "최근접 트렌치 KNN(`geom <-> point`)", "최단 경로(`ST_Length`)·통로 횡단 최소화", 가정 트렌치엔 "가정 좌표(실측 대기)" 배지. +- **캡션**: "수기 위치표시도 폐지 — 좌표 클릭 자동 작도. SRID 0 홀 로컬 미터, GiST 인덱스 실시간." + +#### ⑦ 옥션 폐루프 흐름도 (S29) +- **형태**: 순환/좌→우 흐름, 좌측에 AI 자료 패키지 스택. +- **박스**: `[M2 배치 + M3 설계 + M4 배선/BOQ + M5 시공예측 이미지]`(AI 생성 자료 패키지) → `[옥션 개설(역경매/RFQ/고정가)]` → `[등록업체 검증 게이트: 미등록 응찰 차단 403]` → `[견적서(Quotation) 제출·PDF·버전]` → `[실시간 순위·라운드 마감(Redis 정렬셋·WS 델타)]` → `[종합평가 낙찰(가격+평판+납기)]` → `[Award → 계약/발주 자동전환(M6·M9 연동)]`. +- **캡션**: "AI 설계자료가 곧 발주 근거. 사진 수준 자료로 응찰→발주까지 한 흐름." + +#### ⑧ 종합평가 스코어 비교표 (S31) +- **형태**: 업체 행 × 평가항목 열 표 + 가중 합계 열 + 낙찰 하이라이트 행. +- **열**: 업체명 | 견적금액(점수) | 평판(점수) | 납기(점수) | **가중 종합점수** | 순위. +- **가중치 주석 바**: "가중치(예): 가격 0.6 / 평판 0.25 / 납기 0.15 — 옥션별 설정형(`weight` jsonb)". +- **하이라이트**: 1위 행 강조 + "낙찰(Award)" 배지 + "선정 사유·항목별 비교" 캡션. + +#### ⑨ 시스템 아키텍처 다이어그램 — 전 계층 (S41) +- **형태**: 상하 6밴드 계층도(system.md §2 논리 아키텍처 재구성). +- **밴드1 엣지/DMZ**: `[CDN·정적캐시]` `[WAF/Reverse Proxy(nginx)·TLS 종단·레이트리밋]`. +- **밴드2 역할별 프론트**: organizer·exhibitor·contractor·ops·admin(내부 배지)·public/visitor(공개 SSR/SEO/다국어 배지). +- **밴드3 SSO·RBAC**: `[JWT SSO + TOTP 2FA · 이중 RBAC(플랫폼/행사)]`. +- **밴드4 공유 백엔드**: `[REST + WebSocket/STOMP]` 아래 `[룰엔진]` `[배치·배선 엔진·PostGIS]` `[옥션 M15]` `[BI M16·KpiSnapshot]` `[CMS M17]` `[공개 API read-only]`. +- **밴드5 비동기**: `[Redis 큐·순위·타이머·캐시·쿼터]` → `[나노바나나 워커]` `[서류·EDM 워커]`. +- **밴드6 데이터**: `[PostgreSQL+PostGIS]` `[읽기복제(BI·공개)]` `[오브젝트 스토리지]`. +- **우측 외부 게이트 컬럼**: `[Gemini(G1·라이브)]` `[Claude(AiTextRouter)]` `[PG 결제]` `[kxwp 릴레이]` `[등록업체 DB 739]`. +- **연결 주석**: 워커→Gemini "egress only", 워커→백엔드 "WebSocket 완료 푸시", 백엔드→읽기복제 "BI/공개 오프로드". + +#### ⑩ 보안영역 분리도 (망 구성) (S47) +- **형태**: 좌→우 신뢰도 상승 존 다이어그램(network.md §2). +- **존 박스**: `[인터넷]` → `[엣지: CDN·WAF·DDoS]` → `[DMZ(공개): 공개LB·public SSR·visitor GW·공개 API GW·PG콜백 — 쓰기권한 없음]` → `[내부망(인증): 내부LB·SSO/2FA·내부 API GW·공유 백엔드]` → `[AI 워커존(egress 제한): Redis·나노바나나·Ollama]` → `[데이터존(최내곽): PostgreSQL+PostGIS·오브젝트 스토리지·읽기복제 — 아웃바운드 전면 차단]`. 상단 `[관리존: 배스천·관측성]`. +- **철칙 배지(굵게)**: "DMZ → 데이터존 직접 접근 절대 금지", "데이터존 아웃바운드 0(유출 경로 제거)", "admin. = VPN/허용IP+2FA, 인터넷 미도달". +- **egress 컬럼**: 승인 4목적지만(Claude·Gemini·PG·SMTP), 그 외 DROP. + +#### ⑪ 멀티테넌시 격리 아키텍처도 (S56) +- **형태**: 수직 4층 방어 스택 + 좌측 테넌트 컨텍스트 진입. +- **진입**: `[요청: 서브도메인(kintex./coex.) + JWT 사용자 소속]` → `[테넌트 컨텍스트 해소: 불일치 시 거부]`. +- **4층 박스(위→아래)**: `[①컨텍스트 필터]` → `[②서비스 가드]` → `[③MyBatis 공통 인터셉터(tenant_id 자동 주입)]` → `[④PostGIS/쿼리: tenant_id 선두 복합 인덱스]`. +- **우측 데이터**: `[TB_* … WHERE tenant_id = ctx]` 격리 표현. 하단 배지 "fail-closed — 한 층이라도 불일치면 차단". +- **캡션**: "KINTEX #1 검증 → COEX #2 코드 배포 없이 데이터 온보딩. 기능 불변, 데이터·권한만 분리." + +#### ⑫ 일정 간트 (Phase × 모듈) (S58) +- **형태**: 가로 타임라인 3구간(Phase 1 ~4M / Phase 2 ~4M / Phase 3 ~4M+), 세로 워크스트림 막대. +- **막대(Phase 1)**: 아키텍처(A)·공통레이어(B, 2FA/시스템관리)·P0 코어(C: M2·M3·M4·M5). +- **막대(Phase 2)**: 옥션 M15·관람 M10·BI M16·관리자 M18·판매/서류/정산 M1/6/7/9·CMS M12/17. +- **막대(Phase 3)**: 멀티테넌시·M11·M13·M14·배포 안정화·SM 이관. +- **마일스톤 다이아몬드**: G1(나노바나나 승인·완료)·G2(배포서버·완료)·Phase 게이트·QA 게이트·오픈. +- **캡션**: "선행 게이트 통제 + Phase 게이트 QA 통과 후 진행." + +> **추가 표준 도식**(공공 제안 필수, outline 명시): 추진체계도(S15)=거버넌스(PM/PMO/dev-PM)+아키텍트(AA·SA·TA·DA·NA)+코어/도메인/AI/QA/DevOps 팀 조직도 / 리스크 매트릭스(S59)=발생×영향 2×2에 R-1~R-8·C1~C8 배치 / 기대효과 인포그래픽(S61)=견적·배치·검수·위치표시도·시공예측 5지표 Before/After. 사양은 §2·§5·strategy §4 참조. + +--- + +## 2. Win Theme 기술 근거 (5선 — 실현 가능성 입증) + +### WT-1. 나노바나나 시공 예측 (배점 20 · 최우선) +- **기술 골자**: RenderJob 큐(Redis `kintex:renderjob:queue`) → Python 워커(BLPOP) → Gemini **image-to-image 구조보존** → 워터마크 후처리 → 오브젝트 스토리지 → WebSocket `/topic/render/{jobId}` 완료 푸시. +- **구조보존 메커니즘**(REQ-A-002·003): 참조 이미지 `inlineData` + 구조화 프롬프트 사전(BOOTH_TYPES·BOOTH_STYLES·FIXTURE_LAYERS)에서 **보존(골격·치수·통로·카메라 앵글) / 교체(스타일·재질만 사실화) 명시 분리**. ReRoomAI 검증 패턴 이식(reroomai-source.md). +- **방어**(REQ-A-006): 다층 크기가드·mimeType 자동감지·SAFETY 분기·친화적 한글 에러·**성공 시에만 쿼터 차감**. 간판 한글 렌더 실패 시 간판영역 후처리 합성(REQ-A-008). +- **S6 배선 오버레이**(REQ-A-004): Gemini 미경유 — **백엔드/워커 로컬 PIL 결정적 래스터 합성**(전기 적·네트 청·급배수 녹). 좌표 정확성 확보·비용/지연 제외. +- **실현 근거**: **라이브 검증**(G1 승인·워커 Gemini 실동작, WORK_STATUS §4). "말이 아니라 이미 돈다." +- **도식**: ③파이프라인·④Before/After. + +### WT-2. 배치·설계·배선 AI 3안 + 규정 자동검증 (배점 20+15 교차) +- **기술 골자**: 부스 배치 3안은 **결정적 제약 솔버**(비-LLM)가 상이한 최적화 목표로 생성, LLM(Claude)은 조건 해석·설명만(REQ-A-009). → 공공 "AI 신뢰성" 프레이밍의 핵심(결정론 주도). +- **규정 자동검증**(REQ-F-009·013, REQ-A-010): 룰셋(`compliance-v*.json` 버전 데이터)을 룰엔진이 평가 + PostGIS 공간 판정(통로폭 `ST_Distance/ST_Buffer`·비상구 `ST_Intersects`·홀 이탈 `ST_Contains`·바닥하중 홀별). 병합 후 재검증. 위반 시 `COMPLIANCE_BLOCKED`(422). +- **배선 자동 작도**(REQ-F-015~017): 기기목록→kW 합산→분전반 산출, 최근접 트렌치 KNN(`geom <-> point`)→최단 배선 LineString(`ST_Length`, 통로 횡단 최소 휴리스틱), 위치표시도 좌표 클릭 자동 작도(수기 폐지). +- **AI 신뢰 3층**: 결정적 알고리즘(제약 솔버·PostGIS) 중심 + LLM 보조 + **사람 최종 확정**. 규정검증=플래깅까지, 구조안전 판정은 구조기술사/킨텍스(Non-Goal). RAG 근거·인용·환각 차단(abstain, REQ-A-017). +- **실현 근거**: M2~M5 매퍼(PostGIS 공간 SQL)·룰엔진 **라이브**(WORK_STATUS §4). 3안 생성·병합·집계 API는 구현 계획. +- **도식**: ⑤3안 비교·⑥PostGIS 배선. + +### WT-3. 공사 옥션 폐루프 (배점 15 · 폐루프 핵심) +- **기술 골자**: `TB_AUCTION 1─N TB_QUOTATION ─ TB_AWARD`. 옥션 유형 설정형(REVERSE/RFQ/FIXED). AI 자료 패키지(M2~M5 참조 `attached_refs`) 열람 기반 견적서 제출·PDF·버전. 실시간 순위=Redis 정렬셋 + WebSocket `/topic/auction/{auctionId}` 델타 푸시, 라운드 마감=Redis 타이머. +- **등록 게이트**(REQ-S-007): 미등록 업체 응찰 원천 차단 `NOT_REGISTERED_COMPANY`(403). M7이 `TB_COMPANY.kintex_registered` 검증 권위. → 킨텍스 "등록업체 시공 필수" 규정을 시스템이 강제. +- **종합평가·발주 전환**(REQ-F-028·032): 가중 스코어(가격+평판+납기, `weight` jsonb) → Award → 계약/발주 자동전환(M6·M9 연동, 이벤트 디커플·순환 금지). +- **실현 근거**: 옥션은 **구현 계획**(Phase D-M15). 스캐폴드 4계층·큐·WS 패턴·데이터모델 확정으로 실현성 입증. +- **도식**: ⑦옥션 폐루프·⑧종합평가 스코어. + +### WT-4. 3중 보안 — 워터마크·PII·테넌트 (배점 10) +- **워터마크**(REQ-S-009): M5 이미지 응답 **항상** `watermarkRequired:true`+`watermarkText`+`notice`(계약·심사 서류 금지). 제거 불가(계약 강제, app.md §5-6). 워커 목/live 공통. +- **PII 격리**(REQ-S-013): 관람객/리드 `*_enc` AES-256-GCM 컬럼 암호화, 응답 완전 제외/마스킹, 동의 분리(privacy 필수/marketing 선택/share), 접근 감사 전수. BI 마트는 개인 식별자 비반입(집계만). +- **테넌트 3중**(REQ-S-018): §1-3 fail-closed 4층(컨텍스트→서비스→MyBatis→PostGIS). +- **외부 API 격리**(REQ-S-001·002): Ollama 기본 + Claude/Gemini만 승인 예외. `GEMINI_API_KEY` 워커 env only(백엔드 미취급), egress 워커존 단일 경로. +- **실현 근거**: 인증(JWT/RBAC/2FA/admin env)·워터마크 **라이브**. PII 암호화·테넌트 필터는 구현 계획. +- **도식**: ⑩보안영역 분리·⑪멀티테넌시 격리. + +### WT-5. 멀티테넌트 SaaS 확장 (배점 5 · 미래가치) +- **기술 골자**: §1-3. tenant_id 전파 + 2계층 관리자(플랫폼 슈퍼관리자 테넌트스위처 / 테넌트 관리자 단일스코프) + 컨텍스트 해소. 온보딩 6단계=마스터데이터 입력 수준. +- **개발 부담 최소화**(strategy R-8): 멀티테넌시=격리 레이어만 추가, 기능 로직 불변. 백필 전 단일테넌트 무중단→검증 후 필터 활성화(회귀 방지). +- **실현 근거**: 구현 계획(WORK_STATUS §6). GUARDiA 표준 프레임워크 멀티테넌트 패턴 재사용. +- **도식**: ⑪멀티테넌시 격리. + +--- + +## 3. 비기능(NFR) 충족안 — REQ-N 21건 전부 대응 (P6·P4) + +> 근거: system.md §3(확장성·HA·성능·용량)·tech.md §5(관측성·성능)·data.md §3·§6·network.md §7. **SLO 99.5%(성수기 99.9% 지향)**. + +| REQ-ID | 요구 | 충족 방안(기술) | 측정/게이트 | 근거 | +|---|---|---|---|---| +| REQ-N-001 | 코어 SLO 99.5% | 무상태 백엔드 + Redis 외부화 + HA(§아래) | 월 가용성 ≥99.5%, `/actuator/health` | system.md §3-2 | +| REQ-N-002 | 백엔드 2인스턴스·롤링 무중단 | 최소 2 인스턴스 + 헬스체크 LB + 롤링 배포 | 무중단 배포 검증(스테이징→prod) | system.md §3-2 | +| REQ-N-003 | PG 스탠바이·failover·PITR | 프라이머리-스탠바이 스트리밍 복제 + Patroni/관리형 자동 failover + PITR | RPO 최소·RTO 분 단위 | system.md §3-2 | +| REQ-N-004 | Fail-Safe 배포 | 백업→배포→헬스체크 200→실패 시 롤백(이전 jar 유지) | **라이브**(deploy_kintex.sh) | WORK_STATUS §2 | +| REQ-N-005 | degraded 모드 | G1 미승인/Gemini 장애=워커 목 응답(구조·워터마크 유지), Claude 실패=Ollama 폴백, PG 복제지연=프라이머리 폴백 | 무네트워크 스모크 통과 | system.md §3-2 | +| REQ-N-006 | 나노바나나 40초·1024px | 전면 비동기(WS 완료 푸시) + 클라 Canvas 1024px 다운스케일+JPEG 0.85 전처리 | 단건 평균 ≤40s | system.md §3-3 | +| REQ-N-007 | 대량 생성 제어 | 자동생성 **S1·S7 한정** + 동일 스키마해시 캐시 + 행사별 RenderJob 쿼터(`RENDER_EVENT_QUOTA` 기본 500·성공 시만 차감) | 쿼터/캐시 히트율 | system.md §3-3, R6 | +| REQ-N-008 | 공간쿼리 GiST 실시간 | 전 `geom` 컬럼 GiST 인덱스(트렌치 KNN·통로버퍼·비상구 교차) | 배치·배선 P95 <2s | data.md §3-4 | +| REQ-N-009 | 워커 독립 스케일 | 나노바나나·서류·EDM 워커 큐 깊이 기반 증감, 백엔드 응답성과 분리 | 큐 적체 모니터 | system.md §3-1 | +| REQ-N-010 | BI/공개 읽기복제 오프로드 | BI 집계·공개 조회·플로어플랜 열람 읽기복제 라우팅, 운영 프라이머리 보호 | 프라이머리 부하 격리 | system.md §3-1 | +| REQ-N-011 | 워커 장애 재큐(멱등) | 무상태 소비자 N대 + 가시성 타임아웃 후 재큐(멱등 Job) + AOF 지속화 + ACK | 진행 Job 유실 0 | system.md §3-2 | +| REQ-N-012 | WCAG 2.1 AA·KWCAG 2.2 | 시맨틱 마크업·ARIA·키보드·대비, 공공 KWCAG 2.2 병행 점검 | 접근성 자동+수동 감사 | rfp §6-N1 | +| REQ-N-013 | 캔버스/맵 비시각 대안 | 플로어플랜/배선 캔버스에 데이터 테이블·검색·키보드 부스 선택 대안 필수 제공 | 비시각 경로 검증 | rfp §6-N1 | +| REQ-N-014 | 다국어 i18n·hreflang | i18n 외부화(한 기본+영/중/일)·로케일 전환·hreflang·로케일 포맷 | 4로케일 전환 | rfp §6-N3 | +| REQ-N-015 | 라이트/다크 테마 | CSS 토큰 2벌·prefers-color-scheme 연동·선택 영속 | 테마 왕복 | rfp §6-N4 | +| REQ-N-016 | 반응형 | 데스크톱=설계/에디터, 모바일=현장/조회/승인 | 브레이크포인트 검증 | PLANNING §8 | +| REQ-N-017 | 단일 공간 원천 | M2 폴리곤·M4 배선 매퍼 권위, 소비 모듈 조회만·중복 저장 금지 | ArchUnit·계약 검수 | app.md §3-2, data.md §0-2 | +| REQ-N-018 | 관측성·미기록 | 로그·메트릭·트레이스 관리존 수집, 자격증명·PII·스택트레이스 미기록(`include-stacktrace: never`) | 로그 감사 | tech.md §5, network.md §8 | +| REQ-N-019 | 공개영역 CDN·요청률 상한 | 공개 SSG+CDN 캐시·요청률 상한·slowloris 타임아웃·동시연결 캡 | 스파이크 CDN 흡수 | network.md §7 | +| REQ-N-020 | tenant_id 선두 복합 인덱스 | 격리 쿼리 표준 인덱스(tenant_id 선두) | 격리 쿼리 성능 | data.md, §1-3 | +| REQ-N-021 | BI 데이터마트 배치 ETL | 스타 스키마(FACT/DIM) 야간 배치 ETL 또는 읽기복제 적재, KpiSnapshot | 원천-집계 정합(오차 0) | data.md §6 | + +**HA 구성 요약(P6 SLA 표 입력)**: 프론트/공개=CDN 다중엣지+nginx 다중화 / 백엔드=2+ 인스턴스 헬스체크 LB·롤링 / Redis=Sentinel(자동 failover)+AOF / PostgreSQL=프라이머리-스탠바이+자동 failover+PITR / 워커=무상태 N대·재큐 / 배포=Fail-Safe(롤백). **SLO: 코어 99.5%(성수기 99.9% 지향), 나노바나나 생성=best-effort 비동기(큐 소진 목표).** + +**용량 산정(P4·P6 근거)**: 단일 대형 행사 3,000~5,000부스(수만 지오메트리·GiST 필수) / RenderJob 부스 3,000×자동 2샷(S1·S7)+온디맨드=수천~1만 이미지(수 GB~수십 GB, OBJ+CDN·캐시 억제) / 리드·체크인 수만~수십만(파티셔닝 후보) / 동시 사용자 인증 수백+공개 수천~수만(CDN 흡수) / **DB 연결풀 Hikari max 3(`DB_POOL_MAX`)+PgBouncer 권고**(공유 PG 포화 방지). (system.md §3-4) + +--- + +## 4. 보안 충족안 — REQ-S 20건 전부 대응 (P5 · 시크릿 값 미기재) + +> 근거: SECURITY.md·app.md §5-6·§6·network.md·data.md §5·tech.md §7. **불변(위반=QA 반려)**. + +| REQ-ID | 요구 | 충족 방안(기술) | 근거 | +|---|---|---|---| +| REQ-S-001 | 외부 API 정책 | Ollama 기본 + Claude(`api.anthropic.com`)·Gemini만 승인 예외, egress 화이트리스트 그 외 DROP | network.md §5 | +| REQ-S-002 | GEMINI 키 워커 env only | 나노바나나 워커 env only, Spring은 큐/콜백만, 워커존 단일 egress | tech.md §3-5 | +| REQ-S-003 | 자격증명·키 완전 제외 | 응답/로그/에러/커밋 마스킹, `*_enc`·해시·내부IP·워커토큰 미노출 | tech.md §7 | +| REQ-S-004 | admin 비번 env 재시드 | `ADMIN_PASSWORD_ENC`(AES-256-GCM)+별도 키파일→기동 시 BCrypt 재시드, admin123 금지 | **라이브**(env 시더) | +| REQ-S-005 | JWT+2FA+실패 잠금 | JWT(HS256)+TOTP(RFC6238)+로그인 실패 잠금(관리자 해제) | **라이브**(V7/V8) | +| REQ-S-006 | 행사 RBAC 3중 | 테넌트 격리 ⊃ 행사 RBAC(열람=멤버/홀매니저, 편집=역할별 게이트) | app.md §6 | +| REQ-S-007 | 미등록 업체 차단 | M15 응찰·초대 `NOT_REGISTERED_COMPANY`(403), M7 검증 권위 | app.md §6-2 | +| REQ-S-008 | admin/internal 게이트 | `/api/admin/**`=hasRole(ADMIN), `/api/internal/**`=X-Worker-Token | app.md §5-5 | +| REQ-S-009 | 이미지 워터마크 항상 | M5 응답 항상 watermarkRequired:true+text+notice, 제거 불가 | **라이브**·app.md §5-6 | +| REQ-S-010 | 오류 스택트레이스 미노출 | `server.error.include-*: never` + ApiResponse.error 요약만 | tech.md §5-1 | +| REQ-S-011 | DataAccessException 요약 매핑 | `@RestControllerAdvice GlobalExceptionHandler` INTERNAL 요약(테이블/컬럼 누출 차단) | app.md §7-2 | +| REQ-S-012 | 민감 액션 감사 전수 | 승인·낙찰·설계변경·룰셋개정·리드접근·로그인/권한 `TB_AUDIT_LOG`(tenant_id 포함, `@Audited` AOP) | app.md §7-3 | +| REQ-S-013 | PII 동의·마스킹·암호화 | 동의 분리(privacy/marketing/share)·최소수집·`*_enc` AES-256-GCM·응답 제외·보존/파기 | data.md §5 | +| REQ-S-014 | 입력 검증 | Bean Validation 화이트리스트·파일 MIME/크기 가드(WAF+앱 이중) | tech.md §7, network.md §4-2 | +| REQ-S-015 | XSS 방지·CSP | React 이스케이프·dangerouslySetInnerHTML 금지·CMS sanitize·CSP | rfp §6-N2 | +| REQ-S-016 | 인젝션 차단 | MyBatis `#{}` 강제·`${}` 금지, PostGIS/명령/LDAP 파라미터 바인딩 | rfp §6-N2 | +| REQ-S-017 | IDOR·CSRF·JWT 회전 | 리소스 소유·tenant_id 검증, CSRF/SameSite, JWT 만료·회전 | rfp §6-N2 | +| REQ-S-018 | fail-closed 테넌트 격리 | 4층(컨텍스트 필터→서비스 가드→MyBatis 인터셉터→PostGIS) | §1-3 | +| REQ-S-019 | 의존성 SCA CI 게이트 | OWASP Dependency-Check CI 게이트·정기 패치 | rfp §6-N2 | +| REQ-S-020 | 보안영역 분리 | 공개 DMZ 쓰기 없음·데이터존 직결 불가·DMZ↔내부 HTTPS(mTLS 권장)만·DB 프로토콜 횡단 금지 | network.md §2·§4 | + +**보안 성숙도 강조점(P5)**: ①이미 라이브인 인증·워터마크·admin env(4·5·9번 실증) → "설계가 아니라 동작하는 통제". ②데이터존 아웃바운드 0으로 유출 경로 자체 제거(network.md 철칙). ③외부 AI 키 격리=네트워크 격리 정합(Gemini 워커존만, Claude 백엔드만, 데이터존 무egress). + +--- + +## 5. WBS·공수(M/M) 산정 (P8) + +> 근거: IMPLEMENTATION_BACKLOG Phase A~E·PLANNING §9 로드맵(Phase 1~3 각 ~4개월)·142 REQ·18 모듈. 산정 기반=유사 공공 AI SI 생산성 + 기능 규모(100대 기능: 기구현 63·부분 18·신규 19) + 라이브 스캐폴드로 인한 **착수 리스크·초기 구축 공수 절감** 반영. + +### 5-1. WBS 구조 (Phase × 산출물) + +| Phase | 기간(가정) | 주요 작업(WBS) | 완료 게이트 | +|---|---|---|---| +| **A 아키텍처·거버넌스** | 착수~1M | AA/SA/TA/DA/NA 5종 아키텍처(**완료**)·정합 검증 | 아키텍처 확정·불일치 0 | +| **B 공통/시스템관리 레이어** | ~Phase1 내 | 인증(JWT/2FA)·시스템관리·공통 업무기능·공통 컴포넌트(WISE 이식) | 2FA/RBAC/감사 왕복(**대부분 라이브**) | +| **C P0 부스 코어** | Phase1(~4M) | M2 플로어플랜(3안·규정검증)·M3 부스설계·M4 배선·M5 나노바나나 | 3안·병합·재검증·시각화 | +| **D P1 도메인** | Phase2(~4M) | M15 옥션·M10 관람·M12/17 CMS/공개·M16 BI·M18 관리자·M1/6/7/9 | 각 모듈 왕복·QA 통과 | +| **E P2·배포·확장** | Phase3(~4M+) | M11·M13·M14·**멀티테넌시**·역할별 번들 분리·배포 안정화·SM 이관 | (G2 후)배포·이관 | + +### 5-2. 직군별 공수 산정 (M/M) + +> 12개월(Phase 1~3) 기준. 라이브 스캐폴드/인프라/인증 실적으로 초기 구축 공수를 이미 일부 소화 → 산정에 반영(과다 산정 금지). Phase A는 대부분 완료(감독 공수만 잔여). + +| 직군 | Phase 1 | Phase 2 | Phase 3 | 합계(M/M) | 산정 근거 | +|---|---|---|---|---|---| +| 총괄 PM | 4 | 4 | 4 | 12 | 상주 1.0 FTE | +| 아키텍트(AA·SA·TA·DA·NA) | 8 | 4 | 2 | 14 | Phase A 집중(완료)→거버넌스 감독 | +| 백엔드(공통·코어·도메인) | 12 | 16 | 12 | 40 | 18모듈 코어, 최대 투입 직군 | +| 프론트엔드(역할별 6포털) | 8 | 12 | 8 | 28 | Stitch 이식+역할별 번들 | +| DB 엔지니어(PostGIS) | 4 | 4 | 2 | 10 | 공간 스키마·매퍼·BI 마트·멀티테넌시 | +| AI 개발(Claude·제약 솔버) | 4 | 4 | 2 | 10 | 배치 솔버·규정보조·예측·AiTextRouter | +| 시각화(나노바나나 워커) | 4 | 2 | 2 | 8 | 파이프라인(라이브)·샷세트·품질 | +| QA | 4 | 6 | 6 | 16 | 점진 경계면·보안 불변·회귀 | +| DevOps/인프라 | 2 | 2 | 4 | 8 | CI/CD(라이브)·배포·이관 | +| **소계** | **50** | **54** | **42** | **146** | | + +- **총 공수: 약 146 M/M**(핵심 개발) + PMO/형상관리·품질보증 오버헤드(약 4~8 M/M) → **총 ~150 M/M 규모**. +- **가격평가·투입계획 정합**: 위 산정은 가격제안 투입인력표(직군·기간·M/M)와 1:1 매핑. 라이브 실적(스캐폴드·인증·인프라·나노바나나)이 Phase A/B 공수를 실측 절감 → 동일 규모 대비 **착수 리스크·초기 구축비 우위**. +- **주의**: 예산·사업기간은 실제 RFP 부재로 [가정](공공 SI 통례). 실제 공고 확인 시 M/M·기간 즉시 재정렬. + +--- + +## 6. SM 운영 체계 (SLA·장애대응·정기점검·CI/CD 운영) + +> SI 구축 후 유지보수/운영 제안. **이미 라이브인 자동배포 파이프라인을 실적으로 인용**(과장 아님 — WORK_STATUS §2·§7 검증분). + +### 6-1. 운영 체계·조직(R&R) +- **서비스 데스크·ITSM 프로세스**: 요청(SR)·장애(Incident)·변경(Change)·배포(Release)·문제(Problem·RCA). 공통 업무모듈(통합검색·알림·회의록)·감사로그 기반 티켓 이력. +- **조직**: 운영 총괄 1 + 백엔드/프론트 유지보수 + DB/인프라(DevOps) + AI 워커 담당 + QA. 근무체계=평일 상주 + 행사 성수기(3~5·9~11월) 온콜. + +### 6-2. SLA 지표 +| 지표 | 목표 | 측정 | +|---|---|---| +| 코어 서비스 가용성 | **99.5%**(성수기 99.9% 지향) | 월 가용성·`/actuator/health` | +| 장애 응답시간 | 심각도별(P1 즉시·P2 30분·P3 4시간) | 티켓 타임스탬프 | +| 장애 복구시간(MTTR) | P1 ≤2h·P2 ≤1영업일 | 복구 완료 기록 | +| 배포 성공률 | ≥99%(Fail-Safe 롤백 자동) | 배포 로그 health 게이트 | +| 나노바나나 큐 소진 | best-effort(피크 워커 스케일아웃) | 큐 적체·처리량 | + +측정·보고: 월간 SLA 리포트(가용성·MTTR·티켓·배포). 페널티 체계는 계약 조건에 따름(RFP 확인 필요). + +### 6-3. 유지보수 활동 +- **예방정비·정기점검**: DB 인덱스/통계·복제 지연·백업(PITR) 정상성, Redis AOF·큐 백로그, 워커 하트비트, 디스크/스토리지 용량, 인증서(TLS) 만료 점검. +- **패치/보안 업데이트**: OWASP Dependency-Check SCA 정기 스캔(REQ-S-019)·의존성 패치, OS/미들웨어 보안 패치. 룰셋(요율·규정) **무중단 개정**(버전 데이터, M18 백오피스·감사 기록). +- **성능 튜닝**: PostGIS 공간 쿼리(GiST·EXPLAIN ANALYZE)·Hikari 풀·읽기복제 라우팅·BI 배치 ETL 시간 최적화. +- **형상관리**: Gitea `zio/kintex`·Conventional Commits·main 보호·환경 분리(dev/staging/prod). + +### 6-4. 장애 대응 +- **등급분류·에스컬레이션**: P1(서비스 중단)~P4(경미). 자동 알림(WebSocket/통합 알림센터)·온콜 에스컬레이션. +- **RCA·재발방지**: 장애 후 근본원인 분석(RCA) 리포트·재발방지 조치 티켓화. 감사로그·관측성(로그/메트릭/트레이스, PII·스택트레이스 미기록)로 추적. +- **degraded/BCP·DR**: G1/Gemini 장애=워커 목 응답(구조·워터마크 유지), Claude 장애=Ollama 폴백, PG 장애=자동 failover+PITR, 배포 실패=자동 롤백. 데이터 백업·복구 절차(RPO 최소·RTO 분 단위). + +### 6-5. CI/CD 운영 (라이브 실적 인용) +- **자동배포 파이프라인(라이브·검증됨)**: `workspace/kintex` → Gitea webhook → `deploy_kintex.sh`(bootJar + vite build → 배포 → **health 게이트 → 실패 시 롤백**). push 시 자동배포. (WORK_STATUS §2·§7) +- **운영 함정 숙지(실측 교훈)**: 서버 `/opt/zioinfo/deploy_server.py`(kintex 블록)·`/opt/kintex/` 수정 시 **반영+재시작 필수**(로컬만 고치면 웹훅 1ms no-op), 백엔드도 반드시 빌드, `sh ./gradlew`(실행권한), 로컬 vite rollup win32 크래시=**서버 빌드 신뢰**(tsc 통과 검증). + +### 6-6. 이행/이관 +- 인수인계(WORK_STATUS.md 인수인계 문서 체계 활용)·안정화·지식이전(운영자/개발자 지침서 PPT·프로그램 사양서)·종료 시 이관 계획. 운영 도메인 `kintex.wise.ai.kr` 전환(후속). + +--- + +## 7. RTM 기술 파트 갱신 입력 (REQ ↔ tech_advisory 절 매핑) + +> rfp-analyst RTM 반영상태 갱신용. 각 REQ 계열이 본 자문서 어느 절에서 기술적으로 대응되는지 매핑. QA는 이 표로 기술 파트 커버리지 교차 점검. + +| REQ 계열 | 범위 | tech_advisory 대응 절 | 제안서 목차 | +|---|---|---|---| +| REQ-F-007~019(배치·설계·배선 코어) | M2~M4 | §2 WT-2, §1-2, 도식 ⑤⑥ | P3 | +| REQ-F-025~032(옥션) | M15 | §2 WT-3, 도식 ⑦⑧ | P3 | +| REQ-F-037~055(관람·현장·물류) | M8·M10~M14 | §1-2 App/데이터, §3(오프라인 폴백 N-폴백) | P3 | +| REQ-F-061~066(BI) | M16 | §1-2 데이터, §3 REQ-N-021, data.md 마트 | P3 | +| REQ-F-071~081(관리·공통·멀티테넌시·포털) | M18·§5B·§1A | §1-2·§1-3, 도식 ⑪ | P4·P5·P7·P8 | +| REQ-F-001~006·020~024·033~036·048~051·056~060·067~070 | 판매·서류·정산·CMS·공개 | §1-2 계층·§2 WT, §6(룰셋 운영) | P3 | +| **REQ-A-001~008**(나노바나나) | M5 | §2 WT-1, 도식 ③④ | P3(핵심) | +| REQ-A-009·010·020(배치·규정·비전) | M2/M3 | §2 WT-2 | P3 | +| REQ-A-013·014(예측·KPI·Text-to-SQL) | M16 | §1-2 AI(텍스트), §3 N-021 | P3 | +| REQ-A-016·017(라우터·RAG·환각) | §6 | §1-2 AI(텍스트), §4(abstain) | P4·P5 | +| REQ-A-011·012·015·018·019(검수·챗봇·카피·리드·이상탐지) | 다수 | §1-2 AI(텍스트) | P3 | +| **REQ-N-001~021** | 비기능 21 | **§3 전체 표(21행 1:1)** | P6·P4 | +| **REQ-S-001~020** | 보안 20 | **§4 전체 표(20행 1:1)** | P5 | +| (인프라·HA·배포·관측성) | N-002·003·004·018 | §1-2·§3·§6 SM·§0 실적 | P4·P6·P8 | + +--- + +## 요약 보고 (오케스트레이터·writer·deck-designer용) + +**1. 도식 12종 사양 완비 여부**: ✅ **12/12 완비**(§1-4). ①3중 해자 벤 ②모듈맵 ③나노바나나 파이프라인 ④Before/After ⑤3안 비교 ⑥PostGIS 배선 ⑦옥션 폐루프 ⑧종합평가 스코어 ⑨시스템 아키텍처 ⑩보안영역 분리 ⑪멀티테넌시 격리 ⑫일정 간트 — 각 박스·연결·라벨 텍스트 작도 사양 기술. 추가 표준 도식 3종(추진체계도·리스크 매트릭스·기대효과)은 사양 위치 지정(§1-4 말미). + +**2. REQ 대응 커버리지**: **미대응 0**. REQ-N 21건 전부(§3 표 21행 1:1), REQ-S 20건 전부(§4 표 20행 1:1), REQ-F/REQ-A는 §1-2·§2 Win Theme·§7 매핑표로 전 계열 대응. 총 142 REQ 기술 파트 커버(§7 RTM 갱신 입력). + +**3. 공수 총 M/M**: **약 146 M/M**(핵심 개발, 직군 9종×Phase 3구간) + PMO/QA 오버헤드 4~8 → **총 ~150 M/M 규모**(12개월·Phase 1~3). 라이브 스캐폴드·인증·인프라·나노바나나 실적으로 Phase A/B 공수 실측 절감 반영 = 동일 규모 대비 착수 우위. + +**4. 과장 방지 준수**: 라이브 확인분(인프라·CI/CD·나노바나나·인증·워터마크·PostGIS 코어·평면도 자산)만 "구축 완료/검증됨", 도메인 모듈·멀티테넌시·집계 API·i18n/접근성 전면 적용은 "구현 계획"으로 명확 구분(§0). 시크릿(키·비번·내부IP) 전면 미기재. + +**5. 파일**: `C:\GUARDiA\workspace\kintex\_workspace\proposal\tech_advisory.md` diff --git a/docs/deliverables/제안서/_gen/visual_concepts.md b/docs/deliverables/제안서/_gen/visual_concepts.md new file mode 100644 index 0000000..62bbf17 --- /dev/null +++ b/docs/deliverables/제안서/_gen/visual_concepts.md @@ -0,0 +1,274 @@ +# 킨텍스 자동전시시스템 구축 — 도식 시각 컨셉 (Visual Concepts) + +> 작성: proposal-visual-designer · 작성일: 2026-07-11 · 버전 v1.0 +> 짝 문서: `design_system.md`(팔레트·타이포·레이아웃) · `assets/icons/*.svg`(선 아이콘 20종) · `tech_advisory.md` §1-4(도식 12종 박스·연결·라벨 사양) · `proposal_outline.md`(슬라이드 배치) +> 목적: 필수 도식 12종 + 표준 3종(추진체계·리스크·기대효과) + 표지·간지·3중 해자의 **시각 컨셉을 좌표·색·라벨 수준으로 구체화**. deck-designer가 python-pptx로 재해석 없이 작도. +> 좌표 규약: 단위 **inch**, 16:9 캔버스 13.333×7.5, 콘텐츠 폭 12.23(x 0.55~12.78), 본문 콘텐츠 y 1.45~6.9. 색 토큰=`design_system.md` §1. 폰트 맑은 고딕. +> 공통: 노드=ROUNDED_RECTANGLE, 카드 그림자 alpha 18%, 연결 화살표="→"(15pt)/"›"(16pt) SLATE, 하단 캡션 MUTED 9pt 1줄. **본문 10pt 하한 준수**. + +--- + +## A. 표지 (S01) — "도면이 아니라 사진으로 컨펌한다" + +**컨셉**: 좌측은 절제된 텍스트 존, 우측은 나노바나나 시공 예측 이미지가 대각으로 침투 — "왼쪽은 제안(텍스트), 오른쪽은 결과(사진)"의 물리적 은유. + +- **배경**: `BLUE_DK` 풀블리드(-0.1,-0.1,13.53,7.7). +- **우측 대각 이미지 존**: 평행사변형 2매 겹침 — ①`BLUE` (6.4,-1.5,9,11, PARALLELOGRAM) ②`PURPLE` (9.2,-2.0,7,12, PARALLELOGRAM). **그 위에 나노바나나 생성 부스 시공 사진(워터마크 포함)을 반투명(alpha ~35%) 합성** — 이미지 없으면 blue→purple 그라디언트 도형으로 대체(폴백). 이미지 우하단에 소형 워터마크 배지 "AI 생성 예상 이미지". +- **좌상 브랜드**: WHITE OVAL(0.85,0.8,0.42) + PURPLE 코어 OVAL(0.97,0.92,0.18) + "KINTEX · WISE AI" 15pt WHITE Bold (1.42,0.78). +- **문서 배지**: (0.85,2.35) "기술제안서" PURPLE 12pt / (2.72,2.35) "Technical Proposal" 딥블루 10.5pt. +- **대제목** (0.85,2.9,11,1.9): 2줄 46pt WHITE Bold — "킨텍스 자동전시시스템" / "구축 기술제안서". line 1.02. +- **슬로건 배너**(핵심): (0.85,4.75,11.4,0.7) 반투명 화이트 라운드 rect(alpha 12%) 위 PURPLE 좌측 바 + "신청서를 내는 순간, 시공 후 사진을 먼저 본다." 18pt WHITE Bold. +- **서브 카피** (0.88,5.6): "설계 → 시각화 → 발주 → 시공 → 운영 → 분석. 킨텍스에서 한 흐름으로 끝난다." 12.5pt `#B9C7EA`. +- **하단 메타바** (0.85,6.15 라인): 사업명·기술스택 2줄 + 우측 "작성일 2026-07-11". 개발계획서 표지 하단과 동일 구조. +- **아이콘 앵커**: 슬로건 좌측에 `camera-render` 근사 도형(WHITE stroke). + +--- + +## B. 간지 (Section Divider) — P1~P9 공통 템플릿 + +**컨셉**: 개발계획서 간지 계승 + **배점 배지 추가**(제안서 배점 규율 시각화). + +- 배경 `BLUE_DK` + 우측 평행사변형 2매(BLUE 8.6,-1.5,8,11 / PURPLE 10.9,-2,6,12). +- 좌측 대형 넘버 150pt `#2C4E82` (1.0,2.15). PURPLE 언더바(1.15,3.9,0.9,0.09). 국문 제목 34pt WHITE(1.15,4.05). 영문 13pt `#9CB4D8`(1.18,4.85). +- 우측 포인트 3개: PURPLE OVAL 불릿(8.05,y) + WHITE 12.5pt(8.35,y), y=2.35+i*0.62. +- **★배점 배지 (우상단, 신규)**: (10.3,0.7,2.2,0.62) 라운드 rect, fill=섹션색(P3=PURPLE, 그 외 BLUE), WHITE Bold — 예 "기술제안 · 35점". P3만 PURPLE로 최다 배점 강조. +- 섹션별 넘버/제목/영문/포인트/배점: + | 섹션 | No | 제목 | EN | 배점배지 | 포인트 3 | + |---|---|---|---|---|---| + | P1 | 01 | 사업이해 | BUSINESS UNDERSTANDING | 사업이해·전략 10점(BLUE) | As-Is 병목 / 6역할 페르소나 / To-Be 정량목표 | + | P2 | 02 | 추진전략 | STRATEGY | Win Theme 5선(BLUE) | 3중 해자 / 생애주기 폐루프 / 추진체계 | + | P3 | 03 | 기술제안 | TECHNICAL SOLUTION | 기술제안 · 35점(PURPLE) | 나노바나나 시공예측 / 배치·설계·배선 AI / 옥션 폐루프 | + | P4 | 04 | 아키텍처·기술스택 | ARCHITECTURE | 아키텍처 10점(BLUE) | 확정 스택 4-Tier / 단일 공간원천 / AI 라우팅 | + | P5 | 05 | 보안·개인정보 | SECURITY & PRIVACY | 보안 10점(BLUE) | 워터마크 / PII 3중격리 / 망분리 | + | P6 | 06 | 비기능(NFR) | NON-FUNCTIONAL | 비기능 8점(BLUE) | SLO 99.5% / 렌더 40초 / 접근성·다국어 | + | P7 | 07 | 멀티테넌시·확장 | MULTI-TENANCY | 확장 5점(BLUE) | 격리 아키텍처 / 온보딩 6단계 / COEX 확장 | + | P8 | 08 | 사업관리·일정·조직 | PROJECT MANAGEMENT | 사업관리 2점(BLUE) | Phase 간트 / 선행게이트 / 품질관리 | + | P9 | 09 | 기대효과 | EXPECTED BENEFITS | 가점(PURPLE) | 정량 ROI / 정성효과 / 확장비전 | + +--- + +## C. 필수 도식 12종 + +### ① 3중 해자 벤다이어그램 (S04 요약판 · S12 상세판) ★최중요 + +**컨셉**: 3원 60% 교집합. 중앙 교집합만 컬러 채도 최대(해자), 2원 교집합은 회색(모방 가능). "결합의 희소성"을 색 채도로 표현. + +- **3원 배치**(정삼각 구도, 반경 r=1.9): 원A 중심(5.4,3.6) `PURPLE` stroke 2.5pt + PURPLE_LT 반투명 fill / 원B 중심(7.9,3.6) `BLUE` / 원C 중심(6.65,5.5) `TEAL`. OVAL 도형, fill은 반투명(alpha 22%)로 겹침 표현. +- **원 라벨**(각 원 바깥 가까이): + - 원A(좌상) `ai-sparkle` 아이콘 + "나노바나나 시공 예측 이미지" 13pt PURPLE Bold / 부제 "image-to-image 구조보존 · 40초 · S1~S7" 8.5pt MUTED. + - 원B(우상) `postgis-spatial` + "PostGIS 실측 공간데이터" 13pt BLUE Bold / "부스 폴리곤·트렌치·배선 LineString 단일 원천". + - 원C(하) `closed-loop`+`auction-gavel` + "공사 옥션 폐루프" 13pt TEAL Bold / "AI 자료→응찰→낙찰→발주 자동전환". +- **중앙 3원 교집합**(6.65,4.2 부근): 강조 배지 라운드 rect(INK fill) + WHITE Bold "우리만의 해자(Moat)" 11pt / 소자 "재현 난이도 높은 결합". +- **2원 교집합 3곳**: 소형 회색 라벨 "단일 요소는 모방 가능" 8pt SLATE. +- **하단 캡션**(중앙 정렬): "셋의 결합은 경쟁 전시테크·범용 SI가 재현하기 어렵다." 9.5pt MUTED. +- S04(요약판)=벤+한줄, S12(상세판)=벤 좌측 + 우측에 3결합 재현난이도 근거 3불릿 카드(strategy §3-3). + +### ② 모듈맵 — 생애주기 × 우선순위 매트릭스 (S16) + +- **매트릭스 프레임**: x=생애주기 6단계 열, y=우선순위 3행(P0/P1/P2). 콘텐츠 영역(0.55,1.7)~(12.78,6.2). +- **열 헤더**(y=1.7, 각 폭 ~1.95): "판매·기획" / "설계·시각화" / "발주·계약" / "참가·관람" / "현장운영" / "사후·경영". BLUE 밴드 WHITE 10pt Bold. +- **행 라벨**(좌측 x=0.55, 폭 0.9): P0(PURPLE)/P1(BLUE)/P2(SLATE) 세로 배지. +- **모듈 칩** 배치: + - **P0행**(굵은 테두리 2pt·PURPLE·강조): M2 플로어플랜(설계열) · M3 부스설계 · M4 유틸리티 · M5 나노바나나. 각 칩에 대응 아이콘(`booth-layout`/`camera-render`/`wiring-power`/`ai-sparkle`). + - **P1행**(BLUE 1pt): M1(판매)·M16(사후, 2회 span)·M6/M7(발주)·M15 옥션(발주·강조 테두리)·M10(참가)·M12·M17(참가/사후)·M18(전열 하단)·§5B·§1A. + - **P2행**(SLATE): M8·M11·M13·M14(현장운영열 집중). +- **하단 레이어 띠 2줄**(y~5.8): ①BLUE_LT 풀폭 "공통/시스템관리 레이어(§5B) — 전 모듈 선행 기반" ②PURPLE_LT "멀티테넌시(§1A) — tenant_id 격리". +- **캡션**: "18개 모듈 + 공통 레이어를 한 장으로 조망. P0 4개가 심장." 9.5pt. + +### ③ 나노바나나 파이프라인 플로우 (S20) ★WT-1 + +**컨셉**: 좌→우 8박스 수평 플로우. 전면 비동기를 "동기 대기 없음" 배지로 각인. AI 구간(워커·Gemini)만 PURPLE, 나머지 BLUE. + +- **박스 8개**(y=2.6, 높이 0.95, 폭 ~1.35, gap 0.06): + 1. `[사용자: 렌더 요청]` BLUE_LT (아이콘 `mobile`) + 2. `[Spring 백엔드: RenderJob 생성·쿼터 확인]` WHITE/BLUE + 3. `[Redis 큐 leftPush]` WHITE/BLUE (아이콘 `pipeline-flow`) + 4. `[나노바나나 Python 워커 (BLPOP)]` PURPLE_LT/PURPLE (아이콘 `ai-sparkle`) + 5. `[Gemini image-to-image (G1 승인·라이브)]` PURPLE_LT/PURPLE + 6. `[워터마크 후처리 · S6 로컬 PIL 래스터]` PURPLE_LT/PURPLE (아이콘 `watermark`) + 7. `[오브젝트 스토리지 적재]` WHITE/BLUE + 8. `[WebSocket/STOMP → 프론트 완료 푸시·갤러리 갱신]` BLUE_LT +- 박스 사이 "→" 15pt SLATE. +- **분기 주석**(워커 하단 점선 콜아웃, AMBER 테두리): "degraded: G1 미승인/Gemini 장애 시 목(mock) 응답 — 구조·워터마크 유지". 옆에 "성공 시에만 쿼터 차감" GREEN 소배지. +- **보안 배지**(우상단): `shield-security` + "GEMINI_API_KEY = 워커 env only (백엔드 미취급)" 9pt RED 테두리. +- **라이브 배지**: 박스4·5에 GREEN "라이브" 소배지("이미 돈다"). +- **캡션**: "이미지 생성 전면 비동기 — 사용자 동기 대기 없음, 평균 40초." 9.5pt. + +### ④ Before/After 슬라이더 (S21) + +- **좌우 분할 이미지 카드**(2.0,2.0,9.3,3.3): 좌반부=빈 부스(HALL_BG + 도면 라인 오버레이), 우반부=시공 후(BLUE→PURPLE 그라디언트 + 나노바나나 이미지 자리). +- **중앙 세로 드래그 핸들**(x≈6.65): 세로 WHITE 라인 3pt + 중앙 원형 핸들(WHITE OVAL + `‹›` 양방향 화살표). +- **라벨**: 좌상단 "Before: 빈 부스 (도면/실측)" 칩 SLATE / 우상단 "After: 시공 후 예상 (AI 생성)" 칩 PURPLE. +- **접근성 배지**(하단): `check-verify` + "ARIA slider · 키보드 좌우 조작 지원 (WCAG AA)" 9pt. +- **워터마크 고지 배지**(맨 하단, RED 테두리): "AI 생성 예상 이미지 — 실제 시공과 다를 수 있음. 계약·심사 서류 사용 금지." 8.5pt. +- **우측 배선 색상 범례 미니**(S21이 배선 오버레이 겸함): 전기=RED / 네트워크=CYAN / 급배수=TEAL 3줄(색 사각+텍스트+선스타일 실선/파선/점선). + +### ⑤ 3안 비교 화면 목업 (S24) + +- **상단 홀 정보 바**(0.55,1.6,12.23,0.5) BLUE_LT: "제1전시장 5홀 · 판매가능 10,080㎡ · 통로규정 v3" 좌 + `booth-layout` 아이콘. +- **3열 카드**(각 3.9 폭, gap 0.28, y 2.25, 높이 3.3): + - 카드 상단 헤더바: "안 1 — 통로 효율 최대"(BLUE) / "안 2 — 프리미엄 부스 최대"(PURPLE) / "안 3 — 균형"(TEAL). + - 본문: 미니 배치도 썸네일(HALL_BG + 부스 폴리곤 격자 도형) + 지표 3행 "판매면적 ㎡ / 부스 수 / 규정위반 0건"(위반0=GREEN 체크 `check-verify`). + - 안2는 프리미엄 강조(굵은 부스 몇 개), 안3은 균등 격자. +- **하단 액션 바**(0.55,5.75,12.23,0.6): 버튼칩 3개 "[안 선택]" BLUE / "[구역·블록 병합 편집]" WHITE 테두리 / "[병합 후 재검증]" PURPLE. +- **캡션**: "제약 솔버가 상이한 최적화 목표로 정확히 3안 생성. 사람이 선택·병합·최종 확정." (AI 신뢰 3층 프레이밍). + +### ⑥ PostGIS 배선 오버레이 (S27) ★WT-2 + +**컨셉**: 홀 평면도 위 실측 배선. 3색 규약 고정 + 색맹 안전(선 스타일 병기). + +- **평면도 캔버스**(0.55,1.7,8.6,4.6) HALL_BG 라운드: + - **부스 폴리곤** 다수: 연회색(`#D8DEE8`) 사각 격자 도형. + - **트렌치 포인트** ◆: TEAL 다이아 소도형, 라인 따라 배치. + - **분전반** ▣: INK 사각 + 라벨. + - **배선 LineString 3색**(부스→최근접 트렌치→분전반): + - 전기 = `RED` 실선 2pt + - 네트워크 = `CYAN` 파선(dash 6 3) + - 급배수 = `TEAL` 점선(dot 2 3) + - **가정 트렌치**엔 AMBER "가정 좌표(실측 대기)" 소배지. +- **우측 범례·주석 패널**(9.35,1.7,3.4,4.6) WHITE 카드: + - 제목 "배선 색상 범례" + 3색 행(색+선스타일+라벨). + - 주석 배지 3개: "최근접 트렌치 KNN (geom <-> point)" / "최단 경로 ST_Length · 통로 횡단 최소" / "SRID 0 홀 로컬 미터 · GiST 실시간". + - 아이콘 `wiring-power`·`postgis-spatial`. +- **캡션**: "수기 위치표시도 폐지 — 좌표 클릭 자동 작도." + +### ⑦ 옥션 폐루프 흐름도 (S29) ★WT-3 + +**컨셉**: 좌측 AI 자료 패키지 스택 → 우측 순환 흐름. "AI 자료가 곧 발주 근거"를 좌→우 물리 연결로. + +- **좌측 AI 자료 패키지 스택**(0.55,2.0,2.6,3.0) PURPLE_LT 카드, 4겹 쌓임 효과: + - "M2 배치 + M3 설계 + M4 배선/BOQ + M5 시공예측 이미지" 각 줄, 아이콘 `booth-layout`/`camera-render`. 상단 `ai-sparkle`. +- **우측 흐름 7박스**(순환 배열 또는 좌→우 2행 지그재그, y 2.0~5.5): + 1. `[옥션 개설 (역경매/RFQ/고정가)]` BLUE (`auction-gavel`) + 2. `[등록업체 검증 게이트: 미등록 응찰 차단 403]` RED 테두리 강조 (`shield-security`) + 3. `[견적서 제출 · PDF · 버전]` WHITE/BLUE (`document-rtm`) + 4. `[실시간 순위 · 라운드 마감 (Redis 정렬셋·WS 델타)]` BLUE (`dashboard-chart`) + 5. `[종합평가 낙찰 (가격+평판+납기)]` PURPLE (`check-verify`) + 6. `[Award → 계약/발주 자동전환 (M6·M9)]` TEAL + - 6→다시 자료로 순환 화살표(`closed-loop` 곡선 화살표). +- **게이트2 강조**: RED "미등록 = 응찰 원천 차단" 배지 — 킨텍스 규정 시스템 강제 포인트. +- **캡션**: "AI 설계자료가 곧 발주 근거. 사진 수준 자료로 응찰→발주까지 한 흐름." + +### ⑧ 종합평가 스코어 비교표 (S31) + +- **표**(0.55,2.0,12.23): 헤더 BLUE 풀폭 — 열: "업체명 | 견적금액(점수) | 평판(점수) | 납기(점수) | **가중 종합점수** | 순위". +- **행 4~5개**(zebra): 예 A사/B사/C사/D사. 각 셀 숫자 + 괄호 환산점수. +- **가중치 주석 바**(표 상단 또는 하단): "가중치(예): 가격 0.6 / 평판 0.25 / 납기 0.15 — 옥션별 설정형(weight jsonb)" 9pt MUTED. +- **1위 행 강조**: BLUE_LT 배경 + Bold + 우측 "낙찰(Award)" GREEN 배지 + `check-verify`. +- **우측 또는 하단 캡션 카드**: "선정 사유·항목별 비교 근거 자동 산출". 종합점수 열은 막대 미니바(가중합 시각화, BLUE 그라데이션). +- **캡션**: "가격만이 아니라 평판·납기 가중 — 투명·최적 발주." + +### ⑨ 시스템 아키텍처 다이어그램 — 전 계층 (S41) + +**컨셉**: 개발계획서 아키텍처 밴드도 계승·확장. 상하 6밴드 + 우측 외부 게이트 컬럼. + +- **밴드**(좌측 라벨칩 1.55폭 + 본문, 폭 12.23): + 1. **엣지/DMZ**(y~1.5): `[CDN·정적캐시]` `[WAF/Reverse Proxy(nginx)·TLS·레이트리밋]` BLUE_LT. + 2. **역할별 프론트**(y~2.15): organizer·exhibitor·contractor·ops·admin(내부 배지 회색)·public/visitor(공개 SSR/SEO/다국어 배지). 6노드. + 3. **SSO·RBAC**(y~2.8): `[JWT SSO + TOTP 2FA · 이중 RBAC(플랫폼/행사)]` 풀폭 (`shield-security`). + 4. **공유 백엔드**(y~3.45, 높이 늘림): `[REST + WebSocket/STOMP]` 상단 + 하위 `[룰엔진]` `[배치·배선 엔진·PostGIS]` `[옥션 M15]` `[BI M16]` `[CMS M17]` `[공개 API read-only]`. + 5. **비동기**(y~4.5): `[Redis 큐·순위·타이머·캐시·쿼터]` → `[나노바나나 워커]`(PURPLE) `[서류·EDM 워커]`. + 6. **데이터**(y~5.15): `[PostgreSQL+PostGIS]` `[읽기복제(BI·공개)]` `[오브젝트 스토리지]`. +- **우측 외부 게이트 컬럼**(x~11.4 세로): `[Gemini(G1·라이브)]` `[Claude(AiTextRouter)]` `[PG 결제]` `[kxwp 릴레이]` `[등록업체 DB 739]`. 라이브=GREEN 배지. +- **연결 주석**(얇은 선+라벨): 워커→Gemini "egress only" / 워커→백엔드 "WebSocket 완료 푸시" / 백엔드→읽기복제 "BI/공개 오프로드". +- 계층별 색: 표현=BLUE_LT, 백엔드=WHITE/BLUE, AI밴드=PURPLE_LT, 데이터=HALL_BG. + +### ⑩ 보안영역 분리도 (망 구성) (S47) ★WT-4 + +**컨셉**: 좌→우 신뢰도 상승 존. 철칙 배지를 굵게. `network-zone` 메타포. + +- **존 박스 6개**(좌→우, 각 폭 ~2.0, y 2.2 높이 3.0, 우로 갈수록 테두리 진하게): + 1. `[인터넷]` SLATE + 2. `[엣지: CDN·WAF·DDoS]` BLUE_LT + 3. `[DMZ(공개): 공개LB·public SSR·visitor GW·공개 API·PG콜백 — 쓰기권한 없음]` BLUE + 4. `[내부망(인증): 내부LB·SSO/2FA·내부 API·공유 백엔드]` BLUE_DK + 5. `[AI 워커존(egress 제한): Redis·나노바나나·Ollama]` PURPLE + 6. `[데이터존(최내곽): PostgreSQL+PostGIS·오브젝트·읽기복제 — 아웃바운드 전면 차단]` INK +- 존 사이 화살표 "HTTPS만" 라벨. +- **상단 관리존**(가로 띠): `[관리존: 배스천·관측성 — VPN/허용IP+2FA, 인터넷 미도달]`. +- **철칙 배지 3개**(하단, RED 굵은 테두리): "DMZ → 데이터존 직접 접근 절대 금지" / "데이터존 아웃바운드 0 (유출경로 제거)" / "admin = VPN/허용IP+2FA". +- **egress 컬럼**(우측): "승인 4목적지만 — Claude·Gemini·PG·SMTP / 그 외 DROP" (`shield-security`). +- **캡션**: "공개/내부 물리·논리 분리 · 데이터존 무egress로 유출경로 자체 제거." + +### ⑪ 멀티테넌시 격리 아키텍처도 (S56) + +**컨셉**: 수직 4층 방어 스택. fail-closed를 "한 층이라도 불일치 = 차단" 배지로. + +- **좌측 진입**(1.0,2.0,3.2,1.4): `[요청: 서브도메인(kintex./coex.) + JWT 사용자 소속]` → `[테넌트 컨텍스트 해소: 불일치 시 거부]` (`tenant-building`). +- **중앙 4층 방어 스택**(위→아래, 각 폭 5.0, 높이 0.85, y 2.0~5.5): + 1. `[①컨텍스트 필터]` BLUE_LT + 2. `[②서비스 가드]` BLUE + 3. `[③MyBatis 공통 인터셉터 (tenant_id 자동 주입)]` BLUE_DK + 4. `[④PostGIS/쿼리: tenant_id 선두 복합 인덱스]` PURPLE + - 층 사이 아래 화살표. +- **우측 데이터 표현**(9.3,2.0,3.4,3.5) WHITE 카드: `[TB_* … WHERE tenant_id = ctx]` 격리 도형 — KINTEX(#1)·COEX(#2) 두 색 파티션 시각화. +- **하단 배지**(RED): "fail-closed — 한 층이라도 불일치면 차단". +- **캡션**: "KINTEX #1 검증 → COEX #2 코드 배포 없이 데이터 온보딩. 기능 불변, 데이터·권한만 분리." + +### ⑫ 일정 간트 (Phase × 모듈) (S58) + +**컨셉**: 개발계획서 간트 계승. 3구간 + 라이브 실적(GREEN 완료)으로 "이미 돈다" 실증. + +- **타임라인**(gx=3.55, gw=9.15, 3구간 Phase1/2/3 각 ~4M 눈금). +- **상태 범례**(우상단): 완료 GREEN / 진행 AMBER / 예정 SLATE. +- **워크스트림 막대 행**(좌측 Phase+워크스트림 라벨, 우측 막대): + - Phase1: 아키텍처(A·완료 GREEN) / 공통레이어 B 2FA·시스템관리(완료 GREEN) / P0 코어 M2·M3·M4·M5(진행 AMBER, 하위 "스캐폴드·인증·매퍼·룰엔진·나노바나나=완료 GREEN" / "3안·병합·실데이터=진행 AMBER"). + - Phase2: 옥션 M15 / 관람 M10 / BI M16 / 관리자 M18 / 판매·서류·정산 M1·M6·M7·M9 / CMS M12·M17 (예정 SLATE). + - Phase3: 멀티테넌시 / M11·M13·M14 / 배포 안정화·SM 이관 (예정 SLATE, 배포 일부 진행 AMBER). +- **마일스톤 다이아몬드**(◆): G1(나노바나나 승인·완료 GREEN) · G2(배포서버·완료 GREEN) · Phase 게이트 · QA 게이트 · 오픈. +- **현재 시점 마커**: PURPLE 세로선 + "현재". +- **캡션**: "선행 게이트 통제 + Phase 게이트 QA 통과 후 진행. G1·G2 완료 — 실증 기반." (`schedule-gantt`). + +--- + +## D. 표준 필수 도식 3종 + +### ⑬ 추진체계도 (조직도) (S15) + +- **최상위**(중앙 4.9,1.5,3.55,0.72) BLUE: "프로젝트 총괄 (PM)" / "범위·일정·리스크·게이트(G1·G2)" (`org-people`). +- **2단**(연결선 아래): "개발 PM"(PURPLE) / "PMO"(PURPLE). +- **3단 아키텍트 그룹**(BLUE_LT 띠): AA·SA·TA·DA·NA 5노드(WHITE/BLUE) — "앱/시스템·NFR/기술표준/데이터·ERD/네트워크·보안". +- **4단 구현 그룹**(PURPLE_LT 띠): 공통/시스템·백엔드·프론트·DB·도메인(bidding·visitor·cms·bi·admin)·AI·시각화 6노드(WHITE/PURPLE). +- **하단**: 품질(kintex-qa · GREEN) / 배포(devops-dev · 딥블루). +- 개발계획서 조직도와 동일 구조 재사용 — 제안서용으로 "발주처 보고 라인" 소표기 추가 가능. + +### ⑭ 리스크 매트릭스 (S59) + +**컨셉**: 발생가능성 × 영향도 2축 4사분면 버블 + 게이트. + +- **매트릭스**(2.5,1.8,6.5,4.5): x=발생가능성(낮→높), y=영향도(낮→높). 4사분면 배경 명도(우상=RED_LT 위험, 좌하=GREEN_LT 안전). +- **버블**(R-1~R-8 배치, tech_advisory/strategy §4): + - R-1(나노바나나 미승인) 고영향·중발생 → 우상 근처, AMBER. + - R-2(CAD·트렌치 미확보) 고영향·중발생 AMBER. + - R-3(kxwp 폐쇄 API) 중·중 SLATE. + - R-4(배점 가정) 중·중, R-5(간판 품질) 중·중, R-6(AI 환각) 고·저, R-7(HW 연동) 중·저, R-8(확장 부담) 저·저 GREEN. + - 버블 크기=영향도, 색=위험등급, 라벨 "R-n" + 툴팁 텍스트 소자. +- **우측 게이트·대응 패널**(9.3,1.8,3.4,4.5) WHITE 카드: "선행 게이트 G1(완료)·G2(완료)" + "각 리스크 방어 논리 1줄" 스크롤 리스트 + `check-verify`/`risk-warning`. +- **캡션**: "약한 고리를 선제 노출·방어 — 숨기지 않아 신뢰." + +### ⑮ 기대효과 정량 인포그래픽 (S61) + +- **5지표 Before/After 카드**(5열, 각 2.4 폭, y 1.85, 높이 1.85) — 개발계획서 기대효과 카드 계승: + | 지표 | As-Is(SLATE) | ↓(PURPLE) | To-Be(BLUE) | + |---|---|---|---| + | 홀 배정 견적 | 수일 | | 즉시 | + | 배치도 초안 | 수일~수주 | | 수 분 | + | 규정 검수 | 육안 검토 | | 자동 플래깅 | + | 유틸리티 신청 | 수기 작도 | | 클릭+자동견적 | + | 시공 결과 예측 | 불가(외주) | | 표준 샷 자동생성 | +- 각 카드: 지표명 Bold + As-Is(회색) + ↓ 화살표 PURPLE + To-Be(BLUE Bold) + 대응 아이콘(`document-rtm`/`booth-layout`/`check-verify`/`wiring-power`/`camera-render`). +- **하단 임팩트 지표 스트립**(대형 수치): "40초 렌더 · 99.5% SLO · 142 REQ 커버 · 18 모듈" BLUE/PURPLE 교차 KPI 카드. +- **캡션**: "리드타임 수일→즉시·수분, 검수 육안→자동. 정량 개선을 숫자로 각인." + +--- + +## E. deck-designer 작도 체크리스트 + +1. **색 규율**: 퍼플=AI/나노바나나 전용. 배선 3색 고정(전기 RED 실선 / 네트워크 CYAN 파선 / 급배수 TEAL 점선) — 색+선스타일 이중 인코딩(색맹 안전). +2. **라이브 배지(GREEN "이미 돈다")**: 나노바나나 파이프라인(③)·간트(⑫)·아키텍처(⑨) 외부게이트에 반드시 표기 — tech_advisory §0 실증 우위. +3. **워터마크 고지**: Before/After(④)·AI 이미지 보안 슬라이드에 RED 테두리 고지 배지 필수(REQ-S-009). +4. **캡션 1줄**: 12종 각 도식 하단에 tech_advisory 지정 캡션 그대로. MUTED 9~9.5pt. +5. **아이콘**: `assets/icons/*.svg` 20종 — 헤더 앵커는 도형 근사, 콘텐츠 아이콘은 PNG 변환 후 stroke=맥락색. 이모지 금지. +6. **가독성**: 본문 10pt 하한, 한 슬라이드 1 도식/1 메시지, 여백 확보. 도식 박스 라벨 8~10pt. +7. **배점 규율 시각화**: 간지 배점 배지(P3=PURPLE 35점 최강조), 모듈맵 P0 굵은 테두리. +8. **보안**: 시크릿·내부IP·키값 도식·라벨 미기재. 외부 API는 "승인 예외/env only"로만.