[{"data":1,"prerenderedAt":447},["ShallowReactive",2],{"doc:\u002Fhistory\u002Fhistory.20260513":3},{"id":4,"title":5,"body":6,"description":42,"extension":440,"meta":441,"navigation":442,"path":443,"seo":444,"stem":445,"__hash__":446},"docs\u002Fhistory\u002Fhistory.20260513.md","2026-05-13 — Smart Placement + 발송 페이지 풍부화",{"type":7,"value":8,"toc":421},"minimark",[9,13,18,22,25,29,36,59,82,86,89,94,120,124,162,166,226,230,250,254,276,279,286,306,313,333,337,340,366,368,372,399,403,417],[10,11,5],"h1",{"id":12},"_2026-05-13-smart-placement-발송-페이지-풍부화",[14,15,17],"h2",{"id":16},"한-줄-요약","한 줄 요약",[19,20,21],"p",{},"API Worker에 Smart Placement를 적용해 Aurora 가까이에서 실행되도록 했고, SMS\u002F알림톡 발송 페이지가 21종 공용 컴포넌트 위에 풍부하게 구현되기 시작했다.",[23,24],"hr",{},[14,26,28],{"id":27},"_1-api-worker-smart-placement","1. API Worker Smart Placement",[19,30,31,35],{},[32,33,34],"code",{},"wrangler.toml","에 추가:",[37,38,43],"pre",{"className":39,"code":40,"language":41,"meta":42,"style":42},"language-toml shiki shiki-themes github-light github-dark","[placement]\nmode = \"smart\"\n","toml","",[32,44,45,53],{"__ignoreMap":42},[46,47,50],"span",{"class":48,"line":49},"line",1,[46,51,52],{},"[placement]\n",[46,54,56],{"class":48,"line":55},2,[46,57,58],{},"mode = \"smart\"\n",[60,61,62,66,69,72],"ul",{},[63,64,65],"li",{},"Cloudflare가 트래픽 패턴(외부 호출 빈도·지연)을 분석해 Worker 실행 위치를 자동 최적화",[63,67,68],{},"Aurora MySQL(AWS) ↔ Hyperdrive 호출이 잦아지면 Aurora 리전에 가까운 데이터센터에서 실행",[63,70,71],{},"학습 기반이라 초기 며칠은 일반 placement, 트래픽 누적 후 최적 위치로 수렴",[63,73,74,77,78,81],{},[32,75,76],{},"wrangler deploy"," 즉시 적용 (Version ",[32,79,80],{},"8583dd1e-f8a2-46b6-8704-944662f97175",")",[14,83,85],{"id":84},"_2-발송-페이지-공용-컴포넌트-21종-추가","2. 발송 페이지 공용 컴포넌트 21종 추가",[19,87,88],{},"SMS\u002F알림톡 발송 페이지를 풍부하게 구현하면서 공용 컴포넌트가 정착.",[90,91,93],"h3",{"id":92},"_21-수신자-영역","2.1 수신자 영역",[60,95,96,102,108,114],{},[63,97,98,101],{},[32,99,100],{},"AppRecipientTable.vue"," — 수신자 행 표시, 다중 선택",[63,103,104,107],{},[32,105,106],{},"AppRecipientFormDialog.vue"," — 수신자 직접 입력 \u002F 수정 다이얼로그",[63,109,110,113],{},[32,111,112],{},"AppRecipientActions.vue"," — 추가\u002F편집\u002F삭제 액션바",[63,115,116,119],{},[32,117,118],{},"AppAddressBookDialog.vue"," — 주소록에서 연락처\u002F그룹 선택 모달",[90,121,123],{"id":122},"_22-발송-폼-영역","2.2 발송 폼 영역",[60,125,126,132,138,144,150,156],{},[63,127,128,131],{},[32,129,130],{},"AppSendFormCard.vue"," — 점진적 disclosure 카드(잠금 표시 포함)",[63,133,134,137],{},[32,135,136],{},"AppSendOptionsCard.vue"," — 발송 시점\u002F대체 문자 등 옵션",[63,139,140,143],{},[32,141,142],{},"AppSendActionsBar.vue"," — 발송\u002F예약\u002F초기화 버튼 묶음",[63,145,146,149],{},[32,147,148],{},"AppSendConfirmDialog.vue"," — 발송 컨펌(수신자 수, 차감 크레딧, 잔여 등)",[63,151,152,155],{},[32,153,154],{},"AppSenderSearchSelect.vue"," — 발신 프로필\u002F번호 검색·선택 콤보",[63,157,158,161],{},[32,159,160],{},"AppDateTimePicker.vue"," — 예약 발송 시각 선택",[90,163,165],{"id":164},"_23-메시지-본문-영역","2.3 메시지 본문 영역",[60,167,168,174,180,186,196,202,208,214,220],{},[63,169,170,173],{},[32,171,172],{},"SmsMessageBody.vue"," — SMS\u002FLMS\u002FMMS 본문 작성",[63,175,176,179],{},[32,177,178],{},"KakaoMessageBody.vue"," — 알림톡 템플릿 코드\u002F강조형\u002F변수",[63,181,182,185],{},[32,183,184],{},"AppChannelMessageCard.vue"," — 채널 공통 메시지 영역 래퍼",[63,187,188,191,192,195],{},[32,189,190],{},"AppTemplateVariableTextarea.vue"," — ",[32,193,194],{},"#{name}"," 같은 변수 토큰 입력",[63,197,198,201],{},[32,199,200],{},"AppTemplatePickerDialog.vue"," — 저장된 템플릿 선택 모달",[63,203,204,207],{},[32,205,206],{},"AppSmsTemplateCard.vue"," — SMS 템플릿 카드",[63,209,210,213],{},[32,211,212],{},"AppAIRewriteDialog.vue"," — AI 템플릿 재작성\u002F생성 모달",[63,215,216,219],{},[32,217,218],{},"AppAdNoticeSms080Dialog.vue"," — 광고 수신 동의\u002F080 안내 모달",[63,221,222,225],{},[32,223,224],{},"AppFileUploader.vue"," — 파일 업로드 공용 컴포넌트",[90,227,229],{"id":228},"_24-미리보기-영역","2.4 미리보기 영역",[60,231,232,238,244],{},[63,233,234,237],{},[32,235,236],{},"AppPhonePreview.vue"," — 휴대폰 모형 미리보기 컨테이너",[63,239,240,243],{},[32,241,242],{},"AppPhonePreviewSmsBubble.vue"," — SMS 말풍선",[63,245,246,249],{},[32,247,248],{},"AppPhonePreviewKakaoBubble.vue"," — 알림톡 말풍선",[14,251,253],{"id":252},"_3-composable-타입-추가","3. composable \u002F 타입 추가",[60,255,256,262],{},[63,257,258,261],{},[32,259,260],{},"composables\u002FuseChannelMeta.ts"," — 채널별 메타(가격·발신정보 형식·disclosure 단계 정의)",[63,263,264,267,268,271,272,275],{},[32,265,266],{},"types\u002Fchannel.ts"," — Channel 타입, ",[32,269,270],{},"isCardUnlocked",", ",[32,273,274],{},"isSubstitutionActive"," 헬퍼",[19,277,278],{},"이 단일 composable이 5채널(SMS\u002FRCS\u002F알림톡\u002F이메일\u002FPUSH) 발송 페이지의 공통 동작(점진적 disclosure·가격 계산·치환 변수 활성 여부)을 한 곳에 모음.",[14,280,282,283,81],{"id":281},"_4-sms-발송-페이지-sendsms","4. SMS 발송 페이지 (",[32,284,285],{},"\u002Fsend\u002Fsms",[60,287,288,294,297,300,303],{},[63,289,290,293],{},[32,291,292],{},"useChannelMeta('sms')"," 기반",[63,295,296],{},"발신 번호 검색 → 잠금 해제 → 수신자 등록 → 메시지 입력 → 발송",[63,298,299],{},"휴대폰 미리보기 실시간 반영",[63,301,302],{},"광고 수신 안내(080) 모달 트리거",[63,304,305],{},"발송 컨펌(수신자 수·차감 크레딧·잔여)",[14,307,309,310,81],{"id":308},"_5-알림톡-발송-페이지-sendkakao","5. 알림톡 발송 페이지 (",[32,311,312],{},"\u002Fsend\u002Fkakao",[60,314,315,320,327,330],{},[63,316,317,293],{},[32,318,319],{},"useChannelMeta('kakao')",[63,321,322,323,326],{},"발신 프로필(",[32,324,325],{},"@위캔디오"," 등) 검색 → 템플릿 선택 → 수신자 → 발송",[63,328,329],{},"카카오 템플릿: 일반\u002F추가 정보형\u002F강조표기형, 버튼 4종(web\u002Fapp\u002Fphone\u002Fmessage), 변수 치환",[63,331,332],{},"휴대폰 미리보기에 알림톡 말풍선 + 버튼 렌더",[14,334,336],{"id":335},"_6-작업-분석-워크플랜-정리","6. 작업 분석 \u002F 워크플랜 정리",[19,338,339],{},"사용자 요청으로 작업 단계를 세분화. 4개 카테고리 → 세부 태스크 + 의존성 + 마일스톤 8개 (M1~M8) 정리.",[60,341,342,345,348,351,354,357,360,363],{},[63,343,344],{},"M1: 데이터 모델링 + 인증 API + 인증 UI 연결",[63,346,347],{},"M2: 주소록\u002F발신정보\u002F템플릿 CRUD",[63,349,350],{},"M3: SMS\u002F알림톡 발송 + 이력 (MVP)",[63,352,353],{},"M4: 충전 + PG 연동 (유료 전환 가능)",[63,355,356],{},"M5: Flow + 캠페인 + 대량 발송",[63,358,359],{},"M6: AI 템플릿 + ExportJob",[63,361,362],{},"M7: 운영자단 전체",[63,364,365],{},"M8: 통계\u002FRBAC\u002FRate Limit\u002FOpenAPI",[23,367],{},[14,369,371],{"id":370},"산출물-당일-추가","산출물 (당일 추가)",[60,373,374,379,382,390,393],{},[63,375,376,378],{},[32,377,34],{}," Smart Placement",[63,380,381],{},"발송 페이지 공용 컴포넌트 21종",[63,383,384,387,388],{},[32,385,386],{},"useChannelMeta"," composable + ",[32,389,266],{},[63,391,392],{},"SMS\u002F알림톡 발송 페이지 풍부 구현",[63,394,395,396,398],{},"API Worker Version ",[32,397,80],{}," 배포",[14,400,402],{"id":401},"다음-단계","다음 단계",[60,404,405,408,411,414],{},[63,406,407],{},"RCS\u002F이메일\u002FPUSH\u002FFlow 발송 페이지 (동일 패턴 재사용)",[63,409,410],{},"발송 조회\u002F통계 페이지",[63,412,413],{},"주소록\u002F발신 정보\u002F템플릿 페이지 풍부 구현",[63,415,416],{},"데이터 모델링 + API 기초 (M1 시작)",[418,419,420],"style",{},"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);}",{"title":42,"searchDepth":422,"depth":422,"links":423},3,[424,425,426,432,433,435,437,438,439],{"id":16,"depth":55,"text":17},{"id":27,"depth":55,"text":28},{"id":84,"depth":55,"text":85,"children":427},[428,429,430,431],{"id":92,"depth":422,"text":93},{"id":122,"depth":422,"text":123},{"id":164,"depth":422,"text":165},{"id":228,"depth":422,"text":229},{"id":252,"depth":55,"text":253},{"id":281,"depth":55,"text":434},"4. SMS 발송 페이지 (\u002Fsend\u002Fsms)",{"id":308,"depth":55,"text":436},"5. 알림톡 발송 페이지 (\u002Fsend\u002Fkakao)",{"id":335,"depth":55,"text":336},{"id":370,"depth":55,"text":371},{"id":401,"depth":55,"text":402},"md",{},true,"\u002Fhistory\u002Fhistory.20260513",{"title":5,"description":42},"history\u002Fhistory.20260513","oxLAGSjjJITIO3HeziCTs-ONDdgNhO6XcRM7Oen_2Ec",1780643216573]