[{"data":1,"prerenderedAt":1646},["ShallowReactive",2],{"doc:\u002Fstack":3},{"id":4,"title":5,"body":6,"description":1638,"extension":1639,"meta":1640,"navigation":1641,"path":1642,"seo":1643,"stem":1644,"__hash__":1645},"docs\u002FSTACK.md","기술 스택 — 맑은 메시징",{"type":7,"value":8,"toc":1613},"minimark",[9,13,29,46,49,54,64,66,72,75,322,338,340,346,353,356,376,378,384,387,575,585,587,591,715,721,723,727,813,815,819,915,917,921,1002,1009,1011,1015,1020,1071,1075,1131,1135,1181,1185,1242,1246,1291,1293,1297,1300,1424,1429,1431,1435,1537,1539,1543],[10,11,5],"h1",{"id":12},"기술-스택-맑은-메시징",[14,15,16,17,21,22,21,25,28],"p",{},"3개 레포(",[18,19,20],"code",{},"malgn-noti"," \u002F ",[18,23,24],{},"malgn-noti-admin",[18,26,27],{},"malgn-noti-api",")와 외부 의존을 한 번에 정리한 문서입니다.",[30,31,32],"blockquote",{},[14,33,34,35,40,41,45],{},"큰 그림은 ",[36,37,39],"a",{"href":38},"..\u002FCLAUDE","CLAUDE.md",", 프론트엔드 코딩 컨벤션은 ",[36,42,44],{"href":43},".\u002FFRONTEND","FRONTEND.md","를 참조.",[47,48],"hr",{},[50,51,53],"h2",{"id":52},"_1-전체-토폴로지","1. 전체 토폴로지",[55,56,61],"pre",{"className":57,"code":59,"language":60},[58],"language-text","사용자(고객사)             내부 운영자\n       │                       │\n       ▼                       ▼\n┌─────────────────┐    ┌──────────────────────┐\n│ malgn-noti      │    │ malgn-noti-admin     │       Cloudflare Pages\n│ (Nuxt 3, SSR)   │    │ (Nuxt 3, SSR)        │       (.pages.dev)\n└────────┬────────┘    └──────────┬───────────┘\n         │                        │\n         │     공개 API + 어드민 API│\n         └───────────┬────────────┘\n                     ▼\n            ┌─────────────────────┐\n            │ malgn-noti-api      │       Cloudflare Workers\n            │ (Hono, TS)          │       (.workers.dev)\n            └─────────┬───────────┘\n                      │\n       ┌──────────────┼──────────────────┐\n       ▼              ▼                  ▼\n┌─────────────┐ ┌─────────────┐  ┌────────────────────┐\n│ Hyperdrive  │ │ R2 \u002F KV \u002F   │  │ NHN Notification    │\n│ (MySQL)     │ │ Queues      │  │ Hub                 │\n└──────┬──────┘ └─────────────┘  └─────────────────────┘\n       ▼\n┌─────────────────┐\n│ AWS Aurora MySQL│\n└─────────────────┘\n","text",[18,62,59],{"__ignoreMap":63},"",[47,65],{},[50,67,69,70],{"id":68},"_2-사용자단-malgn-noti","2. 사용자단 — ",[18,71,20],{},[14,73,74],{},"고객(테넌트) 사용자가 사용하는 콘솔.",[76,77,78,97],"table",{},[79,80,81],"thead",{},[82,83,84,88,91,94],"tr",{},[85,86,87],"th",{},"항목",[85,89,90],{},"선택",[85,92,93],{},"버전",[85,95,96],{},"역할",[98,99,100,122,138,157,173,193,209,225,255,271,287,306],"tbody",{},[82,101,102,106,112,119],{},[103,104,105],"td",{},"프레임워크",[103,107,108],{},[109,110,111],"strong",{},"Nuxt",[103,113,114,115,118],{},"3.21.5 (",[18,116,117],{},"future.compatibilityVersion: 4",")",[103,120,121],{},"SSR + 라우팅 + 자동 import",[82,123,124,127,132,135],{},[103,125,126],{},"언어",[103,128,129],{},[109,130,131],{},"TypeScript",[103,133,134],{},"5.9 (strict)",[103,136,137],{},"타입 안전성",[82,139,140,143,148,151],{},[103,141,142],{},"뷰 라이브러리",[103,144,145],{},[109,146,147],{},"Vue",[103,149,150],{},"3.5",[103,152,153,154,118],{},"UI 렌더 (",[18,155,156],{},"\u003Cscript setup>",[82,158,159,162,167,170],{},[103,160,161],{},"UI 컴포넌트",[103,163,164],{},[109,165,166],{},"Nuxt UI v3 (MIT)",[103,168,169],{},"3.3.7",[103,171,172],{},"폼\u002F모달\u002F테이블\u002F메뉴 — Reka UI + Tailwind",[82,174,175,178,183,186],{},[103,176,177],{},"스타일",[103,179,180],{},[109,181,182],{},"Tailwind CSS",[103,184,185],{},"v4 (Nuxt UI 통합)",[103,187,188,189,192],{},"유틸리티 + ",[18,190,191],{},"@theme","로 테마 토큰",[82,194,195,198,203,206],{},[103,196,197],{},"상태 관리",[103,199,200],{},[109,201,202],{},"Pinia",[103,204,205],{},"2.3",[103,207,208],{},"인증\u002F사용자\u002F크레딧",[82,210,211,214,219,222],{},[103,212,213],{},"검증",[103,215,216],{},[109,217,218],{},"Zod",[103,220,221],{},"3.25",[103,223,224],{},"폼\u002F응답",[82,226,227,230,235,247],{},[103,228,229],{},"아이콘",[103,231,232],{},[109,233,234],{},"Iconify",[103,236,237,240,241,240,244],{},[18,238,239],{},"lucide",", ",[18,242,243],{},"heroicons",[18,245,246],{},"bi",[103,248,249,250,252,253],{},"채널 카드는 ",[18,251,246],{},", 일반은 ",[18,254,239],{},[82,256,257,260,265,268],{},[103,258,259],{},"차트",[103,261,262],{},[109,263,264],{},"Chart.js",[103,266,267],{},"4.x (예정)",[103,269,270],{},"통계 페이지",[82,272,273,276,281,284],{},[103,274,275],{},"폰트",[103,277,278],{},[109,279,280],{},"Inter · JetBrains Mono · Pretendard",[103,282,283],{},"Google Fonts \u002F CDN",[103,285,286],{},"UI=Inter, 숫자\u002FID=JetBrains Mono, 한국어 fallback=Pretendard (2026-05-18 디자인 피벗)",[82,288,289,292,297,303],{},[103,290,291],{},"린트",[103,293,294],{},[109,295,296],{},"ESLint",[103,298,299,300],{},"9.x + ",[18,301,302],{},"@nuxt\u002Feslint",[103,304,305],{},"Nuxt 권장 룰",[82,307,308,311,316,319],{},[103,309,310],{},"패키지 매니저",[103,312,313],{},[109,314,315],{},"pnpm",[103,317,318],{},"10.25.0",[103,320,321],{},"빠른 설치 + 워크스페이스 가능",[14,323,324,325,328,329,332,333],{},"배포 대상: ",[109,326,327],{},"Cloudflare Pages"," (",[18,330,331],{},"nitro.preset: 'cloudflare-pages'","). production: ",[36,334,335],{"href":335,"rel":336},"https:\u002F\u002Fmalgn-noti.pages.dev",[337],"nofollow",[47,339],{},[50,341,343,344],{"id":342},"_3-운영자단-malgn-noti-admin","3. 운영자단 — ",[18,345,24],{},[14,347,348,349,352],{},"사용자단과 ",[109,350,351],{},"완전히 동일한 스택",". 컴포넌트\u002F도메인 타입 공유 전제.",[14,354,355],{},"차이점만:",[357,358,359,367,370,373],"ul",{},[360,361,362,363],"li",{},"배포 위치: ",[36,364,365],{"href":365,"rel":366},"https:\u002F\u002Fmalgn-noti-admin.pages.dev",[337],[360,368,369],{},"접근 제어: 사내망\u002FCloudflare Access (예정)",[360,371,372],{},"인증: 어드민 전용 JWT + 2FA 강제 (예정)",[360,374,375],{},"추가 라이브러리(예정): 차트, CSV 내보내기 헬퍼",[47,377],{},[50,379,381,382],{"id":380},"_4-백엔드-malgn-noti-api","4. 백엔드 — ",[18,383,27],{},[14,385,386],{},"NHN\u002FPG\u002FAI를 직접 호출하는 유일한 컴포넌트.",[76,388,389,401],{},[79,390,391],{},[82,392,393,395,397,399],{},[85,394,87],{},[85,396,90],{},[85,398,93],{},[85,400,96],{},[98,402,403,419,438,453,468,481,500,514,527,543,562],{},[82,404,405,408,413,416],{},[103,406,407],{},"런타임",[103,409,410],{},[109,411,412],{},"Cloudflare Workers",[103,414,415],{},"(V8 isolates)",[103,417,418],{},"edge 런타임",[82,420,421,424,429,432],{},[103,422,423],{},"호환 모드",[103,425,426],{},[18,427,428],{},"nodejs_compat",[103,430,431],{},"—",[103,433,434,437],{},[18,435,436],{},"mysql2"," 등 Node API",[82,439,440,443,448,450],{},[103,441,442],{},"호환 날짜",[103,444,445],{},[18,446,447],{},"2025-01-01",[103,449,431],{},[103,451,452],{},"Workers 동작 기준",[82,454,455,457,462,465],{},[103,456,105],{},[103,458,459],{},[109,460,461],{},"Hono",[103,463,464],{},"4.12",[103,466,467],{},"라우터\u002F미들웨어",[82,469,470,472,476,479],{},[103,471,126],{},[103,473,474],{},[109,475,131],{},[103,477,478],{},"5.x (strict)",[103,480,137],{},[82,482,483,486,494,497],{},[103,484,485],{},"ORM",[103,487,488,328,491,118],{},[109,489,490],{},"Drizzle ORM",[18,492,493],{},"drizzle-orm\u002Fmysql2",[103,495,496],{},"예정",[103,498,499],{},"타입 안전 쿼리 + 마이그레이션",[82,501,502,505,509,511],{},[103,503,504],{},"DB 드라이버",[103,506,507],{},[109,508,436],{},[103,510,496],{},[103,512,513],{},"MySQL wire 프로토콜",[82,515,516,518,522,524],{},[103,517,213],{},[103,519,520],{},[109,521,218],{},[103,523,496],{},[103,525,526],{},"요청\u002F응답 스키마",[82,528,529,532,537,540],{},[103,530,531],{},"타입 정의",[103,533,534],{},[109,535,536],{},"@cloudflare\u002Fworkers-types",[103,538,539],{},"4.20260511",[103,541,542],{},"Workers 환경 타입",[82,544,545,548,553,556],{},[103,546,547],{},"빌드\u002F배포",[103,549,550],{},[109,551,552],{},"Wrangler",[103,554,555],{},"4.90.0",[103,557,558,561],{},[18,559,560],{},"wrangler deploy",", secrets, hyperdrive",[82,563,564,567,570,572],{},[103,565,566],{},"OpenAPI (검토)",[103,568,569],{},"hono-openapi \u002F zod-openapi",[103,571,431],{},[103,573,574],{},"자동 스펙",[14,576,577,578,580,581],{},"배포: ",[109,579,412],{},". 엔드포인트: ",[36,582,583],{"href":583,"rel":584},"https:\u002F\u002Fmalgn-noti-api.malgnsoft.workers.dev",[337],[47,586],{},[50,588,590],{"id":589},"_5-데이터-스토리지-큐","5. 데이터 \u002F 스토리지 \u002F 큐",[76,592,593,608],{},[79,594,595],{},[82,596,597,600,602,605],{},[85,598,599],{},"종류",[85,601,90],{},[85,603,604],{},"위치",[85,606,607],{},"용도",[98,609,610,626,642,658,673,688,703],{},[82,611,612,615,620,623],{},[103,613,614],{},"트랜잭션 DB",[103,616,617],{},[109,618,619],{},"AWS Aurora MySQL 8.0",[103,621,622],{},"AWS",[103,624,625],{},"테넌트, 사용자, 발송 메타, 크레딧 원장, 캠페인, 템플릿",[82,627,628,631,636,639],{},[103,629,630],{},"DB 연결",[103,632,633],{},[109,634,635],{},"Cloudflare Hyperdrive (MySQL)",[103,637,638],{},"Cloudflare → AWS",[103,640,641],{},"풀링 + 캐시 + 자격증명 보관",[82,643,644,647,652,655],{},[103,645,646],{},"객체 스토리지",[103,648,649],{},[109,650,651],{},"Cloudflare R2",[103,653,654],{},"Cloudflare",[103,656,657],{},"MMS 첨부, Excel 업로드, Export 결과",[82,659,660,663,668,670],{},[103,661,662],{},"KV",[103,664,665],{},[109,666,667],{},"Cloudflare KV",[103,669,654],{},[103,671,672],{},"세션, 짧은 캐시",[82,674,675,678,683,685],{},[103,676,677],{},"큐",[103,679,680],{},[109,681,682],{},"Cloudflare Queues",[103,684,654],{},[103,686,687],{},"발송 큐 \u002F 재시도 큐 \u002F Export 잡 \u002F 캠페인 fan-out",[82,689,690,693,698,700],{},[103,691,692],{},"Cron",[103,694,695],{},[109,696,697],{},"Workers Crons",[103,699,654],{},[103,701,702],{},"캠페인 스케줄러, 정리 잡, FCM\u002FAPNs 만료 알림",[82,704,705,708,710,712],{},[103,706,707],{},"Durable Objects (검토)",[103,709,431],{},[103,711,654],{},[103,713,714],{},"테넌트별 rate limit, 캠페인 실행 단위",[14,716,717,720],{},[109,718,719],{},"Aurora 노출",": 퍼블릭 엔드포인트 + SG로 Hyperdrive egress IP 화이트리스트(개발 단계). TLS 강제, 앱 전용 최소권한 계정. 운영 단계에서 RDS Proxy \u002F Cloudflare Tunnel 검토.",[47,722],{},[50,724,726],{"id":725},"_6-외부-서비스","6. 외부 서비스",[76,728,729,744],{},[79,730,731],{},[82,732,733,736,738,741],{},[85,734,735],{},"서비스",[85,737,607],{},[85,739,740],{},"통합 방식",[85,742,743],{},"상태",[98,745,746,762,779,795],{},[82,747,748,753,756,759],{},[103,749,750],{},[109,751,752],{},"NHN Cloud Notification Hub",[103,754,755],{},"SMS\u002FRCS\u002F알림톡\u002F이메일\u002FPush 실 발송",[103,757,758],{},"api 서버의 채널 어댑터에서 HTTP 호출",[103,760,761],{},"통합 예정",[82,763,764,770,773,776],{},[103,765,766,769],{},[109,767,768],{},"결제 PG"," (토스\u002F포트원\u002F나이스 중 미정)",[103,771,772],{},"크레딧 충전 결제",[103,774,775],{},"api 서버 어댑터 + 웹훅",[103,777,778],{},"미정",[82,780,781,787,790,793],{},[103,782,783,786],{},[109,784,785],{},"LLM 제공자"," (Anthropic\u002FOpenAI 중 미정)",[103,788,789],{},"AI 템플릿 생성",[103,791,792],{},"api 서버 게이트웨이 (비용 통제)",[103,794,778],{},[82,796,797,801,804,810],{},[103,798,799],{},[109,800,283],{},[103,802,803],{},"Inter · JetBrains Mono · Pretendard · Instrument Serif 로드",[103,805,806,807],{},"프론트 ",[18,808,809],{},"\u003Clink>",[103,811,812],{},"적용",[47,814],{},[50,816,818],{"id":817},"_7-개발운영-도구","7. 개발·운영 도구",[76,820,821,832],{},[79,822,823],{},[82,824,825,828,830],{},[85,826,827],{},"도구",[85,829,93],{},[85,831,607],{},[98,833,834,845,853,862,875,885,895,905],{},[82,835,836,839,842],{},[103,837,838],{},"Node.js",[103,840,841],{},"24.11.1",[103,843,844],{},"로컬 런타임",[82,846,847,849,851],{},[103,848,315],{},[103,850,318],{},[103,852,310],{},[82,854,855,857,859],{},[103,856,552],{},[103,858,555],{},[103,860,861],{},"Cloudflare CLI (deploy, secret, hyperdrive, tail)",[82,863,864,867,869],{},[103,865,866],{},"Git \u002F GitHub",[103,868,431],{},[103,870,871,872,118],{},"버전 관리, 원격 저장소(",[18,873,874],{},"malgnsoft\u002F*",[82,876,877,879,882],{},[103,878,296],{},[103,880,881],{},"9.x",[103,883,884],{},"정적 분석",[82,886,887,890,892],{},[103,888,889],{},"Vitest",[103,891,496],{},[103,893,894],{},"단위\u002F통합 테스트",[82,896,897,900,902],{},[103,898,899],{},"Miniflare",[103,901,496],{},[103,903,904],{},"Workers 로컬 시뮬레이션",[82,906,907,910,912],{},[103,908,909],{},"drizzle-kit",[103,911,496],{},[103,913,914],{},"마이그레이션 생성\u002F적용",[47,916],{},[50,918,920],{"id":919},"_8-배포-호스팅","8. 배포 \u002F 호스팅",[76,922,923,939],{},[79,924,925],{},[82,926,927,930,933,936],{},[85,928,929],{},"프로젝트",[85,931,932],{},"호스팅",[85,934,935],{},"트리거",[85,937,938],{},"URL",[98,940,941,958,973,988],{},[82,942,943,945,947,953],{},[103,944,20],{},[103,946,327],{},[103,948,949,952],{},[18,950,951],{},"wrangler pages deploy"," (CLI)",[103,954,955],{},[36,956,335],{"href":335,"rel":957},[337],[82,959,960,962,964,968],{},[103,961,24],{},[103,963,327],{},[103,965,966,952],{},[18,967,951],{},[103,969,970],{},[36,971,365],{"href":365,"rel":972},[337],[82,974,975,977,979,983],{},[103,976,27],{},[103,978,412],{},[103,980,981,952],{},[18,982,560],{},[103,984,985],{},[36,986,583],{"href":583,"rel":987},[337],[82,989,990,993,996,999],{},[103,991,992],{},"AWS Aurora",[103,994,995],{},"AWS RDS",[103,997,998],{},"(수동\u002FIaC 예정)",[103,1000,1001],{},"(VPC 내부 + 퍼블릭 엔드포인트)",[14,1003,1004,1005,1008],{},"배포는 현 단계에서 ",[109,1006,1007],{},"wrangler CLI 직접 배포",". GitHub Actions 자동화는 추후 옵션.",[47,1010],{},[50,1012,1014],{"id":1013},"_9-핵심-선택-이유-대안-비교","9. 핵심 선택 이유 \u002F 대안 비교",[1016,1017,1019],"h3",{"id":1018},"nuxt-3-vs-다른-프레임워크","Nuxt 3 vs. 다른 프레임워크",[76,1021,1022,1035],{},[79,1023,1024],{},[82,1025,1026,1029,1032],{},[85,1027,1028],{},"후보",[85,1030,1031],{},"선택 여부",[85,1033,1034],{},"메모",[98,1036,1037,1050,1061],{},[82,1038,1039,1044,1047],{},[103,1040,1041],{},[109,1042,1043],{},"Nuxt 3",[103,1045,1046],{},"✅",[103,1048,1049],{},"Vue 생태계 + Nuxt UI 공식 통합 + SSR\u002FSSG\u002FCSR 자유",[82,1051,1052,1055,1058],{},[103,1053,1054],{},"Next.js",[103,1056,1057],{},"❌",[103,1059,1060],{},"React 기반. 사용자 선호 Vue.",[82,1062,1063,1066,1068],{},[103,1064,1065],{},"Vite + Vue Router",[103,1067,1057],{},[103,1069,1070],{},"SSR\u002Fauto-import 직접 구축 부담",[1016,1072,1074],{"id":1073},"nuxt-ui-vs-다른-ui-라이브러리","Nuxt UI vs. 다른 UI 라이브러리",[76,1076,1077,1087],{},[79,1078,1079],{},[82,1080,1081,1083,1085],{},[85,1082,1028],{},[85,1084,1031],{},[85,1086,1034],{},[98,1088,1089,1100,1111,1121],{},[82,1090,1091,1095,1097],{},[103,1092,1093],{},[109,1094,166],{},[103,1096,1046],{},[103,1098,1099],{},"Nuxt 공식 + Tailwind v4 통합 + 263 페이지에 필요한 컴포넌트 풀세트",[82,1101,1102,1105,1108],{},[103,1103,1104],{},"Nuxt UI Pro",[103,1106,1107],{},"❌ (검토 보류)",[103,1109,1110],{},"Dashboard 레이아웃 등 유료. MVP 후 재검토.",[82,1112,1113,1116,1118],{},[103,1114,1115],{},"Naive UI \u002F Element Plus",[103,1117,1057],{},[103,1119,1120],{},"자체 디자인 시스템, Tailwind와 분리 — 통합 비용",[82,1122,1123,1126,1128],{},[103,1124,1125],{},"shadcn-vue",[103,1127,1057],{},[103,1129,1130],{},"컴포넌트 일일 복사. 빠른 263 페이지엔 부담.",[1016,1132,1134],{"id":1133},"cloudflare-vs-aws-only","Cloudflare vs. AWS-only",[76,1136,1137,1147],{},[79,1138,1139],{},[82,1140,1141,1143,1145],{},[85,1142,1028],{},[85,1144,1031],{},[85,1146,1034],{},[98,1148,1149,1161,1171],{},[82,1150,1151,1156,1158],{},[103,1152,1153],{},[109,1154,1155],{},"Cloudflare(Workers\u002FPages\u002FR2\u002FKV\u002FQueues) + AWS(Aurora)",[103,1157,1046],{},[103,1159,1160],{},"edge 글로벌 + 비용 효율, Aurora만 AWS 의존",[82,1162,1163,1166,1168],{},[103,1164,1165],{},"AWS-only (Lambda + RDS + S3 + SQS)",[103,1167,1057],{},[103,1169,1170],{},"글로벌 분산\u002F콜드스타트\u002F비용 면에서 Cloudflare가 우세",[82,1172,1173,1176,1178],{},[103,1174,1175],{},"Vercel + PlanetScale",[103,1177,1057],{},[103,1179,1180],{},"PlanetScale 무료 티어 종료, MySQL 호환성 트레이드오프",[1016,1182,1184],{"id":1183},"aurora-mysql-via-hyperdrive","Aurora MySQL via Hyperdrive",[76,1186,1187,1197],{},[79,1188,1189],{},[82,1190,1191,1193,1195],{},[85,1192,1028],{},[85,1194,1031],{},[85,1196,1034],{},[98,1198,1199,1211,1221,1231],{},[82,1200,1201,1206,1208],{},[103,1202,1203],{},[109,1204,1205],{},"Hyperdrive (MySQL) + mysql2",[103,1207,1046],{},[103,1209,1210],{},"TCP 풀링 + 캐시, 자격증명 분리, 코드 단순",[82,1212,1213,1216,1218],{},[103,1214,1215],{},"RDS Data API (HTTP)",[103,1217,1057],{},[103,1219,1220],{},"Serverless v2만, MySQL Data API 제약",[82,1222,1223,1226,1228],{},[103,1224,1225],{},"Cloudflare D1 (SQLite)",[103,1227,1057],{},[103,1229,1230],{},"대량 이력\u002F원장에 부담, 멀티 리전 제약",[82,1232,1233,1236,1239],{},[103,1234,1235],{},"자체 RDS Proxy",[103,1237,1238],{},"(이전)",[103,1240,1241],{},"Hyperdrive와 이중 풀링 충돌 가능. 운영 단계 재검토.",[1016,1243,1245],{"id":1244},"hono-vs-itty-router-직접-작성","Hono vs. Itty Router \u002F 직접 작성",[76,1247,1248,1258],{},[79,1249,1250],{},[82,1251,1252,1254,1256],{},[85,1253,1028],{},[85,1255,1031],{},[85,1257,1034],{},[98,1259,1260,1271,1281],{},[82,1261,1262,1266,1268],{},[103,1263,1264],{},[109,1265,461],{},[103,1267,1046],{},[103,1269,1270],{},"Workers에 최적화, 미들웨어 풍부, TS 친화",[82,1272,1273,1276,1278],{},[103,1274,1275],{},"Itty Router",[103,1277,1057],{},[103,1279,1280],{},"더 가볍지만 미들웨어 빈약",[82,1282,1283,1286,1288],{},[103,1284,1285],{},"직접 작성",[103,1287,1057],{},[103,1289,1290],{},"라우팅·검증·CORS·에러 처리 다시 만들 이유 없음",[47,1292],{},[50,1294,1296],{"id":1295},"_10-버전-호환-표","10. 버전 호환 표",[14,1298,1299],{},"각 도구의 메이저 버전이 맞물려 동작합니다.",[76,1301,1302,1311],{},[79,1303,1304],{},[82,1305,1306,1309],{},[85,1307,1308],{},"묶음",[85,1310,93],{},[98,1312,1313,1322,1331,1341,1350,1359,1370,1379,1388,1397,1406,1415],{},[82,1314,1315,1317],{},[103,1316,838],{},[103,1318,1319],{},[109,1320,1321],{},"24.x",[82,1323,1324,1326],{},[103,1325,315],{},[103,1327,1328],{},[109,1329,1330],{},"10.x",[82,1332,1333,1335],{},[103,1334,111],{},[103,1336,1337,1340],{},[109,1338,1339],{},"3.21.x"," (compat v4 모드)",[82,1342,1343,1345],{},[103,1344,147],{},[103,1346,1347],{},[109,1348,1349],{},"3.5.x",[82,1351,1352,1354],{},[103,1353,131],{},[103,1355,1356],{},[109,1357,1358],{},"5.9.x",[82,1360,1361,1364],{},[103,1362,1363],{},"Nuxt UI",[103,1365,1366,1369],{},[109,1367,1368],{},"3.3.x"," (Reka UI + Tailwind v4)",[82,1371,1372,1374],{},[103,1373,182],{},[103,1375,1376],{},[109,1377,1378],{},"v4",[82,1380,1381,1383],{},[103,1382,202],{},[103,1384,1385],{},[109,1386,1387],{},"2.3.x",[82,1389,1390,1392],{},[103,1391,461],{},[103,1393,1394],{},[109,1395,1396],{},"4.12.x",[82,1398,1399,1401],{},[103,1400,552],{},[103,1402,1403],{},[109,1404,1405],{},"4.90.x",[82,1407,1408,1411],{},[103,1409,1410],{},"Cloudflare Workers compatibility_date",[103,1412,1413],{},[109,1414,447],{},[82,1416,1417,1420],{},[103,1418,1419],{},"Cloudflare Workers compatibility_flags",[103,1421,1422],{},[18,1423,428],{},[30,1425,1426],{},[14,1427,1428],{},"의존성 업데이트 시 Nuxt ↔ Nuxt UI ↔ Tailwind는 같이 올려야 합니다 (서로 강한 결합).",[47,1430],{},[50,1432,1434],{"id":1433},"_11-미정-결정-대기","11. 미정 \u002F 결정 대기",[76,1436,1437,1449],{},[79,1438,1439],{},[82,1440,1441,1443,1446],{},[85,1442,87],{},[85,1444,1445],{},"선택지",[85,1447,1448],{},"결정 시점",[98,1450,1451,1461,1472,1483,1494,1504,1515,1526],{},[82,1452,1453,1455,1458],{},[103,1454,768],{},[103,1456,1457],{},"토스 \u002F 포트원 \u002F 나이스",[103,1459,1460],{},"api 결제 모듈 작업 시",[82,1462,1463,1466,1469],{},[103,1464,1465],{},"AI 제공자",[103,1467,1468],{},"Anthropic \u002F OpenAI \u002F 자체",[103,1470,1471],{},"AI 템플릿 모듈 작업 시",[82,1473,1474,1477,1480],{},[103,1475,1476],{},"Aurora 토폴로지",[103,1478,1479],{},"Provisioned vs. Serverless v2, Multi-AZ, R\u002FW 분리",[103,1481,1482],{},"운영 환경 준비 시",[82,1484,1485,1488,1491],{},[103,1486,1487],{},"Aurora SG 갱신 절차",[103,1489,1490],{},"IaC(Terraform\u002FSAM) vs. 수동",[103,1492,1493],{},"운영 진입 전",[82,1495,1496,1498,1501],{},[103,1497,646],{},[103,1499,1500],{},"R2 단독 vs. S3 병행",[103,1502,1503],{},"Aurora 리전 확정 후",[82,1505,1506,1509,1512],{},[103,1507,1508],{},"다국어 지원",[103,1510,1511],{},"한국어 우선 → 영어 추가 시점",[103,1513,1514],{},"글로벌 확장 결정 시",[82,1516,1517,1520,1523],{},[103,1518,1519],{},"Nuxt UI Pro 도입",[103,1521,1522],{},"무료 → Pro 전환 여부",[103,1524,1525],{},"MVP 후 재검토",[82,1527,1528,1531,1534],{},[103,1529,1530],{},"GitHub Actions 자동 배포",[103,1532,1533],{},"도입 시점",[103,1535,1536],{},"CI 정책 결정 후",[47,1538],{},[50,1540,1542],{"id":1541},"_12-참고","12. 참고",[357,1544,1545,1552,1558,1565,1572,1579,1586,1593,1600,1606],{},[360,1546,1547],{},[36,1548,1551],{"href":1549,"rel":1550},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fworkers\u002F",[337],"Cloudflare Workers docs",[360,1553,1554],{},[36,1555,635],{"href":1556,"rel":1557},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fhyperdrive\u002F",[337],[360,1559,1560],{},[36,1561,1564],{"href":1562,"rel":1563},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fpages\u002F",[337],"Cloudflare Pages docs",[360,1566,1567],{},[36,1568,1571],{"href":1569,"rel":1570},"https:\u002F\u002Fhono.dev\u002F",[337],"Hono docs",[360,1573,1574],{},[36,1575,1578],{"href":1576,"rel":1577},"https:\u002F\u002Fnuxt.com\u002Fdocs",[337],"Nuxt 3 docs",[360,1580,1581],{},[36,1582,1585],{"href":1583,"rel":1584},"https:\u002F\u002Fui.nuxt.com\u002F",[337],"Nuxt UI v3",[360,1587,1588],{},[36,1589,1592],{"href":1590,"rel":1591},"https:\u002F\u002Ftailwindcss.com\u002F",[337],"Tailwind CSS v4",[360,1594,1595],{},[36,1596,1599],{"href":1597,"rel":1598},"https:\u002F\u002Form.drizzle.team\u002Fdocs\u002Fget-started-mysql",[337],"Drizzle ORM (MySQL)",[360,1601,1602],{},[36,1603,752],{"href":1604,"rel":1605},"https:\u002F\u002Fdocs.nhncloud.com\u002Fko\u002FNotification\u002FNotification%20Hub\u002Fko\u002Foverview\u002F",[337],[360,1607,1608],{},[36,1609,1612],{"href":1610,"rel":1611},"https:\u002F\u002Fdocs.aws.amazon.com\u002FAmazonRDS\u002Flatest\u002FAuroraUserGuide\u002FAurora.AuroraMySQL.html",[337],"AWS Aurora MySQL",{"title":63,"searchDepth":1614,"depth":1614,"links":1615},3,[1616,1618,1620,1622,1624,1625,1626,1627,1628,1635,1636,1637],{"id":52,"depth":1617,"text":53},2,{"id":68,"depth":1617,"text":1619},"2. 사용자단 — malgn-noti",{"id":342,"depth":1617,"text":1621},"3. 운영자단 — malgn-noti-admin",{"id":380,"depth":1617,"text":1623},"4. 백엔드 — malgn-noti-api",{"id":589,"depth":1617,"text":590},{"id":725,"depth":1617,"text":726},{"id":817,"depth":1617,"text":818},{"id":919,"depth":1617,"text":920},{"id":1013,"depth":1617,"text":1014,"children":1629},[1630,1631,1632,1633,1634],{"id":1018,"depth":1614,"text":1019},{"id":1073,"depth":1614,"text":1074},{"id":1133,"depth":1614,"text":1134},{"id":1183,"depth":1614,"text":1184},{"id":1244,"depth":1614,"text":1245},{"id":1295,"depth":1617,"text":1296},{"id":1433,"depth":1617,"text":1434},{"id":1541,"depth":1617,"text":1542},"3개 레포(malgn-noti \u002F malgn-noti-admin \u002F malgn-noti-api)와 외부 의존을 한 번에 정리한 문서입니다.","md",{},true,"\u002Fstack",{"title":5,"description":1638},"STACK","4xbTNG_PL-PbBEyIwP5R9LcmwMixYrftHqP_ArPjGOs",1780638909350]