[{"data":1,"prerenderedAt":3761},["ShallowReactive",2],{"nav-docs":3,"page-/ko/docs/webspace/examples/my-own-system":885,"surround-/ko/docs/webspace/examples/my-own-system":3755,"raw-/ko/docs/webspace/examples/my-own-system":3758},[4,56,226,546,638,778,811,868],{"title":5,"path":6,"stem":7,"children":8,"page":55},"스페이스빌더 시작하기","/getting-started","00.getting-started",[9,13,17,23,29,33,38,42,46,50],{"title":10,"path":11,"stem":12,"children":-1},"스페이스빌더 소개","/getting-started/overview","00.getting-started/00.overview",{"title":14,"path":15,"stem":16,"children":-1},"SetFN 계정 생성","/getting-started/create-setfn-account","00.getting-started/05.create-setfn-account",{"title":18,"path":19,"stem":20,"tags":21,"children":-1},"Linux에 설치하기","/getting-started/install-linux","00.getting-started/10.install-linux",[22],"recommended",{"title":24,"path":25,"stem":26,"tags":27,"children":-1},"Docker로 설치하기","/getting-started/install-docker","00.getting-started/12.install-docker",[28],"preparing",{"title":30,"path":31,"stem":32,"children":-1},"Windows에 설치하기","/getting-started/install-windows","00.getting-started/14.install-windows",{"title":34,"path":35,"stem":36,"tags":37,"children":-1},"macOS에 설치하기","/getting-started/install-macos","00.getting-started/16.install-macos",[28],{"title":39,"path":40,"stem":41,"children":-1},"초기 설정","/getting-started/initial-setup","00.getting-started/20.initial-setup",{"title":43,"path":44,"stem":45,"children":-1},"라이선스 활성화","/getting-started/license-activation","00.getting-started/30.license-activation",{"title":47,"path":48,"stem":49,"children":-1},"접속 주소 확인 (로컬/내부망)","/getting-started/access-url","00.getting-started/35.access-url",{"title":51,"path":52,"stem":53,"tags":54,"children":-1},"외부 접속 방식 선택","/getting-started/access-domain","00.getting-started/40.access-domain",[22],false,{"title":57,"path":58,"stem":59,"children":60,"page":55},"스페이스 관리하기","/admin","10.admin",[61,74,107,136,171,184,209],{"title":62,"path":63,"stem":64,"children":65,"page":55},"관리자 홈","/admin/home","10.admin/00.home",[66,70],{"title":67,"path":68,"stem":69,"children":-1},"관리자 페이지 접속","/admin/home/admin-page-access","10.admin/00.home/00.admin-page-access",{"title":71,"path":72,"stem":73,"children":-1},"라이선스 관리","/admin/home/license","10.admin/00.home/20.license",{"title":75,"path":76,"stem":77,"children":78,"page":55},"사용자 관리","/admin/user-management","10.admin/10.user-management",[79,83,87,91,95,99,103],{"title":80,"path":81,"stem":82,"children":-1},"가입 정책 및 기본 권한 설정하기","/admin/user-management/signup-policy","10.admin/10.user-management/02.signup-policy",{"title":84,"path":85,"stem":86,"children":-1},"사용자 계정 만들기","/admin/user-management/invite-new-member","10.admin/10.user-management/10.invite-new-member",{"title":88,"path":89,"stem":90,"children":-1},"사용자 계정 수정하기","/admin/user-management/edit-member","10.admin/10.user-management/11.edit-member",{"title":92,"path":93,"stem":94,"children":-1},"관리자 추가하기","/admin/user-management/add-new-admin","10.admin/10.user-management/12.add-new-admin",{"title":96,"path":97,"stem":98,"children":-1},"팀 관리","/admin/user-management/team","10.admin/10.user-management/22.team",{"title":100,"path":101,"stem":102,"children":-1},"레벨 관리","/admin/user-management/level","10.admin/10.user-management/24.level",{"title":104,"path":105,"stem":106,"children":-1},"접속 기록 확인하기","/admin/user-management/access-log","10.admin/10.user-management/30.access-log",{"title":108,"path":109,"stem":110,"children":111,"page":55},"서비스 구성","/admin/service-config","10.admin/20.service-config",[112,116,120,124,128,132],{"title":113,"path":114,"stem":115,"children":-1},"파일 영역 설정","/admin/service-config/file-area","10.admin/20.service-config/10.file-area",{"title":117,"path":118,"stem":119,"children":-1},"웹훅 설정","/admin/service-config/webhook-settings","10.admin/20.service-config/16.webhook-settings",{"title":121,"path":122,"stem":123,"children":-1},"커뮤니티 설정","/admin/service-config/community-space","10.admin/20.service-config/22.community-space",{"title":125,"path":126,"stem":127,"children":-1},"AI 챗봇 정책 설정","/admin/service-config/community-ai-chatbot","10.admin/20.service-config/24.community-ai-chatbot",{"title":129,"path":130,"stem":131,"children":-1},"메일 설정","/admin/service-config/email-settings","10.admin/20.service-config/30.email-settings",{"title":133,"path":134,"stem":135,"children":-1},"브랜딩 설정","/admin/service-config/brand","10.admin/20.service-config/40.brand",{"title":137,"path":138,"stem":139,"children":140,"page":55},"지능형 서비스 (AI)","/admin/ai","10.admin/30.ai",[141,145,149,153,159,163,167],{"title":142,"path":143,"stem":144,"children":-1},"AI 모델 설정","/admin/ai/ai-model-setting","10.admin/30.ai/10.ai-model-setting",{"title":146,"path":147,"stem":148,"children":-1},"AI DB 설정","/admin/ai/ai-db-setting","10.admin/30.ai/20.ai-db-setting",{"title":150,"path":151,"stem":152,"children":-1},"Qdrant 서버 준비하기","/admin/ai/qdrant-server-setup","10.admin/30.ai/25.qdrant-server-setup",{"title":154,"path":155,"stem":156,"children":157},"지식 인덱싱","/admin/ai/knowledge-indexing","10.admin/30.ai/30.knowledge-indexing",[158],{"title":154,"path":155,"stem":156,"children":-1},{"title":160,"path":161,"stem":162,"children":-1},"AI 연동 및 정책 설정","/admin/ai/ai-link","10.admin/30.ai/40.ai-link",{"title":164,"path":165,"stem":166,"children":-1},"MCP 서버 관리","/admin/ai/mcp-server","10.admin/30.ai/50.mcp-server",{"title":168,"path":169,"stem":170,"children":-1},"검색 관리","/admin/ai/search-management","10.admin/30.ai/60.search-management",{"title":172,"path":173,"stem":174,"children":175,"page":55},"플러그인","/admin/plugin","10.admin/40.plugin",[176,180],{"title":177,"path":178,"stem":179,"children":-1},"플러그인 관리하기","/admin/plugin/overview","10.admin/40.plugin/00.overview",{"title":181,"path":182,"stem":183,"children":-1},"확장 플러그인 설정","/admin/plugin/settings","10.admin/40.plugin/10.settings",{"title":185,"path":186,"stem":187,"children":188,"page":55},"보안 관리","/admin/security","10.admin/50.security",[189,193,197,201,205],{"title":190,"path":191,"stem":192,"children":-1},"보안 개요","/admin/security/overview","10.admin/50.security/00.overview",{"title":194,"path":195,"stem":196,"children":-1},"감사 로그 확인하기","/admin/security/audit-log","10.admin/50.security/05.audit-log",{"title":198,"path":199,"stem":200,"children":-1},"차단 관리","/admin/security/block-management","10.admin/50.security/10.block-management",{"title":202,"path":203,"stem":204,"children":-1},"보안 설정","/admin/security/security-setting","10.admin/50.security/12.security-setting",{"title":206,"path":207,"stem":208,"children":-1},"IP 접근 제한","/admin/security/ip-restriction","10.admin/50.security/16.ip-restriction",{"title":210,"path":211,"stem":212,"children":213,"page":55},"시스템 관리","/admin/system-admin","10.admin/60.system-admin",[214,218,222],{"title":215,"path":216,"stem":217,"children":-1},"디바이스 정보","/admin/system-admin/device-info","10.admin/60.system-admin/10.device-info",{"title":219,"path":220,"stem":221,"children":-1},"서버 재시작 및 시스템 유지보수","/admin/system-admin/server-restart","10.admin/60.system-admin/12.server-restart",{"title":223,"path":224,"stem":225,"children":-1},"백그라운드 서비스","/admin/system-admin/background-service","10.admin/60.system-admin/14.background-service",{"title":227,"path":228,"stem":229,"children":230,"page":55},"워크스페이스 사용하기","/workspace","20.workspace",[231,264,281,337,448,495,527],{"title":232,"path":233,"stem":234,"children":235,"page":55},"메뉴","/workspace/menu","20.workspace/05.menu",[236,240,244,248,252,256,260],{"title":237,"path":238,"stem":239,"children":-1},"워크스페이스 소개","/workspace/menu/overview","20.workspace/05.menu/00.overview",{"title":241,"path":242,"stem":243,"children":-1},"팀 스페이스","/workspace/menu/team-space","20.workspace/05.menu/05.team-space",{"title":245,"path":246,"stem":247,"children":-1},"클라이언트 스페이스","/workspace/menu/client-space","20.workspace/05.menu/06.client-space",{"title":249,"path":250,"stem":251,"children":-1},"즐겨찾기","/workspace/menu/favorites","20.workspace/05.menu/10.favorites",{"title":253,"path":254,"stem":255,"children":-1},"최근 문서","/workspace/menu/recent","20.workspace/05.menu/20.recent",{"title":257,"path":258,"stem":259,"children":-1},"외부 공유","/workspace/menu/external-share","20.workspace/05.menu/30.external-share",{"title":261,"path":262,"stem":263,"children":-1},"휴지통","/workspace/menu/trash","20.workspace/05.menu/40.trash",{"title":265,"path":266,"stem":267,"children":268,"page":55},"계정","/workspace/account","20.workspace/10.account",[269,273,277],{"title":270,"path":271,"stem":272,"children":-1},"회원가입 및 로그인","/workspace/account/signup","20.workspace/10.account/10.signup",{"title":274,"path":275,"stem":276,"children":-1},"비밀번호 재설정","/workspace/account/reset-password","20.workspace/10.account/20.reset-password",{"title":278,"path":279,"stem":280,"children":-1},"계정 설정","/workspace/account/account-settings","20.workspace/10.account/30.account-settings",{"title":282,"path":283,"stem":284,"children":285,"page":55},"폴더","/workspace/folder","20.workspace/20.folder",[286,290,294,298,302,308,312,316,321,325,329,333],{"title":287,"path":288,"stem":289,"children":-1},"폴더 기본 기능","/workspace/folder/basic","20.workspace/20.folder/10.basic",{"title":291,"path":292,"stem":293,"children":-1},"여러 폴더 한꺼번에 만들기","/workspace/folder/bulk-folder-creation","20.workspace/20.folder/12.bulk-folder-creation",{"title":295,"path":296,"stem":297,"children":-1},"필터","/workspace/folder/filter","20.workspace/20.folder/13.filter",{"title":299,"path":300,"stem":301,"children":-1},"폴더 보기 옵션 설정","/workspace/folder/folder-view-options","20.workspace/20.folder/14.folder-view-options",{"title":303,"path":304,"stem":305,"tags":306,"children":-1},"폴더 웹 보기","/workspace/folder/folder-web-view","20.workspace/20.folder/16.folder-web-view",[307],"hot",{"title":309,"path":310,"stem":311,"children":-1},"폴더 정리","/workspace/folder/folder-organize","20.workspace/20.folder/17.folder-organize",{"title":313,"path":314,"stem":315,"children":-1},"폴더 공지 (README)","/workspace/folder/folder-readme","20.workspace/20.folder/18.folder-readme",{"title":317,"path":318,"stem":319,"tags":320,"children":-1},"폴더/파일 목록 내보내기","/workspace/folder/folder-export","20.workspace/20.folder/20.folder-export",[307],{"title":322,"path":323,"stem":324,"children":-1},"레벨별 접근 권한 설정","/workspace/folder/level-access-permissions","20.workspace/20.folder/24.level-access-permissions",{"title":326,"path":327,"stem":328,"children":-1},"팀별 접근 권한 설정","/workspace/folder/team-access-permissions","20.workspace/20.folder/26.team-access-permissions",{"title":330,"path":331,"stem":332,"children":-1},"폴더 웹훅","/workspace/folder/webhook","20.workspace/20.folder/30.webhook",{"title":334,"path":335,"stem":336,"children":-1},"업무 자동화 폴더","/workspace/folder/automation","20.workspace/20.folder/40.automation",{"title":338,"path":339,"stem":340,"children":341,"page":55},"파일","/workspace/file","20.workspace/30.file",[342,346,351,355,359,363,367,371,375,379,384,388,392,396,400,404,408,412,416,420,424,428,432,436,440,444],{"title":343,"path":344,"stem":345,"children":-1},"파일 관리 기본 기능","/workspace/file/overview","20.workspace/30.file/00.overview",{"title":347,"path":348,"stem":349,"tags":350,"children":-1},"파일 보면서 목록 확인하기","/workspace/file/list-in-file","20.workspace/30.file/05.list-in-file",[307],{"title":352,"path":353,"stem":354,"children":-1},"디스크 파일 등록","/workspace/file/disk-file-registration","20.workspace/30.file/06.disk-file-registration",{"title":356,"path":357,"stem":358,"children":-1},"텍스트 파일 보기 및 편집","/workspace/file/text-file-viewer","20.workspace/30.file/10.text-file-viewer",{"title":360,"path":361,"stem":362,"children":-1},"HTML 파일 보기","/workspace/file/html-viewer","20.workspace/30.file/11.html-viewer",{"title":364,"path":365,"stem":366,"children":-1},"CSV 파일 보기 및 편집","/workspace/file/csv-viewer","20.workspace/30.file/12.csv-viewer",{"title":368,"path":369,"stem":370,"children":-1},"이미지/동영상 파일 보기","/workspace/file/image-file-viewer","20.workspace/30.file/13.image-file-viewer",{"title":372,"path":373,"stem":374,"children":-1},"오피스/PDF 파일 보기","/workspace/file/office-viewer","20.workspace/30.file/14.office-viewer",{"title":376,"path":377,"stem":378,"children":-1},"웹페이지 붙여넣기 (HTML)","/workspace/file/paste-html","20.workspace/30.file/20.paste-html",{"title":380,"path":381,"stem":382,"tags":383,"children":-1},"스크린샷 붙여넣기","/workspace/file/paste-screenshot","20.workspace/30.file/21.paste-screenshot",[307],{"title":385,"path":386,"stem":387,"children":-1},"마크다운 붙여넣기 (MD)","/workspace/file/paste-md","20.workspace/30.file/22.paste-md",{"title":389,"path":390,"stem":391,"children":-1},"스크린 녹화하기","/workspace/file/screen-recording","20.workspace/30.file/23.screen-recording",{"title":393,"path":394,"stem":395,"children":-1},"파일 태그","/workspace/file/file-tag","20.workspace/30.file/33.file-tag",{"title":397,"path":398,"stem":399,"children":-1},"파일 이름 일괄 변경","/workspace/file/bulk-name-revise","20.workspace/30.file/34.bulk-name-revise",{"title":401,"path":402,"stem":403,"children":-1},"파일 변환","/workspace/file/file-convert-overview","20.workspace/30.file/40.file-convert-overview",{"title":405,"path":406,"stem":407,"children":-1},"템플릿 파일","/workspace/file/templates","20.workspace/30.file/41.templates",{"title":409,"path":410,"stem":411,"children":-1},"할일 목록 (Todo)","/workspace/file/template-todo","20.workspace/30.file/42.template-todo",{"title":413,"path":414,"stem":415,"children":-1},"결재 서식","/workspace/file/template-approval","20.workspace/30.file/43.template-approval",{"title":417,"path":418,"stem":419,"children":-1},"칸반 보드","/workspace/file/template-kanban","20.workspace/30.file/44.template-kanban",{"title":421,"path":422,"stem":423,"children":-1},"타임라인","/workspace/file/template-timeline","20.workspace/30.file/45.template-timeline",{"title":425,"path":426,"stem":427,"children":-1},"메모장","/workspace/file/template-memo","20.workspace/30.file/46.template-memo",{"title":429,"path":430,"stem":431,"children":-1},"AI 채팅 파일","/workspace/file/ai-chat-file","20.workspace/30.file/47.ai-chat-file",{"title":433,"path":434,"stem":435,"children":-1},"파일 변경 기록 확인","/workspace/file/audit-trail","20.workspace/30.file/50.audit-trail",{"title":437,"path":438,"stem":439,"children":-1},"파일 버전 관리","/workspace/file/version-trail","20.workspace/30.file/51.version-trail",{"title":441,"path":442,"stem":443,"children":-1},"편집 잠금","/workspace/file/file-lock","20.workspace/30.file/52.file-lock",{"title":445,"path":446,"stem":447,"children":-1},"파일 암호화","/workspace/file/file-encrypt","20.workspace/30.file/53.file-encrypt",{"title":449,"path":450,"stem":451,"children":452,"page":55},"협업","/workspace/cooperation","20.workspace/35.cooperation",[453,457,461,465,470,474,478,482,487,491],{"title":454,"path":455,"stem":456,"children":-1},"파일·폴더 댓글","/workspace/cooperation/file-comments","20.workspace/35.cooperation/00.file-comments",{"title":458,"path":459,"stem":460,"children":-1},"채팅","/workspace/cooperation/chat","20.workspace/35.cooperation/10.chat",{"title":462,"path":463,"stem":464,"children":-1},"협업 채팅 및 편집 잠금","/workspace/cooperation/collaboration-chat","20.workspace/35.cooperation/11.collaboration-chat",{"title":466,"path":467,"stem":468,"tags":469,"children":-1},"팀원 작업 위치 따라가기","/workspace/cooperation/follow-team-location","20.workspace/35.cooperation/12.follow-team-location",[307],{"title":471,"path":472,"stem":473,"children":-1},"멘션","/workspace/cooperation/mention","20.workspace/35.cooperation/14.mention",{"title":475,"path":476,"stem":477,"children":-1},"쪽지","/workspace/cooperation/dm","20.workspace/35.cooperation/16.dm",{"title":479,"path":480,"stem":481,"children":-1},"알림 보관함","/workspace/cooperation/notification-inbox","20.workspace/35.cooperation/18.notification-inbox",{"title":483,"path":484,"stem":485,"tags":486,"children":-1},"팀 활동 확인하기","/workspace/cooperation/file-activity","20.workspace/35.cooperation/30.file-activity",[307],{"title":488,"path":489,"stem":490,"children":-1},"외부 공유 링크 만들기","/workspace/cooperation/share-link-creation","20.workspace/35.cooperation/40.share-link-creation",{"title":492,"path":493,"stem":494,"children":-1},"외부 공유 이메일 전송","/workspace/cooperation/share-link-email","20.workspace/35.cooperation/42.share-link-email",{"title":496,"path":497,"stem":498,"children":499,"page":55},"검색","/workspace/search","20.workspace/40.search",[500,504,509,515,519,523],{"title":501,"path":502,"stem":503,"children":-1},"파일 검색","/workspace/search/search","20.workspace/40.search/00.search",{"title":505,"path":506,"stem":507,"tags":508,"children":-1},"문맥 검색 (AI 검색)","/workspace/search/context-search","20.workspace/40.search/10.context-search",[307],{"title":510,"path":511,"stem":512,"tags":513,"children":-1},"이미지 검색","/workspace/search/image-search","20.workspace/40.search/20.image-search",[514],"new",{"title":516,"path":517,"stem":518,"children":-1},"채팅 검색","/workspace/search/chat-search","20.workspace/40.search/30.chat-search",{"title":520,"path":521,"stem":522,"children":-1},"댓글 검색","/workspace/search/comment-search","20.workspace/40.search/40.comment-search",{"title":524,"path":525,"stem":526,"children":-1},"유의어 검색","/workspace/search/synonym-search","20.workspace/40.search/50.synonym-search",{"title":528,"path":529,"stem":530,"children":531,"page":55},"AI","/workspace/ai","20.workspace/50.ai",[532,536,541],{"title":533,"path":534,"stem":535,"children":-1},"AI 기능 요약","/workspace/ai/overview","20.workspace/50.ai/00.overview",{"title":537,"path":538,"stem":539,"tags":540,"children":-1},"로컬 AI에게 업무 요청하기","/workspace/ai/ai-work","20.workspace/50.ai/10.ai-work",[307],{"title":542,"path":543,"stem":544,"tags":545,"children":-1},"외부 AI 활용하기","/workspace/ai/external-ai","20.workspace/50.ai/20.external-ai",[514],{"title":547,"path":548,"stem":549,"children":550,"page":55},"웹스페이스","/webspace","40.webspace",[551,555,559,563,567,571,576,580,584,588,592,621],{"title":552,"path":553,"stem":554,"children":-1},"웹스페이스(Webspace)란?","/webspace/overview","40.webspace/00.overview",{"title":556,"path":557,"stem":558,"children":-1},"웹사이트 배포하기","/webspace/website-release","40.webspace/10.website-release",{"title":560,"path":561,"stem":562,"children":-1},"스키마 파일(.sfn) 만들기","/webspace/create-database","40.webspace/20.create-database",{"title":564,"path":565,"stem":566,"children":-1},"API 빌드 및 데이터베이스 배포하기","/webspace/api-overview","40.webspace/24.api-overview",{"title":568,"path":569,"stem":570,"children":-1},"프론트엔드 샘플 확인하기","/webspace/frontend-example","40.webspace/26.frontend-example",{"title":572,"path":573,"stem":574,"tags":575,"children":-1},"팀 내부용 웹서비스 만들기","/webspace/internal-webservice","40.webspace/32.internal-webservice",[307],{"title":577,"path":578,"stem":579,"children":-1},"외부 공개용 웹서비스 만들기","/webspace/external-webservice","40.webspace/34.external-webservice",{"title":581,"path":582,"stem":583,"children":-1},"SQL 가져오기와 내보내기","/webspace/sql-converter","40.webspace/42.sql-converter",{"title":585,"path":586,"stem":587,"children":-1},"개발자 팁 2: Code 컨버터","/webspace/code-converter","40.webspace/44.code-converter",{"title":589,"path":590,"stem":591,"children":-1},"성능과 확장","/webspace/performance","40.webspace/48.performance",{"title":593,"path":594,"stem":595,"children":596,"page":55},"웹스페이스 관리","/webspace/admin","40.webspace/50.admin",[597,601,605,609,613,617],{"title":598,"path":599,"stem":600,"children":-1},"웹스페이스 관리 시작하기","/webspace/admin/overview","40.webspace/50.admin/00.overview",{"title":602,"path":603,"stem":604,"children":-1},"운영 현황","/webspace/admin/operations","40.webspace/50.admin/10.operations",{"title":606,"path":607,"stem":608,"children":-1},"워크스페이스 접근","/webspace/admin/workspace-access","40.webspace/50.admin/20.workspace-access",{"title":610,"path":611,"stem":612,"children":-1},"API · 사이트 보안","/webspace/admin/api-site-security","40.webspace/50.admin/30.api-site-security",{"title":614,"path":615,"stem":616,"children":-1},"서비스 및 용량","/webspace/admin/service-capacity","40.webspace/50.admin/40.service-capacity",{"title":618,"path":619,"stem":620,"children":-1},"배포 관리와 프론트엔드 릴리스","/webspace/admin/deployments","40.webspace/50.admin/50.deployments",{"title":622,"path":623,"stem":624,"children":625,"page":55},"웹스페이스 따라해보기","/webspace/examples","40.webspace/60.examples",[626,630,634],{"title":627,"path":628,"stem":629,"children":-1},"웹스페이스 응용편","/webspace/examples/overview","40.webspace/60.examples/00.overview",{"title":631,"path":632,"stem":633,"children":-1},"나만의 업무 시스템 만들기","/webspace/examples/my-own-system","40.webspace/60.examples/10.my-own-system",{"title":635,"path":636,"stem":637,"children":-1},"실시간 오목 게임 만들기","/webspace/examples/realtime-gomoku","40.webspace/60.examples/20.realtime-gomoku",{"title":639,"path":640,"stem":641,"children":642,"page":55},"플러그인 사용하기","/plugin","50.plugin",[643,647,664,709,727,757],{"title":644,"path":645,"stem":646,"children":-1},"플러그인 개요","/plugin/overview","50.plugin/00.overview",{"title":648,"path":649,"stem":650,"children":651,"page":55},"캘린더","/plugin/calendar","50.plugin/10.calendar",[652,656,660],{"title":653,"path":654,"stem":655,"children":-1},"캘린더 소개","/plugin/calendar/overview","50.plugin/10.calendar/00.overview",{"title":657,"path":658,"stem":659,"children":-1},"일정 생성, 수정 및 삭제하기","/plugin/calendar/create-event","50.plugin/10.calendar/10.create-event",{"title":661,"path":662,"stem":663,"children":-1},"활동 기록 확인하기","/plugin/calendar/file-activity","50.plugin/10.calendar/40.file-activity",{"title":665,"path":666,"stem":667,"children":668,"page":55},"이메일","/plugin/email","50.plugin/20.email",[669,673,677,681,685,689,693,697,701,705],{"title":670,"path":671,"stem":672,"children":-1},"이메일 소개","/plugin/email/overview","50.plugin/20.email/00.overview",{"title":674,"path":675,"stem":676,"children":-1},"이메일 설정","/plugin/email/setfn-email-setting","50.plugin/20.email/05.setfn-email-setting",{"title":678,"path":679,"stem":680,"children":-1},"외부 이메일 연결","/plugin/email/external-email","50.plugin/20.email/07.external-email",{"title":682,"path":683,"stem":684,"children":-1},"이메일 기본 기능","/plugin/email/email-basic","50.plugin/20.email/10.email-basic",{"title":686,"path":687,"stem":688,"children":-1},"이메일 작성 및 전송","/plugin/email/email-compose","50.plugin/20.email/20.email-compose",{"title":690,"path":691,"stem":692,"children":-1},"파일 첨부하기","/plugin/email/email-attachment","50.plugin/20.email/30.email-attachment",{"title":694,"path":695,"stem":696,"children":-1},"이메일 폴더 관리","/plugin/email/email-folders","50.plugin/20.email/40.email-folders",{"title":698,"path":699,"stem":700,"children":-1},"이메일 자동 분류하기","/plugin/email/email-auto-classify","50.plugin/20.email/50.email-auto-classify",{"title":702,"path":703,"stem":704,"children":-1},"이메일 파일 보관 및 공유","/plugin/email/email-open-in-space","50.plugin/20.email/60.email-open-in-space",{"title":706,"path":707,"stem":708,"children":-1},"이메일 보안","/plugin/email/email-security","50.plugin/20.email/70.email-security",{"title":710,"path":711,"stem":712,"children":713,"page":55},"워크플로우 (업무자동화)","/plugin/workflow","50.plugin/30.workflow",[714,718,723],{"title":715,"path":716,"stem":717,"children":-1},"워크플로우 소개","/plugin/workflow/overview","50.plugin/30.workflow/00.overview",{"title":719,"path":720,"stem":721,"tags":722,"children":-1},"새 워크플로우 만들기","/plugin/workflow/new-workflow","50.plugin/30.workflow/10.new-workflow",[307],{"title":724,"path":725,"stem":726,"children":-1},"실행 기록 확인하기","/plugin/workflow/execution-history","50.plugin/30.workflow/20.execution-history",{"title":728,"path":729,"stem":730,"children":731,"page":55},"파인튜닝 (AI 학습)","/plugin/fine-tuning","50.plugin/40.fine-tuning",[732,737,741,745,749,753],{"title":733,"path":734,"stem":735,"tags":736,"children":-1},"파인튜닝 소개","/plugin/fine-tuning/overview","50.plugin/40.fine-tuning/00.overview",[307],{"title":738,"path":739,"stem":740,"children":-1},"학습 데이터 전처리","/plugin/fine-tuning/pre-processing","50.plugin/40.fine-tuning/10.pre-processing",{"title":742,"path":743,"stem":744,"children":-1},"학습","/plugin/fine-tuning/training","50.plugin/40.fine-tuning/20.training",{"title":746,"path":747,"stem":748,"children":-1},"평가","/plugin/fine-tuning/evaluation","50.plugin/40.fine-tuning/30.evaluation",{"title":750,"path":751,"stem":752,"children":-1},"채팅 테스트","/plugin/fine-tuning/chat-test","50.plugin/40.fine-tuning/40.chat-test",{"title":754,"path":755,"stem":756,"children":-1},"내보내기","/plugin/fine-tuning/export","50.plugin/40.fine-tuning/50.export",{"title":758,"path":759,"stem":760,"children":761,"page":55},"EDC (데이터 수집)","/plugin/edc","50.plugin/50.edc",[762,766,770,774],{"title":763,"path":764,"stem":765,"children":-1},"EDC 소개","/plugin/edc/overview","50.plugin/50.edc/00.overview",{"title":767,"path":768,"stem":769,"children":-1},"데이터 입력, Audit Trail","/plugin/edc/data-entry","50.plugin/50.edc/10.data-entry",{"title":771,"path":772,"stem":773,"children":-1},"빌더","/plugin/edc/builder","50.plugin/50.edc/20.builder",{"title":775,"path":776,"stem":777,"children":-1},"사용자/기관 설정","/plugin/edc/account","50.plugin/50.edc/30.account",{"title":779,"path":780,"stem":781,"children":782,"page":55},"FAQ","/faq","99.FAQ",[783,787,791,795,799,803,807],{"title":784,"path":785,"stem":786,"children":-1},"SetFN vs 클라우드 서비스 비교","/faq/comparison-cloud","99.FAQ/10.comparison-cloud",{"title":788,"path":789,"stem":790,"children":-1},"SetFN vs NAS 비교","/faq/comparison-nas","99.FAQ/20.comparison-nas",{"title":792,"path":793,"stem":794,"children":-1},"보안 정책","/faq/security-policy","99.FAQ/30.security-policy",{"title":796,"path":797,"stem":798,"children":-1},"SetFN은 왜 빠른가요","/faq/why-fast","99.FAQ/40.why-fast",{"title":800,"path":801,"stem":802,"children":-1},"라이선스 FAQ","/faq/license-faq","99.FAQ/50.license-faq",{"title":804,"path":805,"stem":806,"children":-1},"AI 기능 FAQ","/faq/ai-faq","99.FAQ/60.ai-faq",{"title":808,"path":809,"stem":810,"children":-1},"문제 해결 가이드","/faq/troubleshooting","99.FAQ/70.troubleshooting",{"title":812,"path":813,"stem":814,"children":815,"page":55},"응용편(초안)","/draft","draft",[816,820,824,828,832,836,840,844,848,852,856,860,864],{"title":817,"path":818,"stem":819,"children":-1},"예시 1. 소개 페이지 만들기","/draft/static-intro","draft/05.static-intro",{"title":821,"path":822,"stem":823,"children":-1},"예시 2. 공지 게시판 만들기","/draft/public-notice-board","draft/07.public-notice-board",{"title":825,"path":826,"stem":827,"children":-1},"예시 3. 커피챗 예약 시스템 만들기","/draft/coffee-chat-booking","draft/08.coffee-chat-booking",{"title":829,"path":830,"stem":831,"children":-1},"예시 4. 휴가 신청 시스템 만들기","/draft/leave-request","draft/09.leave-request",{"title":833,"path":834,"stem":835,"children":-1},"예시 5. 실시간 팀 채팅 만들기","/draft/team-chat","draft/10.team-chat",{"title":837,"path":838,"stem":839,"children":-1},"예시 6. 채용 지원 서류 제출함 만들기","/draft/client-submission","draft/11.client-submission",{"title":841,"path":842,"stem":843,"children":-1},"예시 7. 팀과 레벨에 따른 이슈 트래커 만들기","/draft/crm-basic","draft/12.crm-basic",{"title":845,"path":846,"stem":847,"children":-1},"예시 8. 이슈 상태별 필터와 통계 요약 화면 만들기","/draft/crm-search-filter","draft/13.crm-search-filter",{"title":849,"path":850,"stem":851,"children":-1},"예시 9. 실시간 커뮤니티 채팅과 운영 기능 만들기","/draft/community-moderation","draft/14.community-moderation",{"title":853,"path":854,"stem":855,"children":-1},"예시 10. 실시간 출석체크·투표 만들기","/draft/attendance-poll","draft/15.attendance-poll",{"title":857,"path":858,"stem":859,"children":-1},"예시 11. 찬반 논쟁 배틀 만들기","/draft/debate-battle","draft/16.debate-battle",{"title":861,"path":862,"stem":863,"children":-1},"예시 13. 공지사항 읽음 확인 만들기","/draft/announcement-read","draft/18.announcement-read",{"title":865,"path":866,"stem":867,"children":-1},"예시 14. 재고 관리 시스템 만들기","/draft/inventory-management","draft/19.inventory-management",{"title":869,"path":870,"stem":871,"children":872,"page":55},"SJAUTO","/sjauto","sjauto",[873,876,879,882],{"title":67,"path":874,"stem":875,"children":-1},"/sjauto/admin-page-access","sjauto/00.admin-page-access",{"title":270,"path":877,"stem":878,"children":-1},"/sjauto/signup","sjauto/10.signup",{"title":429,"path":880,"stem":881,"children":-1},"/sjauto/ai-chat-file","sjauto/ai-chat-file",{"title":631,"path":883,"stem":884,"children":-1},"/sjauto/webspace-schema-example","sjauto/webspace-schema-example",{"id":886,"title":631,"body":887,"cover":3738,"description":3739,"extension":3740,"image":3738,"meta":3741,"navigation":3743,"path":632,"seo":3744,"stem":633,"tags":3738,"thumbnail":3738,"__hash__":3754},"docs_ko/40.webspace/60.examples/10.my-own-system.md",{"type":888,"value":889,"toc":3732},"minimal",[890,894,898,916,919,924,934,937,947,958,3529,3542,3549,3552,3558,3565,3571,3578,3584,3595,3599,3605,3621,3624,3630,3633,3638,3641,3645,3648,3654,3657,3660,3663,3669,3675,3681,3687,3691,3694,3723,3725,3728],[891,892,631],"h1",{"id":893},"나만의-업무-시스템-만들기",[895,896,897],"p",{},"SetFN 워크스페이스에서 회사만의 그룹웨어, ERP 같은 시스템을 직접 만들 수 있습니다.\n데이터베이스 구조 설계와 화면 제작은 AI에게 맡기고, 우리는 그 결과물을 만들어 워크스페이스에 올리기만 하면 됩니다.\n만들어야 할 파일은 2개. 할 일은 업로드와 '배포' 버튼 클릭.\n'제조 현장의 재고 관리 프로그램'을 예시로 만들어보겠습니다.",[895,899,900,901,906,907,911,912,915],{},"AI 프롬프트 없이 완성된 파일을 바로 써보고 싶다면, ",[902,903,905],"a",{"href":904},"/examples/webspace/inventory-management/setfn-inventory-management-sample.zip","전체 샘플 ZIP 다운로드","에서 스키마와 ",[908,909,910],"code",{},"index.html",", ",[908,913,914],{},"mock-db-upload.html",", README를 한 번에 받을 수 있습니다.",[917,918],"hr",{},[920,921,923],"h2",{"id":922},"_1-데이터베이스-생성을-위한-sfn-파일-만들기","1. 데이터베이스 생성을 위한 .sfn 파일 만들기",[895,925,926,927,930,931,933],{},"SetFN 워크스페이스에서는 ",[908,928,929],{},".sfn","이라는 파일로 DB를 만들 수 있습니다. Claude, GPT, Gemini 같은 AI에게 ",[908,932,929],{}," 파일의 예시를 복사해서 주고 \"부품과 제품 재고 관리를 하고 싶어\"처럼 요구사항을 설명하면, AI가 파일을 만들어 줍니다.",[895,935,936],{},"아래 내용을 복사한 후, 아래 부분의 요구사항 설계를 바꿔서 AI에게 전달해보세요.",[938,939,944],"pre",{"className":940,"code":942,"language":943},[941],"language-text","너는 SetFN이라는 노코드 백엔드 플랫폼의 스키마 파일(.sfn)을 설계하는 엔지니어야.\n.sfn은 아래 구조를 가진 JSON 파일이야. \n\n{\n  \"content-type\": \"application/setfn-schema\",\n  \"dbType\": \"sqlite3\",\n  \"apiBuild\": {\n    \"dbName\": \"영문_소문자_밑줄_db이름\",\n    \"dbEngine\": \"sqlite\",\n    \"includeClient\": false,\n    \"features\": {\n      \"realtime\": { \"enabled\": false },\n      \"upload\": { \"enabled\": false },\n      \"ai-chat\": { \"enabled\": false }\n    }\n  },\n  \"data\": [\n    {\n      \"table\": { \"name\": \"테이블명\", \"cmt\": \"이 테이블 설명\" },\n      \"columns\": [\n        { \"name\": \"id\", \"type\": \"serial4\", \"primary\": true, \"default\": \"auto_increment\" },\n        { \"name\": \"컬럼명\", \"type\": \"text\", \"notnull\": true, \"cmt\": \"컬럼 설명\" },\n        { \"name\": \"숫자컬럼\", \"type\": \"int4\", \"notnull\": true, \"default\": \"0\" },\n        { \"name\": \"_created_at\", \"type\": \"timestamp\", \"default\": \"now()\" }\n      ],\n      \"permissions\": {\n        \"security\": { \"login\": true },\n        \"ops\": {\n          \"list\": { \"login\": true },\n          \"view\": { \"login\": true },\n          \"create\": { \"login\": true },\n          \"update\": { \"login\": true },\n          \"delete\": { \"login\": true, \"roles\": [\"admin\"] }\n        }\n      }\n    }\n  ]\n}\n\n컬럼 type은 serial4(자동증가 PK) / text / int4(정수) / timestamp만 사용해.\n컬럼에는 notnull, default, unique, index, cmt를 필요에 맞게 붙여.\n\n이제 이 형식으로, 제조업체가 쓸 \"재고관리 시스템\" DB를 설계해줘. 요구사항은 다음과 같아.\n\n- 부품을 등록하고, 부품별 현재 재고 수량을 관리한다.\n- 제품을 등록하고, 제품별 현재 재고 수량을 관리한다.\n- 제품 하나는 여러 부품으로 조립되어 만들어진다. 어떤 제품에 어떤 부품이 몇 개씩 필요한지(BOM, 자재명세서)를 관리한다.\n- 부품/제품의 입고·출고 이력을 남긴다. 특히 \"부품을 조립해서 제품을 생산\"하는 이벤트가 발생하면, 그 순간 사용된 부품들과 생산된 제품 수량이 하나의 사건으로 함께 추적되어야 한다(나중에 \"이 제품을 만드는데 부품이 얼마나 들어갔는지\" 조회할 수 있어야 함).\n\nDB 이름(dbName)은 \"inventory_management\"로 해줘.\n테이블 4개 이내로, 실무에서 바로 쓸 수 있을 만큼 실용적으로 설계해줘.\n다른 설명 없이 완성된 .sfn JSON 코드만 출력해줘.\n","text",[908,945,942],{"__ignoreMap":946},"",[895,948,949,950,953,954,957],{},"아래는 이렇게 만들어진 AI 응답의 예시입니다. 실제 결과는 AI마다, 실행할 때마다 조금씩 다를 수 있습니다 — 꼭 이 내용 그대로일 필요는 없고, 이렇게 비슷한 구조로만 나오면 됩니다. 다만 다른 설명 없이 ",[908,951,952],{},"{","로 시작해서 ",[908,955,956],{},"}","로 끝나는 형식이어야, 나올 결과를 그대로 에디터에 붙여넣을 수 있습니다.",[938,959,963],{"className":960,"code":961,"language":962,"meta":946,"style":946},"language-json shiki shiki-themes github-light github-dark monokai","{\n  \"content-type\": \"application/setfn-schema\",\n  \"dbType\": \"sqlite3\",\n  \"apiBuild\": {\n    \"dbName\": \"inventory_management\",\n    \"dbEngine\": \"sqlite\",\n    \"includeClient\": false,\n    \"features\": {\n      \"realtime\": { \"enabled\": false },\n      \"upload\": { \"enabled\": false },\n      \"ai-chat\": { \"enabled\": false }\n    }\n  },\n  \"data\": [\n    {\n      \"table\": { \"name\": \"parts\", \"cmt\": \"부품 마스터. 조회/등록/수정은 회원 누구나, 삭제는 관리자만\" },\n      \"columns\": [\n        { \"name\": \"id\", \"type\": \"serial4\", \"primary\": true, \"default\": \"auto_increment\" },\n        { \"name\": \"part_code\", \"type\": \"text\", \"notnull\": true, \"unique\": true, \"cmt\": \"부품 코드\" },\n        { \"name\": \"name\", \"type\": \"text\", \"notnull\": true, \"cmt\": \"부품명\" },\n        { \"name\": \"spec\", \"type\": \"text\", \"cmt\": \"규격 (예: M2, 220V/50Hz). 같은 이름이라도 규격이 다르면 별도 part_code로 등록\" },\n        { \"name\": \"category\", \"type\": \"text\", \"cmt\": \"부품 분류 (전자부품/기구부품/포장재 등)\" },\n        { \"name\": \"unit\", \"type\": \"text\", \"notnull\": true, \"default\": \"EA\", \"cmt\": \"단위\" },\n        { \"name\": \"unit_cost\", \"type\": \"int4\", \"notnull\": true, \"default\": \"0\", \"cmt\": \"단가\" },\n        { \"name\": \"current_stock\", \"type\": \"int4\", \"notnull\": true, \"default\": \"0\", \"cmt\": \"현재고\" },\n        { \"name\": \"safety_stock\", \"type\": \"int4\", \"notnull\": true, \"default\": \"0\", \"cmt\": \"안전재고(재주문점)\" },\n        { \"name\": \"supplier\", \"type\": \"text\", \"cmt\": \"공급업체\" },\n        { \"name\": \"_user_id\", \"type\": \"int4\", \"notnull\": true, \"index\": true },\n        { \"name\": \"_nick\", \"type\": \"text\", \"cmt\": \"최종 등록/수정한 회원 표시 이름\" },\n        { \"name\": \"_created_at\", \"type\": \"timestamp\", \"default\": \"now()\" }\n      ],\n      \"permissions\": {\n        \"security\": { \"login\": true, \"ownerColumn\": \"_user_id\" },\n        \"ops\": {\n          \"list\": { \"login\": true },\n          \"view\": { \"login\": true },\n          \"create\": { \"login\": true },\n          \"update\": { \"login\": true },\n          \"delete\": { \"login\": true, \"roles\": [\"admin\"] }\n        }\n      }\n    },\n    {\n      \"table\": { \"name\": \"products\", \"cmt\": \"제품 마스터. 조회/등록/수정은 회원 누구나, 삭제는 관리자만\" },\n      \"columns\": [\n        { \"name\": \"id\", \"type\": \"serial4\", \"primary\": true, \"default\": \"auto_increment\" },\n        { \"name\": \"product_code\", \"type\": \"text\", \"notnull\": true, \"unique\": true, \"cmt\": \"제품 코드\" },\n        { \"name\": \"name\", \"type\": \"text\", \"notnull\": true, \"cmt\": \"제품명\" },\n        { \"name\": \"category\", \"type\": \"text\", \"cmt\": \"제품 분류\" },\n        { \"name\": \"unit\", \"type\": \"text\", \"notnull\": true, \"default\": \"EA\", \"cmt\": \"단위\" },\n        { \"name\": \"price\", \"type\": \"int4\", \"notnull\": true, \"default\": \"0\", \"cmt\": \"판매가\" },\n        { \"name\": \"current_stock\", \"type\": \"int4\", \"notnull\": true, \"default\": \"0\", \"cmt\": \"현재고\" },\n        { \"name\": \"_user_id\", \"type\": \"int4\", \"notnull\": true, \"index\": true },\n        { \"name\": \"_nick\", \"type\": \"text\", \"cmt\": \"최종 등록/수정한 회원 표시 이름\" },\n        { \"name\": \"_created_at\", \"type\": \"timestamp\", \"default\": \"now()\" }\n      ],\n      \"permissions\": {\n        \"security\": { \"login\": true, \"ownerColumn\": \"_user_id\" },\n        \"ops\": {\n          \"list\": { \"login\": true },\n          \"view\": { \"login\": true },\n          \"create\": { \"login\": true },\n          \"update\": { \"login\": true },\n          \"delete\": { \"login\": true, \"roles\": [\"admin\"] }\n        }\n      }\n    },\n    {\n      \"table\": { \"name\": \"bom\", \"cmt\": \"제품별 부품 구성표(단일 단계). bom_key(product_id:part_id)에 unique 제약을 걸어 같은 제품에 같은 부품이 중복 등록되지 않게 함\" },\n      \"columns\": [\n        { \"name\": \"id\", \"type\": \"serial4\", \"primary\": true, \"default\": \"auto_increment\" },\n        { \"name\": \"product_id\", \"type\": \"int4\", \"notnull\": true, \"index\": true },\n        { \"name\": \"part_id\", \"type\": \"int4\", \"notnull\": true, \"index\": true },\n        { \"name\": \"qty_per_unit\", \"type\": \"int4\", \"notnull\": true, \"default\": \"1\", \"cmt\": \"제품 1개를 만드는 데 필요한 부품 수량\" },\n        { \"name\": \"bom_key\", \"type\": \"text\", \"notnull\": true, \"unique\": true, \"cmt\": \"product_id:part_id 조합. 중복 등록 방지용\" },\n        { \"name\": \"_user_id\", \"type\": \"int4\", \"notnull\": true, \"index\": true },\n        { \"name\": \"_nick\", \"type\": \"text\", \"cmt\": \"등록한 회원 표시 이름\" },\n        { \"name\": \"_created_at\", \"type\": \"timestamp\", \"default\": \"now()\" }\n      ],\n      \"permissions\": {\n        \"security\": { \"login\": true, \"ownerColumn\": \"_user_id\" },\n        \"ops\": {\n          \"list\": { \"login\": true },\n          \"view\": { \"login\": true },\n          \"create\": { \"login\": true },\n          \"update\": { \"login\": true },\n          \"delete\": { \"login\": true, \"roles\": [\"admin\"] }\n        }\n      }\n    },\n    {\n      \"table\": { \"name\": \"stock_transactions\", \"cmt\": \"입출고/조립 통합 이력. item_type=part|product, tx_type=입고|출고|조립사용|조립생산. 하나의 조립생산 이벤트는 같은 batch_id를 공유하는 조립사용(부품 소모) 여러 건 + 조립생산(제품 증가) 1건으로 구성되어, 제품에 어떤 부품이 얼마나 쓰였는지 추적할 수 있음\" },\n      \"columns\": [\n        { \"name\": \"id\", \"type\": \"serial4\", \"primary\": true, \"default\": \"auto_increment\" },\n        { \"name\": \"item_type\", \"type\": \"text\", \"notnull\": true, \"cmt\": \"part | product\" },\n        { \"name\": \"item_id\", \"type\": \"int4\", \"notnull\": true, \"index\": true, \"cmt\": \"parts.id 또는 products.id\" },\n        { \"name\": \"item_name\", \"type\": \"text\", \"notnull\": true, \"cmt\": \"등록 시점 품목명 스냅샷\" },\n        { \"name\": \"tx_type\", \"type\": \"text\", \"notnull\": true, \"cmt\": \"입고 | 출고 | 조립사용 | 조립생산\" },\n        { \"name\": \"reason\", \"type\": \"text\", \"cmt\": \"입출고 사유. 조립사용/조립생산은 tx_type 자체가 사유이므로 비워둠\" },\n        { \"name\": \"qty\", \"type\": \"int4\", \"notnull\": true, \"cmt\": \"항상 양수. 방향은 tx_type으로 판단\" },\n        { \"name\": \"batch_id\", \"type\": \"text\", \"index\": true, \"cmt\": \"조립생산 이벤트 묶음 id. 단순 입출고는 비어 있음\" },\n        { \"name\": \"note\", \"type\": \"text\", \"cmt\": \"메모\" },\n        { \"name\": \"_user_id\", \"type\": \"int4\", \"notnull\": true, \"index\": true },\n        { \"name\": \"_nick\", \"type\": \"text\", \"cmt\": \"등록한 회원 표시 이름\" },\n        { \"name\": \"_created_at\", \"type\": \"timestamp\", \"default\": \"now()\" }\n      ],\n      \"permissions\": {\n        \"security\": { \"login\": true, \"ownerColumn\": \"_user_id\" },\n        \"ops\": {\n          \"list\": { \"login\": true },\n          \"view\": { \"login\": true },\n          \"create\": { \"login\": true },\n          \"update\": { \"login\": true, \"roles\": [\"admin\"] },\n          \"delete\": { \"login\": true, \"roles\": [\"admin\"] }\n        }\n      }\n    }\n  ]\n}\n","json",[908,964,965,974,991,1004,1013,1026,1039,1053,1061,1080,1096,1113,1119,1125,1134,1140,1168,1176,1221,1271,1309,1340,1371,1419,1468,1515,1562,1593,1632,1663,1695,1701,1709,1735,1743,1759,1775,1791,1807,1835,1841,1847,1853,1858,1883,1890,1927,1974,2012,2042,2087,2134,2179,2216,2245,2274,2279,2286,2309,2316,2331,2346,2361,2376,2399,2404,2409,2414,2419,2444,2451,2488,2526,2564,2612,2659,2696,2726,2755,2760,2767,2790,2797,2812,2827,2842,2857,2880,2885,2890,2895,2900,2925,2932,2969,3008,3055,3094,3133,3164,3203,3242,3273,3310,3339,3368,3373,3380,3403,3410,3425,3440,3455,3479,3502,3507,3512,3517,3523],{"__ignoreMap":946},[966,967,970],"span",{"class":968,"line":969},"line",1,[966,971,973],{"class":972},"sMOD_","{\n",[966,975,977,981,984,988],{"class":968,"line":976},2,[966,978,980],{"class":979},"s-m8C","  \"content-type\"",[966,982,983],{"class":972},": ",[966,985,987],{"class":986},"sCZoN","\"application/setfn-schema\"",[966,989,990],{"class":972},",\n",[966,992,994,997,999,1002],{"class":968,"line":993},3,[966,995,996],{"class":979},"  \"dbType\"",[966,998,983],{"class":972},[966,1000,1001],{"class":986},"\"sqlite3\"",[966,1003,990],{"class":972},[966,1005,1007,1010],{"class":968,"line":1006},4,[966,1008,1009],{"class":979},"  \"apiBuild\"",[966,1011,1012],{"class":972},": {\n",[966,1014,1016,1019,1021,1024],{"class":968,"line":1015},5,[966,1017,1018],{"class":979},"    \"dbName\"",[966,1020,983],{"class":972},[966,1022,1023],{"class":986},"\"inventory_management\"",[966,1025,990],{"class":972},[966,1027,1029,1032,1034,1037],{"class":968,"line":1028},6,[966,1030,1031],{"class":979},"    \"dbEngine\"",[966,1033,983],{"class":972},[966,1035,1036],{"class":986},"\"sqlite\"",[966,1038,990],{"class":972},[966,1040,1042,1045,1047,1051],{"class":968,"line":1041},7,[966,1043,1044],{"class":979},"    \"includeClient\"",[966,1046,983],{"class":972},[966,1048,1050],{"class":1049},"s7F3e","false",[966,1052,990],{"class":972},[966,1054,1056,1059],{"class":968,"line":1055},8,[966,1057,1058],{"class":979},"    \"features\"",[966,1060,1012],{"class":972},[966,1062,1064,1067,1070,1073,1075,1077],{"class":968,"line":1063},9,[966,1065,1066],{"class":979},"      \"realtime\"",[966,1068,1069],{"class":972},": { ",[966,1071,1072],{"class":979},"\"enabled\"",[966,1074,983],{"class":972},[966,1076,1050],{"class":1049},[966,1078,1079],{"class":972}," },\n",[966,1081,1083,1086,1088,1090,1092,1094],{"class":968,"line":1082},10,[966,1084,1085],{"class":979},"      \"upload\"",[966,1087,1069],{"class":972},[966,1089,1072],{"class":979},[966,1091,983],{"class":972},[966,1093,1050],{"class":1049},[966,1095,1079],{"class":972},[966,1097,1099,1102,1104,1106,1108,1110],{"class":968,"line":1098},11,[966,1100,1101],{"class":979},"      \"ai-chat\"",[966,1103,1069],{"class":972},[966,1105,1072],{"class":979},[966,1107,983],{"class":972},[966,1109,1050],{"class":1049},[966,1111,1112],{"class":972}," }\n",[966,1114,1116],{"class":968,"line":1115},12,[966,1117,1118],{"class":972},"    }\n",[966,1120,1122],{"class":968,"line":1121},13,[966,1123,1124],{"class":972},"  },\n",[966,1126,1128,1131],{"class":968,"line":1127},14,[966,1129,1130],{"class":979},"  \"data\"",[966,1132,1133],{"class":972},": [\n",[966,1135,1137],{"class":968,"line":1136},15,[966,1138,1139],{"class":972},"    {\n",[966,1141,1143,1146,1148,1151,1153,1156,1158,1161,1163,1166],{"class":968,"line":1142},16,[966,1144,1145],{"class":979},"      \"table\"",[966,1147,1069],{"class":972},[966,1149,1150],{"class":979},"\"name\"",[966,1152,983],{"class":972},[966,1154,1155],{"class":986},"\"parts\"",[966,1157,911],{"class":972},[966,1159,1160],{"class":979},"\"cmt\"",[966,1162,983],{"class":972},[966,1164,1165],{"class":986},"\"부품 마스터. 조회/등록/수정은 회원 누구나, 삭제는 관리자만\"",[966,1167,1079],{"class":972},[966,1169,1171,1174],{"class":968,"line":1170},17,[966,1172,1173],{"class":979},"      \"columns\"",[966,1175,1133],{"class":972},[966,1177,1179,1182,1184,1186,1189,1191,1194,1196,1199,1201,1204,1206,1209,1211,1214,1216,1219],{"class":968,"line":1178},18,[966,1180,1181],{"class":972},"        { ",[966,1183,1150],{"class":979},[966,1185,983],{"class":972},[966,1187,1188],{"class":986},"\"id\"",[966,1190,911],{"class":972},[966,1192,1193],{"class":979},"\"type\"",[966,1195,983],{"class":972},[966,1197,1198],{"class":986},"\"serial4\"",[966,1200,911],{"class":972},[966,1202,1203],{"class":979},"\"primary\"",[966,1205,983],{"class":972},[966,1207,1208],{"class":1049},"true",[966,1210,911],{"class":972},[966,1212,1213],{"class":979},"\"default\"",[966,1215,983],{"class":972},[966,1217,1218],{"class":986},"\"auto_increment\"",[966,1220,1079],{"class":972},[966,1222,1224,1226,1228,1230,1233,1235,1237,1239,1242,1244,1247,1249,1251,1253,1256,1258,1260,1262,1264,1266,1269],{"class":968,"line":1223},19,[966,1225,1181],{"class":972},[966,1227,1150],{"class":979},[966,1229,983],{"class":972},[966,1231,1232],{"class":986},"\"part_code\"",[966,1234,911],{"class":972},[966,1236,1193],{"class":979},[966,1238,983],{"class":972},[966,1240,1241],{"class":986},"\"text\"",[966,1243,911],{"class":972},[966,1245,1246],{"class":979},"\"notnull\"",[966,1248,983],{"class":972},[966,1250,1208],{"class":1049},[966,1252,911],{"class":972},[966,1254,1255],{"class":979},"\"unique\"",[966,1257,983],{"class":972},[966,1259,1208],{"class":1049},[966,1261,911],{"class":972},[966,1263,1160],{"class":979},[966,1265,983],{"class":972},[966,1267,1268],{"class":986},"\"부품 코드\"",[966,1270,1079],{"class":972},[966,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1307],{"class":968,"line":1273},20,[966,1275,1181],{"class":972},[966,1277,1150],{"class":979},[966,1279,983],{"class":972},[966,1281,1150],{"class":986},[966,1283,911],{"class":972},[966,1285,1193],{"class":979},[966,1287,983],{"class":972},[966,1289,1241],{"class":986},[966,1291,911],{"class":972},[966,1293,1246],{"class":979},[966,1295,983],{"class":972},[966,1297,1208],{"class":1049},[966,1299,911],{"class":972},[966,1301,1160],{"class":979},[966,1303,983],{"class":972},[966,1305,1306],{"class":986},"\"부품명\"",[966,1308,1079],{"class":972},[966,1310,1312,1314,1316,1318,1321,1323,1325,1327,1329,1331,1333,1335,1338],{"class":968,"line":1311},21,[966,1313,1181],{"class":972},[966,1315,1150],{"class":979},[966,1317,983],{"class":972},[966,1319,1320],{"class":986},"\"spec\"",[966,1322,911],{"class":972},[966,1324,1193],{"class":979},[966,1326,983],{"class":972},[966,1328,1241],{"class":986},[966,1330,911],{"class":972},[966,1332,1160],{"class":979},[966,1334,983],{"class":972},[966,1336,1337],{"class":986},"\"규격 (예: M2, 220V/50Hz). 같은 이름이라도 규격이 다르면 별도 part_code로 등록\"",[966,1339,1079],{"class":972},[966,1341,1343,1345,1347,1349,1352,1354,1356,1358,1360,1362,1364,1366,1369],{"class":968,"line":1342},22,[966,1344,1181],{"class":972},[966,1346,1150],{"class":979},[966,1348,983],{"class":972},[966,1350,1351],{"class":986},"\"category\"",[966,1353,911],{"class":972},[966,1355,1193],{"class":979},[966,1357,983],{"class":972},[966,1359,1241],{"class":986},[966,1361,911],{"class":972},[966,1363,1160],{"class":979},[966,1365,983],{"class":972},[966,1367,1368],{"class":986},"\"부품 분류 (전자부품/기구부품/포장재 등)\"",[966,1370,1079],{"class":972},[966,1372,1374,1376,1378,1380,1383,1385,1387,1389,1391,1393,1395,1397,1399,1401,1403,1405,1408,1410,1412,1414,1417],{"class":968,"line":1373},23,[966,1375,1181],{"class":972},[966,1377,1150],{"class":979},[966,1379,983],{"class":972},[966,1381,1382],{"class":986},"\"unit\"",[966,1384,911],{"class":972},[966,1386,1193],{"class":979},[966,1388,983],{"class":972},[966,1390,1241],{"class":986},[966,1392,911],{"class":972},[966,1394,1246],{"class":979},[966,1396,983],{"class":972},[966,1398,1208],{"class":1049},[966,1400,911],{"class":972},[966,1402,1213],{"class":979},[966,1404,983],{"class":972},[966,1406,1407],{"class":986},"\"EA\"",[966,1409,911],{"class":972},[966,1411,1160],{"class":979},[966,1413,983],{"class":972},[966,1415,1416],{"class":986},"\"단위\"",[966,1418,1079],{"class":972},[966,1420,1422,1424,1426,1428,1431,1433,1435,1437,1440,1442,1444,1446,1448,1450,1452,1454,1457,1459,1461,1463,1466],{"class":968,"line":1421},24,[966,1423,1181],{"class":972},[966,1425,1150],{"class":979},[966,1427,983],{"class":972},[966,1429,1430],{"class":986},"\"unit_cost\"",[966,1432,911],{"class":972},[966,1434,1193],{"class":979},[966,1436,983],{"class":972},[966,1438,1439],{"class":986},"\"int4\"",[966,1441,911],{"class":972},[966,1443,1246],{"class":979},[966,1445,983],{"class":972},[966,1447,1208],{"class":1049},[966,1449,911],{"class":972},[966,1451,1213],{"class":979},[966,1453,983],{"class":972},[966,1455,1456],{"class":986},"\"0\"",[966,1458,911],{"class":972},[966,1460,1160],{"class":979},[966,1462,983],{"class":972},[966,1464,1465],{"class":986},"\"단가\"",[966,1467,1079],{"class":972},[966,1469,1471,1473,1475,1477,1480,1482,1484,1486,1488,1490,1492,1494,1496,1498,1500,1502,1504,1506,1508,1510,1513],{"class":968,"line":1470},25,[966,1472,1181],{"class":972},[966,1474,1150],{"class":979},[966,1476,983],{"class":972},[966,1478,1479],{"class":986},"\"current_stock\"",[966,1481,911],{"class":972},[966,1483,1193],{"class":979},[966,1485,983],{"class":972},[966,1487,1439],{"class":986},[966,1489,911],{"class":972},[966,1491,1246],{"class":979},[966,1493,983],{"class":972},[966,1495,1208],{"class":1049},[966,1497,911],{"class":972},[966,1499,1213],{"class":979},[966,1501,983],{"class":972},[966,1503,1456],{"class":986},[966,1505,911],{"class":972},[966,1507,1160],{"class":979},[966,1509,983],{"class":972},[966,1511,1512],{"class":986},"\"현재고\"",[966,1514,1079],{"class":972},[966,1516,1518,1520,1522,1524,1527,1529,1531,1533,1535,1537,1539,1541,1543,1545,1547,1549,1551,1553,1555,1557,1560],{"class":968,"line":1517},26,[966,1519,1181],{"class":972},[966,1521,1150],{"class":979},[966,1523,983],{"class":972},[966,1525,1526],{"class":986},"\"safety_stock\"",[966,1528,911],{"class":972},[966,1530,1193],{"class":979},[966,1532,983],{"class":972},[966,1534,1439],{"class":986},[966,1536,911],{"class":972},[966,1538,1246],{"class":979},[966,1540,983],{"class":972},[966,1542,1208],{"class":1049},[966,1544,911],{"class":972},[966,1546,1213],{"class":979},[966,1548,983],{"class":972},[966,1550,1456],{"class":986},[966,1552,911],{"class":972},[966,1554,1160],{"class":979},[966,1556,983],{"class":972},[966,1558,1559],{"class":986},"\"안전재고(재주문점)\"",[966,1561,1079],{"class":972},[966,1563,1565,1567,1569,1571,1574,1576,1578,1580,1582,1584,1586,1588,1591],{"class":968,"line":1564},27,[966,1566,1181],{"class":972},[966,1568,1150],{"class":979},[966,1570,983],{"class":972},[966,1572,1573],{"class":986},"\"supplier\"",[966,1575,911],{"class":972},[966,1577,1193],{"class":979},[966,1579,983],{"class":972},[966,1581,1241],{"class":986},[966,1583,911],{"class":972},[966,1585,1160],{"class":979},[966,1587,983],{"class":972},[966,1589,1590],{"class":986},"\"공급업체\"",[966,1592,1079],{"class":972},[966,1594,1596,1598,1600,1602,1605,1607,1609,1611,1613,1615,1617,1619,1621,1623,1626,1628,1630],{"class":968,"line":1595},28,[966,1597,1181],{"class":972},[966,1599,1150],{"class":979},[966,1601,983],{"class":972},[966,1603,1604],{"class":986},"\"_user_id\"",[966,1606,911],{"class":972},[966,1608,1193],{"class":979},[966,1610,983],{"class":972},[966,1612,1439],{"class":986},[966,1614,911],{"class":972},[966,1616,1246],{"class":979},[966,1618,983],{"class":972},[966,1620,1208],{"class":1049},[966,1622,911],{"class":972},[966,1624,1625],{"class":979},"\"index\"",[966,1627,983],{"class":972},[966,1629,1208],{"class":1049},[966,1631,1079],{"class":972},[966,1633,1635,1637,1639,1641,1644,1646,1648,1650,1652,1654,1656,1658,1661],{"class":968,"line":1634},29,[966,1636,1181],{"class":972},[966,1638,1150],{"class":979},[966,1640,983],{"class":972},[966,1642,1643],{"class":986},"\"_nick\"",[966,1645,911],{"class":972},[966,1647,1193],{"class":979},[966,1649,983],{"class":972},[966,1651,1241],{"class":986},[966,1653,911],{"class":972},[966,1655,1160],{"class":979},[966,1657,983],{"class":972},[966,1659,1660],{"class":986},"\"최종 등록/수정한 회원 표시 이름\"",[966,1662,1079],{"class":972},[966,1664,1666,1668,1670,1672,1675,1677,1679,1681,1684,1686,1688,1690,1693],{"class":968,"line":1665},30,[966,1667,1181],{"class":972},[966,1669,1150],{"class":979},[966,1671,983],{"class":972},[966,1673,1674],{"class":986},"\"_created_at\"",[966,1676,911],{"class":972},[966,1678,1193],{"class":979},[966,1680,983],{"class":972},[966,1682,1683],{"class":986},"\"timestamp\"",[966,1685,911],{"class":972},[966,1687,1213],{"class":979},[966,1689,983],{"class":972},[966,1691,1692],{"class":986},"\"now()\"",[966,1694,1112],{"class":972},[966,1696,1698],{"class":968,"line":1697},31,[966,1699,1700],{"class":972},"      ],\n",[966,1702,1704,1707],{"class":968,"line":1703},32,[966,1705,1706],{"class":979},"      \"permissions\"",[966,1708,1012],{"class":972},[966,1710,1712,1715,1717,1720,1722,1724,1726,1729,1731,1733],{"class":968,"line":1711},33,[966,1713,1714],{"class":979},"        \"security\"",[966,1716,1069],{"class":972},[966,1718,1719],{"class":979},"\"login\"",[966,1721,983],{"class":972},[966,1723,1208],{"class":1049},[966,1725,911],{"class":972},[966,1727,1728],{"class":979},"\"ownerColumn\"",[966,1730,983],{"class":972},[966,1732,1604],{"class":986},[966,1734,1079],{"class":972},[966,1736,1738,1741],{"class":968,"line":1737},34,[966,1739,1740],{"class":979},"        \"ops\"",[966,1742,1012],{"class":972},[966,1744,1746,1749,1751,1753,1755,1757],{"class":968,"line":1745},35,[966,1747,1748],{"class":979},"          \"list\"",[966,1750,1069],{"class":972},[966,1752,1719],{"class":979},[966,1754,983],{"class":972},[966,1756,1208],{"class":1049},[966,1758,1079],{"class":972},[966,1760,1762,1765,1767,1769,1771,1773],{"class":968,"line":1761},36,[966,1763,1764],{"class":979},"          \"view\"",[966,1766,1069],{"class":972},[966,1768,1719],{"class":979},[966,1770,983],{"class":972},[966,1772,1208],{"class":1049},[966,1774,1079],{"class":972},[966,1776,1778,1781,1783,1785,1787,1789],{"class":968,"line":1777},37,[966,1779,1780],{"class":979},"          \"create\"",[966,1782,1069],{"class":972},[966,1784,1719],{"class":979},[966,1786,983],{"class":972},[966,1788,1208],{"class":1049},[966,1790,1079],{"class":972},[966,1792,1794,1797,1799,1801,1803,1805],{"class":968,"line":1793},38,[966,1795,1796],{"class":979},"          \"update\"",[966,1798,1069],{"class":972},[966,1800,1719],{"class":979},[966,1802,983],{"class":972},[966,1804,1208],{"class":1049},[966,1806,1079],{"class":972},[966,1808,1810,1813,1815,1817,1819,1821,1823,1826,1829,1832],{"class":968,"line":1809},39,[966,1811,1812],{"class":979},"          \"delete\"",[966,1814,1069],{"class":972},[966,1816,1719],{"class":979},[966,1818,983],{"class":972},[966,1820,1208],{"class":1049},[966,1822,911],{"class":972},[966,1824,1825],{"class":979},"\"roles\"",[966,1827,1828],{"class":972},": [",[966,1830,1831],{"class":986},"\"admin\"",[966,1833,1834],{"class":972},"] }\n",[966,1836,1838],{"class":968,"line":1837},40,[966,1839,1840],{"class":972},"        }\n",[966,1842,1844],{"class":968,"line":1843},41,[966,1845,1846],{"class":972},"      }\n",[966,1848,1850],{"class":968,"line":1849},42,[966,1851,1852],{"class":972},"    },\n",[966,1854,1856],{"class":968,"line":1855},43,[966,1857,1139],{"class":972},[966,1859,1861,1863,1865,1867,1869,1872,1874,1876,1878,1881],{"class":968,"line":1860},44,[966,1862,1145],{"class":979},[966,1864,1069],{"class":972},[966,1866,1150],{"class":979},[966,1868,983],{"class":972},[966,1870,1871],{"class":986},"\"products\"",[966,1873,911],{"class":972},[966,1875,1160],{"class":979},[966,1877,983],{"class":972},[966,1879,1880],{"class":986},"\"제품 마스터. 조회/등록/수정은 회원 누구나, 삭제는 관리자만\"",[966,1882,1079],{"class":972},[966,1884,1886,1888],{"class":968,"line":1885},45,[966,1887,1173],{"class":979},[966,1889,1133],{"class":972},[966,1891,1893,1895,1897,1899,1901,1903,1905,1907,1909,1911,1913,1915,1917,1919,1921,1923,1925],{"class":968,"line":1892},46,[966,1894,1181],{"class":972},[966,1896,1150],{"class":979},[966,1898,983],{"class":972},[966,1900,1188],{"class":986},[966,1902,911],{"class":972},[966,1904,1193],{"class":979},[966,1906,983],{"class":972},[966,1908,1198],{"class":986},[966,1910,911],{"class":972},[966,1912,1203],{"class":979},[966,1914,983],{"class":972},[966,1916,1208],{"class":1049},[966,1918,911],{"class":972},[966,1920,1213],{"class":979},[966,1922,983],{"class":972},[966,1924,1218],{"class":986},[966,1926,1079],{"class":972},[966,1928,1930,1932,1934,1936,1939,1941,1943,1945,1947,1949,1951,1953,1955,1957,1959,1961,1963,1965,1967,1969,1972],{"class":968,"line":1929},47,[966,1931,1181],{"class":972},[966,1933,1150],{"class":979},[966,1935,983],{"class":972},[966,1937,1938],{"class":986},"\"product_code\"",[966,1940,911],{"class":972},[966,1942,1193],{"class":979},[966,1944,983],{"class":972},[966,1946,1241],{"class":986},[966,1948,911],{"class":972},[966,1950,1246],{"class":979},[966,1952,983],{"class":972},[966,1954,1208],{"class":1049},[966,1956,911],{"class":972},[966,1958,1255],{"class":979},[966,1960,983],{"class":972},[966,1962,1208],{"class":1049},[966,1964,911],{"class":972},[966,1966,1160],{"class":979},[966,1968,983],{"class":972},[966,1970,1971],{"class":986},"\"제품 코드\"",[966,1973,1079],{"class":972},[966,1975,1977,1979,1981,1983,1985,1987,1989,1991,1993,1995,1997,1999,2001,2003,2005,2007,2010],{"class":968,"line":1976},48,[966,1978,1181],{"class":972},[966,1980,1150],{"class":979},[966,1982,983],{"class":972},[966,1984,1150],{"class":986},[966,1986,911],{"class":972},[966,1988,1193],{"class":979},[966,1990,983],{"class":972},[966,1992,1241],{"class":986},[966,1994,911],{"class":972},[966,1996,1246],{"class":979},[966,1998,983],{"class":972},[966,2000,1208],{"class":1049},[966,2002,911],{"class":972},[966,2004,1160],{"class":979},[966,2006,983],{"class":972},[966,2008,2009],{"class":986},"\"제품명\"",[966,2011,1079],{"class":972},[966,2013,2015,2017,2019,2021,2023,2025,2027,2029,2031,2033,2035,2037,2040],{"class":968,"line":2014},49,[966,2016,1181],{"class":972},[966,2018,1150],{"class":979},[966,2020,983],{"class":972},[966,2022,1351],{"class":986},[966,2024,911],{"class":972},[966,2026,1193],{"class":979},[966,2028,983],{"class":972},[966,2030,1241],{"class":986},[966,2032,911],{"class":972},[966,2034,1160],{"class":979},[966,2036,983],{"class":972},[966,2038,2039],{"class":986},"\"제품 분류\"",[966,2041,1079],{"class":972},[966,2043,2045,2047,2049,2051,2053,2055,2057,2059,2061,2063,2065,2067,2069,2071,2073,2075,2077,2079,2081,2083,2085],{"class":968,"line":2044},50,[966,2046,1181],{"class":972},[966,2048,1150],{"class":979},[966,2050,983],{"class":972},[966,2052,1382],{"class":986},[966,2054,911],{"class":972},[966,2056,1193],{"class":979},[966,2058,983],{"class":972},[966,2060,1241],{"class":986},[966,2062,911],{"class":972},[966,2064,1246],{"class":979},[966,2066,983],{"class":972},[966,2068,1208],{"class":1049},[966,2070,911],{"class":972},[966,2072,1213],{"class":979},[966,2074,983],{"class":972},[966,2076,1407],{"class":986},[966,2078,911],{"class":972},[966,2080,1160],{"class":979},[966,2082,983],{"class":972},[966,2084,1416],{"class":986},[966,2086,1079],{"class":972},[966,2088,2090,2092,2094,2096,2099,2101,2103,2105,2107,2109,2111,2113,2115,2117,2119,2121,2123,2125,2127,2129,2132],{"class":968,"line":2089},51,[966,2091,1181],{"class":972},[966,2093,1150],{"class":979},[966,2095,983],{"class":972},[966,2097,2098],{"class":986},"\"price\"",[966,2100,911],{"class":972},[966,2102,1193],{"class":979},[966,2104,983],{"class":972},[966,2106,1439],{"class":986},[966,2108,911],{"class":972},[966,2110,1246],{"class":979},[966,2112,983],{"class":972},[966,2114,1208],{"class":1049},[966,2116,911],{"class":972},[966,2118,1213],{"class":979},[966,2120,983],{"class":972},[966,2122,1456],{"class":986},[966,2124,911],{"class":972},[966,2126,1160],{"class":979},[966,2128,983],{"class":972},[966,2130,2131],{"class":986},"\"판매가\"",[966,2133,1079],{"class":972},[966,2135,2137,2139,2141,2143,2145,2147,2149,2151,2153,2155,2157,2159,2161,2163,2165,2167,2169,2171,2173,2175,2177],{"class":968,"line":2136},52,[966,2138,1181],{"class":972},[966,2140,1150],{"class":979},[966,2142,983],{"class":972},[966,2144,1479],{"class":986},[966,2146,911],{"class":972},[966,2148,1193],{"class":979},[966,2150,983],{"class":972},[966,2152,1439],{"class":986},[966,2154,911],{"class":972},[966,2156,1246],{"class":979},[966,2158,983],{"class":972},[966,2160,1208],{"class":1049},[966,2162,911],{"class":972},[966,2164,1213],{"class":979},[966,2166,983],{"class":972},[966,2168,1456],{"class":986},[966,2170,911],{"class":972},[966,2172,1160],{"class":979},[966,2174,983],{"class":972},[966,2176,1512],{"class":986},[966,2178,1079],{"class":972},[966,2180,2182,2184,2186,2188,2190,2192,2194,2196,2198,2200,2202,2204,2206,2208,2210,2212,2214],{"class":968,"line":2181},53,[966,2183,1181],{"class":972},[966,2185,1150],{"class":979},[966,2187,983],{"class":972},[966,2189,1604],{"class":986},[966,2191,911],{"class":972},[966,2193,1193],{"class":979},[966,2195,983],{"class":972},[966,2197,1439],{"class":986},[966,2199,911],{"class":972},[966,2201,1246],{"class":979},[966,2203,983],{"class":972},[966,2205,1208],{"class":1049},[966,2207,911],{"class":972},[966,2209,1625],{"class":979},[966,2211,983],{"class":972},[966,2213,1208],{"class":1049},[966,2215,1079],{"class":972},[966,2217,2219,2221,2223,2225,2227,2229,2231,2233,2235,2237,2239,2241,2243],{"class":968,"line":2218},54,[966,2220,1181],{"class":972},[966,2222,1150],{"class":979},[966,2224,983],{"class":972},[966,2226,1643],{"class":986},[966,2228,911],{"class":972},[966,2230,1193],{"class":979},[966,2232,983],{"class":972},[966,2234,1241],{"class":986},[966,2236,911],{"class":972},[966,2238,1160],{"class":979},[966,2240,983],{"class":972},[966,2242,1660],{"class":986},[966,2244,1079],{"class":972},[966,2246,2248,2250,2252,2254,2256,2258,2260,2262,2264,2266,2268,2270,2272],{"class":968,"line":2247},55,[966,2249,1181],{"class":972},[966,2251,1150],{"class":979},[966,2253,983],{"class":972},[966,2255,1674],{"class":986},[966,2257,911],{"class":972},[966,2259,1193],{"class":979},[966,2261,983],{"class":972},[966,2263,1683],{"class":986},[966,2265,911],{"class":972},[966,2267,1213],{"class":979},[966,2269,983],{"class":972},[966,2271,1692],{"class":986},[966,2273,1112],{"class":972},[966,2275,2277],{"class":968,"line":2276},56,[966,2278,1700],{"class":972},[966,2280,2282,2284],{"class":968,"line":2281},57,[966,2283,1706],{"class":979},[966,2285,1012],{"class":972},[966,2287,2289,2291,2293,2295,2297,2299,2301,2303,2305,2307],{"class":968,"line":2288},58,[966,2290,1714],{"class":979},[966,2292,1069],{"class":972},[966,2294,1719],{"class":979},[966,2296,983],{"class":972},[966,2298,1208],{"class":1049},[966,2300,911],{"class":972},[966,2302,1728],{"class":979},[966,2304,983],{"class":972},[966,2306,1604],{"class":986},[966,2308,1079],{"class":972},[966,2310,2312,2314],{"class":968,"line":2311},59,[966,2313,1740],{"class":979},[966,2315,1012],{"class":972},[966,2317,2319,2321,2323,2325,2327,2329],{"class":968,"line":2318},60,[966,2320,1748],{"class":979},[966,2322,1069],{"class":972},[966,2324,1719],{"class":979},[966,2326,983],{"class":972},[966,2328,1208],{"class":1049},[966,2330,1079],{"class":972},[966,2332,2334,2336,2338,2340,2342,2344],{"class":968,"line":2333},61,[966,2335,1764],{"class":979},[966,2337,1069],{"class":972},[966,2339,1719],{"class":979},[966,2341,983],{"class":972},[966,2343,1208],{"class":1049},[966,2345,1079],{"class":972},[966,2347,2349,2351,2353,2355,2357,2359],{"class":968,"line":2348},62,[966,2350,1780],{"class":979},[966,2352,1069],{"class":972},[966,2354,1719],{"class":979},[966,2356,983],{"class":972},[966,2358,1208],{"class":1049},[966,2360,1079],{"class":972},[966,2362,2364,2366,2368,2370,2372,2374],{"class":968,"line":2363},63,[966,2365,1796],{"class":979},[966,2367,1069],{"class":972},[966,2369,1719],{"class":979},[966,2371,983],{"class":972},[966,2373,1208],{"class":1049},[966,2375,1079],{"class":972},[966,2377,2379,2381,2383,2385,2387,2389,2391,2393,2395,2397],{"class":968,"line":2378},64,[966,2380,1812],{"class":979},[966,2382,1069],{"class":972},[966,2384,1719],{"class":979},[966,2386,983],{"class":972},[966,2388,1208],{"class":1049},[966,2390,911],{"class":972},[966,2392,1825],{"class":979},[966,2394,1828],{"class":972},[966,2396,1831],{"class":986},[966,2398,1834],{"class":972},[966,2400,2402],{"class":968,"line":2401},65,[966,2403,1840],{"class":972},[966,2405,2407],{"class":968,"line":2406},66,[966,2408,1846],{"class":972},[966,2410,2412],{"class":968,"line":2411},67,[966,2413,1852],{"class":972},[966,2415,2417],{"class":968,"line":2416},68,[966,2418,1139],{"class":972},[966,2420,2422,2424,2426,2428,2430,2433,2435,2437,2439,2442],{"class":968,"line":2421},69,[966,2423,1145],{"class":979},[966,2425,1069],{"class":972},[966,2427,1150],{"class":979},[966,2429,983],{"class":972},[966,2431,2432],{"class":986},"\"bom\"",[966,2434,911],{"class":972},[966,2436,1160],{"class":979},[966,2438,983],{"class":972},[966,2440,2441],{"class":986},"\"제품별 부품 구성표(단일 단계). bom_key(product_id:part_id)에 unique 제약을 걸어 같은 제품에 같은 부품이 중복 등록되지 않게 함\"",[966,2443,1079],{"class":972},[966,2445,2447,2449],{"class":968,"line":2446},70,[966,2448,1173],{"class":979},[966,2450,1133],{"class":972},[966,2452,2454,2456,2458,2460,2462,2464,2466,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486],{"class":968,"line":2453},71,[966,2455,1181],{"class":972},[966,2457,1150],{"class":979},[966,2459,983],{"class":972},[966,2461,1188],{"class":986},[966,2463,911],{"class":972},[966,2465,1193],{"class":979},[966,2467,983],{"class":972},[966,2469,1198],{"class":986},[966,2471,911],{"class":972},[966,2473,1203],{"class":979},[966,2475,983],{"class":972},[966,2477,1208],{"class":1049},[966,2479,911],{"class":972},[966,2481,1213],{"class":979},[966,2483,983],{"class":972},[966,2485,1218],{"class":986},[966,2487,1079],{"class":972},[966,2489,2491,2493,2495,2497,2500,2502,2504,2506,2508,2510,2512,2514,2516,2518,2520,2522,2524],{"class":968,"line":2490},72,[966,2492,1181],{"class":972},[966,2494,1150],{"class":979},[966,2496,983],{"class":972},[966,2498,2499],{"class":986},"\"product_id\"",[966,2501,911],{"class":972},[966,2503,1193],{"class":979},[966,2505,983],{"class":972},[966,2507,1439],{"class":986},[966,2509,911],{"class":972},[966,2511,1246],{"class":979},[966,2513,983],{"class":972},[966,2515,1208],{"class":1049},[966,2517,911],{"class":972},[966,2519,1625],{"class":979},[966,2521,983],{"class":972},[966,2523,1208],{"class":1049},[966,2525,1079],{"class":972},[966,2527,2529,2531,2533,2535,2538,2540,2542,2544,2546,2548,2550,2552,2554,2556,2558,2560,2562],{"class":968,"line":2528},73,[966,2530,1181],{"class":972},[966,2532,1150],{"class":979},[966,2534,983],{"class":972},[966,2536,2537],{"class":986},"\"part_id\"",[966,2539,911],{"class":972},[966,2541,1193],{"class":979},[966,2543,983],{"class":972},[966,2545,1439],{"class":986},[966,2547,911],{"class":972},[966,2549,1246],{"class":979},[966,2551,983],{"class":972},[966,2553,1208],{"class":1049},[966,2555,911],{"class":972},[966,2557,1625],{"class":979},[966,2559,983],{"class":972},[966,2561,1208],{"class":1049},[966,2563,1079],{"class":972},[966,2565,2567,2569,2571,2573,2576,2578,2580,2582,2584,2586,2588,2590,2592,2594,2596,2598,2601,2603,2605,2607,2610],{"class":968,"line":2566},74,[966,2568,1181],{"class":972},[966,2570,1150],{"class":979},[966,2572,983],{"class":972},[966,2574,2575],{"class":986},"\"qty_per_unit\"",[966,2577,911],{"class":972},[966,2579,1193],{"class":979},[966,2581,983],{"class":972},[966,2583,1439],{"class":986},[966,2585,911],{"class":972},[966,2587,1246],{"class":979},[966,2589,983],{"class":972},[966,2591,1208],{"class":1049},[966,2593,911],{"class":972},[966,2595,1213],{"class":979},[966,2597,983],{"class":972},[966,2599,2600],{"class":986},"\"1\"",[966,2602,911],{"class":972},[966,2604,1160],{"class":979},[966,2606,983],{"class":972},[966,2608,2609],{"class":986},"\"제품 1개를 만드는 데 필요한 부품 수량\"",[966,2611,1079],{"class":972},[966,2613,2615,2617,2619,2621,2624,2626,2628,2630,2632,2634,2636,2638,2640,2642,2644,2646,2648,2650,2652,2654,2657],{"class":968,"line":2614},75,[966,2616,1181],{"class":972},[966,2618,1150],{"class":979},[966,2620,983],{"class":972},[966,2622,2623],{"class":986},"\"bom_key\"",[966,2625,911],{"class":972},[966,2627,1193],{"class":979},[966,2629,983],{"class":972},[966,2631,1241],{"class":986},[966,2633,911],{"class":972},[966,2635,1246],{"class":979},[966,2637,983],{"class":972},[966,2639,1208],{"class":1049},[966,2641,911],{"class":972},[966,2643,1255],{"class":979},[966,2645,983],{"class":972},[966,2647,1208],{"class":1049},[966,2649,911],{"class":972},[966,2651,1160],{"class":979},[966,2653,983],{"class":972},[966,2655,2656],{"class":986},"\"product_id:part_id 조합. 중복 등록 방지용\"",[966,2658,1079],{"class":972},[966,2660,2662,2664,2666,2668,2670,2672,2674,2676,2678,2680,2682,2684,2686,2688,2690,2692,2694],{"class":968,"line":2661},76,[966,2663,1181],{"class":972},[966,2665,1150],{"class":979},[966,2667,983],{"class":972},[966,2669,1604],{"class":986},[966,2671,911],{"class":972},[966,2673,1193],{"class":979},[966,2675,983],{"class":972},[966,2677,1439],{"class":986},[966,2679,911],{"class":972},[966,2681,1246],{"class":979},[966,2683,983],{"class":972},[966,2685,1208],{"class":1049},[966,2687,911],{"class":972},[966,2689,1625],{"class":979},[966,2691,983],{"class":972},[966,2693,1208],{"class":1049},[966,2695,1079],{"class":972},[966,2697,2699,2701,2703,2705,2707,2709,2711,2713,2715,2717,2719,2721,2724],{"class":968,"line":2698},77,[966,2700,1181],{"class":972},[966,2702,1150],{"class":979},[966,2704,983],{"class":972},[966,2706,1643],{"class":986},[966,2708,911],{"class":972},[966,2710,1193],{"class":979},[966,2712,983],{"class":972},[966,2714,1241],{"class":986},[966,2716,911],{"class":972},[966,2718,1160],{"class":979},[966,2720,983],{"class":972},[966,2722,2723],{"class":986},"\"등록한 회원 표시 이름\"",[966,2725,1079],{"class":972},[966,2727,2729,2731,2733,2735,2737,2739,2741,2743,2745,2747,2749,2751,2753],{"class":968,"line":2728},78,[966,2730,1181],{"class":972},[966,2732,1150],{"class":979},[966,2734,983],{"class":972},[966,2736,1674],{"class":986},[966,2738,911],{"class":972},[966,2740,1193],{"class":979},[966,2742,983],{"class":972},[966,2744,1683],{"class":986},[966,2746,911],{"class":972},[966,2748,1213],{"class":979},[966,2750,983],{"class":972},[966,2752,1692],{"class":986},[966,2754,1112],{"class":972},[966,2756,2758],{"class":968,"line":2757},79,[966,2759,1700],{"class":972},[966,2761,2763,2765],{"class":968,"line":2762},80,[966,2764,1706],{"class":979},[966,2766,1012],{"class":972},[966,2768,2770,2772,2774,2776,2778,2780,2782,2784,2786,2788],{"class":968,"line":2769},81,[966,2771,1714],{"class":979},[966,2773,1069],{"class":972},[966,2775,1719],{"class":979},[966,2777,983],{"class":972},[966,2779,1208],{"class":1049},[966,2781,911],{"class":972},[966,2783,1728],{"class":979},[966,2785,983],{"class":972},[966,2787,1604],{"class":986},[966,2789,1079],{"class":972},[966,2791,2793,2795],{"class":968,"line":2792},82,[966,2794,1740],{"class":979},[966,2796,1012],{"class":972},[966,2798,2800,2802,2804,2806,2808,2810],{"class":968,"line":2799},83,[966,2801,1748],{"class":979},[966,2803,1069],{"class":972},[966,2805,1719],{"class":979},[966,2807,983],{"class":972},[966,2809,1208],{"class":1049},[966,2811,1079],{"class":972},[966,2813,2815,2817,2819,2821,2823,2825],{"class":968,"line":2814},84,[966,2816,1764],{"class":979},[966,2818,1069],{"class":972},[966,2820,1719],{"class":979},[966,2822,983],{"class":972},[966,2824,1208],{"class":1049},[966,2826,1079],{"class":972},[966,2828,2830,2832,2834,2836,2838,2840],{"class":968,"line":2829},85,[966,2831,1780],{"class":979},[966,2833,1069],{"class":972},[966,2835,1719],{"class":979},[966,2837,983],{"class":972},[966,2839,1208],{"class":1049},[966,2841,1079],{"class":972},[966,2843,2845,2847,2849,2851,2853,2855],{"class":968,"line":2844},86,[966,2846,1796],{"class":979},[966,2848,1069],{"class":972},[966,2850,1719],{"class":979},[966,2852,983],{"class":972},[966,2854,1208],{"class":1049},[966,2856,1079],{"class":972},[966,2858,2860,2862,2864,2866,2868,2870,2872,2874,2876,2878],{"class":968,"line":2859},87,[966,2861,1812],{"class":979},[966,2863,1069],{"class":972},[966,2865,1719],{"class":979},[966,2867,983],{"class":972},[966,2869,1208],{"class":1049},[966,2871,911],{"class":972},[966,2873,1825],{"class":979},[966,2875,1828],{"class":972},[966,2877,1831],{"class":986},[966,2879,1834],{"class":972},[966,2881,2883],{"class":968,"line":2882},88,[966,2884,1840],{"class":972},[966,2886,2888],{"class":968,"line":2887},89,[966,2889,1846],{"class":972},[966,2891,2893],{"class":968,"line":2892},90,[966,2894,1852],{"class":972},[966,2896,2898],{"class":968,"line":2897},91,[966,2899,1139],{"class":972},[966,2901,2903,2905,2907,2909,2911,2914,2916,2918,2920,2923],{"class":968,"line":2902},92,[966,2904,1145],{"class":979},[966,2906,1069],{"class":972},[966,2908,1150],{"class":979},[966,2910,983],{"class":972},[966,2912,2913],{"class":986},"\"stock_transactions\"",[966,2915,911],{"class":972},[966,2917,1160],{"class":979},[966,2919,983],{"class":972},[966,2921,2922],{"class":986},"\"입출고/조립 통합 이력. item_type=part|product, tx_type=입고|출고|조립사용|조립생산. 하나의 조립생산 이벤트는 같은 batch_id를 공유하는 조립사용(부품 소모) 여러 건 + 조립생산(제품 증가) 1건으로 구성되어, 제품에 어떤 부품이 얼마나 쓰였는지 추적할 수 있음\"",[966,2924,1079],{"class":972},[966,2926,2928,2930],{"class":968,"line":2927},93,[966,2929,1173],{"class":979},[966,2931,1133],{"class":972},[966,2933,2935,2937,2939,2941,2943,2945,2947,2949,2951,2953,2955,2957,2959,2961,2963,2965,2967],{"class":968,"line":2934},94,[966,2936,1181],{"class":972},[966,2938,1150],{"class":979},[966,2940,983],{"class":972},[966,2942,1188],{"class":986},[966,2944,911],{"class":972},[966,2946,1193],{"class":979},[966,2948,983],{"class":972},[966,2950,1198],{"class":986},[966,2952,911],{"class":972},[966,2954,1203],{"class":979},[966,2956,983],{"class":972},[966,2958,1208],{"class":1049},[966,2960,911],{"class":972},[966,2962,1213],{"class":979},[966,2964,983],{"class":972},[966,2966,1218],{"class":986},[966,2968,1079],{"class":972},[966,2970,2972,2974,2976,2978,2981,2983,2985,2987,2989,2991,2993,2995,2997,2999,3001,3003,3006],{"class":968,"line":2971},95,[966,2973,1181],{"class":972},[966,2975,1150],{"class":979},[966,2977,983],{"class":972},[966,2979,2980],{"class":986},"\"item_type\"",[966,2982,911],{"class":972},[966,2984,1193],{"class":979},[966,2986,983],{"class":972},[966,2988,1241],{"class":986},[966,2990,911],{"class":972},[966,2992,1246],{"class":979},[966,2994,983],{"class":972},[966,2996,1208],{"class":1049},[966,2998,911],{"class":972},[966,3000,1160],{"class":979},[966,3002,983],{"class":972},[966,3004,3005],{"class":986},"\"part | product\"",[966,3007,1079],{"class":972},[966,3009,3011,3013,3015,3017,3020,3022,3024,3026,3028,3030,3032,3034,3036,3038,3040,3042,3044,3046,3048,3050,3053],{"class":968,"line":3010},96,[966,3012,1181],{"class":972},[966,3014,1150],{"class":979},[966,3016,983],{"class":972},[966,3018,3019],{"class":986},"\"item_id\"",[966,3021,911],{"class":972},[966,3023,1193],{"class":979},[966,3025,983],{"class":972},[966,3027,1439],{"class":986},[966,3029,911],{"class":972},[966,3031,1246],{"class":979},[966,3033,983],{"class":972},[966,3035,1208],{"class":1049},[966,3037,911],{"class":972},[966,3039,1625],{"class":979},[966,3041,983],{"class":972},[966,3043,1208],{"class":1049},[966,3045,911],{"class":972},[966,3047,1160],{"class":979},[966,3049,983],{"class":972},[966,3051,3052],{"class":986},"\"parts.id 또는 products.id\"",[966,3054,1079],{"class":972},[966,3056,3058,3060,3062,3064,3067,3069,3071,3073,3075,3077,3079,3081,3083,3085,3087,3089,3092],{"class":968,"line":3057},97,[966,3059,1181],{"class":972},[966,3061,1150],{"class":979},[966,3063,983],{"class":972},[966,3065,3066],{"class":986},"\"item_name\"",[966,3068,911],{"class":972},[966,3070,1193],{"class":979},[966,3072,983],{"class":972},[966,3074,1241],{"class":986},[966,3076,911],{"class":972},[966,3078,1246],{"class":979},[966,3080,983],{"class":972},[966,3082,1208],{"class":1049},[966,3084,911],{"class":972},[966,3086,1160],{"class":979},[966,3088,983],{"class":972},[966,3090,3091],{"class":986},"\"등록 시점 품목명 스냅샷\"",[966,3093,1079],{"class":972},[966,3095,3097,3099,3101,3103,3106,3108,3110,3112,3114,3116,3118,3120,3122,3124,3126,3128,3131],{"class":968,"line":3096},98,[966,3098,1181],{"class":972},[966,3100,1150],{"class":979},[966,3102,983],{"class":972},[966,3104,3105],{"class":986},"\"tx_type\"",[966,3107,911],{"class":972},[966,3109,1193],{"class":979},[966,3111,983],{"class":972},[966,3113,1241],{"class":986},[966,3115,911],{"class":972},[966,3117,1246],{"class":979},[966,3119,983],{"class":972},[966,3121,1208],{"class":1049},[966,3123,911],{"class":972},[966,3125,1160],{"class":979},[966,3127,983],{"class":972},[966,3129,3130],{"class":986},"\"입고 | 출고 | 조립사용 | 조립생산\"",[966,3132,1079],{"class":972},[966,3134,3136,3138,3140,3142,3145,3147,3149,3151,3153,3155,3157,3159,3162],{"class":968,"line":3135},99,[966,3137,1181],{"class":972},[966,3139,1150],{"class":979},[966,3141,983],{"class":972},[966,3143,3144],{"class":986},"\"reason\"",[966,3146,911],{"class":972},[966,3148,1193],{"class":979},[966,3150,983],{"class":972},[966,3152,1241],{"class":986},[966,3154,911],{"class":972},[966,3156,1160],{"class":979},[966,3158,983],{"class":972},[966,3160,3161],{"class":986},"\"입출고 사유. 조립사용/조립생산은 tx_type 자체가 사유이므로 비워둠\"",[966,3163,1079],{"class":972},[966,3165,3167,3169,3171,3173,3176,3178,3180,3182,3184,3186,3188,3190,3192,3194,3196,3198,3201],{"class":968,"line":3166},100,[966,3168,1181],{"class":972},[966,3170,1150],{"class":979},[966,3172,983],{"class":972},[966,3174,3175],{"class":986},"\"qty\"",[966,3177,911],{"class":972},[966,3179,1193],{"class":979},[966,3181,983],{"class":972},[966,3183,1439],{"class":986},[966,3185,911],{"class":972},[966,3187,1246],{"class":979},[966,3189,983],{"class":972},[966,3191,1208],{"class":1049},[966,3193,911],{"class":972},[966,3195,1160],{"class":979},[966,3197,983],{"class":972},[966,3199,3200],{"class":986},"\"항상 양수. 방향은 tx_type으로 판단\"",[966,3202,1079],{"class":972},[966,3204,3206,3208,3210,3212,3215,3217,3219,3221,3223,3225,3227,3229,3231,3233,3235,3237,3240],{"class":968,"line":3205},101,[966,3207,1181],{"class":972},[966,3209,1150],{"class":979},[966,3211,983],{"class":972},[966,3213,3214],{"class":986},"\"batch_id\"",[966,3216,911],{"class":972},[966,3218,1193],{"class":979},[966,3220,983],{"class":972},[966,3222,1241],{"class":986},[966,3224,911],{"class":972},[966,3226,1625],{"class":979},[966,3228,983],{"class":972},[966,3230,1208],{"class":1049},[966,3232,911],{"class":972},[966,3234,1160],{"class":979},[966,3236,983],{"class":972},[966,3238,3239],{"class":986},"\"조립생산 이벤트 묶음 id. 단순 입출고는 비어 있음\"",[966,3241,1079],{"class":972},[966,3243,3245,3247,3249,3251,3254,3256,3258,3260,3262,3264,3266,3268,3271],{"class":968,"line":3244},102,[966,3246,1181],{"class":972},[966,3248,1150],{"class":979},[966,3250,983],{"class":972},[966,3252,3253],{"class":986},"\"note\"",[966,3255,911],{"class":972},[966,3257,1193],{"class":979},[966,3259,983],{"class":972},[966,3261,1241],{"class":986},[966,3263,911],{"class":972},[966,3265,1160],{"class":979},[966,3267,983],{"class":972},[966,3269,3270],{"class":986},"\"메모\"",[966,3272,1079],{"class":972},[966,3274,3276,3278,3280,3282,3284,3286,3288,3290,3292,3294,3296,3298,3300,3302,3304,3306,3308],{"class":968,"line":3275},103,[966,3277,1181],{"class":972},[966,3279,1150],{"class":979},[966,3281,983],{"class":972},[966,3283,1604],{"class":986},[966,3285,911],{"class":972},[966,3287,1193],{"class":979},[966,3289,983],{"class":972},[966,3291,1439],{"class":986},[966,3293,911],{"class":972},[966,3295,1246],{"class":979},[966,3297,983],{"class":972},[966,3299,1208],{"class":1049},[966,3301,911],{"class":972},[966,3303,1625],{"class":979},[966,3305,983],{"class":972},[966,3307,1208],{"class":1049},[966,3309,1079],{"class":972},[966,3311,3313,3315,3317,3319,3321,3323,3325,3327,3329,3331,3333,3335,3337],{"class":968,"line":3312},104,[966,3314,1181],{"class":972},[966,3316,1150],{"class":979},[966,3318,983],{"class":972},[966,3320,1643],{"class":986},[966,3322,911],{"class":972},[966,3324,1193],{"class":979},[966,3326,983],{"class":972},[966,3328,1241],{"class":986},[966,3330,911],{"class":972},[966,3332,1160],{"class":979},[966,3334,983],{"class":972},[966,3336,2723],{"class":986},[966,3338,1079],{"class":972},[966,3340,3342,3344,3346,3348,3350,3352,3354,3356,3358,3360,3362,3364,3366],{"class":968,"line":3341},105,[966,3343,1181],{"class":972},[966,3345,1150],{"class":979},[966,3347,983],{"class":972},[966,3349,1674],{"class":986},[966,3351,911],{"class":972},[966,3353,1193],{"class":979},[966,3355,983],{"class":972},[966,3357,1683],{"class":986},[966,3359,911],{"class":972},[966,3361,1213],{"class":979},[966,3363,983],{"class":972},[966,3365,1692],{"class":986},[966,3367,1112],{"class":972},[966,3369,3371],{"class":968,"line":3370},106,[966,3372,1700],{"class":972},[966,3374,3376,3378],{"class":968,"line":3375},107,[966,3377,1706],{"class":979},[966,3379,1012],{"class":972},[966,3381,3383,3385,3387,3389,3391,3393,3395,3397,3399,3401],{"class":968,"line":3382},108,[966,3384,1714],{"class":979},[966,3386,1069],{"class":972},[966,3388,1719],{"class":979},[966,3390,983],{"class":972},[966,3392,1208],{"class":1049},[966,3394,911],{"class":972},[966,3396,1728],{"class":979},[966,3398,983],{"class":972},[966,3400,1604],{"class":986},[966,3402,1079],{"class":972},[966,3404,3406,3408],{"class":968,"line":3405},109,[966,3407,1740],{"class":979},[966,3409,1012],{"class":972},[966,3411,3413,3415,3417,3419,3421,3423],{"class":968,"line":3412},110,[966,3414,1748],{"class":979},[966,3416,1069],{"class":972},[966,3418,1719],{"class":979},[966,3420,983],{"class":972},[966,3422,1208],{"class":1049},[966,3424,1079],{"class":972},[966,3426,3428,3430,3432,3434,3436,3438],{"class":968,"line":3427},111,[966,3429,1764],{"class":979},[966,3431,1069],{"class":972},[966,3433,1719],{"class":979},[966,3435,983],{"class":972},[966,3437,1208],{"class":1049},[966,3439,1079],{"class":972},[966,3441,3443,3445,3447,3449,3451,3453],{"class":968,"line":3442},112,[966,3444,1780],{"class":979},[966,3446,1069],{"class":972},[966,3448,1719],{"class":979},[966,3450,983],{"class":972},[966,3452,1208],{"class":1049},[966,3454,1079],{"class":972},[966,3456,3458,3460,3462,3464,3466,3468,3470,3472,3474,3476],{"class":968,"line":3457},113,[966,3459,1796],{"class":979},[966,3461,1069],{"class":972},[966,3463,1719],{"class":979},[966,3465,983],{"class":972},[966,3467,1208],{"class":1049},[966,3469,911],{"class":972},[966,3471,1825],{"class":979},[966,3473,1828],{"class":972},[966,3475,1831],{"class":986},[966,3477,3478],{"class":972},"] },\n",[966,3480,3482,3484,3486,3488,3490,3492,3494,3496,3498,3500],{"class":968,"line":3481},114,[966,3483,1812],{"class":979},[966,3485,1069],{"class":972},[966,3487,1719],{"class":979},[966,3489,983],{"class":972},[966,3491,1208],{"class":1049},[966,3493,911],{"class":972},[966,3495,1825],{"class":979},[966,3497,1828],{"class":972},[966,3499,1831],{"class":986},[966,3501,1834],{"class":972},[966,3503,3505],{"class":968,"line":3504},115,[966,3506,1840],{"class":972},[966,3508,3510],{"class":968,"line":3509},116,[966,3511,1846],{"class":972},[966,3513,3515],{"class":968,"line":3514},117,[966,3516,1118],{"class":972},[966,3518,3520],{"class":968,"line":3519},118,[966,3521,3522],{"class":972},"  ]\n",[966,3524,3526],{"class":968,"line":3525},119,[966,3527,3528],{"class":972},"}\n",[895,3530,3531,3532,3535,3536,3535,3538,3541],{},"이 결과를 복사해서, 워크스페이스에서 ",[908,3533,3534],{},"만들기"," → ",[908,3537,405],{},[908,3539,3540],{},"새 스키마(DB)","로 빈 스키마 파일을 만듭니다.",[895,3543,3544],{},[3545,3546],"img",{"alt":3547,"src":3548},"만들기 > 템플릿 파일 > 새 스키마(DB) 선택 화면","./_screenshots/new-schema.png",[895,3550,3551],{},"파일 이름을 입력하고 저장하면 빈 스키마 파일이 만들어집니다.",[895,3553,3554],{},[3545,3555],{"alt":3556,"src":3557},"새로 만든 빈 스키마 파일","./_screenshots/schema-file-first.png",[895,3559,3560,3561,3564],{},"오른쪽 위의 ",[908,3562,3563],{},"에디터"," 탭을 누른 후, 아까 AI의 응답을 그대로 붙여넣습니다.",[895,3566,3567],{},[3545,3568],{"alt":3569,"src":3570},"스키마 에디터 화면","./_screenshots/schema-editor.png",[895,3572,3573,3574,3577],{},"저장한 뒤 상단의 ",[908,3575,3576],{},"API빌드"," 탭으로 이동하면 테이블별로 자동 생성된 API 목록을 확인할 수 있습니다.",[895,3579,3580],{},[3545,3581],{"alt":3582,"src":3583},"API 빌드 화면","./_screenshots/schema-api-build.png",[895,3585,3586,3589,3590,3594],{},[908,3587,3588],{},"배포하기","를 누릅니다. 몇 초 정도 기다리면 '배포 완료' 메시지가 뜹니다. 마지막으로, 상단의 디스켓 버튼을 눌러 저장합니다. ",[3591,3592,3593],"strong",{},"여기까지 하면 DB 구성이 끝났습니다"," — 부품/제품/구성표/입출고 이력 4개 테이블과, 그 테이블들을 다루는 REST API가 실제로 만들어져 바로 쓸 수 있는 상태가 됩니다. 이제는 여기 DB와 연결할 화면을 만들 차례입니다.",[920,3596,3598],{"id":3597},"_2-화면-구성을-위한-html-파일-만들기","2. 화면 구성을 위한 .html 파일 만들기",[895,3600,3601,3602,3604],{},"이번에도 AI에게 요청합니다. 만들고 싶은 것을 기획하고 정리해 AI에게 전달합니다. 이때 아까 만든 ",[908,3603,929],{}," 파일 내용도 참고 자료로 같이 주면 됩니다.",[3606,3607,3608,3612,3615,3618],"ul",{},[3609,3610,3611],"li",{},"부품·제품을 등록하는 입력 폼",[3609,3613,3614],{},"입고·출고를 등록하는 폼",[3609,3616,3617],{},"\"이 제품을 몇 개 생산했다\"고 등록하면 필요한 부품 수량을 자동으로 계산해서 재고를 반영",[3609,3619,3620],{},"현재 재고 현황을 표로 보여주고, 표에서 바로 값을 고쳐서 저장",[895,3622,3623],{},"아래 내용을 이어서 AI 채팅에 붙여넣습니다. (맨 위에 1번에서 만든 결과를 함께 붙여넣습니다.)",[938,3625,3628],{"className":3626,"code":3627,"language":943},[941],"[여기에 1번 결과를 붙여넣기]\n\n위 스키마가 이미 배포되어 있어. 이 스키마를 사용하는 웹 화면(index.html) 하나를 만들어줘.\n\n화면에서 데이터를 불러오고 저장할 때는 아래 규칙으로 서버에 요청해.\n\n1. 로그인한 사용자의 API 토큰을 얻으려면:\n   POST /api/auth/bootstrap  (credentials: \"include\")\n   응답: { data: { access_token, user: { id, nick } } }\n\n2. 이후 모든 요청은 이 헤더를 붙인다: Authorization: Bearer \u003Caccess_token>\n\n3. 테이블 CRUD:\n   조회   GET  /api/web/{dbName}/{table}/list?컬럼=값   → 응답 { rows: [...] } (rows는 결과가 없으면 null일 수 있으니 항상 rows || [] 로 처리)\n   생성   POST /api/web/{dbName}/{table}/create          → body: JSON, 응답 { lastInsertId }\n   수정   PUT  /api/web/{dbName}/{table}/update/{id}     → body: JSON (바뀐 컬럼만 보내도 됨)\n   삭제   DELETE /api/web/{dbName}/{table}/delete/{id}\n\n화면에 필요한 기능은 다음과 같아.\n\n- 부품과 제품을 신규 등록할 수 있는 입력 폼\n- 부품/제품의 입고·출고를 등록할 수 있는 폼 (등록하면 현재 재고 수량도 같이 갱신)\n- \"이 제품을 몇 개 생산했다\"를 등록하면, 등록된 구성표에 따라 필요한 부품 수량을 자동으로 계산해서 부품 재고를 차감하고 제품 재고를 늘리는 기능. 부품 재고가 모자라면 등록을 막고 알려줘.\n- 현재 부품/제품 재고 현황을 표로 보여주는 화면. 표의 칸을 클릭하면 그 자리에서 바로 값을 수정하고 저장할 수 있게.\n- 입고/출고/조립 이력을 시간순으로 보여주는 목록.\n\nHTML/CSS/JS 한 파일에 전부 담아줘. 깔끔한 흰 배경에 카드형 레이아웃으로 만들어줘.\n다른 설명 없이 완성된 index.html 코드만 출력해줘.\n",[908,3629,3627],{"__ignoreMap":946},[895,3631,3632],{},"아래는 이렇게 만들어진 html 파일의 예시입니다. 실제 결과는 AI마다 조금씩 다를 수 있습니다.",[3634,3635],"html-sandbox",{"height":3636,"src":3637},"640px","/examples/webspace/inventory-management/index.html",[895,3639,3640],{},"이 파일을 워크스페이스에 올리면, 실제 팀원들이 쓸 수 있는 화면이 완성됩니다.",[920,3642,3644],{"id":3643},"_3-테스트-데이터-채우기","3. 테스트 데이터 채우기",[895,3646,3647],{},"실제로 동작하는 걸 눈으로 보려면 데이터가 있어야 합니다. 버튼 하나로 예시 데이터를 채워 넣는 화면도 AI에게 바로 만들어 달라고 할 수 있습니다.",[938,3649,3652],{"className":3650,"code":3651,"language":943},[941],"[여기에 1번 결과를 붙여넣기]\n\n위 스키마가 이미 배포되어 있고, 이 스키마를 쓰는 index.html도 이미 만들어져 있어.\n버튼 하나를 누르면 테스트용 데이터를 자동으로 채워 넣는 화면(mock-db-upload.html)을 만들어줘.\n\n데이터는 2번 화면과 같은 방식(POST /api/auth/bootstrap으로 토큰을 받고, POST /api/web/{dbName}/{table}/create로 생성)으로 실제 서버에 넣어줘.\n\n- 부품 10~15개, 제품 3~5개, 각 제품의 부품 구성, 입출고 이력 몇 건을 실제로 만들어 넣어줘.\n- 부품/제품 이름과 수량은 제조업 현장에서 실제로 쓸 법한 값으로 채워줘.\n- 이미 같은 코드의 데이터가 있으면 그 항목만 건너뛰고 계속 진행해줘.\n- 진행 상황을 화면에 한 줄씩 로그로 보여주고, 끝나면 \"완료\"를 표시해줘.\n다른 설명 없이 완성된 mock-db-upload.html 코드만 출력해줘.\n",[908,3653,3651],{"__ignoreMap":946},[895,3655,3656],{},"아래는 이렇게 만들어진 html 파일의 예시입니다. 실제 결과는 AI마다 조금씩 다를 수 있습니다. 이 화면은 배포하지 않고, 데모 준비가 필요할 때만 열어서 씁니다.",[3634,3658],{"height":3636,"src":3659},"/examples/webspace/inventory-management/mock-db-upload.html",[895,3661,3662],{},"실제로 데이터를 넣고 써보면 이렇게 동작합니다.",[895,3664,3665],{},[3545,3666],{"alt":3667,"src":3668},"부품 현황 — 칸을 더블클릭하면 바로 수정·저장된다","./_screenshots/inventory-parts-status.jpg",[895,3670,3671],{},[3545,3672],{"alt":3673,"src":3674},"BOM 등록 — 오른쪽 부품 카드를 왼쪽으로 끌어다 놓으면 구성에 추가된다","./_screenshots/inventory-bom-dnd.jpg",[895,3676,3677],{},[3545,3678],{"alt":3679,"src":3680},"조립 생산 등록 — 제품과 생산 수량을 정하면 필요한 부품 수량과 현재고가 자동으로 표시된다","./_screenshots/inventory-assembly-production.jpg",[895,3682,3683],{},[3545,3684],{"alt":3685,"src":3686},"거래 이력 — 배치 번호별로 조립생산·조립사용 내역이 함께 남는다","./_screenshots/inventory-transaction-history.jpg",[920,3688,3690],{"id":3689},"_4-반복해서-수정하기","4. 반복해서 수정하기",[895,3692,3693],{},"한 번에 완성하지 않아도 됩니다. 화면을 써보면서 부족한 기능이나 고치고 싶은 부분이 생기면, AI에게 계속 이어서 요청하면 됩니다. 다만 무엇을 고치느냐에 따라 그 다음에 해야 할 일이 다릅니다.",[3606,3695,3696,3711,3720],{},[3609,3697,3698,3701,3702,3704,3705,3707,3708,3710],{},[3591,3699,3700],{},"DB 구조(테이블·컬럼)가 바뀌는 수정"," — 예: 새 컬럼 추가, 새 테이블 추가 — 은 수정된 ",[908,3703,929],{},"을 다시 받아서 ",[908,3706,3563],{},"에 붙여넣고, ",[908,3709,3576],{},"에서 다시 배포해야 합니다.",[3609,3712,3713,3716,3717,3719],{},[3591,3714,3715],{},"DB 구조는 그대로 두고 화면만 고치는 수정"," — 예: 디자인, 문구, 버튼 위치 — 은 ",[908,3718,910],{},"만 다시 받아서 기존 파일을 덮어쓰면 됩니다. API를 다시 배포할 필요는 없습니다.",[3609,3721,3722],{},"이미 데이터가 들어있는 테이블의 구조를 바꿀 때는, 기존 데이터를 유지한 채 반영할지 덮어쓰고 새로 시작할지를 배포 시점에 선택해야 합니다. 운영 중인 데이터가 있다면 신중하게 선택해야 합니다.",[917,3724],{},[895,3726,3727],{},"이 네 단계만으로 데이터베이스 설계, 실제 화면, 테스트 데이터, 그리고 그 이후의 수정까지 전부 AI가 만들어 줍니다. 이후에는 화면의 디자인이나 세부 항목을 원하는 대로 계속 다듬어 나가면 됩니다.",[3729,3730,3731],"style",{},"html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .s-m8C, html code.shiki .s-m8C{--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sCZoN, html code.shiki .sCZoN{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#CFCFC2}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":946,"searchDepth":976,"depth":993,"links":3733},[3734,3735,3736,3737],{"id":922,"depth":976,"text":923},{"id":3597,"depth":976,"text":3598},{"id":3643,"depth":976,"text":3644},{"id":3689,"depth":976,"text":3690},null,"AI에게 요구사항만 설명하면 데이터베이스 설계부터 실제 화면까지 만들어지는 과정을, 재고 관리 시스템을 예로 보여줍니다.","md",{"slug":3742},"/webspace/examples/my-own-system/",true,{"title":3745,"description":3739,"ogType":3746,"twitterCard":3747,"keywords":3748},"나만의 업무 시스템 만들기 | WebSpace 응용편","article","summary_large_image",[3749,3750,3751,3752,3753],"나만의 업무 시스템","재고 관리 시스템","DB 구성","AI 프롬프트","SetFN 워크스페이스","KcHfUBBuWNNAUb8O37lksJwqMdaY12hH7wbU90xsIOk",[3756,3757],{"title":627,"path":628,"stem":629,"children":-1},{"title":635,"path":636,"stem":637,"children":-1},{"title":631,"filename":3759,"content":3760},"my-own-system","# 나만의 업무 시스템 만들기\n\nSetFN 워크스페이스에서 회사만의 그룹웨어, ERP 같은 시스템을 직접 만들 수 있습니다.\n데이터베이스 구조 설계와 화면 제작은 AI에게 맡기고, 우리는 그 결과물을 만들어 워크스페이스에 올리기만 하면 됩니다.\n만들어야 할 파일은 2개. 할 일은 업로드와 '배포' 버튼 클릭.\n'제조 현장의 재고 관리 프로그램'을 예시로 만들어보겠습니다.\n\nAI 프롬프트 없이 완성된 파일을 바로 써보고 싶다면, [전체 샘플 ZIP 다운로드](/examples/webspace/inventory-management/setfn-inventory-management-sample.zip)에서 스키마와 `index.html`, `mock-db-upload.html`, README를 한 번에 받을 수 있습니다.\n\n---\n\n## 1. 데이터베이스 생성을 위한 .sfn 파일 만들기\n\nSetFN 워크스페이스에서는 `.sfn`이라는 파일로 DB를 만들 수 있습니다. Claude, GPT, Gemini 같은 AI에게 `.sfn` 파일의 예시를 복사해서 주고 \"부품과 제품 재고 관리를 하고 싶어\"처럼 요구사항을 설명하면, AI가 파일을 만들어 줍니다.\n\n아래 내용을 복사한 후, 아래 부분의 요구사항 설계를 바꿔서 AI에게 전달해보세요.\n\n```\n너는 SetFN이라는 노코드 백엔드 플랫폼의 스키마 파일(.sfn)을 설계하는 엔지니어야.\n.sfn은 아래 구조를 가진 JSON 파일이야. \n\n{\n  \"content-type\": \"application/setfn-schema\",\n  \"dbType\": \"sqlite3\",\n  \"apiBuild\": {\n    \"dbName\": \"영문_소문자_밑줄_db이름\",\n    \"dbEngine\": \"sqlite\",\n    \"includeClient\": false,\n    \"features\": {\n      \"realtime\": { \"enabled\": false },\n      \"upload\": { \"enabled\": false },\n      \"ai-chat\": { \"enabled\": false }\n    }\n  },\n  \"data\": [\n    {\n      \"table\": { \"name\": \"테이블명\", \"cmt\": \"이 테이블 설명\" },\n      \"columns\": [\n        { \"name\": \"id\", \"type\": \"serial4\", \"primary\": true, \"default\": \"auto_increment\" },\n        { \"name\": \"컬럼명\", \"type\": \"text\", \"notnull\": true, \"cmt\": \"컬럼 설명\" },\n        { \"name\": \"숫자컬럼\", \"type\": \"int4\", \"notnull\": true, \"default\": \"0\" },\n        { \"name\": \"_created_at\", \"type\": \"timestamp\", \"default\": \"now()\" }\n      ],\n      \"permissions\": {\n        \"security\": { \"login\": true },\n        \"ops\": {\n          \"list\": { \"login\": true },\n          \"view\": { \"login\": true },\n          \"create\": { \"login\": true },\n          \"update\": { \"login\": true },\n          \"delete\": { \"login\": true, \"roles\": [\"admin\"] }\n        }\n      }\n    }\n  ]\n}\n\n컬럼 type은 serial4(자동증가 PK) / text / int4(정수) / timestamp만 사용해.\n컬럼에는 notnull, default, unique, index, cmt를 필요에 맞게 붙여.\n\n이제 이 형식으로, 제조업체가 쓸 \"재고관리 시스템\" DB를 설계해줘. 요구사항은 다음과 같아.\n\n- 부품을 등록하고, 부품별 현재 재고 수량을 관리한다.\n- 제품을 등록하고, 제품별 현재 재고 수량을 관리한다.\n- 제품 하나는 여러 부품으로 조립되어 만들어진다. 어떤 제품에 어떤 부품이 몇 개씩 필요한지(BOM, 자재명세서)를 관리한다.\n- 부품/제품의 입고·출고 이력을 남긴다. 특히 \"부품을 조립해서 제품을 생산\"하는 이벤트가 발생하면, 그 순간 사용된 부품들과 생산된 제품 수량이 하나의 사건으로 함께 추적되어야 한다(나중에 \"이 제품을 만드는데 부품이 얼마나 들어갔는지\" 조회할 수 있어야 함).\n\nDB 이름(dbName)은 \"inventory_management\"로 해줘.\n테이블 4개 이내로, 실무에서 바로 쓸 수 있을 만큼 실용적으로 설계해줘.\n다른 설명 없이 완성된 .sfn JSON 코드만 출력해줘.\n```\n\n아래는 이렇게 만들어진 AI 응답의 예시입니다. 실제 결과는 AI마다, 실행할 때마다 조금씩 다를 수 있습니다 — 꼭 이 내용 그대로일 필요는 없고, 이렇게 비슷한 구조로만 나오면 됩니다. 다만 다른 설명 없이 `{`로 시작해서 `}`로 끝나는 형식이어야, 나올 결과를 그대로 에디터에 붙여넣을 수 있습니다.\n\n```json\n{\n  \"content-type\": \"application/setfn-schema\",\n  \"dbType\": \"sqlite3\",\n  \"apiBuild\": {\n    \"dbName\": \"inventory_management\",\n    \"dbEngine\": \"sqlite\",\n    \"includeClient\": false,\n    \"features\": {\n      \"realtime\": { \"enabled\": false },\n      \"upload\": { \"enabled\": false },\n      \"ai-chat\": { \"enabled\": false }\n    }\n  },\n  \"data\": [\n    {\n      \"table\": { \"name\": \"parts\", \"cmt\": \"부품 마스터. 조회/등록/수정은 회원 누구나, 삭제는 관리자만\" },\n      \"columns\": [\n        { \"name\": \"id\", \"type\": \"serial4\", \"primary\": true, \"default\": \"auto_increment\" },\n        { \"name\": \"part_code\", \"type\": \"text\", \"notnull\": true, \"unique\": true, \"cmt\": \"부품 코드\" },\n        { \"name\": \"name\", \"type\": \"text\", \"notnull\": true, \"cmt\": \"부품명\" },\n        { \"name\": \"spec\", \"type\": \"text\", \"cmt\": \"규격 (예: M2, 220V/50Hz). 같은 이름이라도 규격이 다르면 별도 part_code로 등록\" },\n        { \"name\": \"category\", \"type\": \"text\", \"cmt\": \"부품 분류 (전자부품/기구부품/포장재 등)\" },\n        { \"name\": \"unit\", \"type\": \"text\", \"notnull\": true, \"default\": \"EA\", \"cmt\": \"단위\" },\n        { \"name\": \"unit_cost\", \"type\": \"int4\", \"notnull\": true, \"default\": \"0\", \"cmt\": \"단가\" },\n        { \"name\": \"current_stock\", \"type\": \"int4\", \"notnull\": true, \"default\": \"0\", \"cmt\": \"현재고\" },\n        { \"name\": \"safety_stock\", \"type\": \"int4\", \"notnull\": true, \"default\": \"0\", \"cmt\": \"안전재고(재주문점)\" },\n        { \"name\": \"supplier\", \"type\": \"text\", \"cmt\": \"공급업체\" },\n        { \"name\": \"_user_id\", \"type\": \"int4\", \"notnull\": true, \"index\": true },\n        { \"name\": \"_nick\", \"type\": \"text\", \"cmt\": \"최종 등록/수정한 회원 표시 이름\" },\n        { \"name\": \"_created_at\", \"type\": \"timestamp\", \"default\": \"now()\" }\n      ],\n      \"permissions\": {\n        \"security\": { \"login\": true, \"ownerColumn\": \"_user_id\" },\n        \"ops\": {\n          \"list\": { \"login\": true },\n          \"view\": { \"login\": true },\n          \"create\": { \"login\": true },\n          \"update\": { \"login\": true },\n          \"delete\": { \"login\": true, \"roles\": [\"admin\"] }\n        }\n      }\n    },\n    {\n      \"table\": { \"name\": \"products\", \"cmt\": \"제품 마스터. 조회/등록/수정은 회원 누구나, 삭제는 관리자만\" },\n      \"columns\": [\n        { \"name\": \"id\", \"type\": \"serial4\", \"primary\": true, \"default\": \"auto_increment\" },\n        { \"name\": \"product_code\", \"type\": \"text\", \"notnull\": true, \"unique\": true, \"cmt\": \"제품 코드\" },\n        { \"name\": \"name\", \"type\": \"text\", \"notnull\": true, \"cmt\": \"제품명\" },\n        { \"name\": \"category\", \"type\": \"text\", \"cmt\": \"제품 분류\" },\n        { \"name\": \"unit\", \"type\": \"text\", \"notnull\": true, \"default\": \"EA\", \"cmt\": \"단위\" },\n        { \"name\": \"price\", \"type\": \"int4\", \"notnull\": true, \"default\": \"0\", \"cmt\": \"판매가\" },\n        { \"name\": \"current_stock\", \"type\": \"int4\", \"notnull\": true, \"default\": \"0\", \"cmt\": \"현재고\" },\n        { \"name\": \"_user_id\", \"type\": \"int4\", \"notnull\": true, \"index\": true },\n        { \"name\": \"_nick\", \"type\": \"text\", \"cmt\": \"최종 등록/수정한 회원 표시 이름\" },\n        { \"name\": \"_created_at\", \"type\": \"timestamp\", \"default\": \"now()\" }\n      ],\n      \"permissions\": {\n        \"security\": { \"login\": true, \"ownerColumn\": \"_user_id\" },\n        \"ops\": {\n          \"list\": { \"login\": true },\n          \"view\": { \"login\": true },\n          \"create\": { \"login\": true },\n          \"update\": { \"login\": true },\n          \"delete\": { \"login\": true, \"roles\": [\"admin\"] }\n        }\n      }\n    },\n    {\n      \"table\": { \"name\": \"bom\", \"cmt\": \"제품별 부품 구성표(단일 단계). bom_key(product_id:part_id)에 unique 제약을 걸어 같은 제품에 같은 부품이 중복 등록되지 않게 함\" },\n      \"columns\": [\n        { \"name\": \"id\", \"type\": \"serial4\", \"primary\": true, \"default\": \"auto_increment\" },\n        { \"name\": \"product_id\", \"type\": \"int4\", \"notnull\": true, \"index\": true },\n        { \"name\": \"part_id\", \"type\": \"int4\", \"notnull\": true, \"index\": true },\n        { \"name\": \"qty_per_unit\", \"type\": \"int4\", \"notnull\": true, \"default\": \"1\", \"cmt\": \"제품 1개를 만드는 데 필요한 부품 수량\" },\n        { \"name\": \"bom_key\", \"type\": \"text\", \"notnull\": true, \"unique\": true, \"cmt\": \"product_id:part_id 조합. 중복 등록 방지용\" },\n        { \"name\": \"_user_id\", \"type\": \"int4\", \"notnull\": true, \"index\": true },\n        { \"name\": \"_nick\", \"type\": \"text\", \"cmt\": \"등록한 회원 표시 이름\" },\n        { \"name\": \"_created_at\", \"type\": \"timestamp\", \"default\": \"now()\" }\n      ],\n      \"permissions\": {\n        \"security\": { \"login\": true, \"ownerColumn\": \"_user_id\" },\n        \"ops\": {\n          \"list\": { \"login\": true },\n          \"view\": { \"login\": true },\n          \"create\": { \"login\": true },\n          \"update\": { \"login\": true },\n          \"delete\": { \"login\": true, \"roles\": [\"admin\"] }\n        }\n      }\n    },\n    {\n      \"table\": { \"name\": \"stock_transactions\", \"cmt\": \"입출고/조립 통합 이력. item_type=part|product, tx_type=입고|출고|조립사용|조립생산. 하나의 조립생산 이벤트는 같은 batch_id를 공유하는 조립사용(부품 소모) 여러 건 + 조립생산(제품 증가) 1건으로 구성되어, 제품에 어떤 부품이 얼마나 쓰였는지 추적할 수 있음\" },\n      \"columns\": [\n        { \"name\": \"id\", \"type\": \"serial4\", \"primary\": true, \"default\": \"auto_increment\" },\n        { \"name\": \"item_type\", \"type\": \"text\", \"notnull\": true, \"cmt\": \"part | product\" },\n        { \"name\": \"item_id\", \"type\": \"int4\", \"notnull\": true, \"index\": true, \"cmt\": \"parts.id 또는 products.id\" },\n        { \"name\": \"item_name\", \"type\": \"text\", \"notnull\": true, \"cmt\": \"등록 시점 품목명 스냅샷\" },\n        { \"name\": \"tx_type\", \"type\": \"text\", \"notnull\": true, \"cmt\": \"입고 | 출고 | 조립사용 | 조립생산\" },\n        { \"name\": \"reason\", \"type\": \"text\", \"cmt\": \"입출고 사유. 조립사용/조립생산은 tx_type 자체가 사유이므로 비워둠\" },\n        { \"name\": \"qty\", \"type\": \"int4\", \"notnull\": true, \"cmt\": \"항상 양수. 방향은 tx_type으로 판단\" },\n        { \"name\": \"batch_id\", \"type\": \"text\", \"index\": true, \"cmt\": \"조립생산 이벤트 묶음 id. 단순 입출고는 비어 있음\" },\n        { \"name\": \"note\", \"type\": \"text\", \"cmt\": \"메모\" },\n        { \"name\": \"_user_id\", \"type\": \"int4\", \"notnull\": true, \"index\": true },\n        { \"name\": \"_nick\", \"type\": \"text\", \"cmt\": \"등록한 회원 표시 이름\" },\n        { \"name\": \"_created_at\", \"type\": \"timestamp\", \"default\": \"now()\" }\n      ],\n      \"permissions\": {\n        \"security\": { \"login\": true, \"ownerColumn\": \"_user_id\" },\n        \"ops\": {\n          \"list\": { \"login\": true },\n          \"view\": { \"login\": true },\n          \"create\": { \"login\": true },\n          \"update\": { \"login\": true, \"roles\": [\"admin\"] },\n          \"delete\": { \"login\": true, \"roles\": [\"admin\"] }\n        }\n      }\n    }\n  ]\n}\n```\n\n이 결과를 복사해서, 워크스페이스에서 `만들기` → `템플릿 파일` → `새 스키마(DB)`로 빈 스키마 파일을 만듭니다.\n\n![만들기 > 템플릿 파일 > 새 스키마(DB) 선택 화면](./_screenshots/new-schema.png)\n\n파일 이름을 입력하고 저장하면 빈 스키마 파일이 만들어집니다.\n\n![새로 만든 빈 스키마 파일](./_screenshots/schema-file-first.png)\n\n오른쪽 위의 `에디터` 탭을 누른 후, 아까 AI의 응답을 그대로 붙여넣습니다.\n\n![스키마 에디터 화면](./_screenshots/schema-editor.png)\n\n저장한 뒤 상단의 `API빌드` 탭으로 이동하면 테이블별로 자동 생성된 API 목록을 확인할 수 있습니다.\n\n![API 빌드 화면](./_screenshots/schema-api-build.png)\n\n`배포하기`를 누릅니다. 몇 초 정도 기다리면 '배포 완료' 메시지가 뜹니다. 마지막으로, 상단의 디스켓 버튼을 눌러 저장합니다. **여기까지 하면 DB 구성이 끝났습니다** — 부품/제품/구성표/입출고 이력 4개 테이블과, 그 테이블들을 다루는 REST API가 실제로 만들어져 바로 쓸 수 있는 상태가 됩니다. 이제는 여기 DB와 연결할 화면을 만들 차례입니다.\n\n## 2. 화면 구성을 위한 .html 파일 만들기\n\n이번에도 AI에게 요청합니다. 만들고 싶은 것을 기획하고 정리해 AI에게 전달합니다. 이때 아까 만든 `.sfn` 파일 내용도 참고 자료로 같이 주면 됩니다.\n\n- 부품·제품을 등록하는 입력 폼\n- 입고·출고를 등록하는 폼\n- \"이 제품을 몇 개 생산했다\"고 등록하면 필요한 부품 수량을 자동으로 계산해서 재고를 반영\n- 현재 재고 현황을 표로 보여주고, 표에서 바로 값을 고쳐서 저장\n\n아래 내용을 이어서 AI 채팅에 붙여넣습니다. (맨 위에 1번에서 만든 결과를 함께 붙여넣습니다.)\n\n```\n[여기에 1번 결과를 붙여넣기]\n\n위 스키마가 이미 배포되어 있어. 이 스키마를 사용하는 웹 화면(index.html) 하나를 만들어줘.\n\n화면에서 데이터를 불러오고 저장할 때는 아래 규칙으로 서버에 요청해.\n\n1. 로그인한 사용자의 API 토큰을 얻으려면:\n   POST /api/auth/bootstrap  (credentials: \"include\")\n   응답: { data: { access_token, user: { id, nick } } }\n\n2. 이후 모든 요청은 이 헤더를 붙인다: Authorization: Bearer \u003Caccess_token>\n\n3. 테이블 CRUD:\n   조회   GET  /api/web/{dbName}/{table}/list?컬럼=값   → 응답 { rows: [...] } (rows는 결과가 없으면 null일 수 있으니 항상 rows || [] 로 처리)\n   생성   POST /api/web/{dbName}/{table}/create          → body: JSON, 응답 { lastInsertId }\n   수정   PUT  /api/web/{dbName}/{table}/update/{id}     → body: JSON (바뀐 컬럼만 보내도 됨)\n   삭제   DELETE /api/web/{dbName}/{table}/delete/{id}\n\n화면에 필요한 기능은 다음과 같아.\n\n- 부품과 제품을 신규 등록할 수 있는 입력 폼\n- 부품/제품의 입고·출고를 등록할 수 있는 폼 (등록하면 현재 재고 수량도 같이 갱신)\n- \"이 제품을 몇 개 생산했다\"를 등록하면, 등록된 구성표에 따라 필요한 부품 수량을 자동으로 계산해서 부품 재고를 차감하고 제품 재고를 늘리는 기능. 부품 재고가 모자라면 등록을 막고 알려줘.\n- 현재 부품/제품 재고 현황을 표로 보여주는 화면. 표의 칸을 클릭하면 그 자리에서 바로 값을 수정하고 저장할 수 있게.\n- 입고/출고/조립 이력을 시간순으로 보여주는 목록.\n\nHTML/CSS/JS 한 파일에 전부 담아줘. 깔끔한 흰 배경에 카드형 레이아웃으로 만들어줘.\n다른 설명 없이 완성된 index.html 코드만 출력해줘.\n```\n\n아래는 이렇게 만들어진 html 파일의 예시입니다. 실제 결과는 AI마다 조금씩 다를 수 있습니다.\n\n::html-sandbox{src=\"/examples/webspace/inventory-management/index.html\" height=\"640px\"}\n::\n\n이 파일을 워크스페이스에 올리면, 실제 팀원들이 쓸 수 있는 화면이 완성됩니다.\n\n## 3. 테스트 데이터 채우기\n\n실제로 동작하는 걸 눈으로 보려면 데이터가 있어야 합니다. 버튼 하나로 예시 데이터를 채워 넣는 화면도 AI에게 바로 만들어 달라고 할 수 있습니다.\n\n```\n[여기에 1번 결과를 붙여넣기]\n\n위 스키마가 이미 배포되어 있고, 이 스키마를 쓰는 index.html도 이미 만들어져 있어.\n버튼 하나를 누르면 테스트용 데이터를 자동으로 채워 넣는 화면(mock-db-upload.html)을 만들어줘.\n\n데이터는 2번 화면과 같은 방식(POST /api/auth/bootstrap으로 토큰을 받고, POST /api/web/{dbName}/{table}/create로 생성)으로 실제 서버에 넣어줘.\n\n- 부품 10~15개, 제품 3~5개, 각 제품의 부품 구성, 입출고 이력 몇 건을 실제로 만들어 넣어줘.\n- 부품/제품 이름과 수량은 제조업 현장에서 실제로 쓸 법한 값으로 채워줘.\n- 이미 같은 코드의 데이터가 있으면 그 항목만 건너뛰고 계속 진행해줘.\n- 진행 상황을 화면에 한 줄씩 로그로 보여주고, 끝나면 \"완료\"를 표시해줘.\n다른 설명 없이 완성된 mock-db-upload.html 코드만 출력해줘.\n```\n\n아래는 이렇게 만들어진 html 파일의 예시입니다. 실제 결과는 AI마다 조금씩 다를 수 있습니다. 이 화면은 배포하지 않고, 데모 준비가 필요할 때만 열어서 씁니다.\n\n::html-sandbox{src=\"/examples/webspace/inventory-management/mock-db-upload.html\" height=\"640px\"}\n::\n\n실제로 데이터를 넣고 써보면 이렇게 동작합니다.\n\n![부품 현황 — 칸을 더블클릭하면 바로 수정·저장된다](./_screenshots/inventory-parts-status.jpg)\n\n![BOM 등록 — 오른쪽 부품 카드를 왼쪽으로 끌어다 놓으면 구성에 추가된다](./_screenshots/inventory-bom-dnd.jpg)\n\n![조립 생산 등록 — 제품과 생산 수량을 정하면 필요한 부품 수량과 현재고가 자동으로 표시된다](./_screenshots/inventory-assembly-production.jpg)\n\n![거래 이력 — 배치 번호별로 조립생산·조립사용 내역이 함께 남는다](./_screenshots/inventory-transaction-history.jpg)\n\n## 4. 반복해서 수정하기\n\n한 번에 완성하지 않아도 됩니다. 화면을 써보면서 부족한 기능이나 고치고 싶은 부분이 생기면, AI에게 계속 이어서 요청하면 됩니다. 다만 무엇을 고치느냐에 따라 그 다음에 해야 할 일이 다릅니다.\n\n- **DB 구조(테이블·컬럼)가 바뀌는 수정** — 예: 새 컬럼 추가, 새 테이블 추가 — 은 수정된 `.sfn`을 다시 받아서 `에디터`에 붙여넣고, `API빌드`에서 다시 배포해야 합니다.\n- **DB 구조는 그대로 두고 화면만 고치는 수정** — 예: 디자인, 문구, 버튼 위치 — 은 `index.html`만 다시 받아서 기존 파일을 덮어쓰면 됩니다. API를 다시 배포할 필요는 없습니다.\n- 이미 데이터가 들어있는 테이블의 구조를 바꿀 때는, 기존 데이터를 유지한 채 반영할지 덮어쓰고 새로 시작할지를 배포 시점에 선택해야 합니다. 운영 중인 데이터가 있다면 신중하게 선택해야 합니다.\n\n---\n\n이 네 단계만으로 데이터베이스 설계, 실제 화면, 테스트 데이터, 그리고 그 이후의 수정까지 전부 AI가 만들어 줍니다. 이후에는 화면의 디자인이나 세부 항목을 원하는 대로 계속 다듬어 나가면 됩니다.\n",1789664768200]