[{"data":1,"prerenderedAt":1762},["ShallowReactive",2],{"nav-docs":3,"page-/ko/docs/webspace/examples/monster-raid":985,"surround-/ko/docs/webspace/examples/monster-raid":1756,"raw-/ko/docs/webspace/examples/monster-raid":1759},[4,56,290,627,734,878,911,968],{"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,76,134,163,202,224,237,244,273],{"title":62,"path":63,"stem":64,"children":65,"page":-1},"관리자 홈","/admin/home","10.admin/00.home/00.index",[66,68,72],{"title":67,"path":63,"stem":64,"children":-1},"관리자 메뉴 둘러보기",{"title":69,"path":70,"stem":71,"children":-1},"관리자 페이지 접속","/admin/home/admin-page-access","10.admin/00.home/00.admin-page-access",{"title":73,"path":74,"stem":75,"children":-1},"라이선스 관리","/admin/home/license","10.admin/00.home/20.license",{"title":77,"path":78,"stem":79,"children":80,"page":55},"사용자 관리","/admin/user-management","10.admin/10.user-management",[81,85,91,95,99,103,107,111,115,119,124,129],{"title":82,"path":83,"stem":84,"children":-1},"가입 정책 및 기본 권한 설정하기","/admin/user-management/signup-policy","10.admin/10.user-management/02.signup-policy",{"title":86,"path":87,"stem":88,"tags":89,"children":-1},"가입 약관 등록하기","/admin/user-management/signup-terms","10.admin/10.user-management/04.signup-terms",[90],"new",{"title":92,"path":93,"stem":94,"children":-1},"사용자 계정 만들기","/admin/user-management/invite-new-member","10.admin/10.user-management/10.invite-new-member",{"title":96,"path":97,"stem":98,"children":-1},"사용자 계정 수정하기","/admin/user-management/edit-member","10.admin/10.user-management/11.edit-member",{"title":100,"path":101,"stem":102,"children":-1},"관리자 추가하기","/admin/user-management/add-new-admin","10.admin/10.user-management/12.add-new-admin",{"title":104,"path":105,"stem":106,"children":-1},"팀 관리","/admin/user-management/team","10.admin/10.user-management/22.team",{"title":108,"path":109,"stem":110,"children":-1},"레벨 관리","/admin/user-management/level","10.admin/10.user-management/24.level",{"title":112,"path":113,"stem":114,"children":-1},"접속 기록 확인하기","/admin/user-management/access-log","10.admin/10.user-management/30.access-log",{"title":116,"path":117,"stem":118,"children":-1},"계정·보안 정책 설정하기","/admin/user-management/account-security","10.admin/10.user-management/32.account-security",{"title":120,"path":121,"stem":122,"tags":123,"children":-1},"로봇 확인(CAPTCHA) 설정하기","/admin/user-management/captcha","10.admin/10.user-management/33.captcha",[90],{"title":125,"path":126,"stem":127,"tags":128,"children":-1},"안내 발송 설정하기","/admin/user-management/notice-settings","10.admin/10.user-management/34.notice-settings",[90],{"title":130,"path":131,"stem":132,"tags":133,"children":-1},"회원에게 단체 안내 메일 보내기","/admin/user-management/bulk-mail","10.admin/10.user-management/36.bulk-mail",[90],{"title":135,"path":136,"stem":137,"children":138,"page":55},"서비스 구성","/admin/service-config","10.admin/20.service-config",[139,143,147,151,155,159],{"title":140,"path":141,"stem":142,"children":-1},"파일 영역 설정","/admin/service-config/file-area","10.admin/20.service-config/10.file-area",{"title":144,"path":145,"stem":146,"children":-1},"웹훅 설정","/admin/service-config/webhook-settings","10.admin/20.service-config/16.webhook-settings",{"title":148,"path":149,"stem":150,"children":-1},"커뮤니티 설정","/admin/service-config/community-space","10.admin/20.service-config/22.community-space",{"title":152,"path":153,"stem":154,"children":-1},"AI 챗봇 정책 설정","/admin/service-config/community-ai-chatbot","10.admin/20.service-config/24.community-ai-chatbot",{"title":156,"path":157,"stem":158,"children":-1},"메일 설정","/admin/service-config/email-settings","10.admin/20.service-config/30.email-settings",{"title":160,"path":161,"stem":162,"children":-1},"브랜딩 설정","/admin/service-config/brand","10.admin/20.service-config/40.brand",{"title":164,"path":165,"stem":166,"children":167,"page":55},"지식 서비스","/admin/knowledge","10.admin/30.knowledge",[168,172,178,182,186,190,194,198],{"title":169,"path":170,"stem":171,"children":-1},"지식 서비스 살펴보기","/admin/knowledge/overview","10.admin/30.knowledge/00.overview",{"title":173,"path":174,"stem":175,"children":176},"수집·인덱싱","/admin/knowledge/indexing","10.admin/30.knowledge/10.indexing",[177],{"title":173,"path":174,"stem":175,"children":-1},{"title":179,"path":180,"stem":181,"children":-1},"검색 관리","/admin/knowledge/search","10.admin/30.knowledge/20.search",{"title":183,"path":184,"stem":185,"children":-1},"지식 저장소","/admin/knowledge/storage","10.admin/30.knowledge/30.storage",{"title":187,"path":188,"stem":189,"children":-1},"지식 저장소 운영하기","/admin/knowledge/storage-operations","10.admin/30.knowledge/32.storage-operations",{"title":191,"path":192,"stem":193,"children":-1},"Qdrant 연결","/admin/knowledge/qdrant","10.admin/30.knowledge/34.qdrant",{"title":195,"path":196,"stem":197,"children":-1},"Qdrant 서버 준비하기","/admin/knowledge/qdrant-server-setup","10.admin/30.knowledge/35.qdrant-server-setup",{"title":199,"path":200,"stem":201,"children":-1},"Milvus 연결","/admin/knowledge/milvus","10.admin/30.knowledge/36.milvus",{"title":203,"path":204,"stem":205,"children":206,"page":55},"AI 서비스","/admin/ai","10.admin/35.ai",[207,211,215,220],{"title":208,"path":209,"stem":210,"children":-1},"AI 서비스 관리하기","/admin/ai/overview","10.admin/35.ai/00.overview",{"title":212,"path":213,"stem":214,"children":-1},"모델·런타임 설정하기","/admin/ai/models","10.admin/35.ai/10.models",{"title":216,"path":217,"stem":218,"tags":219,"children":-1},"도구·연동 설정하기","/admin/ai/integrations","10.admin/35.ai/20.integrations",[90],{"title":221,"path":222,"stem":223,"children":-1},"MCP 서버 관리하기","/admin/ai/mcp","10.admin/35.ai/30.mcp",{"title":225,"path":226,"stem":227,"children":228,"page":55},"플러그인","/admin/plugin","10.admin/40.plugin",[229,233],{"title":230,"path":231,"stem":232,"children":-1},"플러그인 관리하기","/admin/plugin/overview","10.admin/40.plugin/00.overview",{"title":234,"path":235,"stem":236,"children":-1},"확장 플러그인 설정","/admin/plugin/settings","10.admin/40.plugin/10.settings",{"title":238,"path":239,"stem":240,"children":241,"tags":243},"운영·감사 기록 확인하기","/admin/operations","10.admin/45.operations/00.index",[242],{"title":238,"path":239,"stem":240,"tags":243,"children":-1},[90],{"title":245,"path":246,"stem":247,"children":248,"page":55},"보안 관리","/admin/security","10.admin/50.security",[249,253,257,261,265,269],{"title":250,"path":251,"stem":252,"children":-1},"보안 개요","/admin/security/overview","10.admin/50.security/00.overview",{"title":254,"path":255,"stem":256,"children":-1},"감사 로그 확인하기","/admin/security/audit-log","10.admin/50.security/05.audit-log",{"title":258,"path":259,"stem":260,"children":-1},"차단 관리","/admin/security/block-management","10.admin/50.security/10.block-management",{"title":262,"path":263,"stem":264,"children":-1},"보안 설정","/admin/security/security-setting","10.admin/50.security/12.security-setting",{"title":266,"path":267,"stem":268,"children":-1},"승인 대기 기기 처리하기","/admin/security/device-approvals","10.admin/50.security/14.device-approvals",{"title":270,"path":271,"stem":272,"children":-1},"IP 접근 제한","/admin/security/ip-restriction","10.admin/50.security/16.ip-restriction",{"title":274,"path":275,"stem":276,"children":277,"page":55},"시스템 관리","/admin/system-admin","10.admin/60.system-admin",[278,282,286],{"title":279,"path":280,"stem":281,"children":-1},"디바이스 정보","/admin/system-admin/device-info","10.admin/60.system-admin/10.device-info",{"title":283,"path":284,"stem":285,"children":-1},"서버 재시작 및 시스템 유지보수","/admin/system-admin/server-restart","10.admin/60.system-admin/12.server-restart",{"title":287,"path":288,"stem":289,"children":-1},"백그라운드 서비스","/admin/system-admin/background-service","10.admin/60.system-admin/14.background-service",{"title":291,"path":292,"stem":293,"children":294,"page":55},"워크스페이스 사용하기","/workspace","20.workspace",[295,328,345,416,532,579,609],{"title":296,"path":297,"stem":298,"children":299,"page":55},"메뉴","/workspace/menu","20.workspace/05.menu",[300,304,308,312,316,320,324],{"title":301,"path":302,"stem":303,"children":-1},"워크스페이스 소개","/workspace/menu/overview","20.workspace/05.menu/00.overview",{"title":305,"path":306,"stem":307,"children":-1},"팀 스페이스","/workspace/menu/team-space","20.workspace/05.menu/05.team-space",{"title":309,"path":310,"stem":311,"children":-1},"클라이언트 스페이스","/workspace/menu/client-space","20.workspace/05.menu/06.client-space",{"title":313,"path":314,"stem":315,"children":-1},"즐겨찾기","/workspace/menu/favorites","20.workspace/05.menu/10.favorites",{"title":317,"path":318,"stem":319,"children":-1},"최근 문서","/workspace/menu/recent","20.workspace/05.menu/20.recent",{"title":321,"path":322,"stem":323,"children":-1},"외부 공유","/workspace/menu/external-share","20.workspace/05.menu/30.external-share",{"title":325,"path":326,"stem":327,"children":-1},"휴지통","/workspace/menu/trash","20.workspace/05.menu/40.trash",{"title":329,"path":330,"stem":331,"children":332,"page":55},"계정","/workspace/account","20.workspace/10.account",[333,337,341],{"title":334,"path":335,"stem":336,"children":-1},"회원가입 및 로그인","/workspace/account/signup","20.workspace/10.account/10.signup",{"title":338,"path":339,"stem":340,"children":-1},"비밀번호 재설정","/workspace/account/reset-password","20.workspace/10.account/20.reset-password",{"title":342,"path":343,"stem":344,"children":-1},"계정 설정","/workspace/account/account-settings","20.workspace/10.account/30.account-settings",{"title":346,"path":347,"stem":348,"children":349,"page":55},"폴더","/workspace/folder","20.workspace/20.folder",[350,354,358,362,366,372,377,381,385,390,394,398,402,406,412],{"title":351,"path":352,"stem":353,"children":-1},"폴더 기본 기능","/workspace/folder/basic","20.workspace/20.folder/10.basic",{"title":355,"path":356,"stem":357,"children":-1},"여러 폴더 한꺼번에 만들기","/workspace/folder/bulk-folder-creation","20.workspace/20.folder/12.bulk-folder-creation",{"title":359,"path":360,"stem":361,"children":-1},"필터","/workspace/folder/filter","20.workspace/20.folder/13.filter",{"title":363,"path":364,"stem":365,"children":-1},"폴더 보기 옵션 설정","/workspace/folder/folder-view-options","20.workspace/20.folder/14.folder-view-options",{"title":367,"path":368,"stem":369,"tags":370,"children":-1},"폴더를 게시판으로 사용하기","/workspace/folder/board-view","20.workspace/20.folder/15.board-view",[371],"hot",{"title":373,"path":374,"stem":375,"tags":376,"children":-1},"폴더 웹 보기","/workspace/folder/folder-web-view","20.workspace/20.folder/16.folder-web-view",[371],{"title":378,"path":379,"stem":380,"children":-1},"폴더 정리","/workspace/folder/folder-organize","20.workspace/20.folder/17.folder-organize",{"title":382,"path":383,"stem":384,"children":-1},"폴더 공지 (README)","/workspace/folder/folder-readme","20.workspace/20.folder/18.folder-readme",{"title":386,"path":387,"stem":388,"tags":389,"children":-1},"폴더/파일 목록 내보내기","/workspace/folder/folder-export","20.workspace/20.folder/20.folder-export",[371],{"title":391,"path":392,"stem":393,"children":-1},"레벨별 접근 권한 설정","/workspace/folder/level-access-permissions","20.workspace/20.folder/24.level-access-permissions",{"title":395,"path":396,"stem":397,"children":-1},"팀별 접근 권한 설정","/workspace/folder/team-access-permissions","20.workspace/20.folder/26.team-access-permissions",{"title":399,"path":400,"stem":401,"children":-1},"파일 규칙 설정하기","/workspace/folder/file-rules","20.workspace/20.folder/28.file-rules",{"title":403,"path":404,"stem":405,"children":-1},"폴더 웹훅","/workspace/folder/webhook","20.workspace/20.folder/30.webhook",{"title":407,"path":408,"stem":409,"children":410},"폴더 지식인덱스 설정하기","/workspace/folder/knowledge-index","20.workspace/20.folder/32.knowledge-index",[411],{"title":407,"path":408,"stem":409,"children":-1},{"title":413,"path":414,"stem":415,"children":-1},"업무 자동화 폴더","/workspace/folder/automation","20.workspace/20.folder/40.automation",{"title":417,"path":418,"stem":419,"children":420,"page":55},"파일","/workspace/file","20.workspace/30.file",[421,425,430,434,438,442,446,450,454,459,463,467,472,476,480,484,488,492,496,500,504,508,512,516,520,524,528],{"title":422,"path":423,"stem":424,"children":-1},"파일 관리 기본 기능","/workspace/file/overview","20.workspace/30.file/00.overview",{"title":426,"path":427,"stem":428,"tags":429,"children":-1},"파일 보면서 목록 확인하기","/workspace/file/list-in-file","20.workspace/30.file/05.list-in-file",[371],{"title":431,"path":432,"stem":433,"children":-1},"마크다운, 텍스트 파일 보기 및 편집","/workspace/file/text-file-viewer","20.workspace/30.file/10.text-file-viewer",{"title":435,"path":436,"stem":437,"children":-1},"HTML 파일 보기","/workspace/file/html-viewer","20.workspace/30.file/11.html-viewer",{"title":439,"path":440,"stem":441,"children":-1},"CSV 파일 보기 및 편집","/workspace/file/csv-viewer","20.workspace/30.file/12.csv-viewer",{"title":443,"path":444,"stem":445,"children":-1},"이미지/동영상 파일 보기","/workspace/file/image-file-viewer","20.workspace/30.file/13.image-file-viewer",{"title":447,"path":448,"stem":449,"children":-1},"오피스/PDF 파일 보기","/workspace/file/office-viewer","20.workspace/30.file/14.office-viewer",{"title":451,"path":452,"stem":453,"children":-1},"웹페이지 붙여넣기 (HTML)","/workspace/file/paste-html","20.workspace/30.file/20.paste-html",{"title":455,"path":456,"stem":457,"tags":458,"children":-1},"스크린샷 붙여넣기","/workspace/file/paste-screenshot","20.workspace/30.file/21.paste-screenshot",[371],{"title":460,"path":461,"stem":462,"children":-1},"마크다운 붙여넣기 (MD)","/workspace/file/paste-md","20.workspace/30.file/22.paste-md",{"title":464,"path":465,"stem":466,"children":-1},"스크린 녹화하기","/workspace/file/screen-recording","20.workspace/30.file/23.screen-recording",{"title":468,"path":469,"stem":470,"tags":471,"children":-1},"빠른노트","/workspace/file/quick-note","20.workspace/30.file/24.quick-note",[90,371],{"title":473,"path":474,"stem":475,"children":-1},"파일 태그","/workspace/file/file-tag","20.workspace/30.file/33.file-tag",{"title":477,"path":478,"stem":479,"children":-1},"파일 이름 일괄 변경","/workspace/file/bulk-name-revise","20.workspace/30.file/34.bulk-name-revise",{"title":481,"path":482,"stem":483,"children":-1},"파일 변환","/workspace/file/file-convert-overview","20.workspace/30.file/40.file-convert-overview",{"title":485,"path":486,"stem":487,"children":-1},"템플릿 파일","/workspace/file/templates","20.workspace/30.file/41.templates",{"title":489,"path":490,"stem":491,"children":-1},"할일 목록 (Todo)","/workspace/file/template-todo","20.workspace/30.file/42.template-todo",{"title":493,"path":494,"stem":495,"children":-1},"결재 서식","/workspace/file/template-approval","20.workspace/30.file/43.template-approval",{"title":497,"path":498,"stem":499,"children":-1},"칸반 보드","/workspace/file/template-kanban","20.workspace/30.file/44.template-kanban",{"title":501,"path":502,"stem":503,"children":-1},"타임라인","/workspace/file/template-timeline","20.workspace/30.file/45.template-timeline",{"title":505,"path":506,"stem":507,"children":-1},"메모장","/workspace/file/template-memo","20.workspace/30.file/46.template-memo",{"title":509,"path":510,"stem":511,"children":-1},"AI 채팅 파일","/workspace/file/ai-chat-file","20.workspace/30.file/47.ai-chat-file",{"title":513,"path":514,"stem":515,"children":-1},"파일 변경 기록 확인","/workspace/file/audit-trail","20.workspace/30.file/50.audit-trail",{"title":517,"path":518,"stem":519,"children":-1},"파일 버전 관리","/workspace/file/version-trail","20.workspace/30.file/51.version-trail",{"title":521,"path":522,"stem":523,"children":-1},"편집 잠금","/workspace/file/file-lock","20.workspace/30.file/52.file-lock",{"title":525,"path":526,"stem":527,"children":-1},"파일 암호화","/workspace/file/file-encrypt","20.workspace/30.file/53.file-encrypt",{"title":529,"path":530,"stem":531,"children":-1},"디스크 파일 등록","/workspace/file/disk-file-registration","20.workspace/30.file/60.disk-file-registration",{"title":533,"path":534,"stem":535,"children":536,"page":55},"협업","/workspace/cooperation","20.workspace/35.cooperation",[537,541,545,549,554,558,562,566,571,575],{"title":538,"path":539,"stem":540,"children":-1},"파일·폴더 댓글","/workspace/cooperation/file-comments","20.workspace/35.cooperation/00.file-comments",{"title":542,"path":543,"stem":544,"children":-1},"채팅","/workspace/cooperation/chat","20.workspace/35.cooperation/10.chat",{"title":546,"path":547,"stem":548,"children":-1},"협업 채팅 및 편집 잠금","/workspace/cooperation/collaboration-chat","20.workspace/35.cooperation/11.collaboration-chat",{"title":550,"path":551,"stem":552,"tags":553,"children":-1},"팀원 작업 위치 따라가기","/workspace/cooperation/follow-team-location","20.workspace/35.cooperation/12.follow-team-location",[371],{"title":555,"path":556,"stem":557,"children":-1},"멘션","/workspace/cooperation/mention","20.workspace/35.cooperation/14.mention",{"title":559,"path":560,"stem":561,"children":-1},"쪽지","/workspace/cooperation/dm","20.workspace/35.cooperation/16.dm",{"title":563,"path":564,"stem":565,"children":-1},"알림 보관함","/workspace/cooperation/notification-inbox","20.workspace/35.cooperation/18.notification-inbox",{"title":567,"path":568,"stem":569,"tags":570,"children":-1},"팀 활동 확인하기","/workspace/cooperation/file-activity","20.workspace/35.cooperation/30.file-activity",[371],{"title":572,"path":573,"stem":574,"children":-1},"외부 공유 링크 만들기","/workspace/cooperation/share-link-creation","20.workspace/35.cooperation/40.share-link-creation",{"title":576,"path":577,"stem":578,"children":-1},"외부 공유 이메일 전송","/workspace/cooperation/share-link-email","20.workspace/35.cooperation/42.share-link-email",{"title":580,"path":581,"stem":582,"children":583,"page":55},"검색","/workspace/search","20.workspace/40.search",[584,588,593,597,601,605],{"title":585,"path":586,"stem":587,"children":-1},"파일 검색","/workspace/search/search","20.workspace/40.search/00.search",{"title":589,"path":590,"stem":591,"tags":592,"children":-1},"문맥 검색 (AI 검색)","/workspace/search/context-search","20.workspace/40.search/10.context-search",[371],{"title":594,"path":595,"stem":596,"children":-1},"이미지 검색","/workspace/search/image-search","20.workspace/40.search/20.image-search",{"title":598,"path":599,"stem":600,"children":-1},"채팅 검색","/workspace/search/chat-search","20.workspace/40.search/30.chat-search",{"title":602,"path":603,"stem":604,"children":-1},"댓글 검색","/workspace/search/comment-search","20.workspace/40.search/40.comment-search",{"title":606,"path":607,"stem":608,"children":-1},"유의어 검색","/workspace/search/synonym-search","20.workspace/40.search/50.synonym-search",{"title":610,"path":611,"stem":612,"children":613,"page":55},"AI","/workspace/ai","20.workspace/50.ai",[614,618,623],{"title":615,"path":616,"stem":617,"children":-1},"AI 기능 요약","/workspace/ai/overview","20.workspace/50.ai/00.overview",{"title":619,"path":620,"stem":621,"tags":622,"children":-1},"로컬 AI에게 업무 요청하기","/workspace/ai/ai-work","20.workspace/50.ai/10.ai-work",[371],{"title":624,"path":625,"stem":626,"children":-1},"외부 AI 활용하기","/workspace/ai/external-ai","20.workspace/50.ai/20.external-ai",{"title":628,"path":629,"stem":630,"children":631,"page":55},"웹스페이스","/webspace","40.webspace",[632,636,640,644,648,652,657,661,665,669,673,702],{"title":633,"path":634,"stem":635,"children":-1},"웹스페이스(Webspace)란?","/webspace/overview","40.webspace/00.overview",{"title":637,"path":638,"stem":639,"children":-1},"웹사이트 배포하기","/webspace/website-release","40.webspace/10.website-release",{"title":641,"path":642,"stem":643,"children":-1},"스키마 파일(.sfn) 만들기","/webspace/create-database","40.webspace/20.create-database",{"title":645,"path":646,"stem":647,"children":-1},"API 빌드 및 데이터베이스 배포하기","/webspace/api-overview","40.webspace/24.api-overview",{"title":649,"path":650,"stem":651,"children":-1},"프론트엔드 샘플 확인하기","/webspace/frontend-example","40.webspace/26.frontend-example",{"title":653,"path":654,"stem":655,"tags":656,"children":-1},"팀 내부용 웹서비스 만들기","/webspace/internal-webservice","40.webspace/32.internal-webservice",[371],{"title":658,"path":659,"stem":660,"children":-1},"외부 공개용 웹서비스 만들기","/webspace/external-webservice","40.webspace/34.external-webservice",{"title":662,"path":663,"stem":664,"children":-1},"SQL 가져오기와 내보내기","/webspace/sql-converter","40.webspace/42.sql-converter",{"title":666,"path":667,"stem":668,"children":-1},"개발자 팁 2: Code 컨버터","/webspace/code-converter","40.webspace/44.code-converter",{"title":670,"path":671,"stem":672,"children":-1},"성능과 확장","/webspace/performance","40.webspace/48.performance",{"title":674,"path":675,"stem":676,"children":677,"page":55},"웹스페이스 관리","/webspace/admin","40.webspace/50.admin",[678,682,686,690,694,698],{"title":679,"path":680,"stem":681,"children":-1},"웹스페이스 관리 시작하기","/webspace/admin/overview","40.webspace/50.admin/00.overview",{"title":683,"path":684,"stem":685,"children":-1},"운영 현황","/webspace/admin/operations","40.webspace/50.admin/10.operations",{"title":687,"path":688,"stem":689,"children":-1},"워크스페이스 접근","/webspace/admin/workspace-access","40.webspace/50.admin/20.workspace-access",{"title":691,"path":692,"stem":693,"children":-1},"API · 사이트 보안","/webspace/admin/api-site-security","40.webspace/50.admin/30.api-site-security",{"title":695,"path":696,"stem":697,"children":-1},"서비스 및 용량","/webspace/admin/service-capacity","40.webspace/50.admin/40.service-capacity",{"title":699,"path":700,"stem":701,"children":-1},"배포 관리와 프론트엔드 릴리스","/webspace/admin/deployments","40.webspace/50.admin/50.deployments",{"title":703,"path":704,"stem":705,"children":706,"page":55},"웹스페이스 따라해보기","/webspace/examples","40.webspace/60.examples",[707,711,715,719,724,729],{"title":708,"path":709,"stem":710,"children":-1},"웹스페이스 응용편","/webspace/examples/overview","40.webspace/60.examples/00.overview",{"title":712,"path":713,"stem":714,"children":-1},"나만의 업무 시스템 만들기","/webspace/examples/my-own-system","40.webspace/60.examples/10.my-own-system",{"title":716,"path":717,"stem":718,"children":-1},"실시간 오목 게임 만들기","/webspace/examples/realtime-gomoku","40.webspace/60.examples/20.realtime-gomoku",{"title":720,"path":721,"stem":722,"tags":723,"children":-1},"폴더 파일로 자료 게시판 만들기","/webspace/examples/folder-board","40.webspace/60.examples/30.folder-board",[90],{"title":725,"path":726,"stem":727,"tags":728,"children":-1},"공동 몬스터 레이드 만들기","/webspace/examples/monster-raid","40.webspace/60.examples/40.monster-raid",[90],{"title":730,"path":731,"stem":732,"tags":733,"children":-1},"AI 상담 채팅 샘플 배포하기","/webspace/examples/ai-support-chat","40.webspace/60.examples/50.ai-support-chat",[90],{"title":735,"path":736,"stem":737,"children":738,"page":55},"플러그인 사용하기","/plugin","50.plugin",[739,743,760,809,827,857],{"title":740,"path":741,"stem":742,"children":-1},"플러그인 개요","/plugin/overview","50.plugin/00.overview",{"title":744,"path":745,"stem":746,"children":747,"page":55},"캘린더","/plugin/calendar","50.plugin/10.calendar",[748,752,756],{"title":749,"path":750,"stem":751,"children":-1},"캘린더 소개","/plugin/calendar/overview","50.plugin/10.calendar/00.overview",{"title":753,"path":754,"stem":755,"children":-1},"일정 생성, 수정 및 삭제하기","/plugin/calendar/create-event","50.plugin/10.calendar/10.create-event",{"title":757,"path":758,"stem":759,"children":-1},"활동 기록 확인하기","/plugin/calendar/file-activity","50.plugin/10.calendar/40.file-activity",{"title":761,"path":762,"stem":763,"children":764,"page":55},"이메일","/plugin/email","50.plugin/20.email",[765,769,773,777,781,785,789,793,797,801,805],{"title":766,"path":767,"stem":768,"children":-1},"이메일 소개","/plugin/email/overview","50.plugin/20.email/00.overview",{"title":770,"path":771,"stem":772,"children":-1},"이메일 설정","/plugin/email/setfn-email-setting","50.plugin/20.email/05.setfn-email-setting",{"title":774,"path":775,"stem":776,"children":-1},"외부 이메일 연결","/plugin/email/external-email","50.plugin/20.email/07.external-email",{"title":778,"path":779,"stem":780,"children":-1},"이메일 기본 기능","/plugin/email/email-basic","50.plugin/20.email/10.email-basic",{"title":782,"path":783,"stem":784,"children":-1},"메일 AI 어시스턴트 사용하기","/plugin/email/email-ai-assistant","50.plugin/20.email/15.email-ai-assistant",{"title":786,"path":787,"stem":788,"children":-1},"이메일 작성 및 전송","/plugin/email/email-compose","50.plugin/20.email/20.email-compose",{"title":790,"path":791,"stem":792,"children":-1},"파일 첨부하기","/plugin/email/email-attachment","50.plugin/20.email/30.email-attachment",{"title":794,"path":795,"stem":796,"children":-1},"이메일 폴더 관리","/plugin/email/email-folders","50.plugin/20.email/40.email-folders",{"title":798,"path":799,"stem":800,"children":-1},"이메일 자동 분류하기","/plugin/email/email-auto-classify","50.plugin/20.email/50.email-auto-classify",{"title":802,"path":803,"stem":804,"children":-1},"이메일 파일 보관 및 공유","/plugin/email/email-open-in-space","50.plugin/20.email/60.email-open-in-space",{"title":806,"path":807,"stem":808,"children":-1},"이메일 보안","/plugin/email/email-security","50.plugin/20.email/70.email-security",{"title":810,"path":811,"stem":812,"children":813,"page":55},"워크플로우 (업무자동화)","/plugin/workflow","50.plugin/30.workflow",[814,818,823],{"title":815,"path":816,"stem":817,"children":-1},"워크플로우 소개","/plugin/workflow/overview","50.plugin/30.workflow/00.overview",{"title":819,"path":820,"stem":821,"tags":822,"children":-1},"새 워크플로우 만들기","/plugin/workflow/new-workflow","50.plugin/30.workflow/10.new-workflow",[371],{"title":824,"path":825,"stem":826,"children":-1},"실행 기록 확인하기","/plugin/workflow/execution-history","50.plugin/30.workflow/20.execution-history",{"title":828,"path":829,"stem":830,"children":831,"page":55},"파인튜닝 (AI 학습)","/plugin/fine-tuning","50.plugin/40.fine-tuning",[832,837,841,845,849,853],{"title":833,"path":834,"stem":835,"tags":836,"children":-1},"파인튜닝 소개","/plugin/fine-tuning/overview","50.plugin/40.fine-tuning/00.overview",[371],{"title":838,"path":839,"stem":840,"children":-1},"학습 데이터 전처리","/plugin/fine-tuning/pre-processing","50.plugin/40.fine-tuning/10.pre-processing",{"title":842,"path":843,"stem":844,"children":-1},"학습","/plugin/fine-tuning/training","50.plugin/40.fine-tuning/20.training",{"title":846,"path":847,"stem":848,"children":-1},"평가","/plugin/fine-tuning/evaluation","50.plugin/40.fine-tuning/30.evaluation",{"title":850,"path":851,"stem":852,"children":-1},"채팅 테스트","/plugin/fine-tuning/chat-test","50.plugin/40.fine-tuning/40.chat-test",{"title":854,"path":855,"stem":856,"children":-1},"내보내기","/plugin/fine-tuning/export","50.plugin/40.fine-tuning/50.export",{"title":858,"path":859,"stem":860,"children":861,"page":55},"EDC (데이터 수집)","/plugin/edc","50.plugin/50.edc",[862,866,870,874],{"title":863,"path":864,"stem":865,"children":-1},"EDC 소개","/plugin/edc/overview","50.plugin/50.edc/00.overview",{"title":867,"path":868,"stem":869,"children":-1},"데이터 입력, Audit Trail","/plugin/edc/data-entry","50.plugin/50.edc/10.data-entry",{"title":871,"path":872,"stem":873,"children":-1},"빌더","/plugin/edc/builder","50.plugin/50.edc/20.builder",{"title":875,"path":876,"stem":877,"children":-1},"사용자/기관 설정","/plugin/edc/account","50.plugin/50.edc/30.account",{"title":879,"path":880,"stem":881,"children":882,"page":55},"FAQ","/faq","99.FAQ",[883,887,891,895,899,903,907],{"title":884,"path":885,"stem":886,"children":-1},"SetFN vs 클라우드 서비스 비교","/faq/comparison-cloud","99.FAQ/10.comparison-cloud",{"title":888,"path":889,"stem":890,"children":-1},"SetFN vs NAS 비교","/faq/comparison-nas","99.FAQ/20.comparison-nas",{"title":892,"path":893,"stem":894,"children":-1},"보안 정책","/faq/security-policy","99.FAQ/30.security-policy",{"title":896,"path":897,"stem":898,"children":-1},"SetFN은 왜 빠른가요","/faq/why-fast","99.FAQ/40.why-fast",{"title":900,"path":901,"stem":902,"children":-1},"라이선스 FAQ","/faq/license-faq","99.FAQ/50.license-faq",{"title":904,"path":905,"stem":906,"children":-1},"AI 기능 FAQ","/faq/ai-faq","99.FAQ/60.ai-faq",{"title":908,"path":909,"stem":910,"children":-1},"문제 해결 가이드","/faq/troubleshooting","99.FAQ/70.troubleshooting",{"title":912,"path":913,"stem":914,"children":915,"page":55},"응용편(초안)","/draft","draft",[916,920,924,928,932,936,940,944,948,952,956,960,964],{"title":917,"path":918,"stem":919,"children":-1},"예시 1. 소개 페이지 만들기","/draft/static-intro","draft/05.static-intro",{"title":921,"path":922,"stem":923,"children":-1},"예시 2. 공지 게시판 만들기","/draft/public-notice-board","draft/07.public-notice-board",{"title":925,"path":926,"stem":927,"children":-1},"예시 3. 커피챗 예약 시스템 만들기","/draft/coffee-chat-booking","draft/08.coffee-chat-booking",{"title":929,"path":930,"stem":931,"children":-1},"예시 4. 휴가 신청 시스템 만들기","/draft/leave-request","draft/09.leave-request",{"title":933,"path":934,"stem":935,"children":-1},"예시 5. 실시간 팀 채팅 만들기","/draft/team-chat","draft/10.team-chat",{"title":937,"path":938,"stem":939,"children":-1},"예시 6. 채용 지원 서류 제출함 만들기","/draft/client-submission","draft/11.client-submission",{"title":941,"path":942,"stem":943,"children":-1},"예시 7. 팀과 레벨에 따른 이슈 트래커 만들기","/draft/crm-basic","draft/12.crm-basic",{"title":945,"path":946,"stem":947,"children":-1},"예시 8. 이슈 상태별 필터와 통계 요약 화면 만들기","/draft/crm-search-filter","draft/13.crm-search-filter",{"title":949,"path":950,"stem":951,"children":-1},"예시 9. 실시간 커뮤니티 채팅과 운영 기능 만들기","/draft/community-moderation","draft/14.community-moderation",{"title":953,"path":954,"stem":955,"children":-1},"예시 10. 실시간 출석체크·투표 만들기","/draft/attendance-poll","draft/15.attendance-poll",{"title":957,"path":958,"stem":959,"children":-1},"예시 11. 찬반 논쟁 배틀 만들기","/draft/debate-battle","draft/16.debate-battle",{"title":961,"path":962,"stem":963,"children":-1},"예시 13. 공지사항 읽음 확인 만들기","/draft/announcement-read","draft/18.announcement-read",{"title":965,"path":966,"stem":967,"children":-1},"예시 14. 재고 관리 시스템 만들기","/draft/inventory-management","draft/19.inventory-management",{"title":969,"path":970,"stem":971,"children":972,"page":55},"SJAUTO","/sjauto","sjauto",[973,976,979,982],{"title":69,"path":974,"stem":975,"children":-1},"/sjauto/admin-page-access","sjauto/00.admin-page-access",{"title":334,"path":977,"stem":978,"children":-1},"/sjauto/signup","sjauto/10.signup",{"title":509,"path":980,"stem":981,"children":-1},"/sjauto/ai-chat-file","sjauto/ai-chat-file",{"title":712,"path":983,"stem":984,"children":-1},"/sjauto/webspace-schema-example","sjauto/webspace-schema-example",{"id":986,"title":725,"body":987,"cover":1739,"description":1740,"extension":1741,"image":1739,"meta":1742,"navigation":1744,"path":726,"seo":1745,"stem":727,"tags":1754,"thumbnail":1739,"__hash__":1755},"docs_ko/40.webspace/60.examples/40.monster-raid.md",{"type":988,"value":989,"toc":1728},"minimal",[990,994,1003,1008,1029,1033,1044,1071,1082,1086,1089,1139,1144,1148,1154,1270,1283,1287,1294,1388,1394,1398,1405,1515,1524,1546,1553,1631,1637,1641,1674,1683,1686,1703,1707,1724],[991,992,725],"h1",{"id":993},"공동-몬스터-레이드-만들기",[995,996,997,998,1002],"p",{},"여러 회원이 같은 몬스터를 공격하고 체력이 0이 될 때까지 결과를 공유하는 실시간 레이드를 구성합니다. Webspace의 공통 ",[999,1000,1001],"code",{},"shared-resource"," 처리기가 공격, 체력 변경과 행동별 보상을 서버에서 함께 처리합니다.",[1004,1005,1007],"h2",{"id":1006},"시작하기-전에","시작하기 전에",[1009,1010,1011,1015,1026],"ul",{},[1012,1013,1014],"li",{},"스키마와 API를 배포할 권한이 필요합니다.",[1012,1016,1017,1018,1021,1022,1025],{},"실시간 기능의 ",[999,1019,1020],{},"send","와 ",[999,1023,1024],{},"receive"," 권한을 사용할 회원에게 부여해야 합니다.",[1012,1027,1028],{},"레이드 대상 생성 API는 관리자만 사용하도록 구성합니다.",[1004,1030,1032],{"id":1031},"완성된-스키마로-시작하기","완성된 스키마로 시작하기",[995,1034,1035,1040,1041,1043],{},[1036,1037,1039],"a",{"href":1038},"/examples/webspace/monster-raid/shared-resource-game.sfn","공동 자원 게임 스키마(.sfn) 다운로드","에는 이 문서에서 사용하는 세 테이블의 컬럼과 권한, ",[999,1042,1001],{}," 처리기 설정이 들어 있습니다.",[1045,1046,1047,1050,1068],"ol",{},[1012,1048,1049],{},"파일을 내려받아 팀 폴더 또는 개인 폴더에 올리고 스키마 편집기로 엽니다.",[1012,1051,1052,1055,1056,1059,1060,1063,1064,1067],{},[999,1053,1054],{},"API 빌드","의 배포 설정에서 ",[999,1057,1058],{},"데이터베이스 식별자","를 확인합니다. 기본값 ",[999,1061,1062],{},"resource_game","이 기존 데이터베이스와 겹치지 않도록 ",[999,1065,1066],{},"monster_raid_team_a","처럼 새 식별자로 바꿉니다.",[1012,1069,1070],{},"권한과 처리기 설정을 검토한 뒤 스키마를 배포합니다.",[995,1072,1073,1074,1077,1078,1081],{},"이 파일은 공동 자원 백엔드 구조 예제입니다. ",[999,1075,1076],{},"includeClient","가 ",[999,1079,1080],{},"false","이므로 게임 화면은 자동으로 만들어지지 않으며, 초기 몬스터 데이터도 포함하지 않습니다. 아래 API와 WebSocket 이벤트를 사용하는 화면을 별도로 만들고 레이드 대상도 생성해야 합니다.",[1004,1083,1085],{"id":1084},"데이터를-세-테이블로-나누기","데이터를 세 테이블로 나누기",[995,1087,1088],{},"공동 자원 구조는 다음 세 종류의 데이터를 분리합니다.",[1090,1091,1092,1105],"table",{},[1093,1094,1095],"thead",{},[1096,1097,1098,1102],"tr",{},[1099,1100,1101],"th",{},"테이블",[1099,1103,1104],{},"저장 내용",[1106,1107,1108,1119,1129],"tbody",{},[1096,1109,1110,1116],{},[1111,1112,1113],"td",{},[999,1114,1115],{},"game_resources",[1111,1117,1118],{},"몬스터 코드, 상태, 현재·최대 체력, 버전과 보상 아이템",[1096,1120,1121,1126],{},[1111,1122,1123],{},[999,1124,1125],{},"game_actions",[1111,1127,1128],{},"행동 ID, 공격한 회원, 적용 피해, 결과 체력과 보상 수량",[1096,1130,1131,1136],{},[1111,1132,1133],{},[999,1134,1135],{},"game_inventory",[1111,1137,1138],{},"회원별 아이템과 누적 수량",[995,1140,1141,1143],{},[999,1142,1125],{},"의 행동 ID는 재시도를 구분합니다. 같은 행동 ID를 다시 보내도 체력과 보상이 두 번 반영되지 않습니다.",[1004,1145,1147],{"id":1146},"실시간-처리기-설정하기","실시간 처리기 설정하기",[995,1149,1150,1151,1153],{},"실시간 기능을 켜고 이벤트 처리기로 ",[999,1152,1001],{},"를 선택합니다. 기본 테이블 이름을 사용한다면 처리기 설정은 다음 구조입니다.",[1155,1156,1161],"pre",{"className":1157,"code":1158,"language":1159,"meta":1160,"style":1160},"language-json shiki shiki-themes github-light github-dark monokai","{\n  \"resourcesTable\": \"game_resources\",\n  \"actionsTable\": \"game_actions\",\n  \"inventoryTable\": \"game_inventory\",\n  \"actionPower\": 1,\n  \"rewardPerAction\": 1,\n  \"maxClientAmount\": 1,\n  \"broadcast\": \"namespace\"\n}\n","json","",[999,1162,1163,1172,1189,1202,1215,1229,1241,1253,1264],{"__ignoreMap":1160},[1164,1165,1168],"span",{"class":1166,"line":1167},"line",1,[1164,1169,1171],{"class":1170},"sMOD_","{\n",[1164,1173,1175,1179,1182,1186],{"class":1166,"line":1174},2,[1164,1176,1178],{"class":1177},"s-m8C","  \"resourcesTable\"",[1164,1180,1181],{"class":1170},": ",[1164,1183,1185],{"class":1184},"sCZoN","\"game_resources\"",[1164,1187,1188],{"class":1170},",\n",[1164,1190,1192,1195,1197,1200],{"class":1166,"line":1191},3,[1164,1193,1194],{"class":1177},"  \"actionsTable\"",[1164,1196,1181],{"class":1170},[1164,1198,1199],{"class":1184},"\"game_actions\"",[1164,1201,1188],{"class":1170},[1164,1203,1205,1208,1210,1213],{"class":1166,"line":1204},4,[1164,1206,1207],{"class":1177},"  \"inventoryTable\"",[1164,1209,1181],{"class":1170},[1164,1211,1212],{"class":1184},"\"game_inventory\"",[1164,1214,1188],{"class":1170},[1164,1216,1218,1221,1223,1227],{"class":1166,"line":1217},5,[1164,1219,1220],{"class":1177},"  \"actionPower\"",[1164,1222,1181],{"class":1170},[1164,1224,1226],{"class":1225},"s7F3e","1",[1164,1228,1188],{"class":1170},[1164,1230,1232,1235,1237,1239],{"class":1166,"line":1231},6,[1164,1233,1234],{"class":1177},"  \"rewardPerAction\"",[1164,1236,1181],{"class":1170},[1164,1238,1226],{"class":1225},[1164,1240,1188],{"class":1170},[1164,1242,1244,1247,1249,1251],{"class":1166,"line":1243},7,[1164,1245,1246],{"class":1177},"  \"maxClientAmount\"",[1164,1248,1181],{"class":1170},[1164,1250,1226],{"class":1225},[1164,1252,1188],{"class":1170},[1164,1254,1256,1259,1261],{"class":1166,"line":1255},8,[1164,1257,1258],{"class":1177},"  \"broadcast\"",[1164,1260,1181],{"class":1170},[1164,1262,1263],{"class":1184},"\"namespace\"\n",[1164,1265,1267],{"class":1166,"line":1266},9,[1164,1268,1269],{"class":1170},"}\n",[995,1271,1272,1077,1275,1278,1279,1282],{},[999,1273,1274],{},"broadcast",[999,1276,1277],{},"namespace","이면 같은 Webspace 실시간 네임스페이스에 연결된 클라이언트가 결과 이벤트를 함께 받습니다. ",[999,1280,1281],{},"actor","이면 행동한 회원에게만 결과를 보냅니다.",[1004,1284,1286],{"id":1285},"레이드-대상-만들기","레이드 대상 만들기",[995,1288,1289,1290,1293],{},"관리자 권한으로 ",[999,1291,1292],{},"game_resources/create","를 호출해 몬스터를 만듭니다.",[1155,1295,1297],{"className":1157,"code":1296,"language":1159,"meta":1160,"style":1160},"{\n  \"code\": \"RAID-1\",\n  \"kind\": \"monster\",\n  \"status\": \"active\",\n  \"current_value\": 10000,\n  \"max_value\": 10000,\n  \"version\": 0,\n  \"reward_item_code\": \"monster-core\"\n}\n",[999,1298,1299,1303,1315,1327,1339,1351,1362,1374,1384],{"__ignoreMap":1160},[1164,1300,1301],{"class":1166,"line":1167},[1164,1302,1171],{"class":1170},[1164,1304,1305,1308,1310,1313],{"class":1166,"line":1174},[1164,1306,1307],{"class":1177},"  \"code\"",[1164,1309,1181],{"class":1170},[1164,1311,1312],{"class":1184},"\"RAID-1\"",[1164,1314,1188],{"class":1170},[1164,1316,1317,1320,1322,1325],{"class":1166,"line":1191},[1164,1318,1319],{"class":1177},"  \"kind\"",[1164,1321,1181],{"class":1170},[1164,1323,1324],{"class":1184},"\"monster\"",[1164,1326,1188],{"class":1170},[1164,1328,1329,1332,1334,1337],{"class":1166,"line":1204},[1164,1330,1331],{"class":1177},"  \"status\"",[1164,1333,1181],{"class":1170},[1164,1335,1336],{"class":1184},"\"active\"",[1164,1338,1188],{"class":1170},[1164,1340,1341,1344,1346,1349],{"class":1166,"line":1217},[1164,1342,1343],{"class":1177},"  \"current_value\"",[1164,1345,1181],{"class":1170},[1164,1347,1348],{"class":1225},"10000",[1164,1350,1188],{"class":1170},[1164,1352,1353,1356,1358,1360],{"class":1166,"line":1231},[1164,1354,1355],{"class":1177},"  \"max_value\"",[1164,1357,1181],{"class":1170},[1164,1359,1348],{"class":1225},[1164,1361,1188],{"class":1170},[1164,1363,1364,1367,1369,1372],{"class":1166,"line":1243},[1164,1365,1366],{"class":1177},"  \"version\"",[1164,1368,1181],{"class":1170},[1164,1370,1371],{"class":1225},"0",[1164,1373,1188],{"class":1170},[1164,1375,1376,1379,1381],{"class":1166,"line":1255},[1164,1377,1378],{"class":1177},"  \"reward_item_code\"",[1164,1380,1181],{"class":1170},[1164,1382,1383],{"class":1184},"\"monster-core\"\n",[1164,1385,1386],{"class":1166,"line":1266},[1164,1387,1269],{"class":1170},[995,1389,1390,1391,1393],{},"화면을 열 때 ",[999,1392,1115],{}," 조회 API에서 현재 체력과 버전을 읽습니다. 새로 연결하거나 연결이 복구된 뒤에도 REST API를 다시 조회하면 현재 서버 상태를 기준으로 화면을 맞출 수 있습니다.",[1004,1395,1397],{"id":1396},"websocket으로-공격-보내기","WebSocket으로 공격 보내기",[995,1399,1400,1401,1404],{},"로그인한 회원이 실시간 연결을 구독한 뒤 ",[999,1402,1403],{},"resource-game.act"," 이벤트를 보냅니다.",[1155,1406,1408],{"className":1157,"code":1407,"language":1159,"meta":1160,"style":1160},"{\n  \"type\": \"webspace:send\",\n  \"data\": {\n    \"dbName\": \"monster_raid_team_a\",\n    \"event\": \"resource-game.act\",\n    \"payload\": {\n      \"actionId\": \"attack-00000001\",\n      \"resourceCode\": \"RAID-1\",\n      \"amount\": 1\n    }\n  }\n}\n",[999,1409,1410,1414,1426,1434,1446,1458,1465,1477,1488,1498,1504,1510],{"__ignoreMap":1160},[1164,1411,1412],{"class":1166,"line":1167},[1164,1413,1171],{"class":1170},[1164,1415,1416,1419,1421,1424],{"class":1166,"line":1174},[1164,1417,1418],{"class":1177},"  \"type\"",[1164,1420,1181],{"class":1170},[1164,1422,1423],{"class":1184},"\"webspace:send\"",[1164,1425,1188],{"class":1170},[1164,1427,1428,1431],{"class":1166,"line":1191},[1164,1429,1430],{"class":1177},"  \"data\"",[1164,1432,1433],{"class":1170},": {\n",[1164,1435,1436,1439,1441,1444],{"class":1166,"line":1204},[1164,1437,1438],{"class":1177},"    \"dbName\"",[1164,1440,1181],{"class":1170},[1164,1442,1443],{"class":1184},"\"monster_raid_team_a\"",[1164,1445,1188],{"class":1170},[1164,1447,1448,1451,1453,1456],{"class":1166,"line":1217},[1164,1449,1450],{"class":1177},"    \"event\"",[1164,1452,1181],{"class":1170},[1164,1454,1455],{"class":1184},"\"resource-game.act\"",[1164,1457,1188],{"class":1170},[1164,1459,1460,1463],{"class":1166,"line":1231},[1164,1461,1462],{"class":1177},"    \"payload\"",[1164,1464,1433],{"class":1170},[1164,1466,1467,1470,1472,1475],{"class":1166,"line":1243},[1164,1468,1469],{"class":1177},"      \"actionId\"",[1164,1471,1181],{"class":1170},[1164,1473,1474],{"class":1184},"\"attack-00000001\"",[1164,1476,1188],{"class":1170},[1164,1478,1479,1482,1484,1486],{"class":1166,"line":1255},[1164,1480,1481],{"class":1177},"      \"resourceCode\"",[1164,1483,1181],{"class":1170},[1164,1485,1312],{"class":1184},[1164,1487,1188],{"class":1170},[1164,1489,1490,1493,1495],{"class":1166,"line":1266},[1164,1491,1492],{"class":1177},"      \"amount\"",[1164,1494,1181],{"class":1170},[1164,1496,1497],{"class":1225},"1\n",[1164,1499,1501],{"class":1166,"line":1500},10,[1164,1502,1503],{"class":1170},"    }\n",[1164,1505,1507],{"class":1166,"line":1506},11,[1164,1508,1509],{"class":1170},"  }\n",[1164,1511,1513],{"class":1166,"line":1512},12,[1164,1514,1269],{"class":1170},[995,1516,1517,1520,1521,1523],{},[999,1518,1519],{},"dbName","에는 배포할 때 지정한 ",[999,1522,1058],{},"를 사용합니다.",[995,1525,1526,1529,1530,1533,1534,1537,1538,1541,1542,1545],{},[999,1527,1528],{},"actionId","는 영문, 숫자, ",[999,1531,1532],{},"_",", ",[999,1535,1536],{},"-","를 조합한 8~80자 값으로 만듭니다. ",[999,1539,1540],{},"amount","를 생략하면 1이며, 값을 보낼 때는 처리기의 ",[999,1543,1544],{},"maxClientAmount"," 범위 안의 정수를 사용합니다.",[995,1547,1548,1549,1552],{},"서버는 처리가 끝난 뒤 ",[999,1550,1551],{},"resource-game.action-applied","를 보냅니다.",[1155,1554,1556],{"className":1157,"code":1555,"language":1159,"meta":1160,"style":1160},"{\n  \"actionId\": \"attack-00000001\",\n  \"resourceId\": 1,\n  \"currentValue\": 9999,\n  \"version\": 1,\n  \"rewardQuantity\": 1,\n  \"duplicate\": false\n}\n",[999,1557,1558,1562,1573,1584,1596,1606,1617,1627],{"__ignoreMap":1160},[1164,1559,1560],{"class":1166,"line":1167},[1164,1561,1171],{"class":1170},[1164,1563,1564,1567,1569,1571],{"class":1166,"line":1174},[1164,1565,1566],{"class":1177},"  \"actionId\"",[1164,1568,1181],{"class":1170},[1164,1570,1474],{"class":1184},[1164,1572,1188],{"class":1170},[1164,1574,1575,1578,1580,1582],{"class":1166,"line":1191},[1164,1576,1577],{"class":1177},"  \"resourceId\"",[1164,1579,1181],{"class":1170},[1164,1581,1226],{"class":1225},[1164,1583,1188],{"class":1170},[1164,1585,1586,1589,1591,1594],{"class":1166,"line":1204},[1164,1587,1588],{"class":1177},"  \"currentValue\"",[1164,1590,1181],{"class":1170},[1164,1592,1593],{"class":1225},"9999",[1164,1595,1188],{"class":1170},[1164,1597,1598,1600,1602,1604],{"class":1166,"line":1217},[1164,1599,1366],{"class":1177},[1164,1601,1181],{"class":1170},[1164,1603,1226],{"class":1225},[1164,1605,1188],{"class":1170},[1164,1607,1608,1611,1613,1615],{"class":1166,"line":1231},[1164,1609,1610],{"class":1177},"  \"rewardQuantity\"",[1164,1612,1181],{"class":1170},[1164,1614,1226],{"class":1225},[1164,1616,1188],{"class":1170},[1164,1618,1619,1622,1624],{"class":1166,"line":1243},[1164,1620,1621],{"class":1177},"  \"duplicate\"",[1164,1623,1181],{"class":1170},[1164,1625,1626],{"class":1225},"false\n",[1164,1628,1629],{"class":1166,"line":1255},[1164,1630,1269],{"class":1170},[995,1632,1633,1634,1636],{},"화면은 이 결과를 받은 뒤에만 체력을 바꿉니다. 클라이언트가 ",[999,1635,1551],{},"를 직접 보내는 요청은 거부됩니다.",[1004,1638,1640],{"id":1639},"체력과-보상-표시하기","체력과 보상 표시하기",[1045,1642,1643,1649,1656,1662,1667],{},[1012,1644,1645,1648],{},[999,1646,1647],{},"resourceId","가 현재 보고 있는 몬스터인지 확인합니다.",[1012,1650,1651,1652,1655],{},"이전 결과보다 큰 ",[999,1653,1654],{},"version","인지 확인합니다.",[1012,1657,1658,1661],{},[999,1659,1660],{},"currentValue","로 체력 표시를 갱신합니다.",[1012,1663,1664,1666],{},[999,1665,1660],{},"가 0이면 공동 처치 완료 상태를 표시합니다.",[1012,1668,1669,1670,1673],{},"개인 아이템은 ",[999,1671,1672],{},"game_inventory/list","에서 다시 조회합니다.",[995,1675,1676,1678,1679,1682],{},[999,1677,1135],{},"에는 회원 본인 데이터만 읽을 수 있는 소유자 권한을 적용합니다. 결과 이벤트의 ",[999,1680,1681],{},"rewardQuantity","만으로 다른 회원의 보유량을 추정하지 않습니다.",[1004,1684,1685],{"id":1685},"알아두기",[1009,1687,1688,1691,1694,1697],{},[1012,1689,1690],{},"공격력과 보상은 클라이언트 값이 아니라 서버의 처리기 설정으로 결정됩니다.",[1012,1692,1693],{},"자원 변경, 행동 기록과 보상 적립은 하나의 트랜잭션으로 처리됩니다.",[1012,1695,1696],{},"현재 공통 구조는 행동별 보상을 제공합니다. 처치 순위나 처치자 전용 보상은 별도로 설계해야 합니다.",[1012,1698,1699,1700,1702],{},"응답이 늦어도 성공으로 간주하지 않습니다. 같은 ",[999,1701,1528],{},"로 재확인하면 중복 적용을 막을 수 있습니다.",[1004,1704,1706],{"id":1705},"관련-문서","관련 문서",[1009,1708,1709,1714,1719],{},[1012,1710,1711],{},[1036,1712,716],{"href":1713},"./realtime-gomoku",[1012,1715,1716],{},[1036,1717,645],{"href":1718},"../api-overview",[1012,1720,1721],{},[1036,1722,670],{"href":1723},"../performance",[1725,1726,1727],"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":1160,"searchDepth":1174,"depth":1191,"links":1729},[1730,1731,1732,1733,1734,1735,1736,1737,1738],{"id":1006,"depth":1174,"text":1007},{"id":1031,"depth":1174,"text":1032},{"id":1084,"depth":1174,"text":1085},{"id":1146,"depth":1174,"text":1147},{"id":1285,"depth":1174,"text":1286},{"id":1396,"depth":1174,"text":1397},{"id":1639,"depth":1174,"text":1640},{"id":1685,"depth":1174,"text":1685},{"id":1705,"depth":1174,"text":1706},null,"Webspace의 shared-resource 실시간 처리기를 사용해 여러 회원이 하나의 몬스터를 공격하는 서버 판정형 레이드를 구성합니다.","md",{"slug":1743},"/webspace/examples/monster-raid/",true,{"title":1746,"description":1747,"ogType":1748,"twitterCard":1749,"keywords":1750},"공동 몬스터 레이드 만들기 | Webspace 응용편","공동 자원 테이블, WebSocket 이벤트와 개인 보상을 연결해 몬스터 레이드 화면을 만드는 방법을 안내합니다.","article","summary_large_image",[1751,1001,1752,1753],"Webspace 몬스터 레이드","WebSocket 게임","SetFN",[90],"_kenjFyAmdnSH2xqJRRBchX4NnLWM8DvXMYGVfzfzv0",[1757,1758],{"title":720,"path":721,"stem":722,"children":-1},{"title":730,"path":731,"stem":732,"children":-1},{"title":725,"filename":1760,"content":1761},"monster-raid","# 공동 몬스터 레이드 만들기\r\n\r\n여러 회원이 같은 몬스터를 공격하고 체력이 0이 될 때까지 결과를 공유하는 실시간 레이드를 구성합니다. Webspace의 공통 `shared-resource` 처리기가 공격, 체력 변경과 행동별 보상을 서버에서 함께 처리합니다.\r\n\r\n## 시작하기 전에\r\n\r\n- 스키마와 API를 배포할 권한이 필요합니다.\r\n- 실시간 기능의 `send`와 `receive` 권한을 사용할 회원에게 부여해야 합니다.\r\n- 레이드 대상 생성 API는 관리자만 사용하도록 구성합니다.\r\n\r\n## 완성된 스키마로 시작하기\r\n\r\n[공동 자원 게임 스키마(.sfn) 다운로드](/examples/webspace/monster-raid/shared-resource-game.sfn)에는 이 문서에서 사용하는 세 테이블의 컬럼과 권한, `shared-resource` 처리기 설정이 들어 있습니다.\r\n\r\n1. 파일을 내려받아 팀 폴더 또는 개인 폴더에 올리고 스키마 편집기로 엽니다.\r\n2. `API 빌드`의 배포 설정에서 `데이터베이스 식별자`를 확인합니다. 기본값 `resource_game`이 기존 데이터베이스와 겹치지 않도록 `monster_raid_team_a`처럼 새 식별자로 바꿉니다.\r\n3. 권한과 처리기 설정을 검토한 뒤 스키마를 배포합니다.\r\n\r\n이 파일은 공동 자원 백엔드 구조 예제입니다. `includeClient`가 `false`이므로 게임 화면은 자동으로 만들어지지 않으며, 초기 몬스터 데이터도 포함하지 않습니다. 아래 API와 WebSocket 이벤트를 사용하는 화면을 별도로 만들고 레이드 대상도 생성해야 합니다.\r\n\r\n## 데이터를 세 테이블로 나누기\r\n\r\n공동 자원 구조는 다음 세 종류의 데이터를 분리합니다.\r\n\r\n| 테이블 | 저장 내용 |\r\n| --- | --- |\r\n| `game_resources` | 몬스터 코드, 상태, 현재·최대 체력, 버전과 보상 아이템 |\r\n| `game_actions` | 행동 ID, 공격한 회원, 적용 피해, 결과 체력과 보상 수량 |\r\n| `game_inventory` | 회원별 아이템과 누적 수량 |\r\n\r\n`game_actions`의 행동 ID는 재시도를 구분합니다. 같은 행동 ID를 다시 보내도 체력과 보상이 두 번 반영되지 않습니다.\r\n\r\n## 실시간 처리기 설정하기\r\n\r\n실시간 기능을 켜고 이벤트 처리기로 `shared-resource`를 선택합니다. 기본 테이블 이름을 사용한다면 처리기 설정은 다음 구조입니다.\r\n\r\n```json\r\n{\r\n  \"resourcesTable\": \"game_resources\",\r\n  \"actionsTable\": \"game_actions\",\r\n  \"inventoryTable\": \"game_inventory\",\r\n  \"actionPower\": 1,\r\n  \"rewardPerAction\": 1,\r\n  \"maxClientAmount\": 1,\r\n  \"broadcast\": \"namespace\"\r\n}\r\n```\r\n\r\n`broadcast`가 `namespace`이면 같은 Webspace 실시간 네임스페이스에 연결된 클라이언트가 결과 이벤트를 함께 받습니다. `actor`이면 행동한 회원에게만 결과를 보냅니다.\r\n\r\n## 레이드 대상 만들기\r\n\r\n관리자 권한으로 `game_resources/create`를 호출해 몬스터를 만듭니다.\r\n\r\n```json\r\n{\r\n  \"code\": \"RAID-1\",\r\n  \"kind\": \"monster\",\r\n  \"status\": \"active\",\r\n  \"current_value\": 10000,\r\n  \"max_value\": 10000,\r\n  \"version\": 0,\r\n  \"reward_item_code\": \"monster-core\"\r\n}\r\n```\r\n\r\n화면을 열 때 `game_resources` 조회 API에서 현재 체력과 버전을 읽습니다. 새로 연결하거나 연결이 복구된 뒤에도 REST API를 다시 조회하면 현재 서버 상태를 기준으로 화면을 맞출 수 있습니다.\r\n\r\n## WebSocket으로 공격 보내기\r\n\r\n로그인한 회원이 실시간 연결을 구독한 뒤 `resource-game.act` 이벤트를 보냅니다.\r\n\r\n```json\r\n{\r\n  \"type\": \"webspace:send\",\r\n  \"data\": {\r\n    \"dbName\": \"monster_raid_team_a\",\r\n    \"event\": \"resource-game.act\",\r\n    \"payload\": {\r\n      \"actionId\": \"attack-00000001\",\r\n      \"resourceCode\": \"RAID-1\",\r\n      \"amount\": 1\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n`dbName`에는 배포할 때 지정한 `데이터베이스 식별자`를 사용합니다.\r\n\r\n`actionId`는 영문, 숫자, `_`, `-`를 조합한 8~80자 값으로 만듭니다. `amount`를 생략하면 1이며, 값을 보낼 때는 처리기의 `maxClientAmount` 범위 안의 정수를 사용합니다.\r\n\r\n서버는 처리가 끝난 뒤 `resource-game.action-applied`를 보냅니다.\r\n\r\n```json\r\n{\r\n  \"actionId\": \"attack-00000001\",\r\n  \"resourceId\": 1,\r\n  \"currentValue\": 9999,\r\n  \"version\": 1,\r\n  \"rewardQuantity\": 1,\r\n  \"duplicate\": false\r\n}\r\n```\r\n\r\n화면은 이 결과를 받은 뒤에만 체력을 바꿉니다. 클라이언트가 `resource-game.action-applied`를 직접 보내는 요청은 거부됩니다.\r\n\r\n## 체력과 보상 표시하기\r\n\r\n1. `resourceId`가 현재 보고 있는 몬스터인지 확인합니다.\r\n2. 이전 결과보다 큰 `version`인지 확인합니다.\r\n3. `currentValue`로 체력 표시를 갱신합니다.\r\n4. `currentValue`가 0이면 공동 처치 완료 상태를 표시합니다.\r\n5. 개인 아이템은 `game_inventory/list`에서 다시 조회합니다.\r\n\r\n`game_inventory`에는 회원 본인 데이터만 읽을 수 있는 소유자 권한을 적용합니다. 결과 이벤트의 `rewardQuantity`만으로 다른 회원의 보유량을 추정하지 않습니다.\r\n\r\n## 알아두기\r\n\r\n- 공격력과 보상은 클라이언트 값이 아니라 서버의 처리기 설정으로 결정됩니다.\r\n- 자원 변경, 행동 기록과 보상 적립은 하나의 트랜잭션으로 처리됩니다.\r\n- 현재 공통 구조는 행동별 보상을 제공합니다. 처치 순위나 처치자 전용 보상은 별도로 설계해야 합니다.\r\n- 응답이 늦어도 성공으로 간주하지 않습니다. 같은 `actionId`로 재확인하면 중복 적용을 막을 수 있습니다.\r\n\r\n## 관련 문서\r\n\r\n- [실시간 오목 게임 만들기](./20.realtime-gomoku.md)\r\n- [API 빌드 및 데이터베이스 배포하기](../24.api-overview.md)\r\n- [성능과 확장](../48.performance.md)\n",1791199143730]