[{"data":1,"prerenderedAt":395},["ShallowReactive",2],{"doc:\u002Fhistory\u002Fhistory.20260612":3},{"id":4,"title":5,"body":6,"description":367,"extension":388,"meta":389,"navigation":390,"path":391,"seo":392,"stem":393,"__hash__":394},"docs\u002Fhistory\u002Fhistory.20260612.md","작업 이력 — 2026-06-12",{"type":7,"value":8,"toc":366},"minimark",[9,13,17,31,40,43,71,78,85,173,180,193,196,264,267,270,277,307,314,335,338,348,352],[10,11,5],"h1",{"id":12},"작업-이력-2026-06-12",[14,15,16],"h2",{"id":16},"종합",[18,19,20,21,25,26,30],"p",{},"오늘 큰 흐름 — ",[22,23,24],"strong",{},"관리자단 목업 6개 화면을 실데이터로 전환",". DBA가 운영 MySQL(PMS)에 관리자 콘솔 스키마(",[27,28,29],"code",{},"002_admin_console.sql",")를 적용·검증하고, API에 인증 가드 + 관리자 엔드포인트를 신설하고, admin 6개 페이지를 실 API에 연동한 뒤 두 레포(api·admin)를 배포했다.",[32,33,35,36,39],"h3",{"id":34},"_1-dba-관리자-콘솔-스키마-적용-malgn-helper-apimigrations002_admin_consolesql","1. DBA — 관리자 콘솔 스키마 적용 (",[27,37,38],{},"malgn-helper-api\u002Fmigrations\u002F002_admin_console.sql",")",[18,41,42],{},"운영 MySQL(PMS)에 적용·검증 완료.",[44,45,46,53,59,65],"ul",{},[47,48,49,52],"li",{},[27,50,51],{},"hp_topic"," 10행 (토픽: common\u002Fservice scope)",[47,54,55,58],{},[27,56,57],{},"hp_service"," 6행 (서비스 카탈로그)",[47,60,61,64],{},[27,62,63],{},"hp_setting"," 21행 (ai\u002Fsafety\u002Fcache 설정 묶음)",[47,66,67,70],{},[27,68,69],{},"hp_integration"," 8행 (외부 연동, 시크릿 값은 미저장)",[32,72,74,75,39],{"id":73},"_2-api-인증-가드-관리자-엔드포인트-malgn-helper-apisrcindexts","2. API — 인증 가드 + 관리자 엔드포인트 (",[27,76,77],{},"malgn-helper-api\u002Fsrc\u002Findex.ts",[18,79,80,81,84],{},"기존엔 ",[27,82,83],{},"\u002Fadmin\u002F*"," 등에 라우트별 가드가 없었다(무인증 접근). 이번에 미들웨어 신설 + 관리자 엔드포인트 추가 (+552 라인).",[44,86,87,95,110,159],{},[47,88,89,94],{},[22,90,91],{},[27,92,93],{},"requireAuth"," — 세션\u002FJWT 검증 미들웨어.",[47,96,97,102,103,105,106,109],{},[22,98,99],{},[27,100,101],{},"requireRole(level)"," — 최소 권한(level) 가드, ",[27,104,93],{}," 뒤에 체인. ",[27,107,108],{},"ROLE_LEVEL","(agent \u003C developer \u003C admin).",[47,111,112,115,116],{},[22,113,114],{},"엔드포인트",":\n",[44,117,118,124,130,136,150],{},[47,119,120,123],{},[27,121,122],{},"GET \u002Faccounts"," (admin) — 운영자\u002F개발자\u002F상담사 계정 목록",[47,125,126,129],{},[27,127,128],{},"GET\u002FPOST\u002FPUT\u002FDELETE \u002Ftopics"," (조회 developer \u002F 변경 admin) — soft delete(status=-1)",[47,131,132,135],{},[27,133,134],{},"GET\u002FPOST\u002FPUT\u002FDELETE \u002Fservices"," (조회 developer \u002F 변경 admin)",[47,137,138,141,142,145,146,149],{},[27,139,140],{},"GET \u002Fsettings\u002Fintegrations"," (developer) · ",[27,143,144],{},"PUT \u002Fsettings\u002Fintegrations\u002F:key"," (admin) — 시크릿 값 미포함, ",[27,147,148],{},"secretSet"," 플래그만",[47,151,152,141,155,158],{},[27,153,154],{},"GET \u002Fsettings\u002F:group",[27,156,157],{},"PUT \u002Fsettings\u002F:group"," (admin) — ai|safety|cache 묶음 upsert",[47,160,161,164,165,168,169,172],{},[22,162,163],{},"라우트 등록 순서 주의",": 정적 경로 ",[27,166,167],{},"\u002Fsettings\u002Fintegrations","를 파라미터 경로 ",[27,170,171],{},"\u002Fsettings\u002F:group","보다 먼저 등록.",[32,174,176,177,39],{"id":175},"_3-admin-목업-6개-화면-실데이터화-malgn-helper-adminpages","3. admin — 목업 6개 화면 실데이터화 (",[27,178,179],{},"malgn-helper-admin\u002Fpages\u002F*",[18,181,182,185,186,185,189,192],{},[27,183,184],{},"accounts.vue","·",[27,187,188],{},"catalog.vue",[27,190,191],{},"settings\u002F{ai,safety,cache,integrations}.vue"," (+1133 \u002F −515) — 폼 disabled·목업 데이터를 제거하고 위 API에 연동(조회·저장).",[32,194,195],{"id":195},"검증",[44,197,198,208,226,240],{},[47,199,200,203,204,207],{},[22,201,202],{},"api 타입체크",": 기존 baseline과 ",[22,205,206],{},"동일한 10건","(classify.ts·index.ts의 선존 에러, 라인 번호만 이동) — 신규 변경이 타입 에러를 추가하지 않음 확인. wrangler deploy(esbuild)는 정상.",[47,209,210,213,214,217,218,221,222,225],{},[22,211,212],{},"api 가드(배포 후)",": 무인증 ",[27,215,216],{},"GET \u002Ftopics·\u002Fservices·\u002Faccounts·\u002Fsettings\u002Fintegrations·\u002Fsettings\u002Fai·\u002Fauth\u002Fme"," → ",[22,219,220],{},"모두 401","(가드 정상). 루트 ",[27,223,224],{},"\u002F"," → 200.",[47,227,228,231,232,235,236,239],{},[22,229,230],{},"admin 빌드",": ",[27,233,234],{},"pnpm run build","(nuxt build) 통과 — 신규 6개 page chunk(accounts\u002Fcatalog\u002Fai\u002Fcache\u002Fintegrations\u002Fsafety) 전부 산출, chunk 46개. 멀티레포 가드: cwd=admin · ",[27,237,238],{},"wrangler.toml"," name=malgn-helper-admin 일치 확인.",[47,241,242,245,246,249,250,253,254,185,257,185,260,263],{},[22,243,244],{},"admin(배포 후)",": prod ",[27,247,248],{},"malgn-helper-admin.pages.dev"," 200 + 마커 ",[27,251,252],{},"\u003Ctitle>홈 · 맑은도우미 Admin\u003C\u002Ftitle>",". 신규 6개 라우트(",[27,255,256],{},"\u002Faccounts",[27,258,259],{},"\u002Fcatalog",[27,261,262],{},"\u002Fsettings\u002F{ai,safety,cache,integrations}",") 모두 200(SSR 셸). 실데이터는 로그인 후 클라이언트가 인증된 API 호출로 채우는 구조 — 무세션이라 풀 데이터 렌더 검증은 범위 밖.",[265,266],"hr",{},[14,268,269],{"id":269},"배포",[32,271,273,276],{"id":272},"malgn-helper-api-cloudflare-workers",[27,274,275],{},"malgn-helper-api"," → Cloudflare Workers",[44,278,279,286,289,295,304],{},[47,280,281,282,285],{},"커밋: ",[27,283,284],{},"9cefd48"," (신규 커밋: yes)",[47,287,288],{},"메시지: feat(admin): requireAuth\u002FrequireRole guards + accounts\u002Ftopics\u002Fservices\u002Fsettings endpoints",[47,290,291,292],{},"Version ID: ",[27,293,294],{},"fc81a5fe-586f-4d21-8c85-66dc16cf34d2",[47,296,297,298],{},"URL: ",[299,300,301],"a",{"href":301,"rel":302},"https:\u002F\u002Fmalgn-helper-api.malgnsoft.workers.dev",[303],"nofollow",[47,305,306],{},"검증: 보호 엔드포인트 무인증 401 \u002F 루트 200",[32,308,310,313],{"id":309},"malgn-helper-admin-cloudflare-pages",[27,311,312],{},"malgn-helper-admin"," → Cloudflare Pages",[44,315,316,321,324,332],{},[47,317,281,318,285],{},[27,319,320],{},"2d1acf9",[47,322,323],{},"메시지: feat(admin): wire accounts\u002Fcatalog\u002Fsettings pages to real API (replace mockups)",[47,325,326,327,331],{},"배포: ",[299,328,329],{"href":329,"rel":330},"https:\u002F\u002F64eedc1c.malgn-helper-admin.pages.dev",[303]," (prod: malgn-helper-admin.pages.dev)",[47,333,334],{},"검증: prod 200 + 빌드 마커 \u002F 신규 6 라우트 200",[32,336,337],{"id":337},"정합",[44,339,340,343],{},[47,341,342],{},"배포 후 두 레포 working tree↔main 일치(각 repo 변경분만 커밋, 무관 파일 미포함). working tree clean.",[47,344,345,347],{},[27,346,29],{},"은 배포 산출물과 무관(운영 MySQL에 이미 적용)하나, 정합을 위해 api 커밋에 함께 포함.",[14,349,351],{"id":350},"다음-작업-후보","다음 작업 후보",[44,353,354,357],{},[47,355,356],{},"admin 신규 화면 로그인 후 실데이터 렌더 E2E 검증(세션 토큰 확보 후 QA).",[47,358,359,185,362,365],{},[27,360,361],{},"\u002Ftopics",[27,363,364],{},"\u002Fservices"," CRUD 쓰기 경로(POST\u002FPUT\u002FDELETE) admin UI 연동 잔여분 점검.",{"title":367,"searchDepth":368,"depth":368,"links":369},"",3,[370,380,387],{"id":16,"depth":371,"text":16,"children":372},2,[373,375,377,379],{"id":34,"depth":368,"text":374},"1. DBA — 관리자 콘솔 스키마 적용 (malgn-helper-api\u002Fmigrations\u002F002_admin_console.sql)",{"id":73,"depth":368,"text":376},"2. API — 인증 가드 + 관리자 엔드포인트 (malgn-helper-api\u002Fsrc\u002Findex.ts)",{"id":175,"depth":368,"text":378},"3. admin — 목업 6개 화면 실데이터화 (malgn-helper-admin\u002Fpages\u002F*)",{"id":195,"depth":368,"text":195},{"id":269,"depth":371,"text":269,"children":381},[382,384,386],{"id":272,"depth":368,"text":383},"malgn-helper-api → Cloudflare Workers",{"id":309,"depth":368,"text":385},"malgn-helper-admin → Cloudflare Pages",{"id":337,"depth":368,"text":337},{"id":350,"depth":371,"text":351},"md",{},true,"\u002Fhistory\u002Fhistory.20260612",{"title":5,"description":367},"history\u002Fhistory.20260612","-92jnkweaF906K2ZkR1KxAEGLSeumbKp0j4vAH4BJiU",1783932938622]