이호영 이호영 2025-04-07
Merge branch 'advc'
@e9a66e7bdfd7d3c94e20f03ba4643f4ed379814b
pom.xml
--- pom.xml
+++ pom.xml
@@ -144,11 +144,12 @@
 			<version>1.1.2</version>
 		</dependency>
 
-		<dependency>
-			<groupId>cglib</groupId>
-			<artifactId>cglib</artifactId>
-			<version>3.1</version>
-		</dependency>
+        <!-- https://mvnrepository.com/artifact/cglib/cglib -->
+        <dependency>
+            <groupId>cglib</groupId>
+            <artifactId>cglib</artifactId>
+            <version>3.3.0</version>
+        </dependency>
 
 		<dependency>
 			<groupId>org.antlr</groupId>
src/main/java/itn/com/cmm/util/DateUtils.java
--- src/main/java/itn/com/cmm/util/DateUtils.java
+++ src/main/java/itn/com/cmm/util/DateUtils.java
@@ -3,6 +3,7 @@
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.Date;
@@ -185,4 +186,20 @@
 
         return isValid;
     }
+    
+    public static String setStrToDataFormatter(String str, String formatter) {
+		
+		// 입력 문자열을 LocalDateTime으로 변환
+		DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+		LocalDateTime dateTime = LocalDateTime.parse(str, inputFormatter);
+		
+		// 원하는 출력 포맷 적용
+		DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(formatter);
+		String formattedDate = dateTime.format(outputFormatter);
+		
+		return formattedDate;
+    } 
+    
+    
+    
 }
src/main/java/itn/com/cmm/util/FileUtil.java
--- src/main/java/itn/com/cmm/util/FileUtil.java
+++ src/main/java/itn/com/cmm/util/FileUtil.java
@@ -25,45 +25,44 @@
  */
 public final class FileUtil {
 	
-    /** 
-     * @methodName	: downLoad 
-     * @author		: 이호영
-     * @date		: 2023.04.06 
-     * @description	: 파일 다운로드 
-     * @param response
-     * @param fileInfo
-     * @param fileName 
-     * @throws Exception 
-     */
-    public static void downLoad(HttpServletResponse response, String fileInfo, String fileNameP) throws Exception {
-
-    
-        try {
-        	String path = fileInfo; // 경로에 접근할 때 역슬래시('\') 사용
-
-        	File file = new File(path);
-        	
-        	String fileName = "";
-        	if(StringUtils.isNotEmpty(fileNameP))
-        		fileName = URLEncoder.encode(fileNameP,"UTF-8").replaceAll("\\+", "%20");
-        	else
-        		fileName = file.getName();
-        	
-        	response.setHeader("Content-Disposition", "attachment;filename=" + fileName); // 다운로드 되거나 로컬에 저장되는 용도로 쓰이는지를 알려주는 헤더
-        	
-        	FileInputStream fileInputStream = new FileInputStream(path); // 파일 읽어오기 
-        	OutputStream out = response.getOutputStream();
-        	
-        	int read = 0;
-            byte[] buffer = new byte[1024];
-            while ((read = fileInputStream.read(buffer)) != -1) { // 1024바이트씩 계속 읽으면서 outputStream에 저장, -1이 나오면 더이상 읽을 파일이 없음
-                out.write(buffer, 0, read);
-            }
-                
-        } catch (Exception e) {
-            throw new Exception("download error");
-        }
+	/** 
+	 * @methodName	: downLoad 
+	 * @author		: 이호영
+	 * @date		: 2023.04.06 
+	 * @description	: 파일 다운로드 
+	 * @param response
+	 * @param fileInfo
+	 * @param fileName 
+	 * @throws Exception 
+	 */
+	public static void downLoad(HttpServletResponse response, String fileInfo, String fileNameP) throws Exception {
+	
+	
+		try {
+			String path = fileInfo; // 경로에 접근할 때 역슬래시('\') 사용
+		
+			File file = new File(path);
+			
+			String fileName = "";
+			if(StringUtils.isNotEmpty(fileNameP))
+				fileName = URLEncoder.encode(fileNameP,"UTF-8").replaceAll("\\+", "%20");
+			else
+				fileName = file.getName();
+			
+			response.setHeader("Content-Disposition", "attachment;filename=" + fileName); // 다운로드 되거나 로컬에 저장되는 용도로 쓰이는지를 알려주는 헤더
+			
+			FileInputStream fileInputStream = new FileInputStream(path); // 파일 읽어오기 
+			OutputStream out = response.getOutputStream();
+			
+			int read = 0;
+			byte[] buffer = new byte[1024];
+			while ((read = fileInputStream.read(buffer)) != -1) { // 1024바이트씩 계속 읽으면서 outputStream에 저장, -1이 나오면 더이상 읽을 파일이 없음
+				out.write(buffer, 0, read);
+			}
+		} catch (Exception e) {
+			throw new Exception("download error");
+		}
 	}
-    
-    
+	
+	
 }
src/main/java/itn/com/cmm/util/MsgSendUtils.java
--- src/main/java/itn/com/cmm/util/MsgSendUtils.java
+++ src/main/java/itn/com/cmm/util/MsgSendUtils.java
@@ -23,6 +23,7 @@
 import itn.com.cmm.OptimalMsgResultDTO;
 import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.event.service.MjonEventVO;
+import itn.let.mjo.mjocommon.MjonCommon;
 import itn.let.mjo.msg.service.MjonMsgVO;
 import itn.let.mjo.msgagent.service.MjonMsgAgentStsVO;
 import itn.let.mjo.spammsg.web.ComGetSpamStringParser;
@@ -55,26 +56,6 @@
 	// 이벤트 최저 잔액
 	public static final double MIN_EVENT_REMAIN_CASH = 7.5; // 이벤트 최소 잔액
 	
-	/** 
-	 * @methodName	: getSmsTxtBytes 
-	 * @author		: 이호영
-	 * @date		: 2024.09.23 
-	 * @description	: sms 텍스트 바이트 계산 후 return;
-	 * @param smsTxt
-	 * @return
-	 * @throws UnsupportedEncodingException 
-	 */
-	public static int getSmsTxtBytes(String smsTxt) throws UnsupportedEncodingException {        	//문자열 길이 체크 해주기
-		int smsBytes = 0;
-		//문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산
-		String charset = "euc-kr"; 						
-		if(StringUtils.isNotEmpty(smsTxt)) {
-			String smsCont = smsTxt.replace("\r\n", "\n");
-			smsBytes = smsCont.getBytes(charset).length;
-		}
-//		log.info(" + smsBytes :: [{}]", smsBytes);
-		return smsBytes;
-	}
 
 	/** 
 	 * @methodName	: getMsgType 
@@ -96,7 +77,7 @@
 		//	    msgType = "4";
 		//	}
 			
-		int smsTxtByte = getSmsTxtBytes(p_smsTxt);
+		int smsTxtByte = MjonCommon.getSmsTxtBytes(p_smsTxt);
 		String msgType = SHORT_MSG_TYPE;
 	
 		// 1. 2000 Byte 초과는 에러 처리
@@ -276,7 +257,6 @@
 				for (Map.Entry<String, Function<MjonMsgSendVO, String>> entry : placeholders.entrySet()) {
 					String placeholder = entry.getKey();
 					String value = entry.getValue().apply(sendVO);
-					System.out.println("");
 //					log.info(" + smsTxtTemp [{}]", smsTxtTemp);
 //					log.info(" + placeholder [{}]", placeholder);
 //					log.info(" + value [{}]", value);
@@ -649,7 +629,7 @@
 			// 각 가격을 합산
 			totalPrice += Float.parseFloat(eachPrice);
 		}
-
+		mjonMsgVO.setTotalPrice(totalPrice);
 		
 	}
 	
 
src/main/java/itn/com/cmm/util/SlackMessageFormatUtil.java (added)
+++ src/main/java/itn/com/cmm/util/SlackMessageFormatUtil.java
@@ -0,0 +1,145 @@
+package itn.com.cmm.util;
+
+import org.apache.commons.lang3.StringUtils;
+
+import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
+import itn.let.kakao.kakaoComm.KakaoVO;
+import itn.let.mjo.msg.service.MjonMsgVO;
+
+public class SlackMessageFormatUtil {
+	
+	private static final String PREFIX_SMISHING = "[스미싱의심]";
+	private static final String PREFIX_RESERVE = "[예약]";
+	private static final String PREFIX_IMAGE = "그림문자 ";
+
+	/**
+	 * 일반 SMS 메시지 텍스트 포맷팅
+	 */
+	public static String formatSmsText(MjonMsgVO mjonMsgVO) {
+		String smsTxt = mjonMsgVO.getSmsTxt();
+		String reserveYn = safeGetString(mjonMsgVO.getReserveYn());
+		String delayYn = safeGetString(mjonMsgVO.getDelayYn());
+		String smishingYn = safeGetString(mjonMsgVO.getSmishingYn());
+		
+		// 공통 텍스트 포맷팅 로직 적용
+		smsTxt = formatMessagePrefix(smsTxt, reserveYn, 
+					"Y".equals(smishingYn) || "Y".equals(delayYn));
+		
+		// 그림 문자 처리 (SMS 전용 로직)
+		int fileCount = parseIntOrDefault(mjonMsgVO.getFileCnt(), 0);
+		if ("6".equals(mjonMsgVO.getMsgType()) && fileCount > 0 && StringUtils.isEmpty(smsTxt)) {
+		    smsTxt = "그림문자 " + smsTxt;
+		}
+		
+		return smsTxt;
+	}
+	
+	/**
+	 * 카카오톡 메시지 텍스트 포맷팅
+	 */
+	public static String formatKakaoText(KakaoSendAdvcVO sendVO) {
+		String smsTxt = sendVO.getTemplateContent();
+		String reserveYn = safeGetString(sendVO.getReserveYn());
+		String atDelayYn = safeGetString(sendVO.getAtDelayYn());
+		
+		// 공통 텍스트 포맷팅 로직 적용
+		return formatMessagePrefix(smsTxt, reserveYn, "Y".equals(atDelayYn));
+	}
+	
+	
+	public static String formatSandName(MjonMsgVO mjonMsgVO) {
+		String userId = mjonMsgVO.getUserId();
+		String callFrom = mjonMsgVO.getCallFrom();
+		String msgType = getMessageTypeLabel(mjonMsgVO.getMsgType(), mjonMsgVO.getFileCnt());
+		return String.format("[%s][%s]%s", userId, callFrom, msgType);
+	}
+	
+	/**
+	 * 메시지 접두사 포맷팅 공통 로직 (예약 및 스미싱 의심 접두사 처리)
+	 * 
+	 * @param messageText 원본 메시지 텍스트
+	 * @param reserveYn   예약 여부
+	 * @param isSmishing  스미싱 의심 여부
+	 * @return 포맷팅된 메시지 텍스트
+	 */
+	public static String formatMessagePrefix(String messageText, String reserveYn, boolean isSmishing) {
+		if ("Y".equals(reserveYn)) {
+			return isSmishing ? PREFIX_SMISHING + PREFIX_RESERVE + messageText : PREFIX_RESERVE + messageText;
+		} else if (isSmishing) {
+			return PREFIX_SMISHING + messageText;
+		}
+		return messageText;
+	}
+
+	/**
+	 * @카카오톡용 sandName 포맷팅 메서드
+	 */
+	public static String formatKakaoSandName(KakaoSendAdvcVO sendVO) {
+		String userId = sendVO.getUserId();
+		String callFrom = sendVO.getCallFrom();
+		String msgType = getKakaoMessageTypeLabel(sendVO.getMsgType());
+		return String.format("[%s][%s]%s", userId, callFrom, msgType);
+	}
+	
+	/**
+	 * 메시지 타입 레이블 반환 (SMS 전용)
+	 * 
+	 * @param msgType 메시지 타입
+	 * @param fileCnt 파일 개수
+	 * @return 메시지 타입 레이블
+	 */
+	public static String getMessageTypeLabel(String msgType, String fileCnt) {
+		int fileCount = parseIntOrDefault(fileCnt, 0);
+
+		switch (msgType) {
+			case "4":
+				return "[단문]";
+			case "6":
+				return fileCount == 0 ? "[장문]" : "[그림]";
+			default:
+				return "";
+		}
+	}
+
+	/**
+	 * 카카오톡 메시지 타입 레이블 반환
+	 * 
+	 * @param msgType 메시지 타입
+	 * @return 메시지 타입 레이블
+	 */
+	public static String getKakaoMessageTypeLabel(String msgType) {
+		switch (msgType) {
+			case "8":
+				return "[알림톡]";
+			case "9":
+				return "[친구톡]";
+			default:
+				return "";
+		}
+	}
+
+	/**
+	 * 정수로 변환, 변환 실패 시 기본값 반환
+	 * 
+	 * @param value        변환할 문자열
+	 * @param defaultValue 기본값
+	 * @return 변환된 정수 또는 기본값
+	 */
+	public static int parseIntOrDefault(String value, int defaultValue) {
+		try {
+			return Integer.parseInt(value);
+		} catch (NumberFormatException e) {
+			return defaultValue;
+		}
+	}
+
+	/**
+	 * 안전하게 문자열 가져오기 (null 체크)
+	 * 
+	 * @param value 원본 문자열
+	 * @return 원본 문자열 또는 빈 문자열
+	 */
+	public static String safeGetString(String value) {
+		return value == null ? "" : value;
+	}
+}
src/main/java/itn/com/uss/ion/bnr/pop/service/MainPopupLinkVO.java
--- src/main/java/itn/com/uss/ion/bnr/pop/service/MainPopupLinkVO.java
+++ src/main/java/itn/com/uss/ion/bnr/pop/service/MainPopupLinkVO.java
@@ -35,5 +35,6 @@
 	private String popId; // 메인존ID
 	private String mlink; // 링크
 	private String coords; // 링크좌표
+	private String popLinkId; // 링크좌표
 	
 }
src/main/java/itn/com/uss/ion/bnr/pop/service/MainPopupManageService.java
--- src/main/java/itn/com/uss/ion/bnr/pop/service/MainPopupManageService.java
+++ src/main/java/itn/com/uss/ion/bnr/pop/service/MainPopupManageService.java
@@ -1,13 +1,8 @@
 package itn.com.uss.ion.bnr.pop.service;
 
 import java.util.List;
-import java.util.Map;
 
-import itn.com.uss.ion.pwm.service.MainzoneVO;
-import itn.com.uss.ion.pwm.service.PopupManageVO;
-import itn.com.uss.ion.pwm.service.PopupzoneVO;
-import itn.com.uss.ion.pwm.service.SocialVO;
-import itn.com.uss.ion.pwm.service.SortVO;
+import itn.com.cmm.RestResponse;
 
 /**
  * 개요
@@ -34,4 +29,6 @@
 
 	public void resetMainPopupSort(MainPopupVO mainPopupVO);
 
+	public RestResponse deleteMainPopupLink(MainPopupLinkVO mainPopupLinkVO);
+
 }
(No newline at end of file)
src/main/java/itn/com/uss/ion/bnr/pop/service/impl/MainPopupManageDAO.java
--- src/main/java/itn/com/uss/ion/bnr/pop/service/impl/MainPopupManageDAO.java
+++ src/main/java/itn/com/uss/ion/bnr/pop/service/impl/MainPopupManageDAO.java
@@ -4,6 +4,7 @@
 import org.springframework.stereotype.Repository;
 
 import itn.com.cmm.service.impl.EgovComAbstractDAO;
+import itn.com.uss.ion.bnr.pop.service.MainPopupLinkVO;
 import itn.com.uss.ion.bnr.pop.service.MainPopupVO;
 
 /**
@@ -46,8 +47,8 @@
 	}
 
 
-	public void deleteMainPopup(String mazId) {
-		delete("mainPopup.deleteMainPopup", mazId);
+	public void deleteMainPopup(String popId) {
+		delete("mainPopup.deleteMainPopup", popId);
 	}
 
 
@@ -55,4 +56,7 @@
 		update("mainPopup.resetMainPopupSort", mainPopupVO);  
 	}
 
+	public void deleteMainPopupLinkInfo(MainPopupLinkVO mainPopupLinkVO) {
+		delete("mainPopup.deleteMainPopupLinkInfo", mainPopupLinkVO);
+	}
 }
(No newline at end of file)
src/main/java/itn/com/uss/ion/bnr/pop/service/impl/MainPopupManageServiceImpl.java
--- src/main/java/itn/com/uss/ion/bnr/pop/service/impl/MainPopupManageServiceImpl.java
+++ src/main/java/itn/com/uss/ion/bnr/pop/service/impl/MainPopupManageServiceImpl.java
@@ -4,12 +4,16 @@
 
 import javax.annotation.Resource;
 
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 
 import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
 import egovframework.rte.fdl.idgnr.EgovIdGnrService;
+import itn.com.cmm.RestResponse;
+import itn.com.uss.ion.bnr.pop.service.MainPopupLinkVO;
 import itn.com.uss.ion.bnr.pop.service.MainPopupManageService;
 import itn.com.uss.ion.bnr.pop.service.MainPopupVO;
+import itn.com.uss.ion.pwm.service.impl.PopupManageDAO;
 
 /**
  * 개요
@@ -29,7 +33,9 @@
 	@Resource(name = "mainPopupManageDAO")
 	public MainPopupManageDAO dao;
 
-    
+	@Resource(name = "popupManageDAO")
+	public PopupManageDAO popupDao;
+	
 	@Resource(name = "egovPopupManageIdGnrService")
 	private EgovIdGnrService idgenService;
 
@@ -59,6 +65,7 @@
 
 	@Override
 	public void deleteMainPopup(String id) {
+		popupDao.deleteMainPopupLinkInfo(id);
 		dao.deleteMainPopup(id);
 	}
 
@@ -68,5 +75,15 @@
 		
 	}
 
+	@Override
+	public RestResponse deleteMainPopupLink(MainPopupLinkVO mainPopupLinkVO) {
+		dao.deleteMainPopupLinkInfo(mainPopupLinkVO);
+		
+		return RestResponse.builder()
+				.status(HttpStatus.OK) // 200, Series.SUCCESSFUL, "OK"
+				.msg("삭제 되었습니다.")
+				.build();
+		
+	}
 
 }
(No newline at end of file)
src/main/java/itn/com/uss/ion/bnr/pop/web/MainPopupController.java
--- src/main/java/itn/com/uss/ion/bnr/pop/web/MainPopupController.java
+++ src/main/java/itn/com/uss/ion/bnr/pop/web/MainPopupController.java
@@ -12,11 +12,15 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import org.springmodules.validation.commons.DefaultBeanValidator;
 
@@ -27,15 +31,16 @@
 import itn.com.cmm.ComDefaultCodeVO;
 import itn.com.cmm.EgovMessageSource;
 import itn.com.cmm.LoginVO;
+import itn.com.cmm.RestResponse;
 import itn.com.cmm.service.EgovCmmUseService;
 import itn.com.cmm.service.EgovFileMngService;
 import itn.com.cmm.service.EgovFileMngUtil;
 import itn.com.cmm.service.FileVO;
 import itn.com.cmm.util.RedirectUrlMaker;
+import itn.com.uss.ion.bnr.pop.service.MainPopupLinkVO;
 import itn.com.uss.ion.bnr.pop.service.MainPopupManageService;
 import itn.com.uss.ion.bnr.pop.service.MainPopupVO;
 import itn.com.uss.ion.bnr.sub.service.SubMainZoneManageService;
-import itn.com.uss.ion.pwm.service.MainzoneVO;
 import itn.let.sym.site.service.EgovSiteManagerService;
 
 /**
@@ -243,11 +248,35 @@
 		RedirectUrlMaker redirectUrlMaker = new RedirectUrlMaker("/uss/ion/bnr/pop/mainPopupList.do");
 		return redirectUrlMaker.getRedirectUrl();
 	}
-	
-	
-	
-	
-	
+
+	/** 
+	 * @methodName	: mainPopupLinkDeleteAjax 
+	 * @author		: 이호영
+	 * @date		: 2025.03.04 
+	 * @description	: 메인팝업링크 데이터 삭제
+	 * @param request
+	 * @param mainPopupLinkVO
+	 * @return
+	 * @throws Exception 
+	 */
+	@ResponseBody
+	@RequestMapping(value="/uss/ion/bnr/pop/mainPopupLinkDeleteAjax.do")
+	public ResponseEntity<?> mainPopupLinkDeleteAjax(
+			HttpServletRequest request
+			,@RequestBody MainPopupLinkVO mainPopupLinkVO) throws Exception {
+ 
+		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
+ 
+		if(!isAuthenticated) {
+			return ResponseEntity.ok(
+					RestResponse.builder()
+					.status(HttpStatus.UNAUTHORIZED) // 401 권한 인증 에러
+					.msg("로그인을 하셔야 이용 가능합니다.")
+					.build()
+					);
+		}
+		return ResponseEntity.ok(mainPopupManageService.deleteMainPopupLink(mainPopupLinkVO));
+	}
 	
 	
 	
 
src/main/java/itn/let/cmm/vo/FileInfoVO.java (added)
+++ src/main/java/itn/let/cmm/vo/FileInfoVO.java
@@ -0,0 +1,32 @@
+package itn.let.cmm.vo;
+
+import java.io.Serializable;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 
+ * @author 		: 이호영
+ * @fileName 	: FileInfoVO.java 
+ * @date 		: 2025.01.17
+ * @description : 파일 풀 경로에서 파일명만 가져와 ID 가져올때 사용하는 VO
+ * 					MjonMsgDetailSentVO 참고
+ * =========================================================== 
+ * DATE          AUTHOR   NOTE 
+ * ----------------------------------------------------------- *
+ * 2025.01.17    이호영          최초 생성
+ * 
+ * 
+ * 
+ */
+@Getter
+@Setter
+public class FileInfoVO implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private String atchFileId;	// 첨부파일 ID
+	private String fileSn;		// 파일 순번
+
+}
src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java
--- src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java
+++ src/main/java/itn/let/kakao/admin/kakaoAt/service/MjonKakaoATVO.java
@@ -151,6 +151,8 @@
 	private String bizKakaoResendType; /* 대체 문자 길이 => MMS / LMS / SMS */
 	private String bizKakaoJsonFile;	//카카오 친구톡 Json 파일 경로
 	
+	private String yellowId;
+	private String bizKakaoResendTypeCnt;
 	
 	public String getMsgDiv() {
 		return msgDiv;
@@ -1273,5 +1275,19 @@
 	public void setBizKakaoJsonFile(String bizKakaoJsonFile) {
 		this.bizKakaoJsonFile = bizKakaoJsonFile;
 	}
+	public String getYellowId() {
+		return yellowId;
+	}
+	public void setYellowId(String yellowId) {
+		this.yellowId = yellowId;
+	}
+	public String getBizKakaoResendTypeCnt() {
+		return bizKakaoResendTypeCnt;
+	}
+	public void setBizKakaoResendTypeCnt(String bizKakaoResendTypeCnt) {
+		this.bizKakaoResendTypeCnt = bizKakaoResendTypeCnt;
+	}
+	
+	
 	
 }
src/main/java/itn/let/kakao/kakaoComm/KakaoButtonVO.java
--- src/main/java/itn/let/kakao/kakaoComm/KakaoButtonVO.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoButtonVO.java
@@ -1,5 +1,9 @@
 package itn.let.kakao.kakaoComm;
 
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
 /**
 * @FileName : KakaoButtonVO.java
 * @Project : mjon
@@ -8,6 +12,9 @@
 
 * @프로그램 설명 : button, quickReplies 변수
 */
+@ToString
+@Getter
+@Setter
 public class KakaoButtonVO {
 	
 	private String name = "";		// 버튼명 - linkType “AC” 선택 시 버튼명은 “채널추가” 로 고정
@@ -17,49 +24,5 @@
 	private String linkMo = "";		// 모바일 웹 링크 주소 (WL 사용시 필수)
 	private String linkPc = "";		// PC 웹 링크 주소 (WL 사용시 선택)
 	private String pluginId = "";	// 플러그인 ID (P1, P2, P3 사용시 필수)
-	
-	public String getName() {
-		return name;
-	}
-	public void setName(String name) {
-		this.name = name;
-	}
-	public String getLinkType() {
-		return linkType;
-	}
-	public void setLinkType(String linkType) {
-		this.linkType = linkType;
-	}
-	public String getLinkAnd() {
-		return linkAnd;
-	}
-	public void setLinkAnd(String linkAnd) {
-		this.linkAnd = linkAnd;
-	}
-	public String getLinkIos() {
-		return linkIos;
-	}
-	public void setLinkIos(String linkIos) {
-		this.linkIos = linkIos;
-	}
-	public String getLinkMo() {
-		return linkMo;
-	}
-	public void setLinkMo(String linkMo) {
-		this.linkMo = linkMo;
-	}
-	public String getLinkPc() {
-		return linkPc;
-	}
-	public void setLinkPc(String linkPc) {
-		this.linkPc = linkPc;
-	}
-	public String getPluginId() {
-		return pluginId;
-	}
-	public void setPluginId(String pluginId) {
-		this.pluginId = pluginId;
-	}
-	
 	
 }
src/main/java/itn/let/kakao/kakaoComm/KakaoCommentVO.java
--- src/main/java/itn/let/kakao/kakaoComm/KakaoCommentVO.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoCommentVO.java
@@ -3,6 +3,10 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
 /**
 * @FileName : KakaoCommentVO.java
 * @Project : mjon
@@ -11,6 +15,9 @@
 
 * @프로그램 설명 : comment 변수
 */
+@ToString
+@Getter
+@Setter
 public class KakaoCommentVO {
 	
 	private String content = "";		// 댓글 본분
@@ -26,60 +33,4 @@
 	private String originalFileName = "";
 	
 	private String filePath = "";
-
-	public String getContent() {
-		return content;
-	}
-
-	public void setContent(String content) {
-		this.content = content;
-	}
-
-	public String getCreatedAt() {
-		return createdAt;
-	}
-
-	public void setCreatedAt(String createdAt) {
-		this.createdAt = createdAt;
-	}
-
-	public String getStatus() {
-		return status;
-	}
-
-	public void setStatus(String status) {
-		this.status = status;
-	}
-
-	public String getUserName() {
-		return userName;
-	}
-
-	public void setUserName(String userName) {
-		this.userName = userName;
-	}
-
-	public String getOriginalFileName() {
-		return originalFileName;
-	}
-
-	public void setOriginalFileName(String originalFileName) {
-		this.originalFileName = originalFileName;
-	}
-
-	public String getFilePath() {
-		return filePath;
-	}
-
-	public void setFilePath(String filePath) {
-		this.filePath = filePath;
-	}
-
-	public List<KakaoCommentVO> getAttachFileList() {
-		return attachFileList;
-	}
-
-	public void setAttachFileList(List<KakaoCommentVO> attachFileList) {
-		this.attachFileList = attachFileList;
-	}
 }
src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java
--- src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoReturnVO.java
@@ -4,6 +4,9 @@
 import java.util.List;
 
 import itn.com.cmm.ComDefaultVO;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
 
 /**
 * @FileName : KakaoReturnVO.java
@@ -13,6 +16,9 @@
 
 * @프로그램 설명 : 카카오톡 리턴 변수 목록
 */
+@Getter
+@Setter
+@ToString
 public class KakaoReturnVO extends ComDefaultVO{
 	
 	private static final long serialVersionUID = 1L;
@@ -130,415 +136,4 @@
 	
 	private String businessType = "";					//카카오톡 채널 비즈니스 인증 타입
 	
-	public static long getSerialversionuid() {
-		return serialVersionUID;
-	}
-
-	public String getBizReturnMsg() {
-		return bizReturnMsg;
-	}
-
-	public void setBizReturnMsg(String bizReturnMsg) {
-		this.bizReturnMsg = bizReturnMsg;
-	}
-
-	public String getBizReturnCode() {
-		return bizReturnCode;
-	}
-
-	public void setBizReturnCode(String bizReturnCode) {
-		this.bizReturnCode = bizReturnCode;
-	}
-
-	public String getProfileId() {
-		return profileId;
-	}
-
-	public void setProfileId(String profileId) {
-		this.profileId = profileId;
-	}
-
-	public String getTotalCount() {
-		return totalCount;
-	}
-
-	public void setTotalCount(String totalCount) {
-		this.totalCount = totalCount;
-	}
-
-	public String getTotalPage() {
-		return totalPage;
-	}
-
-	public void setTotalPage(String totalPage) {
-		this.totalPage = totalPage;
-	}
-
-	public String getCurrentPage() {
-		return currentPage;
-	}
-
-	public void setCurrentPage(String currentPage) {
-		this.currentPage = currentPage;
-	}
-
-	public String getSenderKey() {
-		return senderKey;
-	}
-
-	public void setSenderKey(String senderKey) {
-		this.senderKey = senderKey;
-	}
-
-	public String getSenderKeyType() {
-		return senderKeyType;
-	}
-
-	public void setSenderKeyType(String senderKeyType) {
-		this.senderKeyType = senderKeyType;
-	}
-
-	public String getTemplateCode() {
-		return templateCode;
-	}
-
-	public void setTemplateCode(String templateCode) {
-		this.templateCode = templateCode;
-	}
-
-	public String getTemplateName() {
-		return templateName;
-	}
-
-	public void setTemplateName(String templateName) {
-		this.templateName = templateName;
-	}
-
-	public String getCategoryCode() {
-		return categoryCode;
-	}
-
-	public void setCategoryCode(String categoryCode) {
-		this.categoryCode = categoryCode;
-	}
-
-	public String getCreatedAt() {
-		return createdAt;
-	}
-
-	public void setCreatedAt(String createdAt) {
-		this.createdAt = createdAt;
-	}
-
-	public String getModifiedAt() {
-		return modifiedAt;
-	}
-
-	public void setModifiedAt(String modifiedAt) {
-		this.modifiedAt = modifiedAt;
-	}
-
-	public String getServiceStatus() {
-		return serviceStatus;
-	}
-
-	public void setServiceStatus(String serviceStatus) {
-		this.serviceStatus = serviceStatus;
-	}
-
-	public List<KakaoReturnVO> getTemplatList() {
-		return templatList;
-	}
-
-	public void setTemplatList(List<KakaoReturnVO> templatList) {
-		this.templatList = templatList;
-	}
-
-	public String getUuid() {
-		return uuid;
-	}
-
-	public void setUuid(String uuid) {
-		this.uuid = uuid;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public String getStatus() {
-		return status;
-	}
-
-	public void setStatus(String status) {
-		this.status = status;
-	}
-
-	public boolean isBlock() {
-		return block;
-	}
-
-	public void setBlock(boolean block) {
-		this.block = block;
-	}
-
-	public boolean isDormant() {
-		return dormant;
-	}
-
-	public void setDormant(boolean dormant) {
-		this.dormant = dormant;
-	}
-
-	public String getTitle() {
-		return title;
-	}
-
-	public void setTitle(String title) {
-		this.title = title;
-	}
-
-	public String getDescription() {
-		return description;
-	}
-
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	public String getImageUrl() {
-		return imageUrl;
-	}
-
-	public void setImageUrl(String imageUrl) {
-		this.imageUrl = imageUrl;
-	}
-
-	public String getListTitle() {
-		return listTitle;
-	}
-
-	public void setListTitle(String listTitle) {
-		this.listTitle = listTitle;
-	}
-
-	public String getListDescription() {
-		return listDescription;
-	}
-
-	public void setListDescription(String listDescription) {
-		this.listDescription = listDescription;
-	}
-
-	public String getSumTitle() {
-		return sumTitle;
-	}
-
-	public void setSumTitle(String sumTitle) {
-		this.sumTitle = sumTitle;
-	}
-
-	public String getSumDescription() {
-		return sumDescription;
-	}
-
-	public void setSumDescription(String sumDescription) {
-		this.sumDescription = sumDescription;
-	}
-
-	public String getProfileStatus() {
-		return profileStatus;
-	}
-
-	public void setProfileStatus(String profileStatus) {
-		this.profileStatus = profileStatus;
-	}
-
-	public boolean isAlimtalk() {
-		return alimtalk;
-	}
-
-	public void setAlimtalk(boolean alimtalk) {
-		this.alimtalk = alimtalk;
-	}
-
-	public boolean isBizchat() {
-		return bizchat;
-	}
-
-	public void setBizchat(boolean bizchat) {
-		this.bizchat = bizchat;
-	}
-
-	public boolean isBrandtalk() {
-		return brandtalk;
-	}
-
-	public void setBrandtalk(boolean brandtalk) {
-		this.brandtalk = brandtalk;
-	}
-
-	public String getCommittalCompanyName() {
-		return committalCompanyName;
-	}
-
-	public void setCommittalCompanyName(String committalCompanyName) {
-		this.committalCompanyName = committalCompanyName;
-	}
-
-	public String getChannelKey() {
-		return channelKey;
-	}
-
-	public void setChannelKey(String channelKey) {
-		this.channelKey = channelKey;
-	}
-
-	public boolean isBusinessProfile() {
-		return businessProfile;
-	}
-
-	public void setBusinessProfile(boolean businessProfile) {
-		this.businessProfile = businessProfile;
-	}
-
-	public String getBusinessType() {
-		return businessType;
-	}
-
-	public void setBusinessType(String businessType) {
-		this.businessType = businessType;
-	}
-
-	public String getTemplateMessageType() {
-		return templateMessageType;
-	}
-
-	public void setTemplateMessageType(String templateMessageType) {
-		this.templateMessageType = templateMessageType;
-	}
-
-	public String getTemplateEmphasizeType() {
-		return templateEmphasizeType;
-	}
-
-	public void setTemplateEmphasizeType(String templateEmphasizeType) {
-		this.templateEmphasizeType = templateEmphasizeType;
-	}
-
-	public String getTemplateContent() {
-		return templateContent;
-	}
-
-	public void setTemplateContent(String templateContent) {
-		this.templateContent = templateContent;
-	}
-
-	public String getTemplateExtra() {
-		return templateExtra;
-	}
-
-	public void setTemplateExtra(String templateExtra) {
-		this.templateExtra = templateExtra;
-	}
-	
-	public String getTemplateAd() {
-		return templateAd;
-	}
-
-	public void setTemplateAd(String templateAd) {
-		this.templateAd = templateAd;
-	}
-
-	public String getTemplateImageName() {
-		return templateImageName;
-	}
-
-	public void setTemplateImageName(String templateImageName) {
-		this.templateImageName = templateImageName;
-	}
-
-	public String getTemplateImageUrl() {
-		return templateImageUrl;
-	}
-
-	public void setTemplateImageUrl(String templateImageUrl) {
-		this.templateImageUrl = templateImageUrl;
-	}
-
-	public String getTemplateTitle() {
-		return templateTitle;
-	}
-
-	public void setTemplateTitle(String templateTitle) {
-		this.templateTitle = templateTitle;
-	}
-
-	public String getTemplateSubtitle() {
-		return templateSubtitle;
-	}
-
-	public void setTemplateSubtitle(String templateSubtitle) {
-		this.templateSubtitle = templateSubtitle;
-	}
-
-	public String getTemplateHeader() {
-		return templateHeader;
-	}
-
-	public void setTemplateHeader(String templateHeader) {
-		this.templateHeader = templateHeader;
-	}
-
-	public Boolean getSecurityFlag() {
-		return securityFlag;
-	}
-
-	public void setSecurityFlag(Boolean securityFlag) {
-		this.securityFlag = securityFlag;
-	}
-
-	public String getInspectionStatus() {
-		return inspectionStatus;
-	}
-
-	public void setInspectionStatus(String inspectionStatus) {
-		this.inspectionStatus = inspectionStatus;
-	}
-
-	public List<KakaoButtonVO> getButtonList() {
-		return buttonList;
-	}
-
-	public void setButtonList(List<KakaoButtonVO> buttonList) {
-		this.buttonList = buttonList;
-	}
-
-	public List<KakaoButtonVO> getQuickReplyList() {
-		return quickReplyList;
-	}
-
-	public void setQuickReplyList(List<KakaoButtonVO> quickReplyList) {
-		this.quickReplyList = quickReplyList;
-	}
-
-	public List<KakaoCommentVO> getCommentList() {
-		return commentList;
-	}
-
-	public void setCommentList(List<KakaoCommentVO> commentList) {
-		this.commentList = commentList;
-	}
-
-	public List<KakaoItemVO> getItemList() {
-		return itemList;
-	}
-
-	public void setItemList(List<KakaoItemVO> itemList) {
-		this.itemList = itemList;
-	}
 }
 
src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java (added)
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoSendAdvcVO.java
@@ -0,0 +1,116 @@
+package itn.let.kakao.kakaoComm;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+* @FileName : KakaoSendVO.java
+* @Project : mjon
+* @Date : 2025. 3. 25.
+* @작성자 :  이호영
+
+* @프로그램 설명 : 문자온 발송부분만 ADVC
+*/
+@Getter
+@Setter
+public class KakaoSendAdvcVO implements Serializable {
+
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 343099046833205405L;
+
+	// =====
+	// Insert 데이터
+	private String msgId;				// 문자ID
+	private String msgGroupId;			// 전송그룹ID
+	private String msgGroupCnt;			// 전송그룹ID
+	private String userId;				// 사용자ID
+	private String agentCode;			// 전송사코드
+	private String senderKey;			// 발신프로필 키
+	private String templateCode;		// 템플릿 코드
+	private String callTo;				// 수신번호
+	private String callFrom;			// 발신번호
+	private String msgType;				// 메시지 타입
+	private String templateContent;		// 템플릿 내용
+	private String templateTitle;		// 템플릿 제목
+	List<KakaoButtonVO> buttonList;		// 템플릿 버튼 리스트
+	private String subMsgSendYn;		// 대체문자 전송 여부
+	private String subMsgTxt;			// 대체문자 내용
+	private String subMsgType;			// 대체문자 타입
+	private String reqDate;				// 예약일시
+	
+	private String jsonStr;				// jsonStr
+
+	// =====
+	// =====
+
+	private String eachPrice;		// sms 단가
+	private String smsPrice;		// sms 단가
+	private String mmsPrice;		// mms 단가
+	private String totPrice;		// mms 단가
+	private String befCash;		// mms 단가
+	private String befPoint;		// mms 단가
+	private String kakaoAtPrice;	// 카카오 알림톡 단가
+	private String bizJsonName;	// 카카오 알림톡 단가
+	private String reserveYn;	// 카카오 알림톡 단가
+	private String atDelayYn;	// 카카오 알림톡 단가
+	private String bizKakaoResendOrgnlTxt;	// 카카오 알림톡 단가
+	private String bizKakaoResendType;	// 카카오 알림톡 단가
+	
+	
+	
+	
+	
+	
+	@Override
+	public String toString() {
+		return "MsgSendVO[" +
+			"\n msgId=[" + msgId + "]" +
+			"\n , msgGroupId=[" + msgGroupId + "]" +
+			"\n , msgGroupCnt=[" + msgGroupCnt + "]" +
+			"\n , userId=[" + userId + "]" +
+			"\n , agentCode=[" + agentCode + "]" +
+			"\n , senderKey=[" + senderKey + "]" +
+			"\n , templateCode=[" + templateCode + "]" +
+			"\n , callTo=[" + callTo + "]" +
+			"\n , callFrom=[" + callFrom + "]" +
+			"\n , msgType=[" + msgType + "]" +
+			"\n , templateContent=[" + templateContent + "]" +
+			"\n , templateTitle=[" + templateTitle + "]" +
+			"\n , buttonList=[" + buttonList.toString() + "]" +
+			"\n , subMsgSendYn=[" + subMsgSendYn + "]" +
+			"\n , subMsgTxt=[" + subMsgTxt + "]" +
+			"\n , subMsgType=[" + subMsgType + "]" +
+			"\n , reqDate=[" + reqDate + "]" +
+			"\n , jsonStr=[" + jsonStr + "]" +
+			"\n , ==== MJ_MSG_DATA INSERT DATA END =======" +
+			"\n " +
+			"\n , eachPrice=[" + eachPrice + "]" +
+			"\n , smsPrice=[" + smsPrice + "]" +
+			"\n , mmsPrice=[" + mmsPrice + "]" +
+			"\n , totPrice=[" + totPrice + "]" +
+			"\n , befCash=[" + befCash + "]" +
+			"\n , befPoint=[" + befPoint + "]" +
+			"\n , kakaoAtPrice=[" + kakaoAtPrice + "]" +
+			"\n , bizJsonName=[" + bizJsonName + "]" +
+			"\n , reserveYn=[" + reserveYn + "]" +
+			"\n , atDelayYn=[" + atDelayYn + "]" +
+			"\n , bizKakaoResendOrgnlTxt=[" + bizKakaoResendOrgnlTxt + "]" +
+			"\n , bizKakaoResendType=[" + bizKakaoResendType + "]" +
+			"\n ]";
+	}
+
+
+
+
+
+
+
+	
+}
src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
--- src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoSendUtil.java
@@ -1,21 +1,38 @@
 package itn.let.kakao.kakaoComm;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import javax.annotation.Resource;
 
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Component;
 
+import egovframework.rte.fdl.idgnr.EgovIdGnrService;
 import itn.com.cmm.util.StringUtil;
 import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave;
+import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate;
+import itn.let.mail.service.StatusResponse;
+import itn.let.mjo.mjocommon.MjonCommon;
 import itn.let.mjo.msg.service.MjonMsgVO;
 import itn.let.mjo.msgdata.service.MjonMsgDataService;
 import itn.let.mjo.spammsg.web.ComGetSpamStringParser;
+import itn.let.module.base.PriceAndPoint;
 import itn.let.sym.site.service.JoinSettingVO;
 import itn.let.uss.umt.service.MberManageVO;
+import lombok.extern.slf4j.Slf4j;
 
+@Slf4j
 @Component
 public class KakaoSendUtil {
 
@@ -24,6 +41,374 @@
 	
 	@Resource(name = "MjonMsgDataService")
 	private MjonMsgDataService mjonMsgDataService;
+	
+	@Autowired
+	KakaoApiTemplate kakaoApiTemplate;
+
+	@Autowired
+	private PriceAndPoint priceAndPoint;
+
+	@Autowired
+	private MjonCommon mjonCommon;
+	
+	// 클래스 수준에서 정적 Pattern 정의 (성능 최적화)
+	private static final Pattern REPLACEMENT_PATTERN = Pattern.compile("#\\{[^}]+\\}");
+
+	private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+
+	// 단문 메세지 타입
+	public static final String SHORT_MSG_TYPE = "SMS";
+	// 장문 메세지 타입
+	public static final String LONG_MSG_TYPE = "MMS";
+	
+	/**
+	 * @methodName	: populateSendLists _advc
+	 * @author		: 이호영
+	 * @date		: 2025. 3. 7.
+	 * @description	: 기존 kakaoSendPrice 개선
+	 * @return : KakaoVO
+	 * @param kakaoVO
+	 * @param statusResponse
+	 * @return
+	 * @throws Exception
+	 * 
+	 */
+	public List<KakaoSendAdvcVO> populateSendLists(KakaoVO kakaoVO, boolean isNotified, StatusResponse statusResponse) throws Exception {
+		
+		//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
+//		String befCash = kakaoVO.getBefCash();
+		
+
+		
+		
+		log.info(" +kakaoVO.getVarListMap().size() :: [{}]", kakaoVO.getVarListMap().size()); 
+		
+		List<KakaoSendAdvcVO> kakaoSendAdvcListVO = new ArrayList<>();
+		Calendar calendar = setupBaseDate(kakaoVO, isNotified);
+
+		
+		
+		KakaoReturnVO templateDetail = kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO);
+		String templateContent = templateDetail.getTemplateContent(); // 알림톡 템플릿
+		kakaoVO.setTemplateContent(templateContent);
+		String templateTitle = templateDetail.getTemplateTitle();
+		
+		
+//		log.info(" + templateDetail :: [{}]", templateDetail);
+//		templateDetail.getButtonList().forEach(t->log.info(" + ButtonList :: [{}]", t.toString()));
+		
+		Boolean hasContentReplacement = this.replBooleanStrChecker(templateContent);
+		Boolean hasTitleReplacement = this.replBooleanStrChecker(templateTitle);
+		Boolean hasButtonReplacement = this.needsButtonReplacement(templateDetail.getButtonList());
+
+		/** @jsonStr 필요유무 */
+		boolean hasTitleOrButtons = StringUtils.isNotEmpty(templateTitle)  
+				|| CollectionUtils.isNotEmpty(templateDetail.getButtonList());
+		
+		/** @jsonStr 반복유무 */
+		boolean needsJsonReplacement = hasTitleReplacement || hasButtonReplacement;
+		String sharedJsonStr = null;
+
+		String subMsgTxt = kakaoVO.getSubMsgTxt(); // 실패 대체 문자
+		
+		// 시스템 기본 단가 정보 불러오기
+		JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
+		// 사용자 개인 단가 정보 불러오기
+		MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId());
+		
+		
+		
+
+		/** @MSGID KEY값 */
+		List<String> idList = mjonCommon.getNextCustomMsgCId(kakaoVO.getVarListMap().size());
+//		for (int i = 0; i < kakaoSendAdvcListVO.size(); i++) {
+//			kakaoSendAdvcListVO.get(i).setMsgId(idList.get(i));
+//			kakaoSendAdvcListVO.get(i).setBizJsonName(idList.get(i));
+//		}
+		
+		
+		
+		// 분할 건수 카운터
+		int counter = 0;  
+/** @Map에 총 갯수가 수신자 갯수와 동일함 */
+		List<Map<String, String>> varList = kakaoVO.getVarListMap();
+		for (int i = 0; i < varList.size(); i++) {
+//		for(Map<String, String> variables : kakaoVO.getVarListMap()) {
+			// 치환 데이터
+			Map<String, String> variables = varList.get(i);
+			
+/** @공통 기본값 */		
+			KakaoSendAdvcVO sendVO = createSendVO(kakaoVO);
+			String msgId = idList.get(i);
+			sendVO.setMsgId(msgId);
+
+			// step1
+			// Step 1-1: 값 치환 및 수신번호 셋팅
+			// Step 1-2: 수신자 정보 설정 (callToList는 항상 설정).
+			if (variables.containsKey("callToList")) {
+				sendVO.setCallTo(variables.get("callToList"));
+				variables.remove("callToList"); // 사용 후 제거.
+			}
+
+/** @Step1-3: 템플릿 치환데이터 설정 */		
+			if (hasContentReplacement) {
+				templateContent = mjonCommon.ATReplaceTemplateVariables(templateContent, variables);
+				if(hasTitleReplacement) {
+					templateTitle = mjonCommon.ATReplaceTemplateVariables(templateTitle, variables);
+				}
+			}
+/** @버튼 치환 */			// 버튼 리스트가 있으면 치환 수행, 항상 sendVO에 설정
+			List<KakaoButtonVO> buttonList = templateDetail.getButtonList();
+			if(hasButtonReplacement) {
+				buttonList = replaceButtonLinks(buttonList, variables);
+			}
+			sendVO.setButtonList(buttonList);
+			
+			sendVO.setTemplateTitle(templateTitle);
+			sendVO.setTemplateContent(templateContent);
+
+
+			// Step 1-4: 실패 대체 문자 치환데이터 설정
+			if("Y".equals(kakaoVO.getSubMsgSendYn())) { // 대체문자가 있나?
+				if ("Y".equals(kakaoVO.getSubMsgTxtReplYn())) { // 치환데이터가 있나?
+					subMsgTxt = mjonCommon.ATReplaceTemplateVariables(subMsgTxt, variables);
+				}
+				sendVO.setSubMsgTxt(subMsgTxt);// 실패 
+			}
+			sendVO.setSubMsgSendYn(kakaoVO.getSubMsgSendYn()); 
+			
+			
+			/*
+						log.info("kakaoSendAdvcVO Details: [callTo={}\n, templateContent=\n{}\n, subMsgTxt=\n{}]\n\n\n\n",
+								kakaoSendAdvcVO.getCallTo(),
+								kakaoSendAdvcVO.getTemplateContent(),
+								kakaoSendAdvcVO.getSubMsgTxt()
+								);
+			*/
+
+			// Step1 END
+
+			
+// step3
+// 바이트 수 체크 및 금액설정
+			
+			
+			Float kakaoAtPrice = mberManageVO.getKakaoAtPrice();
+			// 유효한 단가 계산
+			float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice());
+			float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice());
+			
+			
+			String shortPStr = Float.toString(shortPrice);
+			String mmsPStr = Float.toString(longPrice);
+			
+			// 공통 가격 설정
+			sendVO.setSmsPrice(shortPStr);
+			sendVO.setMmsPrice(mmsPStr);
+			
+			
+			if("Y".equals(kakaoVO.getSubMsgSendYn())) {
+				int smsTxtByte = mjonCommon.getSmsTxtBytes(sendVO.getSubMsgTxt());
+				String sendType = getMsgType(smsTxtByte);
+				sendVO.setSubMsgType(sendType);
+
+				if ("INVALID".equals(sendType)) {
+					statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");return kakaoSendAdvcListVO;
+				}
+	
+				boolean isMms = "MMS".equals(sendType);
+				sendVO.setEachPrice(isMms ? mmsPStr : shortPStr);
+				
+				
+			} else {
+				kakaoAtPrice = getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice());
+				sendVO.setEachPrice( Float.toString(kakaoAtPrice) );
+			}
+			
+			
+			
+			// step4
+			// 예약 시간 설정 및 분할 데이터 설정
+			if ("Y".equalsIgnoreCase(kakaoVO.getReserveYn())  
+				&& "Y".equalsIgnoreCase(kakaoVO.getDivideChk())  
+				&& counter == Integer.parseInt(kakaoVO.getDivideCnt())) 
+			{
+				counter = 0;
+				calendar.add(Calendar.MINUTE, Integer.parseInt(kakaoVO.getDivideTime()));
+			}
+			counter++;
+			// 즉시 발송인경우 현재 시간 
+			// 예약인 경우 위에 설정한 시간 입력
+			sendVO.setReqDate(DATE_FORMATTER.format(calendar.getTime())); 
+			
+			
+			
+/** @step5 전송 메세지 설정 json파일 만들기*/
+			// 타이틀과 버튼이 있고
+			if(hasTitleOrButtons) {
+				// 버튼과 타이틀에 치환데이터가 있으면 json String을 계속 생성
+				if(needsJsonReplacement) {
+					sharedJsonStr = kakaoApiJsonSave.kakaoApiJsonSave_advc(sendVO, templateDetail);
+					sendVO.setBizJsonName(msgId);
+					sendVO.setJsonStr(sharedJsonStr);
+				} else if (StringUtils.isEmpty(sharedJsonStr)) {
+					// 치환 데이터가 없고 아직 생성되지 않았으면 한 번만 생성
+					sharedJsonStr = kakaoApiJsonSave.kakaoApiJsonSave_advc(sendVO, templateDetail);
+					sendVO.setBizJsonName(idList.get(0));
+					sendVO.setJsonStr(sharedJsonStr);
+				}else {
+					sendVO.setBizJsonName(idList.get(0));
+				}
+				
+			}
+			kakaoSendAdvcListVO.add(sendVO);
+		}
+		
+		
+		return kakaoSendAdvcListVO;
+	}
+	
+	private Calendar setupBaseDate(KakaoVO kakaoVO, boolean isNotified) throws ParseException {
+		// 예약 시간 기본값 설정
+		Date now = new Date();
+		// ReqDate가 비어 있으면 현재 시간으로 설정, 그렇지 않으면 ReqDate로 설정
+		// 화면에서 예약문자면 예약시간을 regDate로 설정한다.
+		Date baseDate;
+		if (StringUtils.isEmpty(kakaoVO.getReqDate())) {
+			kakaoVO.setReqDate(DATE_FORMATTER.format(now));  // ReqDate에 현재 시간 설정
+		    baseDate = now;
+		} else {
+		    baseDate = DATE_FORMATTER.parse(kakaoVO.getReqDate()); // ReqDate를 baseDate로 설정
+		}
+		
+		// 시간 성정
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(baseDate);  // calendar에 baseDate 설정
+		
+		// 지연 여부 처리
+		// 알림톡 스미싱의심 + 공휴일알림 조건이 맞으면 30분 delay
+		if ( "Y".equalsIgnoreCase(kakaoVO.getAtSmishingYn())
+				&& isNotified) {
+			calendar.add(Calendar.MINUTE, 30); // 모든 시간을 30분 뒤로 미룸
+		}
+		return calendar;
+	}
+
+	/**
+	 * @methodName	: createSendVO 
+	 * @author		: 이호영
+	 * @date		: 2025. 3. 19.
+	 * @description	:  populateSendLists 반복에 필요한 공통생성 부분
+	 * @return : KakaoSendAdvcVO
+	 * @param kakaoVO
+	 * @return
+	 * 
+	 */
+	private KakaoSendAdvcVO createSendVO(KakaoVO kakaoVO) {
+		KakaoSendAdvcVO sendVO = new KakaoSendAdvcVO();
+		sendVO.setMsgType("8");
+		sendVO.setSenderKey(kakaoVO.getSenderKey());
+		sendVO.setTemplateCode(kakaoVO.getTemplateCode());
+		sendVO.setUserId(kakaoVO.getUserId());
+		sendVO.setCallFrom(kakaoVO.getCallFrom());
+		sendVO.setAgentCode("04");
+		return sendVO;
+	}
+	
+	private List<KakaoButtonVO> replaceButtonLinks(List<KakaoButtonVO> buttonList,
+			Map<String, String> variables) {
+
+		if (buttonList != null) {
+			for (KakaoButtonVO button : buttonList) {
+				// 각 링크 필드에 대해 치환 수행
+				if (button.getLinkAnd() != null) {
+					button.setLinkAnd(mjonCommon.ATReplaceTemplateVariables(button.getLinkAnd(), variables));
+				}
+				if (button.getLinkIos() != null) {
+					button.setLinkIos(mjonCommon.ATReplaceTemplateVariables(button.getLinkIos(), variables));
+				}
+				if (button.getLinkMo() != null) {
+					button.setLinkMo(mjonCommon.ATReplaceTemplateVariables(button.getLinkMo(), variables));
+				}
+				if (button.getLinkPc() != null) {
+					button.setLinkPc(mjonCommon.ATReplaceTemplateVariables(button.getLinkPc(), variables));
+				}
+			}
+			// 치환된 버튼 리스트를 sendVO에 반영
+//			sendVO.setButtonList(buttonList); // KakaoSendAdvcVO에 setButtonList가 있다고 가정
+		}
+		
+		return buttonList;
+	}
+
+	/**
+	 * 버튼 리스트에 치환 패턴(#{...})이 있는지 확인합니다.
+	 * @param buttonList 버튼 리스트 (null 가능)
+	 * @return 치환 패턴이 있으면 true, 없으면 false
+	 */
+	private boolean needsButtonReplacement(List<KakaoButtonVO> buttonList) {
+		if (buttonList == null) {
+			return false;
+		}
+		return buttonList.stream().anyMatch(button -> 
+			replBooleanStrChecker(button.getLinkAnd()) ||
+			replBooleanStrChecker(button.getLinkIos()) ||
+			replBooleanStrChecker(button.getLinkMo()) ||
+			replBooleanStrChecker(button.getLinkPc())
+		);
+	}
+
+	/**
+	 * 입력 문자열에 치환 패턴(#{...})이 있는지 확인합니다.
+	 * @param input 확인할 문자열 (null 가능)
+	 * @return 치환 패턴이 있으면 true, 없으면 false
+	 */
+	private boolean replBooleanStrChecker(String input) {
+		// #{...} 패턴을 확인하는 정규 표현식
+		if (input == null) {
+			return false;
+		}
+		Matcher matcher = REPLACEMENT_PATTERN.matcher(input);
+		return matcher.find();
+	}
+
+
+	public Float getValidPrice(Float personalPrice, Float defaultPrice) {
+		return (personalPrice != null && personalPrice > 0) ? personalPrice : defaultPrice;
+	}
+
+
+	/**
+	 * @methodName	: getMsgType 
+	 * @author		: 이호영
+	 * @date		: 2025. 3. 12.
+	 * @description	: 메세지 타입 구하기
+	 * @return : String
+	 * @param smsTxtByte
+	 * @return
+	 * 
+	 */
+	private String getMsgType(int smsTxtByte) {
+		// TODO Auto-generated method stub
+
+		String msgType = SHORT_MSG_TYPE;
+
+		// 1. 2000 Byte 초과는 에러 처리
+		if (smsTxtByte > 2000) {
+			return "INVALID";
+		}
+
+		// 2. 문자 길이에 따라 메시지 타입 설정 (90 Byte 초과는 장문)
+		if (smsTxtByte > 90) {
+			msgType = LONG_MSG_TYPE;
+		}
+		
+		return msgType;
+	}
+
+
+
+	
 	
 	
 	/**
@@ -34,13 +419,11 @@
 	*/
 	public KakaoVO kakaoSendPrice(KakaoVO kakaoVO) throws Exception {
 		
-		//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
-		String befCash = kakaoVO.getBefCash();
+		System.out.println(" :: kakaoSendPrice :: ");
 		
-		//VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴
-		if("".equals(befCash) || befCash == null) {
-			
-		}
+		//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
+//		String befCash = kakaoVO.getBefCash();
+		
 		MjonMsgVO mjonMsgVO = new MjonMsgVO();
 		mjonMsgVO.setUserId(kakaoVO.getUserId());
 		String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
@@ -55,6 +438,7 @@
 		
 		/** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */
 		//대체문자 발송 여부 확인
+		System.out.println(" :: kakaoVO.getSubMsgSendYn() :: "+ kakaoVO.getSubMsgSendYn());
 		if(kakaoVO.getSubMsgSendYn().equals("Y")) {
 			
 			
@@ -401,6 +785,107 @@
 						varValInfo = kakaoVO.getVarValList().get(count);
 					}
 					String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, varValInfo);
+					setSendMsgVO.setBizJsonName(jsonFileName); //json 파일명
+				}
+				
+				kakaoSendList.add(setSendMsgVO);
+			}
+			kakaoVO.setKakaoSendList(kakaoSendList);
+			
+		} catch (Exception e) {
+			System.out.println(e.toString());
+			e.printStackTrace();
+		}
+		
+		return kakaoVO;
+	}
+	
+	/**
+	 * @methodName	: kakaoSendMsg_advc 
+	 * @author		: 이호영
+	 * @date		: 2025. 3. 13.
+	 * @description	: kakaoSendMsg 개선
+	 * @return : KakaoVO
+	 * @param kakaoVO
+	 * @return
+	 * @throws Exception
+	 * 
+	 */
+	public KakaoVO kakaoSendMsg_advc(KakaoVO kakaoVO) throws Exception {
+		List<KakaoVO> kakaoSendList = new ArrayList<KakaoVO>();
+		//전체 받는사람 수량만큼 반복 확인
+		int callToCnt = kakaoVO.getCallToList().length;	
+		try {
+			for(int count =0; count < callToCnt; count++) {
+				
+				KakaoVO setSendMsgVO = new KakaoVO();
+				
+				setSendMsgVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호
+				// 카카오 전송내용 설정
+				// 변환문자 포함(Y), 미포함(N)
+				if(kakaoVO.getTxtReplYn().equals("Y")) {
+					
+					String templateContent = kakaoSubMagTxtRepl(kakaoVO.getTemplateContent(), kakaoVO, count);
+					setSendMsgVO.setTemplateContent(templateContent);
+					
+					if(kakaoVO.getTemplateEmphasizeType().equals("TEXT")) {
+						
+						String title = kakaoSubMagTxtRepl(kakaoVO.getTemplateTitle(), kakaoVO, count);
+						String subTitle = kakaoVO.getTemplateSubtitle();
+//						title = title +"§§"+ subTitle;
+						setSendMsgVO.setTemplateEmphasizeType(kakaoVO.getTemplateEmphasizeType());
+						setSendMsgVO.setTemplateTitle(title);
+					}
+					
+				}else {
+					
+					if(kakaoVO.getTemplateEmphasizeType().equals("TEXT")) {
+						
+						String title = kakaoSubMagTxtRepl(kakaoVO.getTemplateTitle(), kakaoVO, count);
+						String subTitle = kakaoVO.getTemplateSubtitle();
+//						title = title +"§§"+ subTitle;
+						setSendMsgVO.setTemplateEmphasizeType(kakaoVO.getTemplateEmphasizeType());
+						setSendMsgVO.setTemplateTitle(title);
+					}
+					
+					// 템플릿 내용 설정
+					setSendMsgVO.setTemplateContent(kakaoVO.getTemplateContent());
+				}
+				
+				//대체문자 포함(Y), 미포함(N)
+				if(kakaoVO.getSubMsgSendYn().equals("Y")) {
+					
+					String charset = "euc-kr";	//문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산
+					
+					String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n");
+					kakaoVO.setKakaoSubMagOrgnlTxt(tempSubMagTxt);
+					if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) {
+						tempSubMagTxt = kakaoSubMagTxtRepl(tempSubMagTxt, kakaoVO, count);
+					}
+					System.out.println("@@  대체문자내용 : " + tempSubMagTxt);
+					setSendMsgVO.setSubMsgTxt(tempSubMagTxt);
+					
+					int FrBytes = tempSubMagTxt.getBytes(charset).length;
+					System.out.println("@@  대체문자길이 : " + FrBytes);
+					//메세지 길이가 90Byte가 초과시 MMS
+					if(FrBytes > 90) {
+						setSendMsgVO.setSubMsgType("MMS");
+					}else {// 아니면 SMS
+						setSendMsgVO.setSubMsgType("SMS");
+					}
+					
+					System.out.println("@@  대체문자타입 : " + setSendMsgVO.getSubMsgType());
+				}
+				
+				if(kakaoVO.getBizJsonYn().equals("Y")) {
+					kakaoVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호
+					
+					String[] varValInfo = null;
+					if( kakaoVO.getVarValList().size() != 0) {
+						varValInfo = kakaoVO.getVarValList().get(count);
+					}
+					String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, varValInfo);
+//					String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave_advc(kakaoVO, varValInfo);
 //					String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, kakaoVO.getVarValList().get(count));
 					setSendMsgVO.setBizJsonName(jsonFileName); //json 파일명
 				}
@@ -509,6 +994,7 @@
 	
 	
 	public String kakaoSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) {
+		System.out.println("tempSubMagTxt : "+ tempSubMagTxt);
 		
 //		String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n");
 //		String tempSubMagTxt = msgTxt;
@@ -550,6 +1036,7 @@
 		}
 		return tempSubMagTxt;
 	}
+	
 	
 	public String kakaoFTSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) throws Exception{
 
@@ -704,5 +1191,10 @@
 		//}
 		return "";
 	}
-	
+
+	public static void statusResponseSet (StatusResponse statusResponse, HttpStatus httpStatus, String msg ) {
+		statusResponse.setStatus(httpStatus);
+		statusResponse.setMessage(msg);
+		
+	}
 }
src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java
--- src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java
+++ src/main/java/itn/let/kakao/kakaoComm/KakaoVO.java
@@ -2,8 +2,11 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import itn.let.mjo.msg.service.MjonMsgVO;
+import lombok.Getter;
+import lombok.Setter;
 
 /**
 * @FileName : KakaoVO.java
@@ -13,6 +16,8 @@
 
 * @프로그램 설명 : 카카오톡 요청 변수 목록 (문자온VO를 상속 받음)
 */
+@Getter
+@Setter
 public class KakaoVO extends MjonMsgVO{
 
 	private static final long serialVersionUID = 536382850588307019L;
@@ -246,996 +251,69 @@
 	private String successCntDay;
 	private String successCntMonth;
 	private String successCntYear;
-
-	public String getSuccessDay() {
-		return successDay;
-	}
-
-	public void setSuccessDay(String successDay) {
-		this.successDay = successDay;
-	}
-
-	public String getSuccessMonth() {
-		return successMonth;
-	}
-
-	public void setSuccessMonth(String successMonth) {
-		this.successMonth = successMonth;
-	}
-
-	public String getSuccessYear() {
-		return successYear;
-	}
-
-	public void setSuccessYear(String successYear) {
-		this.successYear = successYear;
-	}
 	
-	public String getSuccessCntDay() {
-		return successCntDay;
-	}
-
-	public void setSuccessCntDay(String successCntDay) {
-		this.successCntDay = successCntDay;
-	}
-
-	public String getSuccessCntMonth() {
-		return successCntMonth;
-	}
-
-	public void setSuccessCntMonth(String successCntMonth) {
-		this.successCntMonth = successCntMonth;
-	}
-
-	public String getSuccessCntYear() {
-		return successCntYear;
-	}
-
-	public void setSuccessCntYear(String successCntYear) {
-		this.successCntYear = successCntYear;
-	}
 	
-	public static long getSerialversionuid() {
-		return serialVersionUID;
-	}
-
-	public String getCategoryDepth() {
-		return categoryDepth;
-	}
-
-	public void setCategoryDepth(String categoryDepth) {
-		this.categoryDepth = categoryDepth;
-	}
-
-	public String getCategoryType() {
-		return categoryType;
-	}
-
-	public void setCategoryType(String categoryType) {
-		this.categoryType = categoryType;
-	}
-
-	public String getCategoryCode() {
-		return categoryCode;
-	}
-
-	public void setCategoryCode(String categoryCode) {
-		this.categoryCode = categoryCode;
-	}
-
-	public String getCategoryGroupName() {
-		return categoryGroupName;
-	}
-
-	public void setCategoryGroupName(String categoryGroupName) {
-		this.categoryGroupName = categoryGroupName;
-	}
-
-	public String getCategoryName() {
-		return categoryName;
-	}
-
-	public void setCategoryName(String categoryName) {
-		this.categoryName = categoryName;
-	}
-
-	public String getCategoryInclusion() {
-		return categoryInclusion;
-	}
-
-	public void setCategoryInclusion(String categoryInclusion) {
-		this.categoryInclusion = categoryInclusion;
-	}
-
-	public String getCategoryExclusion() {
-		return categoryExclusion;
-	}
-
-	public void setCategoryExclusion(String categoryExclusion) {
-		this.categoryExclusion = categoryExclusion;
-	}
-
-	public String getBizUrl() {
-		return bizUrl;
-	}
 	
-	public void setBizUrl(String bizUrl) {
-		this.bizUrl = bizUrl;
-	}
+	//재전송 영역
+	private String msgResendAllFlag;
+	private String msgResendAllGroupId;
+	private String msgResendAllTmpKey;
+	private String msgResendAllYellowId;
 
-	public String getBizReturnMsg() {
-		return bizReturnMsg;
-	}
-	
-	public void setBizReturnMsg(String bizReturnMsg) {
-		this.bizReturnMsg = bizReturnMsg;
-	}
+	private List<Map<String, String>> varListMap;
 
-	public String getBizReturnCode() {
-		return bizReturnCode;
-	}
-	
-	public void setBizReturnCode(String bizReturnCode) {
-		this.bizReturnCode = bizReturnCode;
-	}
-
-	public String getPhoneNumber() {
-		return phoneNumber;
-	}
-	
-	public void setPhoneNumber(String phoneNumber) {
-		this.phoneNumber = phoneNumber;
-	}
-
-	public String getYellowId() {
-		return yellowId;
-	}
-	
-	public void setYellowId(String yellowId) {
-		this.yellowId = yellowId;
-	}
-
-	public String getBizJsonName() {
-		return bizJsonName;
-	}
-
-	public void setBizJsonName(String bizJsonName) {
-		this.bizJsonName = bizJsonName;
-	}
-
-	public String getToken() {
-		return token;
-	}
-
-	public void setToken(String token) {
-		this.token = token;
-	}
-
-	public String getSenderKey() {
-		return senderKey;
-	}
-
-	public void setSenderKey(String senderKey) {
-		this.senderKey = senderKey;
-	}
-
-	public String getProfileId() {
-		return profileId;
-	}
-
-	public void setProfileId(String profileId) {
-		this.profileId = profileId;
-	}
-
-	public String getUserId() {
-		return userId;
-	}
-
-	public void setUserId(String userId) {
-		this.userId = userId;
-	}
-
-	public String getImgTitle() {
-		return imgTitle;
-	}
-
-	public void setImgTitle(String imgTitle) {
-		this.imgTitle = imgTitle;
-	}
-
-	public String getImageType() {
-		return imageType;
-	}
-
-	public void setImageType(String imageType) {
-		this.imageType = imageType;
-	}
-
-	public String getImgLink() {
-		return imgLink;
-	}
-
-	public void setImgLink(String imgLink) {
-		this.imgLink = imgLink;
-	}
-
-	public String getTemplateName() {
-		return templateName;
-	}
-
-	public void setTemplateName(String templateName) {
-		this.templateName = templateName;
-	}
-
-	public String getTemplateMessageType() {
-		return templateMessageType;
-	}
-
-	public void setTemplateMessageType(String templateMessageType) {
-		this.templateMessageType = templateMessageType;
-	}
-
-	public String getTemplateEmphasizeType() {
-		return templateEmphasizeType;
-	}
-
-	public void setTemplateEmphasizeType(String templateEmphasizeType) {
-		this.templateEmphasizeType = templateEmphasizeType;
-	}
-
-	public String getTemplateContent() {
-		return templateContent;
-	}
-
-	public void setTemplateContent(String templateContent) {
-		this.templateContent = templateContent;
-	}
-
-	public String getTemplateExtra() {
-		return templateExtra;
-	}
-
-	public void setTemplateExtra(String templateExtra) {
-		this.templateExtra = templateExtra;
-	}
-
-	public String getTamplateAd() {
-		return tamplateAd;
-	}
-
-	public void setTamplateAd(String tamplateAd) {
-		this.tamplateAd = tamplateAd;
-	}
-
-	public String getTemplateImageName() {
-		return templateImageName;
-	}
-
-	public void setTemplateImageName(String templateImageName) {
-		this.templateImageName = templateImageName;
-	}
-
-	public String getTemplateImageUrl() {
-		return templateImageUrl;
-	}
-
-	public void setTemplateImageUrl(String templateImageUrl) {
-		this.templateImageUrl = templateImageUrl;
-	}
-
-	public String getTemplateTitle() {
-		return templateTitle;
-	}
-
-	public void setTemplateTitle(String templateTitle) {
-		this.templateTitle = templateTitle;
-	}
-
-	public String getTemplateSubtitle() {
-		return templateSubtitle;
-	}
-
-	public void setTemplateSubtitle(String templateSubtitle) {
-		this.templateSubtitle = templateSubtitle;
-	}
-
-	public String getTemplateHeader() {
-		return templateHeader;
-	}
-
-	public void setTemplateHeader(String templateHeader) {
-		this.templateHeader = templateHeader;
-	}
-
-	public Boolean getSecurityFlag() {
-		return securityFlag;
-	}
-
-	public void setSecurityFlag(Boolean securityFlag) {
-		this.securityFlag = securityFlag;
-	}
-
-	public List<KakaoButtonVO> getButtonVOList() {
-		return buttonVOList;
-	}
-
-	public void setButtonVOList(List<KakaoButtonVO> buttonVOList) {
-		this.buttonVOList = buttonVOList;
-	}
-
-	public String getButtonName() {
-		return buttonName;
-	}
-
-	public void setButtonName(String buttonName) {
-		this.buttonName = buttonName;
-	}
-
-	public String getButtonLinkType() {
-		return buttonLinkType;
-	}
-
-	public void setButtonLinkType(String buttonLinkType) {
-		this.buttonLinkType = buttonLinkType;
-	}
-
-	public String getButtonLinkAnd() {
-		return buttonLinkAnd;
-	}
-
-	public void setButtonLinkAnd(String buttonLinkAnd) {
-		this.buttonLinkAnd = buttonLinkAnd;
-	}
-
-	public String getButtonLinkIos() {
-		return buttonLinkIos;
-	}
-
-	public void setButtonLinkIos(String buttonLinkIos) {
-		this.buttonLinkIos = buttonLinkIos;
-	}
-
-	public String getButtonLinkMo() {
-		return buttonLinkMo;
-	}
-
-	public void setButtonLinkMo(String buttonLinkMo) {
-		this.buttonLinkMo = buttonLinkMo;
-	}
-
-	public String getButtonLinkPc() {
-		return buttonLinkPc;
-	}
-
-	public void setButtonLinkPc(String buttonLinkPc) {
-		this.buttonLinkPc = buttonLinkPc;
-	}
-
-	public String getButtonPluginId() {
-		return buttonPluginId;
-	}
-
-	public void setButtonPluginId(String buttonPluginId) {
-		this.buttonPluginId = buttonPluginId;
-	}
-
-	public String getQuickName() {
-		return quickName;
-	}
-
-	public void setQuickName(String quickName) {
-		this.quickName = quickName;
-	}
-
-	public String getQuickLinkType() {
-		return quickLinkType;
-	}
-
-	public void setQuickLinkType(String quickLinkType) {
-		this.quickLinkType = quickLinkType;
-	}
-
-	public String getQuickLinkAnd() {
-		return quickLinkAnd;
-	}
-
-	public void setQuickLinkAnd(String quickLinkAnd) {
-		this.quickLinkAnd = quickLinkAnd;
-	}
-
-	public String getQuickLinkIos() {
-		return quickLinkIos;
-	}
-
-	public void setQuickLinkIos(String quickLinkIos) {
-		this.quickLinkIos = quickLinkIos;
-	}
-
-	public String getQuickLinkMo() {
-		return quickLinkMo;
-	}
-
-	public void setQuickLinkMo(String quickLinkMo) {
-		this.quickLinkMo = quickLinkMo;
-	}
-
-	public String getQuickLinkPc() {
-		return quickLinkPc;
-	}
-
-	public void setQuickLinkPc(String quickLinkPc) {
-		this.quickLinkPc = quickLinkPc;
-	}
-
-	public String getSenderKeyType() {
-		return senderKeyType;
-	}
-
-	public void setSenderKeyType(String senderKeyType) {
-		this.senderKeyType = senderKeyType;
-	}
-
-	public String getDeleteYn() {
-		return deleteYn;
-	}
-
-	public void setDeleteYn(String deleteYn) {
-		this.deleteYn = deleteYn;
-	}
-
-	public String getTemplateCode() {
-		return templateCode;
-	}
-
-	public void setTemplateCode(String templateCode) {
-		this.templateCode = templateCode;
-	}
-
-	public String getNewTemplateCode() {
-		return newTemplateCode;
-	}
-
-	public void setNewTemplateCode(String newTemplateCode) {
-		this.newTemplateCode = newTemplateCode;
-	}
-
-	public String[] getArrTemplateCode() {
-		return arrTemplateCode;
-	}
-
-	public void setArrTemplateCode(String[] arrTemplateCode) {
-		this.arrTemplateCode = arrTemplateCode;
-	}
-
-	public String getTemplateStatus() {
-		return templateStatus;
-	}
-
-	public void setTemplateStatus(String templateStatus) {
-		this.templateStatus = templateStatus;
-	}
-
-	public String getKeyword() {
-		return keyword;
-	}
-
-	public void setKeyword(String keyword) {
-		this.keyword = keyword;
-	}
-
-	public String getSendPhone() {
-		return sendPhone;
-	}
-
-	public void setSendPhone(String sendPhone) {
-		this.sendPhone = sendPhone;
-	}
-
-	public String getDestPhone() {
-		return destPhone;
-	}
-
-	public void setDestPhone(String destPhone) {
-		this.destPhone = destPhone;
-	}
-
-	public String getSubMsgSendYn() {
-		return subMsgSendYn;
-	}
-
-	public void setSubMsgSendYn(String subMsgSendYn) {
-		this.subMsgSendYn = subMsgSendYn;
-	}
-
-	public String getCount() {
-		return count;
-	}
-
-	public void setCount(String count) {
-		this.count = count;
-	}
-
-	public String getPage() {
-		return page;
-	}
-
-	public void setPage(String page) {
-		this.page = page;
-	}
-
-	public String getBizUmid() {
-		return bizUmid;
-	}
-
-	public void setBizUmid(String bizUmid) {
-		this.bizUmid = bizUmid;
-	}
-
-	public List<String> getVarNmList() {
-		return varNmList;
-	}
-
-	public void setVarNmList(List<String> varNmList) {
-		this.varNmList = varNmList;
-	}
-
-	public List<String[]> getVarValList() {
-		return varValList;
-	}
-
-	public void setVarValList(List<String[]> varValList) {
-		this.varValList = varValList;
-	}
-
-	public String getFormListType() {
-		return formListType;
-	}
-
-	public void setFormListType(String formListType) {
-		this.formListType = formListType;
-	}
-
-	public String getSubMsgTxt() {
-		return subMsgTxt;
-	}
-
-	public void setSubMsgTxt(String subMsgTxt) {
-		this.subMsgTxt = subMsgTxt;
-	}
-
-	public String getBizJsonYn() {
-		return bizJsonYn;
-	}
-
-	public void setBizJsonYn(String bizJsonYn) {
-		this.bizJsonYn = bizJsonYn;
-	}
-
-	public String getSendType() {
-		return sendType;
-	}
-
-	public void setSendType(String sendType) {
-		this.sendType = sendType;
-	}
-
-	public String getAdFlag() {
-		return adFlag;
-	}
-
-	public void setAdFlag(String adFlag) {
-		this.adFlag = adFlag;
-	}
-
-	public List<KakaoVO> getKakaoSendList() {
-		return kakaoSendList;
-	}
-
-	public void setKakaoSendList(List<KakaoVO> kakaoSendList) {
-		this.kakaoSendList = kakaoSendList;
-	}
-
-	public String getSubMsgTxtReplYn() {
-		return subMsgTxtReplYn;
-	}
-
-	public void setSubMsgTxtReplYn(String subMsgTxtReplYn) {
-		this.subMsgTxtReplYn = subMsgTxtReplYn;
-	}
-	
-	public String getSubMsgType() {
-		return subMsgType;
-	}
-
-	public void setSubMsgType(String subMsgType) {
-		this.subMsgType = subMsgType;
-	}
-	public List<String[]> varValPaser(String[] varValList){
-		
-		List<String[]> returnVarVal = new ArrayList<>();
-		
-		for(String varVal : varValList)
-		{
-			String[] strList = varVal.split("§");
-			returnVarVal.add(strList);
+	@Override
+	public String toString() {
+		String varListMapString = "[";
+		if (varListMap != null && !varListMap.isEmpty()) {
+			StringBuilder sb = new StringBuilder();
+			for (Map<String, String> map : varListMap) {
+				if (sb.length() > 0)
+					sb.append(", ");
+				if (map == null) {
+					sb.append("null");
+				} else {
+					sb.append("{");
+					String prefix = "";
+					for (Map.Entry<String, String> entry : map.entrySet()) {
+						sb.append(prefix).append(entry.getKey()).append("=").append(entry.getValue());
+						prefix = ", ";
+					}
+					sb.append("}");
+				}
+			}
+			varListMapString += sb.toString();
 		}
+		varListMapString += "]";
 		
-		return returnVarVal;
+		return "KakaoSendAdvcVO[" +
+			"\n senderKey=[" + senderKey + "]" +
+			"\n , subMsgTxtReplYn=[" + subMsgTxtReplYn + "]" +
+			"\n , subMsgSendYn=[" + subMsgSendYn + "]" +
+			"\n , reserveYn=[" + getReserveYn() + "]" +
+			"\n , divideCnt=[" + getDivideCnt() + "]" +
+			"\n , bizJsonYn=[" + bizJsonYn + "]" +
+			"\n , templateEmphasizeType=[" + templateEmphasizeType + "]" +
+			"\n , templateSubtitle=[" + templateSubtitle + "]" +
+			"\n , txtReplYn=[" + getTxtReplYn() + "]" +
+			"\n , callFrom=[" + getCallFrom() + "]" +
+			"\n , templateCode=[" + templateCode + "]" +
+			"\n , divideTime=[" + getDivideTime() + "]" +
+			"\n , reqDate=[" + getReqDate() + "]" +
+			"\n , atSmishingYn=[" + getAtSmishingYn() + "]" +
+			"\n , menuTopTab=[" + menuTopTab + "]" +
+			"\n , templateContent=[" + templateContent + "]" +
+			"\n , templateTitle=[" + templateTitle + "]" +
+			"\n , subMsgTxt=[" + subMsgTxt + "]" +
+			"\n , divideChk=[" + getDivideChk() + "]" +
+			"\n , sendType=[" + sendType + "]" +
+			"\n , msgType=[" + getMsgType() + "]" +
+			"\n , userId=[" + userId + "]" +
+			"\n , varListMap=[" + varListMapString + "]" +
+			"\n , befCash=[" + getBefCash() + "]" +
+			"\n , befPoint=[" + getBefPoint() + "]" +
+			"\n ]";
 	}
-
-	public String getMenuTopTab() {
-		return menuTopTab;
-	}
-
-	public void setMenuTopTab(String menuTopTab) {
-		this.menuTopTab = menuTopTab;
-	}
-
-	public String getMenuSubTab() {
-		return menuSubTab;
-	}
-
-	public void setMenuSubTab(String menuSubTab) {
-		this.menuSubTab = menuSubTab;
-	}
-
-	public String getSearchCondition2() {
-		return searchCondition2;
-	}
-
-	public void setSearchCondition2(String searchCondition2) {
-		this.searchCondition2 = searchCondition2;
-	}
-
-	public String getKakaoResendSuccCount() {
-		return kakaoResendSuccCount;
-	}
-
-	public void setKakaoResendSuccCount(String kakaoResendSuccCount) {
-		this.kakaoResendSuccCount = kakaoResendSuccCount;
-	}
-
-	public String getKakaoResendFailCount() {
-		return kakaoResendFailCount;
-	}
-
-	public void setKakaoResendFailCount(String kakaoResendFailCount) {
-		this.kakaoResendFailCount = kakaoResendFailCount;
-	}
-
-	public String getAtSuccessCount() {
-		return atSuccessCount;
-	}
-
-	public void setAtSuccessCount(String atSuccessCount) {
-		this.atSuccessCount = atSuccessCount;
-	}
-
-	public String getFtSuccessCount() {
-		return ftSuccessCount;
-	}
-
-	public void setFtSuccessCount(String ftSuccessCount) {
-		this.ftSuccessCount = ftSuccessCount;
-	}
-
-	public String getAtFailCount() {
-		return atFailCount;
-	}
-
-	public void setAtFailCount(String atFailCount) {
-		this.atFailCount = atFailCount;
-	}
-
-	public String getFtFailCount() {
-		return ftFailCount;
-	}
-
-	public void setFtFailCount(String ftFailCount) {
-		this.ftFailCount = ftFailCount;
-	}
-
-	public String getAtSuccPrice() {
-		return atSuccPrice;
-	}
-
-	public void setAtSuccPrice(String atSuccPrice) {
-		this.atSuccPrice = atSuccPrice;
-	}
-
-	public String getFtSuccPrice() {
-		return ftSuccPrice;
-	}
-
-	public void setFtSuccPrice(String ftSuccPrice) {
-		this.ftSuccPrice = ftSuccPrice;
-	}
-
-	public String getAtFailPrice() {
-		return atFailPrice;
-	}
-
-	public void setAtFailPrice(String atFailPrice) {
-		this.atFailPrice = atFailPrice;
-	}
-
-	public String getFtFailPrice() {
-		return ftFailPrice;
-	}
-
-	public void setFtFailPrice(String ftFailPrice) {
-		this.ftFailPrice = ftFailPrice;
-	}
-
-	public String getKakaoResendSuccPrice() {
-		return kakaoResendSuccPrice;
-	}
-
-	public void setKakaoResendSuccPrice(String kakaoResendSuccPrice) {
-		this.kakaoResendSuccPrice = kakaoResendSuccPrice;
-	}
-
-	public String getKakaoResendFailPrice() {
-		return kakaoResendFailPrice;
-	}
-
-	public void setKakaoResendFailPrice(String kakaoResendFailPrice) {
-		this.kakaoResendFailPrice = kakaoResendFailPrice;
-	}
-
-	public String getAtSuccCntSum() {
-		return atSuccCntSum;
-	}
-
-	public void setAtSuccCntSum(String atSuccCntSum) {
-		this.atSuccCntSum = atSuccCntSum;
-	}
-
-	public String getFtSuccCntSum() {
-		return ftSuccCntSum;
-	}
-
-	public void setFtSuccCntSum(String ftSuccCntSum) {
-		this.ftSuccCntSum = ftSuccCntSum;
-	}
-
-	public String getAtFailCntSum() {
-		return atFailCntSum;
-	}
-
-	public void setAtFailCntSum(String atFailCntSum) {
-		this.atFailCntSum = atFailCntSum;
-	}
-
-	public String getFtFailCntSum() {
-		return ftFailCntSum;
-	}
-
-	public void setFtFailCntSum(String ftFailCntSum) {
-		this.ftFailCntSum = ftFailCntSum;
-	}
-
-	public String getKakaoResenSuccSum() {
-		return kakaoResenSuccSum;
-	}
-
-	public void setKakaoResenSuccSum(String kakaoResenSuccSum) {
-		this.kakaoResenSuccSum = kakaoResenSuccSum;
-	}
-
-	public String getKakaoResenFailSum() {
-		return kakaoResenFailSum;
-	}
-
-	public void setKakaoResenFailSum(String kakaoResenFailSum) {
-		this.kakaoResenFailSum = kakaoResenFailSum;
-	}
-
-	public String getAtSuccPriceSum() {
-		return atSuccPriceSum;
-	}
-
-	public void setAtSuccPriceSum(String atSuccPriceSum) {
-		this.atSuccPriceSum = atSuccPriceSum;
-	}
-
-	public String getFtSuccPriceSum() {
-		return ftSuccPriceSum;
-	}
-
-	public void setFtSuccPriceSum(String ftSuccPriceSum) {
-		this.ftSuccPriceSum = ftSuccPriceSum;
-	}
-
-	public String getAtFailPriceSum() {
-		return atFailPriceSum;
-	}
-
-	public void setAtFailPriceSum(String atFailPriceSum) {
-		this.atFailPriceSum = atFailPriceSum;
-	}
-
-	public String getFtFailPriceSum() {
-		return ftFailPriceSum;
-	}
-
-	public void setFtFailPriceSum(String ftFailPriceSum) {
-		this.ftFailPriceSum = ftFailPriceSum;
-	}
-
-	public String getKakaoResendSuccPriceSum() {
-		return kakaoResendSuccPriceSum;
-	}
-
-	public void setKakaoResendSuccPriceSum(String kakaoResendSuccPriceSum) {
-		this.kakaoResendSuccPriceSum = kakaoResendSuccPriceSum;
-	}
-
-	public String getKakaoResendFailPriceSum() {
-		return kakaoResendFailPriceSum;
-	}
-
-	public void setKakaoResendFailPriceSum(String kakaoResendFailPriceSum) {
-		this.kakaoResendFailPriceSum = kakaoResendFailPriceSum;
-	}
-
-	public String getFriendId() {
-		return friendId;
-	}
-
-	public void setFriendId(String friendId) {
-		this.friendId = friendId;
-	}
-
-	public String getImageTitle() {
-		return imageTitle;
-	}
-
-	public void setImageTitle(String imageTitle) {
-		this.imageTitle = imageTitle;
-	}
-
-	public String getImageLink() {
-		return imageLink;
-	}
-
-	public void setImageLink(String imageLink) {
-		this.imageLink = imageLink;
-	}
-
-	public String getJsonText() {
-		return jsonText;
-	}
-
-	public void setJsonText(String jsonText) {
-		this.jsonText = jsonText;
-	}
-
-	public String getImageFileName() {
-		return imageFileName;
-	}
-
-	public void setImageFileName(String imageFileName) {
-		this.imageFileName = imageFileName;
-	}
-
-	public String getSbscrbDe() {
-		return sbscrbDe;
-	}
-
-	public void setSbscrbDe(String sbscrbDe) {
-		this.sbscrbDe = sbscrbDe;
-	}
-
-	public String getMoblphonNo() {
-		return moblphonNo;
-	}
-
-	public void setMoblphonNo(String moblphonNo) {
-		this.moblphonNo = moblphonNo;
-	}
-
-	public String getDept() {
-		return dept;
-	}
-
-	public void setDept(String dept) {
-		this.dept = dept;
-	}
-
-	public String getAtchFileId() {
-		return atchFileId;
-	}
-
-	public void setAtchFileId(String atchFileId) {
-		this.atchFileId = atchFileId;
-	}
-
-	public String getWorkAtchFileId() {
-		return workAtchFileId;
-	}
-
-	public void setWorkAtchFileId(String workAtchFileId) {
-		this.workAtchFileId = workAtchFileId;
-	}
-
-	public String getFileSn() {
-		return fileSn;
-	}
-
-	public void setFileSn(String fileSn) {
-		this.fileSn = fileSn;
-	}
-
-	public String getFileCn() {
-		return fileCn;
-	}
-
-	public void setFileCn(String fileCn) {
-		this.fileCn = fileCn;
-	}
-
-	public String getFileStreCours() {
-		return fileStreCours;
-	}
-
-	public void setFileStreCours(String fileStreCours) {
-		this.fileStreCours = fileStreCours;
-	}
-
-	public String getOrignlFileNm() {
-		return orignlFileNm;
-	}
-
-	public void setOrignlFileNm(String orignlFileNm) {
-		this.orignlFileNm = orignlFileNm;
-	}
-
-	public String getStreFileNm() {
-		return streFileNm;
-	}
-
-	public void setStreFileNm(String streFileNm) {
-		this.streFileNm = streFileNm;
-	}
-
-	public String getFileExtsn() {
-		return fileExtsn;
-	}
-
-	public void setFileExtsn(String fileExtsn) {
-		this.fileExtsn = fileExtsn;
-	}
-
-	public String getFileSize() {
-		return fileSize;
-	}
-
-	public void setFileSize(String fileSize) {
-		this.fileSize = fileSize;
-	}
-
-	public int getStartCount() {
-		return startCount;
-	}
-
-	public void setStartCount(int startCount) {
-		this.startCount = startCount;
-	}
-
-	public int getEndCount() {
-		return endCount;
-	}
-
-	public void setEndCount(int endCount) {
-		this.endCount = endCount;
-	}
-
-	public String getPhmType() {
-		return phmType;
-	}
-
-	public void setPhmType(String phmType) {
-		this.phmType = phmType;
-	}
+	
+	
 }
src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java
--- src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java
+++ src/main/java/itn/let/kakao/kakaoComm/kakaoApi/KakaoApiJsonSave.java
@@ -8,6 +8,7 @@
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
@@ -18,6 +19,7 @@
 import itn.com.cmm.util.StringUtil;
 import itn.let.kakao.kakaoComm.KakaoButtonVO;
 import itn.let.kakao.kakaoComm.KakaoReturnVO;
+import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
 import itn.let.kakao.kakaoComm.KakaoVO;
 
 @Component
@@ -32,7 +34,57 @@
 	
 	static String json;
 	
-	@SuppressWarnings("unchecked")
+	public String kakaoApiJsonSave_advc(KakaoSendAdvcVO sendVO, KakaoReturnVO templateDetail) {
+		
+		// 버튼리스트 JSON 생성
+		JSONArray buttonList = new JSONArray();
+		for(KakaoButtonVO buttonInfoVO : sendVO.getButtonList()) {
+			JSONObject buttonInfo = new JSONObject();
+			
+			buttonInfo.put("name", buttonInfoVO.getName());
+			buttonInfo.put("type", buttonInfoVO.getLinkType());
+			
+			if(buttonInfoVO.getLinkType().equals("WL")) {
+				buttonInfo.put("url_mobile", buttonInfoVO.getLinkMo());
+				buttonInfo.put("url_pc", buttonInfoVO.getLinkPc());
+			}else if(buttonInfoVO.getLinkType().equals("AL")) {
+				buttonInfo.put("scheme_ios", buttonInfoVO.getLinkIos());
+				buttonInfo.put("scheme_android", buttonInfoVO.getLinkAnd());
+			}else if(buttonInfoVO.getLinkType().equals("BC")) {
+				// 상담톡 진행시 등록해야함
+			}else if(buttonInfoVO.getLinkType().equals("BT")) {
+				// 봇 전환 시 전달
+			}
+			buttonList.add(buttonInfo);
+		}
+		
+		// 강조유형 JSON 생성
+		JSONObject templateDetailInfo = new JSONObject();
+		String emphasizeType = templateDetail.getTemplateEmphasizeType();
+		
+		
+		if(emphasizeType.equals("TEXT")) {
+			templateDetailInfo.put("title", sendVO.getTemplateTitle());
+		}else if(emphasizeType.equals("IMAGE")) {
+			templateDetailInfo.put("msg_type", "ai");
+		}
+		
+		
+		JSONObject jo = new JSONObject();
+		
+		if(buttonList.size() != 0) {
+			jo.put("button", buttonList);
+		}
+		if(templateDetailInfo.size() != 0) {
+			jo.put("extra", templateDetailInfo);
+		}
+		
+		// 입력 json 데이터를 파일로 변경
+		String jsonStr = jo.toString();
+		
+		return jsonStr;
+	}
+	
 	public String kakaoApiJsonSave(KakaoVO kakaoVO, String[] varValInfo) {
 		// json파일 저장
 		
@@ -109,12 +161,12 @@
 					for(int i=0; i < varNm.length; i++) {
 						for(int j=0; j < varValInfo.length; j++) {
 							if (templateTitle.indexOf(varNm[i]) > -1) {
-				 				if(varValInfo[j] != null) {
-				 					templateTitle = templateTitle.replaceAll(varNm[i] , StringUtil.getString(varValInfo[j]));
-				 				}else {
-				 					templateTitle = templateTitle.replaceAll(varNm[i] , "");
-				 				}
-				 			}
+								if(varValInfo[j] != null) {
+									templateTitle = templateTitle.replaceAll(varNm[i] , StringUtil.getString(varValInfo[j]));
+								}else {
+									templateTitle = templateTitle.replaceAll(varNm[i] , "");
+								}
+							}
 						}
 					}
 					
@@ -140,8 +192,8 @@
 			
 			// 입력 json 데이터를 파일로 변경
 			String jsonStr = jo.toString();
-			System.out.println("jsonFileName  : "+jsonFileName);
-		
+//			System.out.println("jsonFileName  : "+jsonFileName);
+			
 			File outPut = new File(jsonFileName);
 			outPut.createNewFile();
 			
src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java
--- src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/service/KakaoAlimTalkService.java
@@ -2,7 +2,11 @@
 
 import java.util.List;
 
+import javax.servlet.http.HttpServletRequest;
+
+import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
 import itn.let.kakao.kakaoComm.KakaoVO;
+import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.msgdata.service.MjonMsgReturnVO;
 
 public interface KakaoAlimTalkService {
@@ -24,5 +28,7 @@
 	
 	//카카오 친구톡 전송 실패 환불리스트 조회
 	public void selectKakaoFtSentRefundList() throws Exception;
+
+	StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception;
 	
 }
src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java
--- src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkDAO.java
@@ -6,6 +6,7 @@
 import org.springframework.stereotype.Repository;
 
 import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
+import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
 import itn.let.kakao.kakaoComm.KakaoVO;
 
 @Repository("kakaoAlimTalkDAO")
@@ -39,15 +40,6 @@
 		} catch (Exception e) {
 			System.out.println("++++++++++++++++++++ selectDeleteProfileInfo DAO Error !!! " + e);
 		}
-		
-		return result;
-	}
-	
-	public int insertKakaoAtDataInfo(List<KakaoVO> kakaoAtSandList) throws Exception{
-		
-		int result = 0;
-		
-		result = update("kakaoAlimTalkDAO.insertKakaoAtDataInfo", kakaoAtSandList);
 		
 		return result;
 	}
@@ -94,4 +86,26 @@
 	public void updateKakaoFtNotSend(KakaoVO kakaoVO) {
 		select("kakaoAlimTalkDAO.updateKakaoFtNotSend", kakaoVO);
 	}
+	
+	public int insertKakaoAtDataInfo(List<KakaoVO> kakaoAtSandList) throws Exception{
+		
+		int result = 0;
+		
+		result = update("kakaoAlimTalkDAO.insertKakaoAtDataInfo", kakaoAtSandList);
+		
+		return result;
+	}
+
+	public int insertKakaoAtDataInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
+		
+		return update("kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc", kakaoSendAdvcVOList);
+	}
+
+	public void insertKakaoAtDataJsonInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
+		insert("kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc", kakaoSendAdvcVOList);
+	}
+
+	public void insertKakaoGroupDataTb_advc(KakaoSendAdvcVO sendVO) {
+		insert("kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc", sendVO);
+	}
 }
src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
--- src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/service/impl/KakaoAlimTalkServiceImpl.java
@@ -1,19 +1,40 @@
 package itn.let.kakao.user.kakaoAt.service.impl;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
+import java.time.Duration;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 
 import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
 import egovframework.rte.fdl.idgnr.EgovIdGnrService;
+import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
+import itn.com.cmm.LoginVO;
+import itn.com.cmm.MjonMsgSendVO;
+import itn.com.utl.fcc.service.EgovStringUtil;
+import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
+import itn.let.kakao.kakaoComm.KakaoSendUtil;
 import itn.let.kakao.kakaoComm.KakaoVO;
 import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService;
+import itn.let.mail.service.StatusResponse;
+import itn.let.mjo.mjocommon.MjonCommon;
 import itn.let.mjo.mjocommon.MjonHolidayApi;
 import itn.let.mjo.msg.service.MjonMsgVO;
 import itn.let.mjo.msg.service.impl.MjonMsgDAO;
@@ -24,9 +45,14 @@
 import itn.let.mjo.msgholiday.service.impl.MsgHolidayDAO;
 import itn.let.mjo.pay.service.MjonPayService;
 import itn.let.mjo.pay.service.MjonPayVO;
+import itn.let.module.base.PriceAndPoint;
 import itn.let.sym.site.service.JoinSettingVO;
 import itn.let.sym.site.service.impl.SiteManagerDAO;
+import itn.let.uss.umt.service.EgovUserManageService;
+import itn.let.uss.umt.service.UserManageVO;
+import lombok.extern.slf4j.Slf4j;
 
+@Slf4j
 @Service("kakaoAlimTalkService")
 public class KakaoAlimTalkServiceImpl extends EgovAbstractServiceImpl implements KakaoAlimTalkService{
 
@@ -47,12 +73,28 @@
 	
 	@Resource(name = "egovMjonMsgIdGnrService")
 	private EgovIdGnrService idgenMsgId;
+
+	@Resource(name = "egovMjonMsgGroupIdGnrService")
+	private EgovIdGnrService idgenMjonMsgGroupId;
 	
 	@Resource(name = "mjonPayService")
 	private MjonPayService mjonPayService;
 	
 	@Resource(name = "egovMjonCashIdGnrService")
 	private EgovIdGnrService idgenMjonCashId;
+
+	/** userManageService */
+	@Resource(name = "userManageService")
+	private EgovUserManageService userManageService;
+	
+	@Autowired
+	KakaoSendUtil kakaoSendUtil;
+
+	@Autowired
+	private MjonCommon mjonCommon;
+	
+	@Autowired
+	private PriceAndPoint priceAndPoint;
 	
 	//발신프로필 상태값 변경(삭제/복구 기능)
 	@Override
@@ -816,4 +858,349 @@
 			}
 		}
 	}
+
+	@Override
+	public StatusResponse insertKakaoAtSandAjax_advc(KakaoVO kakaoVO, HttpServletRequest request) throws Exception {
+
+//		log.info(" :: [{}]", kakaoVO.toString());
+
+		
+		// 측정할 메소드 호출 전 시간 기록
+		Instant start = Instant.now();
+//		KakaoSendAdvcVO
+		
+		Map<String, Object> returnMap = new HashMap<>();
+
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()
+				? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser()
+				: null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+
+		if (userId.equals("")) {
+			return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다.");
+		}
+		
+		kakaoVO.setUserId(userId);
+
+		/**
+		 * 회원 정지된 상태이면 문자 발송이 안되도록 처리함 현재 로그인 세션도 만료 처리함
+		 */
+		boolean mberSttus = userManageService.selectUserStatusInfo(userId);
+		if (!mberSttus) {
+			request.getSession().invalidate();
+			// UNAUTHORIZED : 인증되지 않은 사용자가 접근하려고 할 때
+			return new StatusResponse(HttpStatus.UNAUTHORIZED,
+					"현재 고객님께서는 문자온 서비스 이용이 정지된 상태로 알림톡을 발송하실 수 없습니다. 이용정지 해제를 원하시면 고객센터로 연락주시기 바랍니다.");
+		}
+		
+
+		StatusResponse statusResponse = new StatusResponse();
+
+/** @isHolidayNotified 
+ * @false : 알림 X
+ * @true  : 알림 O */
+		boolean isNotified = mjonCommon.processUserAndCheckAT(kakaoVO);
+		
+		
+		
+/** @카카오톡 전송 list 셋팅 -------------------------------------------*/
+		List<KakaoSendAdvcVO> kakaoSendAdvcListVO = kakaoSendUtil.populateSendLists(kakaoVO, isNotified, statusResponse);
+		if (statusResponse.getStatus() != null && !statusResponse.getStatus().equals(HttpStatus.OK)) {
+			log.error(" + populateSendLists 처리 중 오류 발생: {}", statusResponse.getMessage());
+			return statusResponse;
+		}
+
+		
+		
+/** @전송금액 확인 --------------------------------------------------*/
+		if (!isCashSufficient(userId, kakaoSendAdvcListVO)) {
+			log.error("Insufficient balance for message sending.");
+			return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다.");
+		}
+
+		
+
+/** @json파일이 있을 떄 biz_attachments insert */
+		this.insertKakaoAtDataJsonInfo_advc(kakaoSendAdvcListVO);
+		
+		
+		Map<String, List<KakaoSendAdvcVO>> priceGroupedMessages = kakaoSendAdvcListVO.stream()
+				.collect(Collectors.groupingBy(KakaoSendAdvcVO::getEachPrice));
+		// instTotalCnt : 화면에서 보여줄 총 발송건수
+		int instTotalCnt = 0;
+		// 임시
+		List<String> nextMsgGroupIdA = new ArrayList<>();
+			// 대안: entrySet() 직접 사용
+		for (Map.Entry<String, List<KakaoSendAdvcVO>> entry : priceGroupedMessages.entrySet()) {
+			    // entry 사용
+
+			List<KakaoSendAdvcVO> groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트
+
+			String nextMsgGroupId = idgenMjonMsgGroupId.getNextStringId();
+			groupedMsgList.forEach(t -> t.setMsgGroupId(nextMsgGroupId));
+			
+
+			// 발송 데이터 삽입
+			int instCnt = this.insertKakaoData_advc(groupedMsgList);
+//			int instCnt = 6;
+			
+			if(instCnt > 0) {
+
+				instTotalCnt += instCnt;
+
+				KakaoSendAdvcVO sendVO = groupedMsgList.get(0);
+
+/** @groupData 테이블 insert */
+				this.insertKakaoGroupDataTb_advc(instCnt, kakaoVO, sendVO);
+
+
+/** @biz_kakao_price에 insert (대체문자 환불관련 테이블)*/ 
+				kakaoVO.setMsgGroupId(sendVO.getMsgGroupId());
+				kakaoVO.setKakaoAtPrice(Float.parseFloat(sendVO.getEachPrice()));
+				kakaoVO.setSmsPrice(Float.parseFloat(sendVO.getSmsPrice()));
+				kakaoVO.setMmsPrice(Float.parseFloat(sendVO.getMmsPrice()));
+				
+				kakaoAlimTalkDAO.insertKakaoSendPrice(kakaoVO);
+				
+				
+				priceAndPoint.insertCashAndPoint(kakaoVO.getUserId()
+						, -Float.parseFloat(sendVO.getTotPrice())
+						, "카카오 알림톡 총 "+groupedMsgList.size()+"건 중 " + instCnt + "건 발송"
+						, nextMsgGroupId
+					);
+
+
+/** @SLACK발송 */ 
+				/** @발송조건이되면 발송 */ 
+				if(isNotified) {
+					mjonCommon.getAdminKakaoAtSendSlack(sendVO);
+				}else if("Y".equals(kakaoVO.getAtSmishingYn())){
+				/** @발송조건이 안되면 DB INSERT */ 
+					mjonMsgDAO.insertSpamPassMsgData(MjonMsgVO.builder()
+							.msgGroupId(nextMsgGroupId)
+							.userId(kakaoVO.getUserId())
+							.reqDate(kakaoVO.getReqDate())
+							.smsTxt(groupedMsgList.get(0).getTemplateContent())
+							.totalCallCnt(instCnt)
+							.callFrom(kakaoVO.getCallFrom())
+							.msgType("8")
+							.reserveYn(kakaoVO.getReserveYn())
+							.build()
+						);
+				}
+				
+				nextMsgGroupIdA.add(nextMsgGroupId);
+				
+			}
+			
+		}
+
+		returnMap.put("resultSts", instTotalCnt);
+		returnMap.put("reserYn", kakaoVO.getReserveYn());
+		returnMap.put("groupIds", nextMsgGroupIdA);
+		
+		
+		// 측정할 메소드 호출 후 시간 기록
+		Instant end = Instant.now();
+
+		log.info(" + start :: [{}]", start);
+		// 실행 시간 계산 (나노초, 밀리초, 초)
+		long seconds = Duration.between(start, end).getSeconds();
+		System.out.println("메소드 실행 시간 (초): " + seconds + " s");
+		double minutes = seconds / 60.0; // 소수점 포함을 위해 60.0으로 나눔
+
+		returnMap.put("second", seconds+" s");
+		returnMap.put("minutes", minutes+" min");
+		
+
+//		System.out.println("메소드 실행 시간 (분): " + minutes + " min");
+		
+		
+		
+		
+//		priceAndPoint.getBefCash(userId);
+		
+		
+		
+
+		statusResponse.setStatus(HttpStatus.OK);
+		statusResponse.setObject(returnMap);
+		
+		return statusResponse;
+	}
+	
+	
+
+
+	private void insertKakaoAtDataJsonInfo_advc(List<KakaoSendAdvcVO> kakaoSendAdvcListVO) {
+		// TODO Auto-generated method stub
+
+		// 측정할 메소드 호출 전 시간 기록
+		List<KakaoSendAdvcVO> jsonInfoData = new ArrayList<>(kakaoSendAdvcListVO);
+		jsonInfoData.removeIf(t -> StringUtils.isBlank(t.getJsonStr()));
+		log.info(" + jsonInfoData Insert :: [{}]", jsonInfoData.size());
+		if(jsonInfoData.size() > 0) {
+			kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc(jsonInfoData);
+		}
+
+	}
+
+	private void insertKakaoGroupDataTb_advc(int instCnt, KakaoVO kakaoVO, KakaoSendAdvcVO sendVO) throws Exception {
+		// TODO Auto-generated method stub
+
+//		log.info(" + insertKakaoGroupDataTb_advc kakaoVO :: \n[{}]", kakaoVO.toString());;
+//		log.info(" + insertKakaoGroupDataTb_advc kakaoSendAdvcVOList :: \n[{}]", sendVO.toString());
+		
+		sendVO.setMsgGroupCnt(Integer.toString(instCnt));
+		sendVO.setReserveYn(kakaoVO.getReserveYn());
+		sendVO.setBefCash(priceAndPoint.getBefCash(sendVO.getUserId()));
+		sendVO.setBefPoint(priceAndPoint.getBefPoint(sendVO.getUserId()));
+		
+		Float eachPrice = Float.parseFloat(sendVO.getEachPrice());
+
+		Float totPrice = eachPrice * instCnt;
+		sendVO.setTotPrice(String.format("%.1f", totPrice));
+		
+		sendVO.setAtDelayYn(kakaoVO.getAtSmishingYn()); 
+		sendVO.setBizKakaoResendOrgnlTxt(kakaoVO.getSubMsgTxt());
+		sendVO.setBizKakaoResendType(sendVO.getSubMsgType());
+		
+		kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc(sendVO);
+		
+	}
+
+	/**
+	 * @methodName	: insertKakaoData_advc 
+	 * @author		: 이호영
+	 * @date		: 2025. 3. 20.
+	 * @description	: 카카오 batch 발송 => mj_msg_data
+	 * @return : int
+	 * @param kakaoSendAdvcVOList
+	 * @param parentLoopCount
+	 * @param isJsonNotEmpty
+	 * @param isJsonNameAllSame
+	 * @return
+	 * 
+	 */
+	private int insertKakaoData_advc(List<KakaoSendAdvcVO> kakaoSendAdvcVOList) {
+
+
+		// 시작 시간 측정
+		long totalStartTime = System.currentTimeMillis();
+
+		int totalSize = kakaoSendAdvcVOList.size(); // 총 데이터 개수
+		// Batch 크기 설정 (고정값)
+//		int batchSize = 10000; 465
+		int batchSize = 50000; // 9분 18초
+
+		log.info("총 데이터 개수 :: [{}] ", totalSize);
+		log.info("설정된 Batch 크기 :: [{}] ", batchSize);
+
+		// 총 insert 카운트
+		int instCnt = 0;
+		int batchCount = 0;
+
+		// 각 배치별 실행 시간 기록
+		List<Double> batchExecutionTimes = new ArrayList<>();
+
+	
+		// 첫 번째 배치에서만 삽입했는지 추적하는 플래그
+		for (int i = 0; i < totalSize; i += batchSize) {
+			// Batch 시작 시간 측정
+			long batchStartTime = System.currentTimeMillis();
+
+			// Batch 리스트 생성
+			List<KakaoSendAdvcVO> batchList = kakaoSendAdvcVOList.subList(i, Math.min(i + batchSize, totalSize));
+			System.out.println("Batch 시작 인덱스: " + i);
+
+			// mj_msg_data 테이블 insert
+			int insertedCount = kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc(batchList);
+			
+			/** @kakaoSendUtil.populateSendLists  
+			 * 하단에서 
+			 * getJsonStr 데이터 처리 후 활용
+			 *  */
+			instCnt += insertedCount;
+
+			// Batch 종료 시간 측정 및 실행 시간 계산
+			long batchEndTime = System.currentTimeMillis();
+			double batchExecutionTimeInSeconds = (batchEndTime - batchStartTime) / 1000.0;
+
+			// 실행 시간 기록
+			batchExecutionTimes.add(batchExecutionTimeInSeconds);
+			batchCount++;
+		}
+
+		// 종료 시간 측정
+		long totalEndTime = System.currentTimeMillis();
+
+		// 총 실행 시간 계산 (밀리초 -> 초로 변환)
+		double totalExecutionTimeInSeconds = (totalEndTime - totalStartTime) / 1000.0;
+
+		// 실행 시간 출력
+		log.info("총 배치 실행 횟수 :: [{}] ", batchCount);
+		log.info("batchSize :: [{}] ", batchSize);
+		log.info("총 실행 시간 :: [{}] ", totalExecutionTimeInSeconds + "초");
+		log.info("총 삽입 건수 :: [{}] ", instCnt);
+
+		// 각 배치별 실행 시간 출력
+		for (int k = 0; k < batchExecutionTimes.size(); k++) {
+			System.out.println("배치 " + (k + 1) + " 실행 시간 :: " + batchExecutionTimes.get(k) + "초");
+		}
+
+		return instCnt;
+		
+	}
+
+	// 보유 금액이 충분한지 확인하는 메서드
+	private boolean isCashSufficient(String userId, List<KakaoSendAdvcVO> kakaoSendAdvcListVO) throws Exception {
+		
+		
+		String userMoney = priceAndPoint.getBefCash(userId);
+		// 쉼표 제거
+		userMoney = userMoney.replace(",", "");
+
+		// 사용자 보유 금액 BigDecimal 변환 (HALF_EVEN 적용)
+		BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
+		
+		// 총 메시지 금액 계산 (HALF_EVEN 적용)
+		BigDecimal totalEachPrice = kakaoSendAdvcListVO.stream()
+			.map(msg -> new BigDecimal(String.valueOf(msg.getEachPrice()))) // 변환 오류 방지
+			.reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(2, RoundingMode.HALF_EVEN); // 일관성 유지
+
+		// 비교 수행
+		return befCash.compareTo(totalEachPrice) >= 0;
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
 }
src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java
--- src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java
+++ src/main/java/itn/let/kakao/user/kakaoAt/web/KakaoAlimTalkSendController.java
@@ -35,9 +35,11 @@
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -45,6 +47,8 @@
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartHttpServletRequest;
 import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 import egovframework.rte.fdl.idgnr.EgovIdGnrService;
 import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
@@ -57,6 +61,7 @@
 import itn.com.cmm.util.StringUtil;
 import itn.com.utl.fcc.service.EgovStringUtil;
 import itn.let.kakao.kakaoComm.KakaoReturnVO;
+import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
 import itn.let.kakao.kakaoComm.KakaoSendUtil;
 import itn.let.kakao.kakaoComm.KakaoVO;
 import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave;
@@ -65,6 +70,7 @@
 import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate;
 import itn.let.kakao.kakaoComm.kakaoApi.service.KakaoApiService;
 import itn.let.kakao.user.kakaoAt.service.KakaoAlimTalkService;
+import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.mjocommon.MjonCommon;
 import itn.let.mjo.mjocommon.MjonHolidayApi;
 import itn.let.mjo.msgdata.service.MjonMsgDataService;
@@ -216,7 +222,29 @@
 			model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId));
 		}
 		
+		if("Y".equals(kakaoVO.getMsgResendAllFlag())) {
+			List<MjonMsgDataVO> resendList = new ArrayList<MjonMsgDataVO>();
+			
+			MjonMsgDataVO mjonMsgDataVO = new MjonMsgDataVO();
+			mjonMsgDataVO.setMsgGroupId(kakaoVO.getMsgResendAllGroupId());
+			mjonMsgDataVO.setUserId(userId);
+			resendList = mjonMsgDataService.selectMjMsgListByResend(mjonMsgDataVO);
+			
+			ObjectMapper mapper = new ObjectMapper();
+	        try {
+	            String resendListJson = mapper.writeValueAsString(resendList);
+	            model.addAttribute("resendListJson", resendListJson);
+	        } catch (Exception e) {
+	            e.printStackTrace();
+	        }
+			
+		}
+		
+		
+		
 		return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView";
+//		return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310";
+									
 	}
 	
 	
@@ -1057,6 +1085,16 @@
 		return modelAndView;
 	}
 	
+	@RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax_advc.do"}, method = RequestMethod.POST)
+	public ResponseEntity<StatusResponse> kakaoAlimTalkMsgSendAjax_advc(
+			@RequestBody KakaoVO kakaoVO,
+			HttpServletRequest request
+			) throws Exception {
+
+		System.out.println(" + kakaoAlimTalkMsgSendAjax_advc + ");
+		return ResponseEntity.ok().body(kakaoAlimTalkService.insertKakaoAtSandAjax_advc(kakaoVO, request)) ;
+	}
+	
 	@RequestMapping(value= {"/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax.do"}, method = RequestMethod.POST)
 //	@ResponseBody
 	public ModelAndView kakaoAlimTalkMsgSendAjax(
@@ -1064,6 +1102,10 @@
 			HttpServletRequest request,
 			@ModelAttribute("kakaoVO")  KakaoVO kakaoVO
 		) throws Exception {
+		// 시작 시간
+        long startTime = System.currentTimeMillis();
+		
+		System.out.println(" :: kakaoAlimTalkMsgSendAjax :: ");
 		ModelAndView modelAndView = new ModelAndView();		
 		modelAndView.setViewName("jsonView");
 		
@@ -1388,7 +1430,7 @@
 						
 						if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송
 							
-							mjonCommon.getAdminKakaoAtSandSlack(kakaoVO);
+//							mjonCommon.getAdminKakaoAtSendSlack(kakaoVO);
 							
 						}
 						
@@ -1400,7 +1442,94 @@
 		} catch (Exception e) {
 			throw new Exception("++++++++++++++++++++++ getAdminPhoneSendMsgData Error !!! " + e);
 		}
+		// 종료 시간
+		long endTime = System.currentTimeMillis();
+		
+// 실행 시간 계산 (초 단위)
+		double executionTimeSeconds = (endTime - startTime) / 1000.0;
+		
+		System.out.println("실행 시간: " + String.format("%.3f", executionTimeSeconds) + "초");
+		
+		
+		String returnTxt = String.format("%.3f", executionTimeSeconds) + "초";
+		modelAndView.addObject("seconds", returnTxt);
 		
 		return modelAndView;
 	}
+	
+	
+	@RequestMapping(value= {"/web/mjon/alimtalk/kakaoAlimtalkMsgDataView_test_set.do"})
+	public String kakaoAlimtalkMsgDataView_test_set(ModelMap model
+			, @ModelAttribute("kakaoVO")  KakaoVO kakaoVO) throws Exception {
+
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String author = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getAuthority());
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		
+		model.addAttribute("loginVO", loginVO);
+/* 		if(userId == "") {
+			return "redirect:/web/user/login/login.do";
+		}*/
+
+
+		//2.사용자 개인 단가 정보 불러오기
+		if(!userId.equals("") && !author.equals("ROLE_ADMIN")) {
+		
+			// 사용자 아이디를 이용한 발신프로필 조회
+			kakaoVO.setUserId(userId); 
+			List<KakaoVO> selectKakaoProfileList = kakaoApiService.selectKakaoProfileList(kakaoVO);
+			model.addAttribute("kakaoProfileList", selectKakaoProfileList);
+			
+			//발신번호 불러오기
+			//아이디 발신번호 리스트 불러오기.
+			List<String> resultSendPhonList = mjonMsgDataService.selectSendPhonNumList(userId);
+			List<String> resultPhonList = new ArrayList<String>();
+			MJUtil mjUtil = new MJUtil();
+			
+			for(String phone : resultSendPhonList) {
+				
+				resultPhonList.add(mjUtil.addDash(phone));
+				
+			}
+			model.addAttribute("resultPhonList", resultPhonList);
+			
+			
+			MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
+			
+			model.addAttribute("atSmishingYn", mberManageVO.getAtSmishingYn());
+			
+			//3.사용자 개인단가 정보가 0이 아니면 개인단가 사용, 없으면 시스템 기본 단가 사용
+			Float shortPrice = mberManageVO.getShortPrice();
+			Float longPrice = mberManageVO.getLongPrice();
+			Float picturePrice = mberManageVO.getPicturePrice();
+			Float picture2Price = mberManageVO.getPicture2Price();
+			Float picture3Price = mberManageVO.getPicture3Price();
+			BigDecimal userMoney = new BigDecimal(mberManageVO.getUserMoney()).setScale(2, RoundingMode.HALF_EVEN);
+			
+			model.addAttribute("userMoney", userMoney);
+			
+			
+			//////////////////////////////////////////////////////////////////
+			
+			//최근 전송 내역
+			MjonMsgDataVO searchVO = new MjonMsgDataVO();
+			Calendar cal = Calendar.getInstance();
+			Date now = new Date();
+			SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
+			cal.setTime(now);
+			cal.add(Calendar.DATE, -3);
+			String chkDate = format.format(cal.getTime());
+			searchVO.setUserId(userId);
+			searchVO.setMyMsgStDt(chkDate);	//검색 시작일 저장 - 현재날짜로 부터 3일 이전 날짜로 시작
+			model.addAttribute("resultLatestMsgList", mjonMsgDataService.selectLatestMsgList(searchVO));
+			
+			//자주보내는 번호
+			model.addAttribute("resultBookMarkMsgList", mjonMsgDataService.selectBookMarkMsgList(searchVO));
+			
+			// 사용자 저으이
+			model.addAttribute("sendPrice", kakaoSendUtil.selectSendPriceOfKakaoAtAndSmsAndMms(userId));
+		}
+		
+		return "web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_tmp";
+	}
 }
src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java
--- src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java
+++ src/main/java/itn/let/kakao/user/kakaoFt/web/KakaoFriendsTalkSendController.java
@@ -663,7 +663,7 @@
 						if(!smishingAlarmPassSts) {//평일,주말, 공휴일 알림설정 시간에 포함되지 않는 경우 슬랙 알림 발송
 							
 							MjonCommon comm = new MjonCommon();
-							comm.getAdminKakaoAtSandSlack(kakaoVO);
+//							comm.getAdminKakaoAtSendSlack(kakaoVO);
 							
 						}
 						
 
src/main/java/itn/let/kakao/user/sent/service/KakaoSentDetailVO.java (added)
+++ src/main/java/itn/let/kakao/user/sent/service/KakaoSentDetailVO.java
@@ -0,0 +1,51 @@
+package itn.let.kakao.user.sent.service;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class KakaoSentDetailVO extends KakaoSentVO{
+
+	private static final long serialVersionUID = 1L;
+	
+	private String msgGroupId;
+	private String reqDate;
+	private String regDate;
+	private String msgGroupCnt;
+	private String reserveYn;
+	private String reserveCYn;
+	private String canceldate;
+	private String callFrom;
+	private String userId;
+	private String smsTxt;
+	private String subject;
+	private String subjectChkYn;
+	private String msgType;
+	private String fileCnt;
+	private String msgKind;
+	private String eachPrice;
+	private String filePath1;
+	private String filePath2;
+	private String filePath3;
+	
+	private String callTo;
+	private String statusTxt;
+	private String addrNm;
+	
+	private String successPct;
+	private String failedPct;
+	private String waitingPct;
+	
+	private String statusCd; // 진행상태 코드
+	private String divideYn;
+	private String divideText;
+	private String totPrice;
+	private String yellowId;
+	private String msgNoticetalkTmpKey;
+	
+	// FileInfo 리스트 필드 추가
+//	private List<FileInfoVO> fileInfos;
+
+	
+}
src/main/java/itn/let/kakao/user/sent/service/KakaoSentService.java
--- src/main/java/itn/let/kakao/user/sent/service/KakaoSentService.java
+++ src/main/java/itn/let/kakao/user/sent/service/KakaoSentService.java
@@ -1,6 +1,7 @@
 package itn.let.kakao.user.sent.service;
 
 import java.util.List;
+import java.util.Map;
 
 import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO;
 
@@ -31,5 +32,11 @@
 	//예약 결과 전체 발송 리스트 불러오기
 	public List<KakaoSentVO> selectReservKakaoSentList(KakaoSentVO kakaoSentVO) throws Exception;
 	
+	public Map<String, Object> selectKakaoSentCntAll_Advc(KakaoSentVO kakaoSentVO) throws Exception;
+
+	public KakaoSentDetailVO selectKakaoSentDetailView(KakaoSentDetailVO kakaoSentDetailVO) throws Exception;
+	
+	//발송 관리 문자발송 내용 상세보기 팝업
+	public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO kakaoSentVO) throws Exception;
 
 }
src/main/java/itn/let/kakao/user/sent/service/KakaoSentVO.java
--- src/main/java/itn/let/kakao/user/sent/service/KakaoSentVO.java
+++ src/main/java/itn/let/kakao/user/sent/service/KakaoSentVO.java
@@ -4,7 +4,11 @@
 import java.util.List;
 
 import itn.let.uss.umt.service.UserDefaultVO;
+import lombok.Getter;
+import lombok.Setter;
 
+@Getter
+@Setter
 public class KakaoSentVO extends UserDefaultVO{
 
 	private static final long serialVersionUID = 1L;
@@ -90,6 +94,7 @@
 	private int successCount;
 	private int waitCount;
 	private int failCount;
+	private int allCount;
 	
 	private String bizUmid;
 	private int kakaoResendSuccCount;
@@ -103,471 +108,11 @@
 	private String atDelayCompleteYn;		//알림톡 30분 지연 승인/취소 처리 여부
 	private Date atDelayOrgTime;			//알림톡 30분 지연에 대한 원래 시간 (-30분 처리된 시간)
 	
-	public String getCallToComma() {
-		return callToComma;
-	}
-	public void setCallToComma(String callToComma) {
-		this.callToComma = callToComma;
-	}
-	public String getCallFromComma() {
-		return callFromComma;
-	}
-	public void setCallFromComma(String callFromComma) {
-		this.callFromComma = callFromComma;
-	}
+	private String statusCd;
 	
-	public String getAtchFiles() {
-		return atchFiles;
-	}
-	public void setAtchFiles(String atchFiles) {
-		this.atchFiles = atchFiles;
-	}	
+	private int successPrice;
+	private int kakaoResendSuccPrice;
 	
-	public String getMsgId() {
-		return msgId;
-	}
-	public void setMsgId(String msgId) {
-		this.msgId = msgId;
-	}
-	public int getSuccessCnt() {
-		return successCnt;
-	}
-	public void setSuccessCnt(int successCnt) {
-		this.successCnt = successCnt;
-	}
-	public String getMsgTypeName() {
-		return msgTypeName;
-	}
-	public void setMsgTypeName(String msgTypeName) {
-		this.msgTypeName = msgTypeName;
-	}
-	public int getOrderByCode() {
-		return orderByCode;
-	}
-	public void setOrderByCode(int orderByCode) {
-		this.orderByCode = orderByCode;
-	}
-	public String getAtchFileId() {
-		return atchFileId;
-	}
-	public void setAtchFileId(String atchFileId) {
-		this.atchFileId = atchFileId;
-	}
-	public String getFileSn() {
-		return fileSn;
-	}
-	public void setFileSn(String fileSn) {
-		this.fileSn = fileSn;
-	}
-	public String getUserId() {
-		return userId;
-	}
-	public void setUserId(String userId) {
-		this.userId = userId;
-	}
-	public String getAddrNm() {
-		return addrNm;
-	}
-	public void setAddrNm(String addrNm) {
-		this.addrNm = addrNm;
-	}
-	public String getMsgSeq() {
-		return msgSeq;
-	}
-	public void setMsgSeq(String msgSeq) {
-		this.msgSeq = msgSeq;
-	}
-	public String getMsgGroupId() {
-		return msgGroupId;
-	}
-	public void setMsgGroupId(String msgGroupId) {
-		this.msgGroupId = msgGroupId;
-	}
-	public List getMsgGroupIdList() {
-		return msgGroupIdList;
-	}
-	public void setMsgGroupIdList(List msgGroupIdList) {
-		this.msgGroupIdList = msgGroupIdList;
-	}
-	public String getSmsTxt() {
-		return smsTxt;
-	}
-	public void setSmsTxt(String smsTxt) {
-		this.smsTxt = smsTxt;
-	}
-	public String getSubject() {
-		return subject;
-	}
-	public void setSubject(String subject) {
-		this.subject = subject;
-	}
-	public Date getRegdate() {
-		return regdate;
-	}
-	public void setRegdate(Date regdate) {
-		this.regdate = regdate;
-	}
-	public Date getReqdate() {
-		return reqdate;
-	}
-	public void setReqdate(Date reqdate) {
-		this.reqdate = reqdate;
-	}
-	public String getCallFrom() {
-		return callFrom;
-	}
-	public void setCallFrom(String callFrom) {
-		this.callFrom = callFrom;
-	}
-	public String getCallTo() {
-		return callTo;
-	}
-	public void setCallTo(String callTo) {
-		this.callTo = callTo;
-	}
-	public List getCallToList() {
-		return callToList;
-	}
-	public void setCallToList(List callToList) {
-		this.callToList = callToList;
-	}
-	public String getTotPrice() {
-		return totPrice;
-	}
-	public void setTotPrice(String totPrice) {
-		this.totPrice = totPrice;
-	}
-	public String getEachPrice() {
-		return eachPrice;
-	}
-	public void setEachPrice(String eachPrice) {
-		this.eachPrice = eachPrice;
-	}
-	public String getDelFlag() {
-		return delFlag;
-	}
-	public void setDelFlag(String delFlag) {
-		this.delFlag = delFlag;
-	}
-	public String getTotMsgPrice() {
-		return totMsgPrice;
-	}
-	public void setTotMsgPrice(String totMsgPrice) {
-		this.totMsgPrice = totMsgPrice;
-	}
-	public String getRsltCode() {
-		return rsltCode;
-	}
-	public void setRsltCode(String rsltCode) {
-		this.rsltCode = rsltCode;
-	}
-	public String getRsltCode2() {
-		return rsltCode2;
-	}
-	public void setRsltCode2(String rsltCode2) {
-		this.rsltCode2 = rsltCode2;
-	}
-	public String getMsgType() {
-		return msgType;
-	}
-	public void setMsgType(String msgType) {
-		this.msgType = msgType;
-	}
-	public String getMsgGroupCnt() {
-		return msgGroupCnt;
-	}
-	public void setMsgGroupCnt(String msgGroupCnt) {
-		this.msgGroupCnt = msgGroupCnt;
-	}
-	public String getFileCnt() {
-		return fileCnt;
-	}
-	public void setFileCnt(String fileCnt) {
-		this.fileCnt = fileCnt;
-	}
-	public String getTotMsgCnt() {
-		return totMsgCnt;
-	}
-	public void setTotMsgCnt(String totMsgCnt) {
-		this.totMsgCnt = totMsgCnt;
-	}
-	public String getCurState() {
-		return curState;
-	}
-	public void setCurState(String curState) {
-		this.curState = curState;
-	}
-	public String getReserveYn() {
-		return reserveYn;
-	}
-	public void setReserveYn(String reserveYn) {
-		this.reserveYn = reserveYn;
-	}
-	public String getReserveCYn() {
-		return reserveCYn;
-	}
-	public void setReserveCYn(String reserveCYn) {
-		this.reserveCYn = reserveCYn;
-	}
-	public String getFilePath1() {
-		return filePath1;
-	}
-	public void setFilePath1(String filePath1) {
-		this.filePath1 = filePath1;
-	}
-	public String getFilePath2() {
-		return filePath2;
-	}
-	public void setFilePath2(String filePath2) {
-		this.filePath2 = filePath2;
-	}
-	public String getFilePath3() {
-		return filePath3;
-	}
-	public void setFilePath3(String filePath3) {
-		this.filePath3 = filePath3;
-	}
-	public Date getSentDate() {
-		return sentDate;
-	}
-	public void setSentDate(Date sentDate) {
-		this.sentDate = sentDate;
-	}
-	public String getAgentCode() {
-		return agentCode;
-	}
-	public void setAgentCode(String agentCode) {
-		this.agentCode = agentCode;
-	}
-	public String getUserData() {
-		return userData;
-	}
-	public void setUserData(String userData) {
-		this.userData = userData;
-	}
-	public List getUserDataList() {
-		return userDataList;
-	}
-	public void setUserDataList(List userDataList) {
-		this.userDataList = userDataList;
-	}
-	public Date getCancelDate() {
-		return cancelDate;
-	}
-	public void setCancelDate(Date cancelDate) {
-		this.cancelDate = cancelDate;
-	}
-	public String getStartDate() {
-		return startDate;
-	}
-	public void setStartDate(String startDate) {
-		this.startDate = startDate;
-	}
-	public String getEndDate() {
-		return endDate;
-	}
-	public void setEndDate(String endDate) {
-		this.endDate = endDate;
-	}
-	public String getSearchMsgType() {
-		return searchMsgType;
-	}
-	public void setSearchMsgType(String searchMsgType) {
-		this.searchMsgType = searchMsgType;
-	}
-	public String getTabType() {
-		return tabType;
-	}
-	public void setTabType(String tabType) {
-		this.tabType = tabType;
-	}
-	public String getStateType() {
-		return stateType;
-	}
-	public void setStateType(String stateType) {
-		this.stateType = stateType;
-	}
-	public String getListType() {
-		return listType;
-	}
-	public void setListType(String listType) {
-		this.listType = listType;
-	}
-	public String getResultType() {
-		return resultType;
-	}
-	public void setResultType(String resultType) {
-		this.resultType = resultType;
-	}
-	public String getMsgResultCnt() {
-		return msgResultCnt;
-	}
-	public void setMsgResultCnt(String msgResultCnt) {
-		this.msgResultCnt = msgResultCnt;
-	}
-	public String getMsgResultSts() {
-		return msgResultSts;
-	}
-	public void setMsgResultSts(String msgResultSts) {
-		this.msgResultSts = msgResultSts;
-	}
-	public String getAddrGrpNm() {
-		return addrGrpNm;
-	}
-	public void setAddrGrpNm(String addrGrpNm) {
-		this.addrGrpNm = addrGrpNm;
-	}
-	public int getOrderByrsltCode() {
-		return orderByrsltCode;
-	}
-	public void setOrderByrsltCode(int orderByrsltCode) {
-		this.orderByrsltCode = orderByrsltCode;
-	}
-	public String getMsgResult() {
-		return msgResult;
-	}
-	public void setMsgResult(String msgResult) {
-		this.msgResult = msgResult;
-	}
-	public String getNtceBgnde() {
-		return ntceBgnde;
-	}
-	public void setNtceBgnde(String ntceBgnde) {
-		this.ntceBgnde = ntceBgnde;
-	}
-	public String getNtceEndde() {
-		return ntceEndde;
-	}
-	public void setNtceEndde(String ntceEndde) {
-		this.ntceEndde = ntceEndde;
-	}
-	public String getMsgKind() {
-		return msgKind;
-	}
-	public void setMsgKind(String msgKind) {
-		this.msgKind = msgKind;
-	}
-	public String getDelayYn() {
-		return delayYn;
-	}
-	public void setDelayYn(String delayYn) {
-		this.delayYn = delayYn;
-	}
-	public String getDelayCompleteYn() {
-		return delayCompleteYn;
-	}
-	public void setDelayCompleteYn(String delayCompleteYn) {
-		this.delayCompleteYn = delayCompleteYn;
-	}
-	public String getBizKakaoResendYn() {
-		return bizKakaoResendYn;
-	}
-	public void setBizKakaoResendYn(String bizKakaoResendYn) {
-		this.bizKakaoResendYn = bizKakaoResendYn;
-	}
-	public String getBizKakaoResendType() {
-		return bizKakaoResendType;
-	}
-	public void setBizKakaoResendType(String bizKakaoResendType) {
-		this.bizKakaoResendType = bizKakaoResendType;
-	}
-	public String getBizKakaoResendData() {
-		return bizKakaoResendData;
-	}
-	public void setBizKakaoResendData(String bizKakaoResendData) {
-		this.bizKakaoResendData = bizKakaoResendData;
-	}
-	public String getCallStatus() {
-		return callStatus;
-	}
-	public void setCallStatus(String callStatus) {
-		this.callStatus = callStatus;
-	}
-	public String getBizKakaoAtPrice() {
-		return bizKakaoAtPrice;
-	}
-	public void setBizKakaoAtPrice(String bizKakaoAtPrice) {
-		this.bizKakaoAtPrice = bizKakaoAtPrice;
-	}
-	public String getBizKakaoFtPrice() {
-		return bizKakaoFtPrice;
-	}
-	public void setBizKakaoFtPrice(String bizKakaoFtPrice) {
-		this.bizKakaoFtPrice = bizKakaoFtPrice;
-	}
-	public String getBizSmsPrice() {
-		return bizSmsPrice;
-	}
-	public void setBizSmsPrice(String bizSmsPrice) {
-		this.bizSmsPrice = bizSmsPrice;
-	}
-	public String getDiffMin() {
-		return diffMin;
-	}
-	public void setDiffMin(String diffMin) {
-		this.diffMin = diffMin;
-	}
-	public String getBizMmsPrice() {
-		return bizMmsPrice;
-	}
-	public void setBizMmsPrice(String bizMmsPrice) {
-		this.bizMmsPrice = bizMmsPrice;
-	}
-	public int getSuccessCount() {
-		return successCount;
-	}
-	public void setSuccessCount(int successCount) {
-		this.successCount = successCount;
-	}
-	public String getBizUmid() {
-		return bizUmid;
-	}
-	public void setBizUmid(String bizUmid) {
-		this.bizUmid = bizUmid;
-	}
-	public int getKakaoResendSuccCount() {
-		return kakaoResendSuccCount;
-	}
-	public void setKakaoResendSuccCount(int kakaoResendSuccCount) {
-		this.kakaoResendSuccCount = kakaoResendSuccCount;
-	}
-	public int getKakaoResendFailCount() {
-		return kakaoResendFailCount;
-	}
-	public void setKakaoResendFailCount(int kakaoResendFailCount) {
-		this.kakaoResendFailCount = kakaoResendFailCount;
-	}
-	public int getWaitCount() {
-		return waitCount;
-	}
-	public void setWaitCount(int waitCount) {
-		this.waitCount = waitCount;
-	}
-	public int getFailCount() {
-		return failCount;
-	}
-	public void setFailCount(int failCount) {
-		this.failCount = failCount;
-	}
-	public String getAtDelayYn() {
-		return atDelayYn;
-	}
-	public void setAtDelayYn(String atDelayYn) {
-		this.atDelayYn = atDelayYn;
-	}
-	public String getAtDelayCompleteYn() {
-		return atDelayCompleteYn;
-	}
-	public void setAtDelayCompleteYn(String atDelayCompleteYn) {
-		this.atDelayCompleteYn = atDelayCompleteYn;
-	}
-	public Date getAtDelayOrgTime() {
-		return atDelayOrgTime;
-	}
-	public void setAtDelayOrgTime(Date atDelayOrgTime) {
-		this.atDelayOrgTime = atDelayOrgTime;
-	}
-
-
+	private String divideYn;
 	
 }
src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentDAO.java
--- src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentDAO.java
+++ src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentDAO.java
@@ -7,6 +7,7 @@
 
 import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
 import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO;
+import itn.let.kakao.user.sent.service.KakaoSentDetailVO;
 import itn.let.kakao.user.sent.service.KakaoSentVO;
 
 @Repository("KakaoSentDAO")
@@ -44,6 +45,10 @@
 	@SuppressWarnings("unchecked")
 	public List<KakaoSentVO> selectAllKakaoSentList(KakaoSentVO kakaoSentVO) throws Exception{
 		return (List<KakaoSentVO>) list("KakaoSentDAO.selectAllKakaoSentList",kakaoSentVO);
+	}
+	@SuppressWarnings("unchecked")
+	public List<KakaoSentVO> selectAllKakaoSentList_advc(KakaoSentVO kakaoSentVO) throws Exception{
+		return (List<KakaoSentVO>) list("KakaoSentDAO.selectAllKakaoSentList_advc",kakaoSentVO);
 	}
 	
 	@SuppressWarnings("unchecked")
@@ -90,4 +95,39 @@
 		return (List<KakaoSentVO>) list("KakaoSentDAO.selectReservKakaoSentList",kakaoSentVO);
 	}	
 	
+	@SuppressWarnings("unchecked")
+	public List<KakaoSentVO> selectKakaoSentCntAll_advc(KakaoSentVO kakaoSentVO) throws Exception{
+		
+		List<KakaoSentVO> result = new ArrayList<KakaoSentVO>();
+		
+		try {
+			
+			result = (List<KakaoSentVO>) list("KakaoSentDAO.selectKakaoSentCntAll_advc", kakaoSentVO);
+			
+		} catch (Exception e) {
+			
+			throw new Exception("++++++++++ ErrorService DAO :: " + e);
+			
+		}
+		
+		return result;
+	}
+	
+	public KakaoSentVO selectKakaoSentCntEachCnt_advc(KakaoSentVO kakaoSentVO) throws Exception{
+		return (KakaoSentVO) select("KakaoSentDAO.selectKakaoSentCntEachCnt_advc",kakaoSentVO);
+	}
+	
+	public KakaoSentDetailVO selectKakaoSentDetailView(KakaoSentDetailVO kakaoSentDetailVO) throws Exception{
+		return (KakaoSentDetailVO) select("KakaoSentDAO.selectKakaoSentDetailView", kakaoSentDetailVO);
+	}
+	
+	public List<String> findByReqDateWhereMsgGroupId(String msgGroupId) {
+		return (List<String>) list("KakaoSentDAO.findByReqDateWhereMsgGroupId", msgGroupId);
+	}
+	
+	//발송 관리 문자발송 내용 상세보기 팝업[그룹]
+		public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO KakaoSentVO) throws Exception{
+			return (MjonKakaoATVO) select("KakaoSentDAO.selectKakaoSentDetailViewPhoneAjax", KakaoSentVO);
+		}	
+	
 }
src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java
--- src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java
+++ src/main/java/itn/let/kakao/user/sent/service/impl/KakaoSentServiceImpl.java
@@ -1,7 +1,15 @@
 package itn.let.kakao.user.sent.service.impl;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 
@@ -10,6 +18,7 @@
 import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
 import egovframework.rte.fdl.idgnr.EgovIdGnrService;
 import itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO;
+import itn.let.kakao.user.sent.service.KakaoSentDetailVO;
 import itn.let.kakao.user.sent.service.KakaoSentService;
 import itn.let.kakao.user.sent.service.KakaoSentVO;
 
@@ -29,7 +38,8 @@
 		
 		try {
 			
-			result = kakaoSentDAO.selectKakaoSentCntAll(kakaoSentVO);
+//			result = kakaoSentDAO.selectKakaoSentCntAll(kakaoSentVO);
+			result = kakaoSentDAO.selectKakaoSentCntAll_advc(kakaoSentVO);
 			
 		} catch (Exception e) {
 			throw new Exception("++++++++++ ErrorService Impl :: " + e);
@@ -38,30 +48,83 @@
 		return result;
 	}
 	
+	public Map<String, Object> selectKakaoSentCntAll_Advc(KakaoSentVO kakaoSentVO) throws Exception{
+		
+		List<KakaoSentVO> result = new ArrayList<KakaoSentVO>();
+		Map<String, Object> returnMap = new HashMap<String, Object>();
+		
+		try {
+			
+//			result = kakaoSentDAO.selectKakaoSentCntAll(kakaoSentVO);
+			result = kakaoSentDAO.selectKakaoSentCntAll_advc(kakaoSentVO);
+			
+			
+			KakaoSentVO allVO = new KakaoSentVO();
+			KakaoSentVO atVO = new KakaoSentVO();
+			KakaoSentVO ftVO = new KakaoSentVO();
+			
+			result.stream()
+						.forEach(t -> 
+							{
+								Integer rsultCnt = Integer.parseInt(t.getMsgResultCnt());
+								
+								if(Integer.parseInt(t.getFilePath1()) > 0) {
+									if("S".equals(t.getMsgResultSts())) {
+										atVO.setSuccessCount(atVO.getSuccessCount()+rsultCnt);
+									}else if("W".equals(t.getMsgResultSts())) {
+										atVO.setWaitCount(atVO.getWaitCount()+rsultCnt);
+									}else {
+										atVO.setFailCount(atVO.getFailCount()+rsultCnt);
+									}
+									
+									atVO.setAllCount(atVO.getAllCount()+rsultCnt);
+									allVO.setAllCount(allVO.getAllCount()+rsultCnt);
+									
+								}else {
+									if("S".equals(t.getMsgResultSts())) {
+										ftVO.setSuccessCount(ftVO.getSuccessCount()+rsultCnt);
+									}else if("W".equals(t.getMsgResultSts())) {
+										ftVO.setWaitCount(ftVO.getWaitCount()+rsultCnt);
+									}else {
+										ftVO.setFailCount(ftVO.getFailCount()+rsultCnt);
+									}
+									
+									ftVO.setAllCount(ftVO.getAllCount()+rsultCnt);
+									allVO.setAllCount(allVO.getAllCount()+rsultCnt);
+									
+								}
+							});
+			
+			allVO.setSuccessCount(atVO.getSuccessCount()+ftVO.getSuccessCount());
+			allVO.setWaitCount(atVO.getWaitCount()+ftVO.getWaitCount());
+			allVO.setFailCount(atVO.getFailCount()+ftVO.getFailCount());
+			
+			//전체 성공건, 실패건 불러오기
+			returnMap.put("allCnt", allVO);
+			
+			//알림톡 성공건, 실패건 불러오기    	
+			returnMap.put("atCnt", atVO);
+			
+			//친구톡 성공건, 실패건 불러오기
+			returnMap.put("ftCnt", ftVO);
+			
+			
+		} catch (Exception e) {
+			throw new Exception("++++++++++ ErrorService Impl :: " + e);
+		}
+		
+		return returnMap;
+	}
+	
 	//발송 관리 전체 발송 리스트 불러오기
 	public List<KakaoSentVO> selectAllKakaoSentList(KakaoSentVO kakaoSentVO) throws Exception{
 		
 		List<KakaoSentVO> resultList = new ArrayList<KakaoSentVO>();
 		
-		String listType = kakaoSentVO.getListType();
-		String stateType = kakaoSentVO.getStateType();
+		resultList = kakaoSentDAO.selectAllKakaoSentList_advc(kakaoSentVO);
 		
-		if(stateType.equals("fail")) {
-			
-			listType = "privateList";
-			
-		}
-		
-		System.out.println("listType : "+ listType);
-		if(listType.equals("groupList")) {//전송건별 리스트 불러오기
-			
-			resultList = kakaoSentDAO.selectAllKakaoSentList(kakaoSentVO);
-			
-		}else {//개인별 리스트 불러오기
-			
-			resultList = kakaoSentDAO.selectAllPrivateKakaoSentList(kakaoSentVO);
-			
-		}
+		//totPrice 계산 및 상태코드 set
+		resultList = resultList.stream().map(t -> setPriceNCode(t)).collect(Collectors.toList());
 		
 		return resultList;
 	}
@@ -149,5 +212,229 @@
 		
 		return kakaoSentDAO.selectReservKakaoSentList(kakaoSentVO);
 	}
+	
+	@Override
+	public KakaoSentDetailVO selectKakaoSentDetailView(KakaoSentDetailVO kakaoSentDetailVO) throws Exception{
+
+		KakaoSentDetailVO resultVO = kakaoSentDAO.selectKakaoSentDetailView(kakaoSentDetailVO);
+		
+		int total = Integer.parseInt(resultVO.getMsgGroupCnt()); // 전체 건수
+		int success = 0; // 성공 건수
+		int waiting = 0; // 대기 건수
+		int failed = 0; // 실패 건수
+		if("Y".equals(resultVO.getBizKakaoResendYn())) {
+			success = resultVO.getSuccessCount() + resultVO.getKakaoResendSuccCount();
+			failed = resultVO.getKakaoResendFailCount();
+		}else {
+			success = resultVO.getSuccessCount();
+			failed = resultVO.getFailCount();
+		}
+		waiting = resultVO.getWaitCount(); // 대기 건수
+		
+		String successPct = total > 0 ? String.format("%.1f%%", (success / (double) total) * 100) : "0.0%";
+		String waitingPct = total > 0 ? String.format("%.1f%%", (waiting / (double) total) * 100) : "0.0%";
+		String failedPct = total > 0 ? String.format("%.1f%%", (failed / (double) total) * 100) : "0.0%";
+		
+		resultVO.setSuccessPct(successPct);
+		resultVO.setFailedPct(waitingPct);
+		resultVO.setWaitingPct(failedPct);
+		
+		resultVO.setTotPrice(this.priceProc(resultVO.getSuccessPrice(), resultVO.getKakaoResendSuccPrice()));
+		
+		resultVO = this.codeProc(resultVO);
+		
+		// 분할문자인 경우
+		if("Y".equals(resultVO.getDivideYn())) {
+			String divideText = calculateBatchInfo(resultVO);
+			resultVO.setDivideText(divideText);
+		}
+		
+		return resultVO;
+	}
+	
+	//발송 관리 문자발송 내용 상세보기 팝업 => 문자내용(MJ_MSG_DATA)
+	public MjonKakaoATVO selectKakaoSentDetailViewPhoneAjax(MjonKakaoATVO kakaoSentVO) throws Exception{
+		
+		return kakaoSentDAO.selectKakaoSentDetailViewPhoneAjax(kakaoSentVO);
+	}
+	
+	
+	// 공통코드 ITN057에 대한 코드화 진행
+	/*
+	 * CODE_ID	CODE	CODE_NM		CODE_DC
+	 * ITN057	01		진행중		진행중
+	 * ITN057	02		완료			완료출해야함
+	 * ITN057	03		예약대기		예약대기(발송전) 버튼으로 노출해야함
+	 * ITN057	04		-			예약취소 ( - 으로 노출 )
+	 * */
+	private KakaoSentVO setPriceNCode(KakaoSentVO result) {
+		
+		//성공 건수 세팅
+		KakaoSentVO eachCnt = new KakaoSentVO();
+		eachCnt.setMsgGroupId(result.getMsgGroupId());
+		try {
+			eachCnt = kakaoSentDAO.selectKakaoSentCntEachCnt_advc(eachCnt);
+		} catch (Exception e) {
+			System.out.println("setPriceNCode error!!");
+		}
+		
+		result.setSuccessCount(eachCnt.getSuccessCount());
+		result.setWaitCount(eachCnt.getWaitCount());
+		result.setFailCount(eachCnt.getFailCount());
+		result.setKakaoResendSuccCount(eachCnt.getKakaoResendSuccCount());
+		result.setKakaoResendFailCount(eachCnt.getKakaoResendFailCount());
+		
+		
+		//완료상태 시작
+		result = this.codeProc(result);
+		
+		//완료상태 끝
+		//=======================================================
+		
+		//총금액 시작
+		result.setTotPrice(this.priceProc(eachCnt.getSuccessPrice(), eachCnt.getKakaoResendSuccPrice()));
+		
+		
+		return result;
+		
+	}
+	
+	private String priceProc(int successPrice, int kakaoResendSuccPrice) {
+		
+		String totPrice = "-";
+		
+		//총금액 시작
+		//=======================================================
+		// TotPrice : 성공건수에 대한 금액 곱하기
+		BigDecimal atPrice = new BigDecimal(successPrice);
+		BigDecimal kakaoResendPrice = new BigDecimal(kakaoResendSuccPrice);
+		BigDecimal totalPrice = atPrice.add(kakaoResendPrice);
+		// 소수점 한 자리로 설정 (반올림)// totalPrice 값을 소수점 한 자리까지 반올림하여 roundedTotalPrice에 저장
+		// RoundingMode.HALF_UP: 반올림 방식으로, 소수점 기준 5 이상이면 올림, 그렇지 않으면 내림
+		BigDecimal roundedTotalPrice = totalPrice.setScale(1, RoundingMode.HALF_UP);
+		
+		// roundedTotalPrice가 0인지 확인
+		// BigDecimal.compareTo(BigDecimal.ZERO)는 값을 비교하는 메서드
+		// 결과:
+		// - 반환 값이 0이면 두 값이 같음
+		// - 반환 값이 음수이면 roundedTotalPrice가 0보다 작음
+		// - 반환 값이 양수이면 roundedTotalPrice가 0보다 큼
+		if (roundedTotalPrice.compareTo(BigDecimal.ZERO) == 0) {
+			// roundedTotalPrice 값이 0이면, "-" 문자열을 totPrice에 설정
+			totPrice = "-"; 
+		} else {
+			// roundedTotalPrice 값이 0이 아닌 경우
+			// 반올림된 BigDecimal 값을 toPlainString()을 사용하여 문자열로 변환 후 totPrice에 설정
+			// toPlainString(): 지수 표기법 없이 일반적인 문자열 형태로 반환
+			totPrice = roundedTotalPrice.toPlainString();
+		}
+		//총금액 끝
+		//=======================================================
+		
+		
+		return totPrice;
+	}
+	
+	private KakaoSentVO codeProc(KakaoSentVO result) {
+		//=======================================================
+		String returnCode;
+		if ("Y".equals(result.getReserveCYn())) {
+			returnCode = "04"; // 예약취소 코드
+		} else if (
+				"Y".equals(result.getReserveYn()) 
+					&& "N".equals(result.getReserveCYn()) 
+					&& Integer.valueOf(result.getMsgGroupCnt()).equals(result.getWaitCount())
+					&& Integer.valueOf(result.getDiffMin()) < -5 // 예약 시간이 5분 이상인 것들만
+					) {
+			returnCode = "03"; // 예약대기 코드 ( 예약취소 버튼 노출 )
+		} else if (
+					//대체문자 발송 Y일때
+					("Y".equals(result.getBizKakaoResendYn())
+						//알림톡 발송 총건수 == 알림톡 발송 성공건 + 알림톡 발송 실패건
+						&& Integer.valueOf(result.getMsgGroupCnt()).equals(result.getSuccessCount() + result.getFailCount())
+						//알림톡 발송 실패건 == 대체문자 발송 성공건 + 대체문자 발송 실패건
+						&& result.getFailCount() == (result.getKakaoResendSuccCount() + result.getKakaoResendFailCount())
+					)
+					||
+					//대체문자 발송 N일때
+					("N".equals(result.getBizKakaoResendYn())
+						//알림톡 발송 총건수 == 알림톡 발송 성공건 + 알림톡 발송 실패건
+						&& Integer.valueOf(result.getMsgGroupCnt()).equals(result.getSuccessCount() + result.getFailCount()))
+					) {
+			returnCode = "02"; // 완료 코드
+		} else {
+			returnCode = "01"; // 진행중 코드
+		}
+		
+		result.setStatusCd(returnCode);
+		
+		return result;
+	}
+	private KakaoSentDetailVO codeProc(KakaoSentDetailVO result) {
+		//=======================================================
+		String returnCode;
+		if ("Y".equals(result.getReserveCYn())) {
+			returnCode = "04"; // 예약취소 코드
+		} else if (
+				"Y".equals(result.getReserveYn()) 
+					&& "N".equals(result.getReserveCYn()) 
+					&& Integer.valueOf(result.getMsgGroupCnt()).equals(result.getWaitCount())
+					&& Integer.valueOf(result.getDiffMin()) < -5 // 예약 시간이 5분 이상인 것들만
+					) {
+			returnCode = "03"; // 예약대기 코드 ( 예약취소 버튼 노출 )
+		} else if (
+					//대체문자 발송 Y일때
+					("Y".equals(result.getBizKakaoResendYn())
+						//알림톡 발송 총건수 == 알림톡 발송 성공건 + 알림톡 발송 실패건
+						&& Integer.valueOf(result.getMsgGroupCnt()).equals(result.getSuccessCount() + result.getFailCount())
+						//알림톡 발송 실패건 == 대체문자 발송 성공건 + 대체문자 발송 실패건
+						&& result.getFailCount() == (result.getKakaoResendSuccCount() + result.getKakaoResendFailCount())
+					)
+					||
+					//대체문자 발송 N일때
+					("N".equals(result.getBizKakaoResendYn())
+						//알림톡 발송 총건수 == 알림톡 발송 성공건 + 알림톡 발송 실패건
+						&& Integer.valueOf(result.getMsgGroupCnt()).equals(result.getSuccessCount() + result.getFailCount()))
+					) {
+			returnCode = "02"; // 완료 코드
+		} else {
+			returnCode = "01"; // 진행중 코드
+		}
+		
+		result.setStatusCd(returnCode);
+		
+		return result;
+	}
+	
+	private String calculateBatchInfo(KakaoSentDetailVO resultVO) {
+		
+		String msgGroupId = resultVO.getMsgGroupId();
+		
+
+		List<String> requestTimes = kakaoSentDAO.findByReqDateWhereMsgGroupId(msgGroupId);
+		
+		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
+		Map<LocalDateTime, Integer> timeCountMap = new LinkedHashMap<>();
+
+		// REQ_DATE 그룹화 (같은 시간대 몇 건인지)
+		for (String timeStr : requestTimes) {
+			LocalDateTime time = LocalDateTime.parse(timeStr, formatter);
+			timeCountMap.put(time, timeCountMap.getOrDefault(time, 0) + 1);
+		}
+
+		//  가장 첫 번째 시간 & 간격 계산
+		List<LocalDateTime> sortedKeys = new ArrayList<>(timeCountMap.keySet());
+		if (sortedKeys.size() < 2) {
+			return "데이터 부족 (분석 불가)";
+		}
+
+		int batchSize = timeCountMap.get(sortedKeys.get(0)); // 한 번에 보낸 건수
+		int intervalMinutes = sortedKeys.get(1).getMinute() - sortedKeys.get(0).getMinute(); // 시간 간격 계산
+//		int batchCount = sortedKeys.size(); // 총 몇 번 보냈는지
+
+//		return String.format("%,d건씩 %d분 간격 (%d회 발송)", batchSize, intervalMinutes, batchCount);
+		return String.format("%,d건씩 %d분 간격", batchSize, intervalMinutes);
+		
+	}
 
 }
src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java
--- src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java
+++ src/main/java/itn/let/kakao/user/sent/web/KakaoSentController.java
@@ -8,6 +8,7 @@
 import java.util.Date;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
@@ -26,6 +27,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.ModelAttribute;
@@ -43,6 +46,7 @@
 import itn.let.kakao.kakaoComm.KakaoReturnVO;
 import itn.let.kakao.kakaoComm.KakaoVO;
 import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiTemplate;
+import itn.let.kakao.user.sent.service.KakaoSentDetailVO;
 import itn.let.kakao.user.sent.service.KakaoSentService;
 import itn.let.kakao.user.sent.service.KakaoSentVO;
 
@@ -82,26 +86,26 @@
 		//전체 발송 건수 통계 불러오기
 		kakaoSentVO.setMsgType("");
 		
-		List<KakaoSentVO> totalMsgCnt = kakaoSentService.selectKakaoSentCntAll(kakaoSentVO);
-		model.addAttribute("totalMsgCnt", totalMsgCnt);
-
-		List<KakaoSentVO> atCnt = new ArrayList<KakaoSentVO>();
-		List<KakaoSentVO> ftCnt = new ArrayList<KakaoSentVO>();
-		
-
-		totalMsgCnt.forEach(t->{
-			if (Integer.parseInt(t.getFilePath1())>0) {
-				atCnt.add(t);
-			} else if (Integer.parseInt(t.getFilePath2())>0) {
-				ftCnt.add(t);
-			}
-		});
-		
-		//알림톡 성공건, 실패건 불러오기    	
-		model.addAttribute("atCnt", atCnt);
-		
-		//친구톡 성공건, 실패건 불러오기
-		model.addAttribute("ftCnt", ftCnt);
+//		List<KakaoSentVO> totalMsgCnt = kakaoSentService.selectKakaoSentCntAll(kakaoSentVO);
+//		model.addAttribute("totalMsgCnt", totalMsgCnt);
+//
+//		List<KakaoSentVO> atCnt = new ArrayList<KakaoSentVO>();
+//		List<KakaoSentVO> ftCnt = new ArrayList<KakaoSentVO>();
+//		
+//
+//		totalMsgCnt.forEach(t->{
+//			if (Integer.parseInt(t.getFilePath1())>0) {
+//				atCnt.add(t);
+//			} else if (Integer.parseInt(t.getFilePath2())>0) {
+//				ftCnt.add(t);
+//			}
+//		});
+//		
+//		//알림톡 성공건, 실패건 불러오기    	
+//		model.addAttribute("atCnt", atCnt);
+//		
+//		//친구톡 성공건, 실패건 불러오기
+//		model.addAttribute("ftCnt", ftCnt);
 		
 		// 검색 리스트 불러오기
 		if(kakaoSentVO.getPageUnit() != 10) kakaoSentVO.setPageUnit(kakaoSentVO.getPageUnit());
@@ -193,7 +197,7 @@
 		List<KakaoSentVO> resultAllSentList = kakaoSentService.selectAllKakaoSentList(kakaoSentVO);
 		System.out.println("??");
 		model.addAttribute("resultAllSentList", resultAllSentList);
-		model.addAttribute("resultAllSentCnt", resultAllSentList.size());
+//		model.addAttribute("resultAllSentCnt", resultAllSentList.size());
 		
 		model.addAttribute("searchKeyword", kakaoSentVO.getSearchKeyword());
 		paginationInfo.setTotalRecordCount( resultAllSentList.size()> 0 ? (Integer.parseInt((resultAllSentList.get(0)).getTotMsgCnt())) : 0);
@@ -498,7 +502,6 @@
      * 발송관리 엑셀다운로드 기능  - 카카오톡
      * @param searchVO
      * @param model
-     * @return	"/web/mjon/msgsent/msgSentExcelDownLoadAjax.do"
      * @throws Exception
      */
 	@RequestMapping(value= {"/web/mjon/msgsent/kakaoSentExcelDownLoadAjax.do"})
@@ -985,5 +988,105 @@
 		
 	}
 	
+	@RequestMapping(value= {"/web/kakao/sent/selectKakaoSentViewTotalSumAjax.do"})
+	public ResponseEntity<?> selectKakaoSentViewTotalSumAjax(
+										KakaoSentVO kakaoSentVO
+									) throws Exception{
+		//로그인 권한정보 불러오기
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		if(loginVO == null) {
+//			return "redirect:/web/user/login/login.do";
+		}
+		
+		kakaoSentVO.setUserId(userId);
+		
+		Map<String, Object> returnMap = kakaoSentService.selectKakaoSentCntAll_Advc(kakaoSentVO);
+
+		return new ResponseEntity<>(returnMap, HttpStatus.OK);
+	}
 	
+	/**
+	 * 발송관리 상세화면 
+	 * @param searchVO
+	 * @param model
+	 * @return	"/web/kakao/sent/selectKakaoSentDetailView.do"
+	 * @throws Exception
+	 */
+	@RequestMapping(value= {"/web/kakao/sent/selectKakaoSentDetailView.do"})
+	public String selectKakaoSentDetailView(@ModelAttribute("searchVO") KakaoSentDetailVO kakaoSentDetailVO,
+			RedirectAttributes redirectAttributes,	ModelMap model) throws Exception{
+		//로그인 권한정보 불러오기
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		if(loginVO == null) {
+			return "redirect:/web/user/login/login.do";
+		}
+		
+		kakaoSentDetailVO.setUserId(userId);
+		
+		model.addAttribute("result", kakaoSentService.selectKakaoSentDetailView(kakaoSentDetailVO));
+		
+		return "web/kakao/sent/KakaoSentDetailView";
+	}
+	
+	
+	/** 
+	 * @methodName	: selectMsgSentDetailDataAjax 
+	 * @author		: 이호영
+	 * @date		: 2023.03.06 
+	 * @description	: 알림톡 전송 - 내용 상세 팝업 [전송건별]
+	 * @param mjonKakaoATVO
+	 * @param model
+	 * @return
+	 * @throws Exception 
+	 */
+	@RequestMapping(value= {"/web/kakao/sent/selectKakaoSentDetailViewPhoneAjax.do"})
+	public String selectKakaoSentDetailViewPhoneAjax(@ModelAttribute("searchVO") MjonKakaoATVO mjonKakaoATVO, ModelMap model) throws Exception{
+		
+		//로그인 권한정보 불러오기
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		mjonKakaoATVO.setUserId(userId);
+		
+		
+		
+		//발송 관리 문자발송 내용 상세보기 팝업 => 문자내용(MJ_MSG_DATA)
+		MjonKakaoATVO mjonKakaoATResultVO = kakaoSentService.selectKakaoSentDetailDataAjax(mjonKakaoATVO);
+		// 대체문자 엔터키 치환
+		mjonKakaoATResultVO.setSmsTxt(StringUtil2.replaceBR(mjonKakaoATResultVO.getSmsTxt()));  
+		model.addAttribute("resultMsgDetail", mjonKakaoATResultVO);
+		
+		String msgType = mjonKakaoATResultVO.getMsgType();
+		
+		if(msgType.equals("8")) {//카카오 알림톡인 경우 상세정보 처리
+			
+			// 템플릿 api 가져오기
+			KakaoVO kakaoVO = new KakaoVO(); 
+			kakaoVO.setSenderKey(mjonKakaoATResultVO.getMsgNoticetalkSenderKey());
+			kakaoVO.setTemplateCode(mjonKakaoATResultVO.getMsgNoticetalkTmpKey());
+			
+			KakaoReturnVO kakaoTemplateInfo =kakaoApiTemplate.selectKakaoApiTemplateDetail(kakaoVO);
+			
+			model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo);
+			// //템플릿 api 가져오기
+			
+		}else if(msgType.equals("9")) {//카카오 친구톡인 경우 상세정보 처리
+			
+			//String smsTxt = mjonKakaoATResultVO.getSmsTxt();
+			
+			KakaoReturnVO kakaoTemplateInfo = getKakaoFTSendTemplateInfo(mjonKakaoATResultVO);
+			//kakaoTemplateInfo.setTemplateContent(smsTxt);
+			
+			model.addAttribute("kakaoTemplateInfo", kakaoTemplateInfo);
+			
+		}else {
+			
+			model.addAttribute("kakaoTemplateInfo", "");
+			
+		}
+		
+		model.addAttribute("msgType", msgType);		
+		return "web/kakao/sent/KakaoSentDetailPopAjax";
+	}
 }
src/main/java/itn/let/mjo/addr/service/AddrService.java
--- src/main/java/itn/let/mjo/addr/service/AddrService.java
+++ src/main/java/itn/let/mjo/addr/service/AddrService.java
@@ -109,4 +109,8 @@
 	void deleteAddr_advc(AddrGroupVO addrGroupVO) throws Exception;
 
 	int getAddrCount(AddrGroupVO addrGroupVO) throws Exception;
+
+	StatusResponse insertByAddrGrpDataAndAddrDataAjax(AddrVO addrVO) throws Exception;
+
+	StatusResponse deleteAddrNoDataAjax(AddrVO addrVO) throws Exception;
 }
src/main/java/itn/let/mjo/addr/service/impl/AddrDAO.java
--- src/main/java/itn/let/mjo/addr/service/impl/AddrDAO.java
+++ src/main/java/itn/let/mjo/addr/service/impl/AddrDAO.java
@@ -292,5 +292,9 @@
 		return (Integer)select("AddrDAO.getAddrCount", addrVO);
 	}
 
+	public int deleteAddrPhoneNo(AddrVO addrVO) {
+		return update("AddrDAO.deleteAddrPhoneNo", addrVO);
+	}
+
 	
 }
src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java
--- src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java
+++ src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java
@@ -34,6 +34,8 @@
 import itn.let.mjo.addr.service.AddrService;
 import itn.let.mjo.addr.service.AddrTransHistVO;
 import itn.let.mjo.addr.service.AddrVO;
+import itn.let.mjo.msgsent.service.MjonMsgSentVO;
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * 주소록 관리를 위한 서비스 구현 클래스
@@ -49,6 +51,7 @@
  *  2021.04.08  ITN          최초 생성
  *  </pre>
  */
+@Slf4j
 @Service("AddrService")
 public class AddrServiceImpl  extends EgovAbstractServiceImpl implements AddrService {
 
@@ -644,5 +647,81 @@
 		
 		return aa; 
 	}
+
+	@Override
+	public StatusResponse insertByAddrGrpDataAndAddrDataAjax(AddrVO addrVO) throws Exception {
+
+		String userId = addrVO.getMberId();
+		
+		log.info("addrVO.getAddrGrpId() :: [{}]", addrVO.getAddrGrpId());
+		
+		// 새로운 그룹 생성
+		if ("NEW".equals(addrVO.getAddrGrpId())) {
+			
+			
+			AddrGroupVO addrGroupVO = new AddrGroupVO();
+			addrGroupVO.setMberId(userId);
+			addrGroupVO.setAddrGrpNm(addrVO.getAddrGrpNm());
+			addrGroupVO.setFrstRegisterId(userId);
+			
+			int usedCnt = addrGroupDAO.selectDuplAddrGroupCnt(addrGroupVO);
+			if(usedCnt > 0) {
+				return new StatusResponse(HttpStatus.BAD_REQUEST, "이미 등록되어있는 그룹이름입니다.", LocalDateTime.now());
+			}
+
+			int nextOrderNumber = addrGroupDAO.selectMaxOrderNumber(addrGroupVO);
+			addrGroupVO.setGrpOrder(nextOrderNumber);
+			
+			String addrGrpIdTemp = addrGroupDAO.insertAddrGroup(addrGroupVO);
+			
+
+			addrVO.setAddrGrpId(addrGrpIdTemp);
+			
+		}
+		else if ("bookmark".equals(addrVO.getAddrGrpId())) 
+		{// 자주 보내는 그룹
+			addrVO.setBookmark("Y"); 
+			addrVO.setAddrGrpId("0"); 
+		} 
+		else 
+		{
+			addrVO.setBookmark("N");
+		} 
+
+		String bookmark = addrVO.getBookmark(); 
+		String addrGrpId = addrVO.getAddrGrpId(); 
+
+		List<AddrVO> addrDataInfo = new ArrayList<AddrVO>();
+
+		for(String phone : addrVO.getAddrPhones()) {
+			AddrVO addrTempVO = new AddrVO();
+			addrTempVO.setAddrPhoneNo(phone);
+			addrTempVO.setAddrGrpId(addrGrpId);
+			addrTempVO.setBookmark(bookmark);
+			addrTempVO.setFrstRegisterId(userId);
+			addrTempVO.setMberId(userId);
+			addrDataInfo.add(addrTempVO);
+		}
+
+		int resultCnt = addrDAO.insertAddrList(addrDataInfo);
+		
+		
+
+		return new StatusResponse(HttpStatus.OK, "총" + resultCnt + "건의 주소록 등록이 완료되었습니다.", addrVO);
+		
+	}
+
+	@Override
+	public StatusResponse deleteAddrNoDataAjax(AddrVO addrVO) throws Exception {
+		
+//		AddrPhones
+		//아이디 저장
+		
+		//주소록 디비에서 연락처 정보를 delete 시킴
+		int resultCnt = addrDAO.deleteAddrPhoneNo(addrVO);
+		
+		
+		return new StatusResponse(HttpStatus.OK, "총 " + resultCnt + "건의 주소록을 삭제하였습니다.", addrVO);
+	}
     
 }
src/main/java/itn/let/mjo/addr/web/AddrController.java
--- src/main/java/itn/let/mjo/addr/web/AddrController.java
+++ src/main/java/itn/let/mjo/addr/web/AddrController.java
@@ -4,6 +4,7 @@
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -31,10 +32,13 @@
 import org.apache.poi.xssf.usermodel.XSSFRow;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
@@ -52,12 +56,14 @@
 import itn.com.cmm.util.StringUtil;
 import itn.com.utl.fcc.service.EgovStringUtil;
 import itn.let.fax.addr.service.FaxAddrVO;
+import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.addr.service.AddrGroupService;
 import itn.let.mjo.addr.service.AddrGroupVO;
 import itn.let.mjo.addr.service.AddrService;
 import itn.let.mjo.addr.service.AddrTransHistVO;
 import itn.let.mjo.addr.service.AddrVO;
 import itn.let.mjo.msgdata.service.PhoneVO;
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * 주소록 관한 controller 클래스를 정의한다.
@@ -75,6 +81,7 @@
  *
  * </pre>
  */
+@Slf4j
 @Controller
 public class AddrController {
 
@@ -2223,6 +2230,47 @@
 		return modelAndView;
 	} 	
 	
+
+	@RequestMapping(value = {"/web/mjon/addr/insertByAddrGrpDataAndAddrDataAjax.do"})
+	public ResponseEntity<StatusResponse> insertByAddrGrpDataAndAddrDataAjax(@RequestBody AddrVO addrVO) throws Exception {
+		
+		ModelAndView modelAndView = new ModelAndView();
+		modelAndView.setViewName("jsonView");
+		
+		//로그인 권한정보 불러오기
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		
+		if(userId == null) {
+			if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
+		}
+		
+		addrVO.setMberId(userId);
+		
+		
+		return ResponseEntity.ok().body(addrService.insertByAddrGrpDataAndAddrDataAjax(addrVO));
+	}	
+	
+	@RequestMapping(value = {"/web/mjon/addr/deleteAddrNoDataAjax.do"})
+	public ResponseEntity<StatusResponse> deleteAddrNoDataAjax(@RequestBody AddrVO addrVO) throws Exception {
+		
+		ModelAndView modelAndView = new ModelAndView();
+		modelAndView.setViewName("jsonView");
+		
+		//로그인 권한정보 불러오기
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		
+		if(userId == null) {
+			if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
+		}
+		
+		addrVO.setMberId(userId);
+		
+		return ResponseEntity.ok().body(addrService.deleteAddrNoDataAjax(addrVO));
+	}	
+	
+	
 	
 
 	public boolean getNameRepLenChk(String type, String value) {
src/main/java/itn/let/mjo/mjocommon/MjonCommon.java
--- src/main/java/itn/let/mjo/mjocommon/MjonCommon.java
+++ src/main/java/itn/let/mjo/mjocommon/MjonCommon.java
@@ -1,10 +1,12 @@
 package itn.let.mjo.mjocommon;
 
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 import javax.annotation.Resource;
 
@@ -14,13 +16,18 @@
 import org.apache.commons.httpclient.methods.PostMethod;
 import org.json.simple.JSONObject;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
 import com.mysql.jdbc.StringUtils;
 
+import egovframework.com.idgen.CustomIdGnrService;
+import egovframework.rte.fdl.cmmn.exception.FdlException;
 import itn.com.cmm.MjonMsgSendVO;
 import itn.com.cmm.OptimalMsgResultDTO;
 import itn.com.cmm.util.MsgSendUtils;
+import itn.com.cmm.util.SlackMessageFormatUtil;
+import itn.let.kakao.kakaoComm.KakaoSendAdvcVO;
 import itn.let.kakao.kakaoComm.KakaoVO;
 import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.event.service.MjonEventService;
@@ -60,11 +67,14 @@
 	/** xpedite 솔루션 ID*/
 	@Value("#{globalSettings['Globals.slack.channel.name']}")
 	private String SLACK_CHANNEL;
-	
+
+	@Resource(name = "egovMjonMsgIdCGnrService")
+	private CustomIdGnrService idgenMsgCId;
+
 	
 
 	/** 
-	 * @methodName	: getAdminMsgSandSlack 
+	 * @methodName	: getAdminSandSlack 
 	 * @author		: 이호영
 	 * @date		: 2024.12.04 
 	 * @description	: 기존 메소드 리펙토링
@@ -120,8 +130,8 @@
 	
 		try {
 			// 메시지 내용 설정
-			String smsTxt = formatSmsText(mjonMsgVO);
-			String sandName = formatSandName(mjonMsgVO);
+			String smsTxt = SlackMessageFormatUtil.formatSmsText(mjonMsgVO);
+			String sandName = SlackMessageFormatUtil.formatSandName(mjonMsgVO);
 		
 			// Slack 메시지 생성
 			JSONObject json = new JSONObject();
@@ -150,94 +160,49 @@
 		}
 	}
 	
-	/**
-	* @throws Exception 
-	 * @Method Name : getAdminSlackSand
-	* @작성일 : 2022. 12. 6.
-	* @작성자 :  WYH
-	* @Method 설명 : slack 메시지 전송
-	*/
-	/*public void getAdminMsgSandSlack(MjonMsgVO mjonMsgVO) {
-		
+	public void getAdminKakaoAtSendSlack(KakaoSendAdvcVO kakaoVO) {
 		HttpClient client = new HttpClient();
-		PostMethod post = new PostMethod(url);
-		JSONObject json = new JSONObject();
+		PostMethod post = new PostMethod(SLACK_URL);
+
 		try {
- 
-			String reserveYn = mjonMsgVO.getReserveYn();
-			String delayYn = mjonMsgVO.getDelayYn();
-			String smsTxt = mjonMsgVO.getSmsTxt();
-			String smishingYn = mjonMsgVO.getSmishingYn();
-			String reservSmsTxt = "";
-			String smisingSmsTxt = "";
-			//예약문자를 발송하는 경우 문자 내용 앞에 "[예약]" 표시되도록 처리
+			// 메시지 내용 설정
+			String smsTxt = SlackMessageFormatUtil.formatKakaoText(kakaoVO);
+			String sandName = SlackMessageFormatUtil.formatKakaoSandName(kakaoVO);
 			
-			if(reserveYn.equals("Y")) {
-				
-				if(smishingYn.equals("Y") || delayYn.equals("Y")) {
-					reservSmsTxt = "[스미싱의심][예약]" + smsTxt;
-				}else {
-					reservSmsTxt = "[예약]" + smsTxt;
-				}
-				
-				smsTxt = reservSmsTxt;
-				System.out.println("smishingYn : "+ smishingYn);
-				System.out.println("delayYn : "+ delayYn);
-			}else if(smishingYn.equals("Y") || delayYn.equals("Y")) {
-				
-				smisingSmsTxt = "[스미싱의심]" + smsTxt;
-				smsTxt = smisingSmsTxt;
-			}
-			
-			String sandName = mjonMsgVO.getCallFrom();
-			String userId = mjonMsgVO.getUserId();
-			String msgType = "";
-			int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt());//그림 이미지 갯수
-			if(mjonMsgVO.getMsgType().equals("4")) {	//단문 금액
-				msgType = "[단문]";
-			}else if(mjonMsgVO.getMsgType().equals("6")){
-				if(fileCount == 0) {
-					msgType = "[장문]";	
-				}else {
-					msgType = "[그림]";
-					// 2022.12.21 JSP => 텍스트없는 그림문자만 발송시 슬랙알림 안됨
-					if (StringUtils.isNullOrEmpty(smsTxt)) {
-						smsTxt = "그림문자 " + smsTxt;
-					}
-				}
-			}
-//			sandName = "[" + userId + "]" + "[" + sandName + "]" + msgType;
-			sandName = "[개발테스트]"+"[" + userId + "]" + "[" + sandName + "]" + msgType;
-			
-			json.put("channel", "mjon메시지");
+			// Slack 메시지 생성
+			JSONObject json = new JSONObject();
+			json.put("channel", SLACK_CHANNEL);
 			json.put("text", smsTxt);
 			json.put("username", sandName);
 			
-			
+			// Slack 요청
 			post.addParameter("payload", json.toString());
-			// 처음에 utf-8로 content-type안넣어주니까 한글은 깨져서  content-type넣어줌
 			post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
+		
+			// Slack 응답 처리
 			int responseCode = client.executeMethod(post);
-			String response = post.getResponseBodyAsString();
-			if (responseCode != HttpStatus.SC_OK) { 
-				System.out.println("Response: " + response);
+			if (responseCode != HttpStatus.SC_OK) {
+				log.warn("Slack 메시지 전송 실패. Response: {}", post.getResponseBodyAsString());
 			}
 		} catch (IllegalArgumentException e) {
-			System.out.println("IllegalArgumentException posting to Slack " + e);
-		} 
-		catch (IOException e) {
-			System.out.println("IOException posting to Slack " + e);
-		} 
-		catch (Exception e) {
-			System.out.println("Exception posting to Slack " + e);
-			e.printStackTrace();
+			log.error("Slack 메시지 전송 중 IllegalArgumentException 발생", e);
+		} catch (IOException e) {
+			log.error("Slack 메시지 전송 중 IOException 발생", e);
+		} catch (Exception e) {
+			log.error("Slack 메시지 전송 중 Exception 발생", e);
 		} finally {
 			post.releaseConnection();
 		}
-		
-	}*/
+	}
 	
+	private String formatKakaoSandName(KakaoVO kakaoVO) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
 	
+
+
 	/**
 	* @Method Name : sendSimpleSlackMsg
 	* @작성일 : 2022. 12. 9
@@ -384,7 +349,7 @@
 		
 		return mjonMsgVO;
 	}
-	
+	/*
 	@SuppressWarnings("unchecked")
 	public void getAdminKakaoAtSandSlack(KakaoVO kakaoVO) {
 		
@@ -448,7 +413,7 @@
 		}
 		
 	}
-	
+	*/
 	
 	public String getCreateMsgUserIdgen(String subUserId, String lastId) throws Exception{
 		
@@ -485,27 +450,6 @@
 
 
 
-private String formatSmsText(MjonMsgVO mjonMsgVO) {
-    String smsTxt = mjonMsgVO.getSmsTxt();
-    String reserveYn = safeGetString(mjonMsgVO.getReserveYn());
-    String delayYn = safeGetString(mjonMsgVO.getDelayYn());
-    String smishingYn = safeGetString(mjonMsgVO.getSmishingYn());
-
-    // 예약 문자와 스미싱 의심 처리
-    if ("Y".equals(reserveYn)) {
-        smsTxt = ("Y".equals(smishingYn) || "Y".equals(delayYn)) ? "[스미싱의심][예약]" + smsTxt : "[예약]" + smsTxt;
-    } else if ("Y".equals(smishingYn) || "Y".equals(delayYn)) {
-        smsTxt = "[스미싱의심]" + smsTxt;
-    }
-
-    // 그림 문자 처리
-    int fileCount = parseIntOrDefault(mjonMsgVO.getFileCnt(), 0);
-    if ("6".equals(mjonMsgVO.getMsgType()) && fileCount > 0 && StringUtils.isNullOrEmpty(smsTxt)) {
-        smsTxt = "그림문자 " + smsTxt;
-    }
-
-    return smsTxt;
-}
 
 private String formatSandName(MjonMsgVO mjonMsgVO) {
     String userId = mjonMsgVO.getUserId();
@@ -542,7 +486,18 @@
 	
 	
 
-	// 전체 로직 처리 (한 번에 모든 필요한 정보 반환)
+	/**
+	 * @methodName	: processUserAndCheckSms 
+	 * @author		: 이호영
+	 * @date		: 2025. 3. 25.
+	 * @description	: SMS 알림 전체 로직 처리 (한 번에 모든 필요한 정보 반환)
+	 * @return : boolean
+	 * @param mjonMsgVO
+	 * @param userId
+	 * @return
+	 * @throws Exception
+	 * 
+	 */
 	public boolean processUserAndCheckSms(MjonMsgVO mjonMsgVO, String userId) throws Exception {
 		UserManageVO userManageVO = getUserManageInfo(userId);
 
@@ -556,9 +511,39 @@
 			mjonMsgVO.setSmishingYn(smishingYn); // MjonMsgVO에 스미싱 정보 설정
 
 			// 스미싱 알림 처리
-			return handleSmishingAlert(mjonMsgVO); // 알림 처리 결과 반환
+			return handleSmishingAlert(); // 알림 처리 결과 반환
 		}
 
+		return false; // 알림 처리되지 않음
+	}
+	
+	/**
+	 * @methodName	: processUserAndCheckAT 
+	 * @author		: 이호영
+	 * @date		: 2025. 3. 25.
+	 * @description	: SMS 알림 전체 로직 처리 (한 번에 모든 필요한 정보 반환)
+	 * @return : boolean
+	 * @param mjonMsgVO
+	 * @param userId
+	 * @return
+	 * @throws Exception
+	 * 
+	 */
+	public boolean processUserAndCheckAT(KakaoVO kakaoVO) throws Exception {
+		UserManageVO userManageVO = getUserManageInfo(kakaoVO.getUserId());
+		
+		// 기본값 처리된 사용자 정보와 문자 상태
+		String adminSmsNoticeYn = userManageVO.getAdminSmsNoticeYn();
+		String atSmishingYn = userManageVO.getAtSmishingYn();
+		
+		// 조건 체크
+		if ("Y".equals(adminSmsNoticeYn) || "Y".equals(atSmishingYn)) {
+			kakaoVO.setAtSmishingYn("Y"); // MjonMsgVO에 스미싱 정보 설정
+			
+			// 스미싱 알림 처리
+			return handleSmishingAlert(); // 알림 처리 결과 반환
+		}
+		
 		return false; // 알림 처리되지 않음
 	}
 
@@ -572,18 +557,28 @@
 	}
 
 	// 스미싱 알림 처리
-	public boolean handleSmishingAlert(MjonMsgVO mjonMsgVO) throws Exception {
+	public boolean handleSmishingAlert() throws Exception {
+		/**
+		 * MJ_MBER_SETTING => 기본 시스템 알림 여부
+		 * 슬랙 Y
+		 * 야간스미싱알림 Y
+		 * 등등
+		 *
+		 */
 		JoinSettingVO joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
 		
+/** @시스템 설정에 야간스미싱 알림 || 슬랙알림이 N이면 false*/
 		if (joinSettingVO == null || !"Y".equals(joinSettingVO.getHoliSmishingNoti()) || 
 			!"Y".equals(joinSettingVO.getSlackNoti())) {
 			return false; // 알림 조건 미충족
 		}
 
-		// 알림 조건 충족 시 추가 작업
+/** @MJ_SPAMPASS_ALARM : 현재 활성화된 알림 SELECT */ 
 		List<MsgAlarmSetVO> alarmList = getAlarmSettings();
+/** @MJ_HOLIDAY 시스템에 등록된 공휴일 설정 */
 		List<MsgHolidayVO> holidayList = getHolidayList();
-		boolean isNotificationAllowed = new MjonHolidayApi().getHolidaySmishingPassStatus(alarmList, holidayList);
+/** @MJ_HOLIDAY 시스템에 등록된 공휴일 설정 */
+		boolean isNotificationAllowed = new MjonHolidayApi().getHolidaySmishingPassStatus_advc(alarmList, holidayList);
 
 		return !isNotificationAllowed; // 알림 발송 조건 미충족
 	}
@@ -699,9 +694,55 @@
 	
 
 
+	public List<String> getNextCustomMsgCId (int cnt) throws FdlException {
+
+		List<String> idList = idgenMsgCId.getNextStringId(cnt);
+		return idList;
+		
+	}
 	
 	
-	
+	/** 
+	 * @methodName	: getSmsTxtBytes 
+	 * @author		: 이호영
+	 * @date		: 2024.09.23 
+	 * @description	: sms 텍스트 바이트 계산 후 return;
+	 * @param smsTxt
+	 * @return
+	 * @throws UnsupportedEncodingException 
+	 */
+	public static int getSmsTxtBytes(String smsTxt) throws UnsupportedEncodingException {        	//문자열 길이 체크 해주기
+		int smsBytes = 0;
+		//문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산
+		String charset = "euc-kr"; 						
+		if(org.apache.commons.lang3.StringUtils.isNotEmpty(smsTxt)) {
+			String smsCont = smsTxt.replace("\r\n", "\n");
+			smsBytes = smsCont.getBytes(charset).length;
+		}
+//		log.info(" + smsBytes :: [{}]", smsBytes);
+		return smsBytes;
+	}
+
+
+	/**
+	 * @methodName	: replaceTemplateVariables 
+	 * @author		: 이호영
+	 * @date		: 2025. 3. 12.
+	 * @description	: 헬퍼 메서드: 템플릿 변수 치환
+	 * @return : String
+	 * @param content
+	 * @param variables
+	 * @return
+	 */
+	public static String ATReplaceTemplateVariables(String content, Map<String, String> variables) {
+		String result = content;
+		for (Map.Entry<String, String> entry : variables.entrySet()) {
+			String placeholder = entry.getKey();
+			String value = entry.getValue();
+			result = result.replace(placeholder, value);
+		}
+		return result;
+	}
 	
 	
 	
src/main/java/itn/let/mjo/mjocommon/MjonHolidayApi.java
--- src/main/java/itn/let/mjo/mjocommon/MjonHolidayApi.java
+++ src/main/java/itn/let/mjo/mjocommon/MjonHolidayApi.java
@@ -231,4 +231,71 @@
 		return smishingAlarmPassSts;
 	}
 	
+	/**
+	 * @methodName	: getHolidaySmishingPassStatus_advc
+	 * @author		: 이호영
+	 * @date		: 2025. 3. 19.
+	 * @description	: getHolidaySmishingPassStatus 개선 버전
+	 * @return : boolean
+	 * @param resultAlarmList
+	 * @param resultHolidayList
+	 * @return
+	 * @throws Exception
+	 * 
+	 */
+	public boolean getHolidaySmishingPassStatus_advc(List<MsgAlarmSetVO> alarmList, List<MsgHolidayVO> holidayList) throws Exception{
+		
+		Date now = new Date(); // 현재 시스템 시간
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 날짜-시간 포맷 (예: 2025-03-18 14:30)
+		
+		// 현재 날짜와 요일 계산
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(now);
+		int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1(일요일) ~ 7(토요일)
+		// 오늘 날짜를 "yyyy-MM-dd" 형식으로 포맷팅 (mj_holiday.HOLIDAY_DATE와 비교용)
+		String today = String.format("%d-%02d-%02d", 
+		    cal.get(Calendar.YEAR), 
+		    cal.get(Calendar.MONTH) + 1, // Calendar.MONTH는 0부터 시작하므로 +1
+		    cal.get(Calendar.DATE));
+	
+		// 공휴일 여부 확인
+		// mj_holiday 테이블의 HOLIDAY_DATE와 오늘 날짜가 일치하는지 체크
+		// HOLIDAY_DATE는 'yyyy-MM-dd' 형식으로 저장됨 (예: '2025-01-01')
+		boolean isHoliday = holidayList.stream()
+				.anyMatch(holiday -> today.equals(holiday.getHolidayDate()));
+	
+		// 알람 설정 순회
+		// alarmList는 MsgAlarmSetVO 객체의 리스트로, 알람 타입과 시작/종료 시간을 포함
+		for (MsgAlarmSetVO alarm : alarmList) {
+			String alarmType = alarm.getAlarmType(); // 알람 유형: 'W'(평일), 'E'(주말), 'H'(공휴일)
+			// 오늘 날짜에 알람 시작/종료 시간을 붙여 Date 객체로 변환
+			Date start = sdf.parse(today + " " + alarm.getAlarmStart()); // 예: "2025-03-18 09:00"
+			Date end = sdf.parse(today + " " + alarm.getAlarmEnd());     // 예: "2025-03-18 18:00"
+		
+			// 현재 시간이 알람 시작~종료 시간 범위 내에 있는지 확인
+			boolean isWithinTime = now.after(start) && now.before(end);
+			if (!isWithinTime) continue; // 시간 범위 밖이면 다음 알람으로
+		
+			// 평일 체크 (월~금: dayOfWeek 2~6)
+			// alarmType 'W'는 평일에만 적용
+			if (dayOfWeek > 1 && dayOfWeek < 7 && alarmType.equals("W")) {
+				return true; // 평일이고, 시간이 맞고, 타입이 'W'면 스미싱 알람 통과
+			}
+			// 주말 체크 (일:1, 토:7)
+			// alarmType 'E'는 주말에만 적용
+			else if ((dayOfWeek == 1 || dayOfWeek == 7) && alarmType.equals("E")) {
+				return true; // 주말이고, 시간이 맞고, 타입이 'E'면 스미싱 알람 통과
+			}
+			// 공휴일 체크
+			// alarmType 'H'는 mj_holiday에 등록된 공휴일에 적용
+			// HOLIDAY_TYPE(1:법정, 2:임시, 3:기타)과 관계없이 날짜만 확인
+			else if (isHoliday && alarmType.equals("H")) {
+				return true; // 공휴일이고, 시간이 맞고, 타입이 'H'면 스미싱 알람 통과
+			}
+		}
+		
+		// 모든 조건에 부합하지 않으면 false 반환 (스미싱 알람 비활성화)
+		return false;
+	}
+	
 }
src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java
--- src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java
+++ src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java
@@ -7,12 +7,18 @@
 
 import itn.com.cmm.ComDefaultVO;
 import itn.com.cmm.MjonMsgSendVO;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
 
 @JsonIgnoreProperties(ignoreUnknown = true)
 @Getter
 @Setter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class MjonMsgVO extends ComDefaultVO{
 	
 	private static final long serialVersionUID = 1L;
@@ -34,6 +40,7 @@
 	private String[] callToList; // '수신번호리스트',
 	private String  callFrom; // '발신번호 (하이픈 등의 문자를 제외한 12byte이하의 숫자로 입력한다.)',
 	private String  subject; // 'MMS용 메시지제목',
+	private String  subjectChkYn; // 'MMS용 메시지제목',
 	private String  smsTxt; // 'SMS용 메시지본문',
 	private String  smsTxtArea;//문자 작성 화면 본문 내용 
 	private String  msgType; // '메시지의 (4: SMS 전송, 5: URL 전송, 6: MMS전송, 7: BARCODE전송, 8: 카카오 알림톡 전송)',
src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataVO.java
--- src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataVO.java
+++ src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataVO.java
@@ -28,6 +28,7 @@
 	private List msgIdList;
 	private List msgSeqList;
 	private String subject;
+	private String subjectChkYn;
 	private String mmsSubject;
 	private String smsTxt;
 	private String smsLen;
src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java
--- src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java
+++ src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java
@@ -4061,7 +4061,7 @@
 
 		System.out.println("================================");
 		// 스팸 및 스미싱 의심이면 slack 알림
-		boolean isHolidayNotified = mjonCommon.handleSmishingAlert(mjonMsgVO);
+		boolean isHolidayNotified = mjonCommon.handleSmishingAlert();
 		
 		
 		// 스팸관련 키워드 select
@@ -4095,7 +4095,9 @@
 		MsgSendUtils.setPriceforVO(mjonMsgVO, mjonMsgSendVOList, sysJoinSetVO, mberManageVO);
 
 		// msg_id 대량 생성
-		List<String> idList = idgenMsgCId.getNextStringId(mjonMsgSendVOList.size());
+		
+//		List<String> idList = idgenMsgCId.getNextStringId(mjonMsgSendVOList.size());
+		List<String> idList = mjonCommon.getNextCustomMsgCId(mjonMsgSendVOList.size());
 		for (int i = 0; i < mjonMsgSendVOList.size(); i++) {
 			mjonMsgSendVOList.get(i).setMsgId(idList.get(i));
 		}
@@ -4136,7 +4138,6 @@
 		int instTotalCnt = 0;
 		// Step 2: 그룹화 된 데이터를 그룹별로 insert 처리
 		for (Map.Entry<String, List<MjonMsgSendVO>> entry : priceGroupedMessages.entrySet()) {
-			String price = entry.getKey(); // 가격 (String)
 			List<MjonMsgSendVO> groupedMsgList = entry.getValue(); // 해당 가격의 메시지 리스트
 			
 			// msgGroupId 생성
@@ -4150,6 +4151,7 @@
 				
 				instTotalCnt += instCnt;
 				this.insertMsgGroupDataTb_advc(instCnt, mjonMsgVO, groupedMsgList);
+				log.info(" :: group data insert :: ");
 
 				// 금액 및 포인트 insert
 				priceAndPoint.insertCashAndPoint(
@@ -4171,7 +4173,7 @@
 			// 수신거부 목록 업데이트
 //			returnMap.put("resultSts", instCnt);
 
-			log.debug("가격 [{}]의 총 갯수: [{}]", price, groupedMsgList.size());
+			log.debug("가격 [{}]의 총 갯수: [{}]", entry.getKey(), groupedMsgList.size());
 
 		}
 
src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java
--- src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java
+++ src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java
@@ -114,8 +114,9 @@
 import itn.let.uss.umt.service.MberManageVO;
 import itn.let.uss.umt.service.UserManageVO;
 import itn.let.utl.sim.service.EgovClntInfo;
+import lombok.extern.slf4j.Slf4j;
 
-
+@Slf4j
 @Controller
 public class MjonMsgDataController {
 
@@ -816,6 +817,7 @@
 		
 		mjonMsgDataVO.setMsgSeqList(tempList);
 		
+		log.info("===================================================");
 		List<MjonMsgVO> resultList = mjonMsgDataService.selectReSendMsgDataList(mjonMsgDataVO);
 		
 		//문자발송 이미지 처리 - 사용하지 않아서 주석처리함.
@@ -2088,16 +2090,8 @@
 	    		
 	    	}
 
-	        long startTime = System.currentTimeMillis(); // 시작 시간 측정
-	        
 	    	List<AddrVO> resultAddrList = mjonMsgDataService.selectMsgAddrListAjax(addrVO);
 
-	        long endTime = System.currentTimeMillis(); // 종료 시간 측정
-
-	        long elapsedTime = endTime - startTime; // 소요 시간 계산
-	        System.out.println("소요 시간: " + elapsedTime + " 밀리초");
-	        
-	        
 	    	
 	    	modelAndView.addObject("resultAddrList", resultAddrList);
 	    	modelAndView.addObject("result", "success");
@@ -5961,7 +5955,6 @@
      * 발송관리 엑셀다운로드 기능 
      * @param searchVO
      * @param model
-     * @return	"/web/mjon/msgsent/msgSentExcelDownLoadAjax.do"
      * @throws Exception
      */
 	@RequestMapping(value= {"/web/mjon/msgdata/recieveCallToListExcelDownAjax.do"})
 
src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentVO.java (added)
+++ src/main/java/itn/let/mjo/msgsent/service/MjonMsgDetailSentVO.java
@@ -0,0 +1,64 @@
+package itn.let.mjo.msgsent.service;
+
+import java.util.List;
+
+import itn.let.cmm.vo.FileInfoVO;
+import itn.let.uss.umt.service.UserDefaultVO;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class MjonMsgDetailSentVO extends UserDefaultVO{
+
+	private static final long serialVersionUID = 1L;
+
+	
+	private String msgGroupId;
+	private String reqDate;
+	private String regDate;
+	private String msgGroupCnt;
+	private String reserveYn;
+	private String reserveCYn;
+	private String canceldate;
+	private String callFrom;
+	private String userId;
+	private String smsTxt;
+	private String subject;
+	private String subjectChkYn;
+	private String msgType;
+	private String fileCnt;
+	private String msgKind;
+	private String eachPrice;
+	private String sentDate;
+	private String filePath1;
+	private String filePath2;
+	private String filePath3;
+	
+	private String callTo;
+	private String statusTxt;
+	private String addrNm;
+	
+	
+	private String resultSValue;
+	private String resultFValue;
+	private String resultWValue;
+	
+	private String successPct;
+	private String failedPct;
+	private String waitingPct;
+	
+	
+	
+	
+	
+	private String statusCd; // 진행상태 코드
+	private String divideYN;
+	private String divideText;
+	private int diffMin;
+	private String totPrice;
+
+
+	// FileInfo 리스트 필드 추가
+	private List<FileInfoVO> fileInfos;
+}
 
src/main/java/itn/let/mjo/msgsent/service/MjonMsgSWFDTO.java (added)
+++ src/main/java/itn/let/mjo/msgsent/service/MjonMsgSWFDTO.java
@@ -0,0 +1,33 @@
+package itn.let.mjo.msgsent.service;
+
+import java.io.Serializable;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 
+ * @author 		: 이호영
+ * @fileName 	: MjonMsgSWFDTO.java 
+ * @date 		: 2025.01.16
+ * @description : 그룹ID로 성공 실패 대기 건수를 구해서 전달해주는 DTO 
+ * =========================================================== 
+ * DATE          AUTHOR   NOTE 
+ * ----------------------------------------------------------- *
+ * 2025.01.16    이호영          최초 생성
+ * 
+ * 
+ * 
+ */
+@Getter
+@Setter
+public class MjonMsgSWFDTO  implements Serializable {
+
+	private static final long serialVersionUID = 1L; // 선언
+	
+	private int resultSValue; // 성공건수
+	private int resultFValue; // 실패건수
+	private int resultWValue; // 대기건수
+	private String divideYN; // 분할여부
+	
+}
src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentService.java
--- src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentService.java
+++ src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentService.java
@@ -1,6 +1,10 @@
 package itn.let.mjo.msgsent.service;
 
+import java.io.IOException;
 import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
 
 import itn.let.fax.addr.service.FaxAddrGroupVO;
 import itn.let.mjo.addr.service.AddrGroupVO;
@@ -15,6 +19,8 @@
 	
 	//발송 관리 전체 발송 리스트 불러오기
 	public List<MjonMsgSentVO> selectAllMsgSentList(MjonMsgSentVO mjonMsgSentVO) throws Exception;
+	
+	public Map<String, Object> selectAllMsgSentList_advc(MjonMsgSentVO mjonMsgSentVO) throws Exception;
 	
 	//발송 관리 전체 발송 리스트 불러오기 => 주소록 조인 제거버전
 	public List<MjonMsgSentVO> selectAllMsgSentSimpleList(MjonMsgSentVO mjonMsgSentVO) throws Exception;
@@ -54,5 +60,14 @@
 	
 	//첨부파일 정보 불러오기
 	public MjonMsgSentVO selectFileInfo(String streFileId) throws Exception;
+
+	public int countAllMsgSentList(MjonMsgSentVO mjonMsgSentVO);
+
+	public Map<String, Object> selectAllMsgSentDetailView(MjonMsgDetailSentVO mjonMsgDetailSentVO) throws Exception;
+
+	public List<MjonMsgDetailSentVO> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO);
+
+	public void msgSentExcelDownLoad(MjonMsgSentVO mjonMsgSentVO, HttpServletResponse response) throws IOException, Exception;
+
 	
 }
src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java
--- src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java
+++ src/main/java/itn/let/mjo/msgsent/service/MjonMsgSentVO.java
@@ -4,7 +4,17 @@
 import java.util.List;
 
 import itn.let.uss.umt.service.UserDefaultVO;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
 
+@Getter
+@Setter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class MjonMsgSentVO extends UserDefaultVO{
 
 	private static final long serialVersionUID = 1L;
@@ -16,8 +26,9 @@
 	private List msgGroupIdList;	//문자 그룹아이디 리스트
 	private String smsTxt;			//문자 내용
 	private String subject;			//문자 제목
-	private Date regdate;			//문자 등록일자
-	private Date reqdate;			//문자 예약 발송 일자
+	private String subjectChkYn;			//문자 제목
+	private String regDate;			//문자 등록일자
+	private String reqDate;			//문자 예약 발송 일자
 	private String callFrom;		//발신번호
 	private String callTo;			//수신자 번호
 	private List callToList;		//수신자 번호 리스트 
@@ -86,399 +97,16 @@
 	private String successCount;
 	
 	private String resultSValue;
+	private String resultFValue;
+	private String resultWValue;
 	private String resultWFValue;
 	
-	public String getSuccessCount() {
-		return successCount;
-	}
-	public void setSuccessCount(String successCount) {
-		this.successCount = successCount;
-	}
-	public String getMsgSentType() {
-		return msgSentType;
-	}
-	public void setMsgSentType(String msgSentType) {
-		this.msgSentType = msgSentType;
-	}
-	public String getCallFromComma() {
-		return callFromComma;
-	}
-	public void setCallFromComma(String callFromComma) {
-		this.callFromComma = callFromComma;
-	}
-	public String getCallToComma() {
-		return callToComma;
-	}
-	public void setCallToComma(String callToComma) {
-		this.callToComma = callToComma;
-	}
+	private String divideYN; // 분할여부
 	
-	public String getAtchFiles() {
-		return atchFiles;
-	}
-	public void setAtchFiles(String atchFiles) {
-		this.atchFiles = atchFiles;
-	}	
+	private String statusCd; // 진행상태 코드
 	
-	public String getMsgId() {
-		return msgId;
-	}
-	public void setMsgId(String msgId) {
-		this.msgId = msgId;
-	}
-	public int getSuccessCnt() {
-		return successCnt;
-	}
-	public void setSuccessCnt(int successCnt) {
-		this.successCnt = successCnt;
-	}
-	public String getMsgTypeName() {
-		return msgTypeName;
-	}
-	public void setMsgTypeName(String msgTypeName) {
-		this.msgTypeName = msgTypeName;
-	}
-	public int getOrderByCode() {
-		return orderByCode;
-	}
-	public void setOrderByCode(int orderByCode) {
-		this.orderByCode = orderByCode;
-	}
-	public String getAtchFileId() {
-		return atchFileId;
-	}
-	public void setAtchFileId(String atchFileId) {
-		this.atchFileId = atchFileId;
-	}
-	public String getFileSn() {
-		return fileSn;
-	}
-	public void setFileSn(String fileSn) {
-		this.fileSn = fileSn;
-	}
-	public String getUserId() {
-		return userId;
-	}
-	public void setUserId(String userId) {
-		this.userId = userId;
-	}
-	public String getAddrNm() {
-		return addrNm;
-	}
-	public void setAddrNm(String addrNm) {
-		this.addrNm = addrNm;
-	}
-	public String getMsgSeq() {
-		return msgSeq;
-	}
-	public void setMsgSeq(String msgSeq) {
-		this.msgSeq = msgSeq;
-	}
-	public String getMsgGroupId() {
-		return msgGroupId;
-	}
-	public void setMsgGroupId(String msgGroupId) {
-		this.msgGroupId = msgGroupId;
-	}
-	public List getMsgGroupIdList() {
-		return msgGroupIdList;
-	}
-	public void setMsgGroupIdList(List msgGroupIdList) {
-		this.msgGroupIdList = msgGroupIdList;
-	}
-	public String getSmsTxt() {
-		return smsTxt;
-	}
-	public void setSmsTxt(String smsTxt) {
-		this.smsTxt = smsTxt;
-	}
-	public String getSubject() {
-		return subject;
-	}
-	public void setSubject(String subject) {
-		this.subject = subject;
-	}
-	public Date getRegdate() {
-		return regdate;
-	}
-	public void setRegdate(Date regdate) {
-		this.regdate = regdate;
-	}
-	public Date getReqdate() {
-		return reqdate;
-	}
-	public void setReqdate(Date reqdate) {
-		this.reqdate = reqdate;
-	}
-	public String getCallFrom() {
-		return callFrom;
-	}
-	public void setCallFrom(String callFrom) {
-		this.callFrom = callFrom;
-	}
-	public String getCallTo() {
-		return callTo;
-	}
-	public void setCallTo(String callTo) {
-		this.callTo = callTo;
-	}
-	public List getCallToList() {
-		return callToList;
-	}
-	public void setCallToList(List callToList) {
-		this.callToList = callToList;
-	}
-	public String getTotPrice() {
-		return totPrice;
-	}
-	public void setTotPrice(String totPrice) {
-		this.totPrice = totPrice;
-	}
-	public String getEachPrice() {
-		return eachPrice;
-	}
-	public void setEachPrice(String eachPrice) {
-		this.eachPrice = eachPrice;
-	}
-	public String getDelFlag() {
-		return delFlag;
-	}
-	public void setDelFlag(String delFlag) {
-		this.delFlag = delFlag;
-	}
-	public String getTotMsgPrice() {
-		return totMsgPrice;
-	}
-	public void setTotMsgPrice(String totMsgPrice) {
-		this.totMsgPrice = totMsgPrice;
-	}
-	public String getRsltCode() {
-		return rsltCode;
-	}
-	public void setRsltCode(String rsltCode) {
-		this.rsltCode = rsltCode;
-	}
-	public String getRsltCode2() {
-		return rsltCode2;
-	}
-	public void setRsltCode2(String rsltCode2) {
-		this.rsltCode2 = rsltCode2;
-	}
-	public String getMsgType() {
-		return msgType;
-	}
-	public void setMsgType(String msgType) {
-		this.msgType = msgType;
-	}
-	public String getMsgGroupCnt() {
-		return msgGroupCnt;
-	}
-	public void setMsgGroupCnt(String msgGroupCnt) {
-		this.msgGroupCnt = msgGroupCnt;
-	}
-	public String getFileCnt() {
-		return fileCnt;
-	}
-	public void setFileCnt(String fileCnt) {
-		this.fileCnt = fileCnt;
-	}
-	public String getTotMsgCnt() {
-		return totMsgCnt;
-	}
-	public void setTotMsgCnt(String totMsgCnt) {
-		this.totMsgCnt = totMsgCnt;
-	}
-	public String getCurState() {
-		return curState;
-	}
-	public void setCurState(String curState) {
-		this.curState = curState;
-	}
-	public String getReserveYn() {
-		return reserveYn;
-	}
-	public void setReserveYn(String reserveYn) {
-		this.reserveYn = reserveYn;
-	}
-	public String getReserveCYn() {
-		return reserveCYn;
-	}
-	public void setReserveCYn(String reserveCYn) {
-		this.reserveCYn = reserveCYn;
-	}
-	public String getFilePath1() {
-		return filePath1;
-	}
-	public void setFilePath1(String filePath1) {
-		this.filePath1 = filePath1;
-	}
-	public String getFilePath2() {
-		return filePath2;
-	}
-	public void setFilePath2(String filePath2) {
-		this.filePath2 = filePath2;
-	}
-	public String getFilePath3() {
-		return filePath3;
-	}
-	public void setFilePath3(String filePath3) {
-		this.filePath3 = filePath3;
-	}
-	public Date getSentDate() {
-		return sentDate;
-	}
-	public void setSentDate(Date sentDate) {
-		this.sentDate = sentDate;
-	}
-	public String getAgentCode() {
-		return agentCode;
-	}
-	public void setAgentCode(String agentCode) {
-		this.agentCode = agentCode;
-	}
-	public String getUserData() {
-		return userData;
-	}
-	public void setUserData(String userData) {
-		this.userData = userData;
-	}
-	public List getUserDataList() {
-		return userDataList;
-	}
-	public void setUserDataList(List userDataList) {
-		this.userDataList = userDataList;
-	}
-	public Date getCancelDate() {
-		return cancelDate;
-	}
-	public void setCancelDate(Date cancelDate) {
-		this.cancelDate = cancelDate;
-	}
-	public String getStartDate() {
-		return startDate;
-	}
-	public void setStartDate(String startDate) {
-		this.startDate = startDate;
-	}
-	public String getEndDate() {
-		return endDate;
-	}
-	public void setEndDate(String endDate) {
-		this.endDate = endDate;
-	}
-	public String getSearchMsgType() {
-		return searchMsgType;
-	}
-	public void setSearchMsgType(String searchMsgType) {
-		this.searchMsgType = searchMsgType;
-	}
-	public String getTabType() {
-		return tabType;
-	}
-	public void setTabType(String tabType) {
-		this.tabType = tabType;
-	}
-	public String getStateType() {
-		return stateType;
-	}
-	public void setStateType(String stateType) {
-		this.stateType = stateType;
-	}
-	public String getListType() {
-		return listType;
-	}
-	public void setListType(String listType) {
-		this.listType = listType;
-	}
-	public String getResultType() {
-		return resultType;
-	}
-	public void setResultType(String resultType) {
-		this.resultType = resultType;
-	}
-	public String getMsgResultCnt() {
-		return msgResultCnt;
-	}
-	public void setMsgResultCnt(String msgResultCnt) {
-		this.msgResultCnt = msgResultCnt;
-	}
-	public String getMsgResultSts() {
-		return msgResultSts;
-	}
-	public void setMsgResultSts(String msgResultSts) {
-		this.msgResultSts = msgResultSts;
-	}
-	public String getAddrGrpNm() {
-		return addrGrpNm;
-	}
-	public void setAddrGrpNm(String addrGrpNm) {
-		this.addrGrpNm = addrGrpNm;
-	}
-	public int getOrderByrsltCode() {
-		return orderByrsltCode;
-	}
-	public void setOrderByrsltCode(int orderByrsltCode) {
-		this.orderByrsltCode = orderByrsltCode;
-	}
-	public String getMsgResult() {
-		return msgResult;
-	}
-	public void setMsgResult(String msgResult) {
-		this.msgResult = msgResult;
-	}
-	public String getNtceBgnde() {
-		return ntceBgnde;
-	}
-	public void setNtceBgnde(String ntceBgnde) {
-		this.ntceBgnde = ntceBgnde;
-	}
-	public String getNtceEndde() {
-		return ntceEndde;
-	}
-	public void setNtceEndde(String ntceEndde) {
-		this.ntceEndde = ntceEndde;
-	}
-	public String getMsgKind() {
-		return msgKind;
-	}
-	public void setMsgKind(String msgKind) {
-		this.msgKind = msgKind;
-	}
-	public String getDelayYn() {
-		return delayYn;
-	}
-	public void setDelayYn(String delayYn) {
-		this.delayYn = delayYn;
-	}
-	public String getDelayCompleteYn() {
-		return delayCompleteYn;
-	}
-	public void setDelayCompleteYn(String delayCompleteYn) {
-		this.delayCompleteYn = delayCompleteYn;
-	}
-	public String getSendKind() {
-		return sendKind;
-	}
-	public void setSendKind(String sendKind) {
-		this.sendKind = sendKind;
-	}
-	public String getResultSValue() {
-		return resultSValue;
-	}
-	public void setResultSValue(String resultSValue) {
-		this.resultSValue = resultSValue;
-	}
-	public String getResultWFValue() {
-		return resultWFValue;
-	}
-	public void setResultWFValue(String resultWFValue) {
-		this.resultWFValue = resultWFValue;
-	}
-	public Date getDelayOrgTime() {
-		return delayOrgTime;
-	}
-	public void setDelayOrgTime(Date delayOrgTime) {
-		this.delayOrgTime = delayOrgTime;
-	}
+	// 결과 리스트 select 할 떄
+	// TIMESTAMPDIFF(minute, DATE_FORMAT(B.REQ_DATE, '%Y-%m-%d %T'), DATE_FORMAT(NOW(), '%Y-%m-%d %T')) as diffMin
+	private int diffMin;
 	
 }
src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java
--- src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java
+++ src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentDAO.java
@@ -9,6 +9,8 @@
 import itn.let.fax.addr.service.FaxAddrGroupVO;
 import itn.let.mjo.addr.service.AddrGroupVO;
 import itn.let.mjo.block.service.MjonBlockVO;
+import itn.let.mjo.msgsent.service.MjonMsgDetailSentVO;
+import itn.let.mjo.msgsent.service.MjonMsgSWFDTO;
 import itn.let.mjo.msgsent.service.MjonMsgSentVO;
 
 @Repository("MjonMsgSentDAO")
@@ -54,6 +56,13 @@
 	public List<MjonMsgSentVO> selectAllMsgSentList(MjonMsgSentVO mjonMsgSentVO) throws Exception{
 		
 		return (List<MjonMsgSentVO>) list("MjonMsgSentDAO.selectAllMsgSentList",mjonMsgSentVO);
+	}
+	
+	//발송 관리 전체 발송 리스트 불러오기
+	@SuppressWarnings("unchecked")
+	public List<MjonMsgSentVO> selectAllMsgSentList_advc(MjonMsgSentVO mjonMsgSentVO) throws Exception{
+		
+		return (List<MjonMsgSentVO>) list("MjonMsgSentDAO.selectAllMsgSentList_advc",mjonMsgSentVO);
 	}
 	
 	//발송 관리 전체 발송 리스트 불러오기 => 주소록 조인 제거버전
@@ -158,5 +167,28 @@
 	public MjonMsgSentVO selectFileInfo(String streFileId) throws Exception{
 		return (MjonMsgSentVO) select("MjonMsgSentDAO.selectFileInfo", streFileId);
 	}
+
+	public int countAllMsgSentList(MjonMsgSentVO mjonMsgSentVO) {
+        return (Integer)select("MjonMsgSentDAO.countAllMsgSentList", mjonMsgSentVO);
+	}
+
+	public MjonMsgSWFDTO findBySWF(String msgGroupId) {
+		
+		return (MjonMsgSWFDTO) select("MjonMsgSentDAO.findBySWF", msgGroupId);
+	}
+
+	public MjonMsgDetailSentVO selectAllMsgSentDetailView(MjonMsgDetailSentVO mjonMsgDetailSentVO) {
+		// TODO Auto-generated method stub
+		return (MjonMsgDetailSentVO) select("MjonMsgSentDAO.selectAllMsgSentDetailView", mjonMsgDetailSentVO);
+	}
+
+	public List<MjonMsgDetailSentVO> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) {
+		
+		return (List<MjonMsgDetailSentVO>) list("MjonMsgSentDAO.findByMsgDetailListAjax", mjonMsgDetailSentVO);
+	}
+
+	public List<String> findByReqDateWhereMsgGroupId(String msgGroupId) {
+		return (List<String>) list("MjonMsgSentDAO.findByReqDateWhereMsgGroupId", msgGroupId);
+	}
 	
 }
src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java
--- src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java
+++ src/main/java/itn/let/mjo/msgsent/service/impl/MjonMsgSentServiceImpl.java
@@ -1,20 +1,51 @@
 package itn.let.mjo.msgsent.service.impl;
 
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.BorderStyle;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 import org.springframework.stereotype.Service;
 
 import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
 import egovframework.rte.fdl.idgnr.EgovIdGnrService;
+import itn.com.cmm.util.StringUtil2;
+import itn.let.cmm.vo.FileInfoVO;
 import itn.let.fax.addr.service.FaxAddrGroupVO;
 import itn.let.mjo.addr.service.AddrGroupVO;
 import itn.let.mjo.block.service.MjonBlockVO;
+import itn.let.mjo.msgsent.service.MjonMsgDetailSentVO;
+import itn.let.mjo.msgsent.service.MjonMsgSWFDTO;
 import itn.let.mjo.msgsent.service.MjonMsgSentService;
 import itn.let.mjo.msgsent.service.MjonMsgSentVO;
+import lombok.extern.slf4j.Slf4j;
 
+@Slf4j
 @Service("MjonMsgSentService")
 public class MjonMsgSentServiceImpl  extends EgovAbstractServiceImpl implements MjonMsgSentService{
 
@@ -82,6 +113,204 @@
 		}
 		
 		return resultList;
+	}
+	
+	/**
+	 *	advc
+	 *	이호영 20250121
+	 *	발송 관리 전체 발송 리스트 불러오기
+	 */
+	public Map<String, Object> selectAllMsgSentList_advc(MjonMsgSentVO mjonMsgSentVO) throws Exception{
+
+
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+		
+		// 목록
+		List<MjonMsgSentVO> resultList = mjonMsgSentDAO.selectAllMsgSentList_advc(mjonMsgSentVO);
+
+
+		// groupID에 대한 결과건수(대기, 성공 실패) 분할건수를 가져옴
+		resultList = makeDetailFunction(resultList);
+
+		/*
+		 * 진행상태 코드화
+		 * */
+		resultList.stream().forEach(t->{
+			String code = getStatusCode(t);
+			t.setStatusCd(code);
+		});
+
+
+		resultList.stream().forEach(t->{
+
+			// 내용이 없고 이미지만 있을 경우
+			// 내용에 "이미지"표시
+			if("6".equals(t.getMsgType()) 
+					&& StringUtils.isEmpty(t.getSmsTxt())
+					&& !"0".equals(t.getFileCnt()) 
+					) {
+				t.setSmsTxt("이미지");
+			}
+			
+			// 예약 취소일 시 대기건도 0으로 표시
+			if( t.getReserveCYn().equals(("Y")) ) {
+				t.setResultSValue("0");
+				t.setResultFValue("0");
+				t.setResultWValue("0");
+			}
+		});
+		
+		
+		
+		
+		// 총 카운트
+		int totalCnt = mjonMsgSentDAO.countAllMsgSentList(mjonMsgSentVO);
+		resultMap.put("resultList", resultList);
+		resultMap.put("totalCnt", totalCnt);
+			
+			
+		return resultMap;
+	}
+	
+
+
+	public Map<String, Object> selectAllMsgSentDetailView(MjonMsgDetailSentVO mjonMsgDetailSentVO) throws Exception{
+
+		Map<String, Object> resultMap = new HashMap<String, Object>();
+
+		// 목록
+		MjonMsgDetailSentVO resultVO = mjonMsgSentDAO.selectAllMsgSentDetailView(mjonMsgDetailSentVO);
+		
+		log.info(" + ::  [{}]", resultVO.getSmsTxt());
+		
+		
+		// 성공 대기 실패 발송금액 분할여부
+		MjonMsgSentVO updatedVO = getDetailFunction(resultVO.getMsgGroupId(), resultVO.getEachPrice());
+		resultVO.setResultSValue(updatedVO.getResultSValue()); // 성공건수
+		resultVO.setResultWValue(updatedVO.getResultWValue()); // 대기건수
+		resultVO.setResultFValue(updatedVO.getResultFValue()); // 실패건수
+		resultVO.setTotPrice(updatedVO.getTotPrice()); // 총 발송 금액 (성공건수 * 개별금액)
+		resultVO.setDivideYN(updatedVO.getDivideYN()); // 분할 여부
+		
+
+		// 퍼센트 계산 실행
+		Map<String, String> returnMap = calculatePercentages(resultVO);
+		resultVO.setSuccessPct(returnMap.get("successPct"));
+		resultVO.setWaitingPct(returnMap.get("waitingPct"));
+		resultVO.setFailedPct(returnMap.get("failedPct"));
+		
+		
+		// 진행상태 코드화
+		String statusCode = getStatusCode(MjonMsgSentVO.builder()
+													.reserveCYn(resultVO.getReserveCYn())
+													.reserveYn(resultVO.getReserveYn())
+													.msgGroupCnt(resultVO.getMsgGroupCnt())
+													.resultSValue(resultVO.getResultSValue())
+													.resultWValue(resultVO.getResultWValue())
+													.resultFValue(resultVO.getResultFValue())
+													.diffMin(resultVO.getDiffMin())
+													.build());
+
+		resultVO.setStatusCd(statusCode);
+		
+		// 결과 출력
+//		log.info("성공률: [{}]", returnMap.get("successPct"));
+//		log.info("대기율: [{}]", returnMap.get("waitingPct"));
+//		log.info("실패율: [{}]", returnMap.get("failedPct"));
+		
+		
+		// 광고일떄 (광고)와 줄바꿈+무료거부 0808800858 삭제
+		if("A".equals(resultVO.getMsgKind())) {
+			resultVO.setSmsTxt(resultVO.getSmsTxt().replace("(광고)", "")
+					.replaceAll("\\s*무료거부 0808800858", ""));
+		}
+		
+		// 그림문자일 경우 그림정보 가져오기
+		if(StringUtils.isNotEmpty(resultVO.getFileCnt()) && Integer.parseInt(resultVO.getFileCnt()) > 0)
+		{
+			List<FileInfoVO> fileInfos = getFileInfo(resultVO);
+			resultVO.setFileInfos(fileInfos);
+		}
+		
+		// 분할문자인 경우
+		if("Y".equals(resultVO.getDivideYN())) {
+			String divideText = calculateBatchInfo(resultVO);
+			resultVO.setDivideText(divideText);
+		}
+		
+		
+		
+		
+		resultMap.put("result", resultVO);
+		
+		return resultMap;
+	}
+
+
+	private String calculateBatchInfo(MjonMsgDetailSentVO resultVO) {
+		
+		String msgGroupId = resultVO.getMsgGroupId();
+		
+
+		List<String> requestTimes = mjonMsgSentDAO.findByReqDateWhereMsgGroupId(msgGroupId);
+		
+		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
+		Map<LocalDateTime, Integer> timeCountMap = new LinkedHashMap<>();
+
+		// REQ_DATE 그룹화 (같은 시간대 몇 건인지)
+		for (String timeStr : requestTimes) {
+			LocalDateTime time = LocalDateTime.parse(timeStr, formatter);
+			timeCountMap.put(time, timeCountMap.getOrDefault(time, 0) + 1);
+		}
+
+		//  가장 첫 번째 시간 & 간격 계산
+		List<LocalDateTime> sortedKeys = new ArrayList<>(timeCountMap.keySet());
+		if (sortedKeys.size() < 2) {
+			return "데이터 부족 (분석 불가)";
+		}
+
+		int batchSize = timeCountMap.get(sortedKeys.get(0)); // 한 번에 보낸 건수
+		int intervalMinutes = sortedKeys.get(1).getMinute() - sortedKeys.get(0).getMinute(); // 시간 간격 계산
+//		int batchCount = sortedKeys.size(); // 총 몇 번 보냈는지
+
+//		return String.format("%,d건씩 %d분 간격 (%d회 발송)", batchSize, intervalMinutes, batchCount);
+		return String.format("%,d건씩 %d분 간격", batchSize, intervalMinutes);
+		
+	}
+
+	private List<FileInfoVO> getFileInfo(MjonMsgDetailSentVO result) throws Exception {
+		
+		
+		List<FileInfoVO> fileInfos = new ArrayList<>();
+		
+		// 파일 경로 필드들을 배열로 관리
+		String[] filePaths = { result.getFilePath1(), result.getFilePath2(), result.getFilePath3() };
+
+		for (String filePath : filePaths) {
+			if (filePath != null) {
+				// 파일 ID 추출
+
+				// 확장자 제외한 파일명
+				String fileId = FilenameUtils.getBaseName(filePath);
+				
+				// 파일 정보 조회
+				MjonMsgSentVO info = mjonMsgSentDAO.selectFileInfo(fileId);
+
+				// FileInfo 객체 생성 및 추가
+				FileInfoVO fileInfo = new FileInfoVO();
+				fileInfo.setAtchFileId(info.getAtchFileId());
+				fileInfo.setFileSn(info.getFileSn());
+
+				fileInfos.add(fileInfo);
+			}
+		}
+		return fileInfos;
+		
+	}
+
+	@Override
+	public int countAllMsgSentList(MjonMsgSentVO mjonMsgSentVO) {
+		return mjonMsgSentDAO.countAllMsgSentList(mjonMsgSentVO);
 	}
 	
 	//발송 관리 전체 발송 리스트 불러오기 => 주소록 조인 제거버전
@@ -243,4 +472,384 @@
 	public MjonMsgSentVO selectFileInfo(String streFileId) throws Exception {
 		return mjonMsgSentDAO.selectFileInfo(streFileId);
 	}
+
+	@Override
+	public List<MjonMsgDetailSentVO> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) {
+		
+		List<MjonMsgDetailSentVO> list = mjonMsgSentDAO.findByMsgDetailListAjax(mjonMsgDetailSentVO);
+		list.stream().forEach(t->{
+			t.setCallTo(StringUtil2.formatPhone(t.getCallTo())); 
+		});
+		
+		return list; 
+	}
+
+	public void msgSentExcelDownLoad(MjonMsgSentVO mjonMsgSentVO, HttpServletResponse response) throws Exception{
+
+		
+		mjonMsgSentVO.setRecordCountPerPage(100000);
+		mjonMsgSentVO.setFirstIndex(0);
+
+    	if(StringUtils.isEmpty(mjonMsgSentVO.getSearchSortOrd())) {
+			mjonMsgSentVO.setSearchSortOrd("desc");
+			mjonMsgSentVO.setSearchSortCnd("B.REQ_DATE");
+		}
+		
+		//예약 관리 리스트 불러오기
+		List<MjonMsgSentVO> resultAllSentList = mjonMsgSentDAO.selectAllMsgSentList_advc(mjonMsgSentVO);
+
+//		long startTime = System.nanoTime(); // 시작 시간 측정
+		resultAllSentList = makeDetailFunction(resultAllSentList);
+//		long endTime = System.nanoTime(); // 끝난 시간 측정
+//		double executionTimeInSeconds = (endTime - startTime) / 1_000_000_000.0;
+//		System.out.println("Execution time: " + executionTimeInSeconds + " seconds");
+
+		SXSSFWorkbook  workbook = null; // SXSSFWorkbook 변수 선언
+		try{ 
+			
+			
+			// Workbook 생성
+			workbook = new SXSSFWorkbook();
+			Sheet sheet = workbook.createSheet("발송 내역");
+	
+			// 열 너비 설정
+			sheet.setColumnWidth(0, 3000);  // 번호 열
+			sheet.setColumnWidth(1, 4000);  // 발송일시 열
+			sheet.setColumnWidth(2, 5000);  // 구분 열
+			sheet.setColumnWidth(3, 3000);  // 형태 열
+			sheet.setColumnWidth(4, 10000); // 내용 열
+			sheet.setColumnWidth(5, 4000);  // 발송건수 열
+			sheet.setColumnWidth(6, 3000);  // 대기 열
+			sheet.setColumnWidth(7, 3000);  // 성공 열
+			sheet.setColumnWidth(8, 3000);  // 실패 열
+			sheet.setColumnWidth(9, 4000);  // 금액 열
+			sheet.setColumnWidth(10, 5000); // 진행상황 열
+	
+			// 헤더 스타일 설정
+			CellStyle headerStyle = workbook.createCellStyle();
+			headerStyle.setAlignment(HorizontalAlignment.CENTER);
+			headerStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+			headerStyle.setBorderTop(BorderStyle.THIN);
+			headerStyle.setBorderBottom(BorderStyle.THIN);
+			headerStyle.setBorderLeft(BorderStyle.THIN);
+			headerStyle.setBorderRight(BorderStyle.THIN);
+			headerStyle.setTopBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
+			headerStyle.setBottomBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
+			headerStyle.setLeftBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
+			headerStyle.setRightBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
+	
+			Font font = workbook.createFont();
+			font.setBold(true);  // 글씨체 굵게
+			font.setFontHeightInPoints((short) 12); // 글씨 크기
+			headerStyle.setFont(font);
+	
+			// 데이터 스타일 설정 (가운데 정렬)
+			CellStyle centerStyle = workbook.createCellStyle();
+			centerStyle.setAlignment(HorizontalAlignment.CENTER);
+			centerStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+			centerStyle.setBorderTop(BorderStyle.THIN);
+			centerStyle.setBorderBottom(BorderStyle.THIN);
+			centerStyle.setBorderLeft(BorderStyle.THIN);
+			centerStyle.setBorderRight(BorderStyle.THIN);
+			centerStyle.setTopBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
+			centerStyle.setBottomBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
+			centerStyle.setLeftBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
+			centerStyle.setRightBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
+	
+			// 첫 번째 헤더 작성 (상단 병합)
+			Row headerRow = sheet.createRow(0);
+	
+			// 번호 열 추가
+			Cell cell = headerRow.createCell(0);
+			cell.setCellValue("번호");
+			cell.setCellStyle(headerStyle);
+			sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0)); // 번호 병합
+	
+			// 구분 열 추가
+			cell = headerRow.createCell(1);
+			cell.setCellValue("발송일시");
+			cell.setCellStyle(headerStyle);
+			sheet.addMergedRegion(new CellRangeAddress(0, 1, 1, 1)); // 구분 병합
+	
+			cell = headerRow.createCell(2);
+			cell.setCellValue("구분");
+			cell.setCellStyle(headerStyle);
+			sheet.addMergedRegion(new CellRangeAddress(0, 1, 2, 2)); // 발송일시 병합
+	
+			cell = headerRow.createCell(3);
+			cell.setCellValue("형태");
+			cell.setCellStyle(headerStyle);
+			sheet.addMergedRegion(new CellRangeAddress(0, 1, 3, 3)); // 형태 병합
+	
+			cell = headerRow.createCell(4);
+			cell.setCellValue("내용");
+			cell.setCellStyle(headerStyle);
+			sheet.addMergedRegion(new CellRangeAddress(0, 1, 4, 4)); // 내용 병합
+	
+			cell = headerRow.createCell(5);
+			cell.setCellValue("발송건수");
+			cell.setCellStyle(headerStyle);
+			sheet.addMergedRegion(new CellRangeAddress(0, 1, 5, 5)); // 발송건수 병합
+	
+			cell = headerRow.createCell(6);
+			cell.setCellValue("결과");
+			cell.setCellStyle(headerStyle);
+			sheet.addMergedRegion(new CellRangeAddress(0, 0, 6, 8)); // 결과 병합
+	
+			cell = headerRow.createCell(9);
+			cell.setCellValue("금액(원)");
+			cell.setCellStyle(headerStyle);
+			sheet.addMergedRegion(new CellRangeAddress(0, 1, 9, 9)); // 금액(원) 병합
+	
+			cell = headerRow.createCell(10);
+			cell.setCellValue("진행상황");
+			cell.setCellStyle(headerStyle);
+			sheet.addMergedRegion(new CellRangeAddress(0, 1, 10, 10)); // 진행상황 병합
+	
+			// 두 번째 헤더 작성 (결과 하위 열)
+			Row subHeaderRow = sheet.createRow(1);
+	
+			String[] subHeaders = {"대기", "성공", "실패"};
+			for (int i = 0; i < subHeaders.length; i++) {
+				cell = subHeaderRow.createCell(6 + i); // 결과 열 시작점(6번 열)부터 순차적으로 설정
+				cell.setCellValue(subHeaders[i]);
+				cell.setCellStyle(headerStyle);
+			}
+	
+			// 샘플 데이터 추가
+	//		Object[][] data = {
+	//			{1, "2025-01-23 12:00", "web", "SMS", "테스트 메시지입니다.", 139, 1, 0, 12, "-", "진행중"}
+	//		};
+			
+			
+			
+			
+			// Object[][]로 변환
+			Object[][] data = new Object[resultAllSentList.size()][11]; // 11은 필드 수
+	
+			for (int i = 0; i < resultAllSentList.size(); i++) {
+				MjonMsgSentVO vo = resultAllSentList.get(i);
+				data[i][0] = i+1;
+				data[i][1] = vo.getReqDate();
+//				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//				data[i][1] = sdf.format(vo.getReqDate());
+				
+
+//				log.info("엑셀에 넣을 데이터: [{}]", data[i][1]);
+
+				data[i][2] = "H".equals(vo.getSendKind()) ? "WEB" : "API";
+				
+				String msgType="단문";
+				if ("6".equals(vo.getMsgType())) {
+					msgType = "0".equals(vo.getFileCnt()) ? "장문" : "그림";
+				}
+				data[i][3] = msgType;
+				
+				String reserveTxt = "";
+				if("Y".equals(vo.getReserveYn())) {reserveTxt="[예약]";}
+				if("Y".equals(vo.getDivideYN())) {reserveTxt+="[분할]";}
+				
+				data[i][4] = reserveTxt + (StringUtils.isEmpty(vo.getSmsTxt()) ? "-" : vo.getSmsTxt());
+				data[i][5] = vo.getMsgGroupCnt();
+				data[i][6] = vo.getResultWValue();
+				data[i][7] = vo.getResultSValue();
+				data[i][8] = vo.getResultFValue();
+				data[i][9] = vo.getTotPrice();
+	
+				String statusTxt="진행중";
+				if ("Y".equals(vo.getReserveCYn())) {
+					statusTxt = "예약취소"; // 예약취소 코드
+	//			} else if ("Y".equals(vo.getReserveYn()) && vo.getMsgGroupCnt().equals(vo.getResultWValue())) {
+	//				statusTxt = "예약대기"; // 예약대기 코드 ( 예약취소 버튼 노출 )
+				} else if (vo.getMsgGroupCnt().equals(vo.getResultSValue()) || vo.getMsgGroupCnt().equals(vo.getResultFValue())) {
+					statusTxt = "완료"; // 완료 코드
+				}
+				
+				
+				
+				
+				data[i][10] = statusTxt;
+			}
+			
+			
+			
+	
+			int rowNum = 2; // 데이터 시작 행
+			for (Object[] rowData : data) {
+				Row row = sheet.createRow(rowNum++);
+				for (int col = 0; col < rowData.length; col++) {
+					cell = row.createCell(col);
+	
+					// "내용" 열만 제외하고 가운데 정렬
+					if (col == 4) { // 내용 열
+						cell.setCellValue((String) rowData[col]);
+					} else if (rowData[col] instanceof String) {
+						cell.setCellValue((String) rowData[col]);
+						cell.setCellStyle(centerStyle);
+					} else if (rowData[col] instanceof Integer) {
+						cell.setCellValue((Integer) rowData[col]);
+						cell.setCellStyle(centerStyle);
+					}
+				}
+			}
+	
+			// 파일 다운로드 응답 설정
+			String fileName ="발송결과_리스트";		// 저장 파일명
+			SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyyMMdd_HHmmss", Locale.KOREA );
+			Date currentTime = new Date ();
+			String mTime = mSimpleDateFormat.format ( currentTime );
+			fileName = fileName+"("+mTime+")";
+	
+			response.setHeader("Set-Cookie", "fileDownload=true; path=/");
+			response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx"));
+			response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+	
+			// 파일 출력
+			workbook.write(response.getOutputStream());
+			workbook.close();
+	
+		} catch (Exception e) {
+			// 에러 처리 로직
+			response.setHeader("Set-Cookie", "fileDownload=false; path=/");
+			response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
+			response.setHeader("Content-Type", "text/html; charset=utf-8");
+
+			try (OutputStream out = response.getOutputStream()) {
+				byte[] data = "fail..".getBytes();
+				out.write(data, 0, data.length);
+			} catch (Exception ignore) {
+				ignore.printStackTrace();
+			}
+		} finally {
+			if (workbook != null) {
+				try {
+					workbook.dispose(); // SXSSFWorkbook 임시 파일 제거
+					workbook.close();
+				} catch (Exception ignore) {
+					ignore.printStackTrace();
+				}
+			}
+		}
+		
+	}
+	
+
+	/** 
+	 * @methodName	: makeDetailFunction 
+	 * @author		: 이호영
+	 * @date		: 2025.02.04 
+	 * @description	: 발송결과 성공건수, 실패건수, 대기건수, 분할발송여부, 총 발송금액 구하기
+	 * @param resultList
+	 * @return 
+	 */
+	private List<MjonMsgSentVO> makeDetailFunction(List<MjonMsgSentVO> resultList) {
+		resultList.stream().forEach(t->{
+			MjonMsgSentVO updatedVO = getDetailFunction(t.getMsgGroupId(), t.getEachPrice());
+
+			t.setResultSValue(updatedVO.getResultSValue());
+			t.setResultFValue(updatedVO.getResultFValue());
+			t.setResultWValue(updatedVO.getResultWValue());
+			t.setDivideYN(updatedVO.getDivideYN());
+			t.setTotPrice(updatedVO.getTotPrice());
+		});
+		return resultList;
+	}
+	
+	
+	private MjonMsgSentVO getDetailFunction(String p_msgGroupId, String p_eachPrice) {
+		
+
+		MjonMsgSentVO returnVO = new MjonMsgSentVO(); 
+		
+		MjonMsgSWFDTO mjonMsgSWFDTO =	mjonMsgSentDAO.findBySWF(p_msgGroupId);
+		returnVO.setResultSValue(String.valueOf(mjonMsgSWFDTO.getResultSValue())); // 성공건수
+		returnVO.setResultFValue(String.valueOf(mjonMsgSWFDTO.getResultFValue())); // 실패건수
+		returnVO.setResultWValue(String.valueOf(mjonMsgSWFDTO.getResultWValue())); // 대기건수
+		returnVO.setDivideYN(mjonMsgSWFDTO.getDivideYN());
+		
+		
+		// TotPrice : 성공건수에 대한 금액 곱하기
+		BigDecimal eachPrice = new BigDecimal(p_eachPrice);
+		BigDecimal resultSValue = new BigDecimal(mjonMsgSWFDTO.getResultSValue());
+		BigDecimal totalPrice = eachPrice.multiply(resultSValue);
+		// 소수점 한 자리로 설정 (반올림)// totalPrice 값을 소수점 한 자리까지 반올림하여 roundedTotalPrice에 저장
+		// RoundingMode.HALF_UP: 반올림 방식으로, 소수점 기준 5 이상이면 올림, 그렇지 않으면 내림
+		BigDecimal roundedTotalPrice = totalPrice.setScale(1, RoundingMode.HALF_UP);
+
+		// roundedTotalPrice가 0인지 확인
+		// BigDecimal.compareTo(BigDecimal.ZERO)는 값을 비교하는 메서드
+		// 결과:
+		// - 반환 값이 0이면 두 값이 같음
+		// - 반환 값이 음수이면 roundedTotalPrice가 0보다 작음
+		// - 반환 값이 양수이면 roundedTotalPrice가 0보다 큼
+		if (roundedTotalPrice.compareTo(BigDecimal.ZERO) == 0) {
+			// roundedTotalPrice 값이 0이면, "-" 문자열을 totPrice에 설정
+			returnVO.setTotPrice("-"); 
+		} else {
+			// roundedTotalPrice 값이 0이 아닌 경우
+			// 반올림된 BigDecimal 값을 toPlainString()을 사용하여 문자열로 변환 후 totPrice에 설정
+			// toPlainString(): 지수 표기법 없이 일반적인 문자열 형태로 반환
+			returnVO.setTotPrice(roundedTotalPrice.toPlainString());
+		}
+//		log.info(" + returnVO.getTotPrice() :: [{}]", returnVO.getTotPrice());
+		return returnVO;
+		
+		
+	}
+	
+
+	
+	private Map<String, String> calculatePercentages(MjonMsgDetailSentVO result) {
+		int total = Integer.parseInt(result.getMsgGroupCnt()); // 전체 건수
+		int success = Integer.parseInt(result.getResultSValue()); // 성공 건수
+		int waiting = Integer.parseInt(result.getResultWValue()); // 대기 건수
+		int failed = Integer.parseInt(result.getResultFValue()); // 실패 건수
+
+		// 퍼센트 계산 (0으로 나누는 경우 대비)
+		String successPct = total > 0 ? String.format("%.1f%%", (success / (double) total) * 100) : "0.0%";
+		String waitingPct = total > 0 ? String.format("%.1f%%", (waiting / (double) total) * 100) : "0.0%";
+		String failedPct = total > 0 ? String.format("%.1f%%", (failed / (double) total) * 100) : "0.0%";
+
+		// 결과 맵에 저장
+		Map<String, String> percentages = new HashMap<>();
+		percentages.put("successPct", successPct);
+		percentages.put("waitingPct", waitingPct);
+		percentages.put("failedPct", failedPct);
+
+		return percentages;
+		
+	}
+	
+	// 공통코드 ITN057에 대한 코드화 진행
+	/*
+	 * CODE_ID	CODE	CODE_NM		CODE_DC
+	 * ITN057	01		진행중		진행중
+	 * ITN057	02		완료			완료출해야함
+	 * ITN057	03		예약대기		예약대기(발송전) 버튼으로 노출해야함
+	 * ITN057	04		-			예약취소 ( - 으로 노출 )
+	 * */
+	private String getStatusCode(MjonMsgSentVO result) {
+
+		String returnCode;
+		
+		if ("Y".equals(result.getReserveCYn())) {
+			returnCode = "04"; // 예약취소 코드
+		} else if (
+				"Y".equals(result.getReserveYn()) 
+					&& "N".equals(result.getReserveCYn()) 
+					&& result.getMsgGroupCnt().equals(result.getResultWValue())
+					&& result.getDiffMin() < -5 // 예약 시간이 5분 이상인 것들만
+					) {
+			returnCode = "03"; // 예약대기 코드 ( 예약취소 버튼 노출 )
+		} else if (result.getMsgGroupCnt().equals(result.getResultSValue()) 
+					|| result.getMsgGroupCnt().equals(result.getResultFValue())) {
+			returnCode = "02"; // 완료 코드
+		} else {
+			returnCode = "01"; // 진행중 코드
+		}
+		
+		
+		return returnCode;
+		
+	}
 }
src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java
--- src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java
+++ src/main/java/itn/let/mjo/msgsent/web/MjonMsgSentController.java
@@ -5,14 +5,17 @@
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.Font;
@@ -22,6 +25,8 @@
 import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.ModelAttribute;
@@ -38,16 +43,20 @@
 import itn.com.cmm.util.DateUtils;
 import itn.com.utl.fcc.service.EgovStringUtil;
 import itn.let.kakao.user.sent.service.KakaoSentService;
+import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.addr.service.AddrGroupService;
 import itn.let.mjo.addr.service.AddrGroupVO;
 import itn.let.mjo.addr.service.AddrService;
 import itn.let.mjo.addr.service.AddrVO;
 import itn.let.mjo.apikey.service.ApiKeyMngService;
 import itn.let.mjo.apikey.service.ApiKeyVO;
+import itn.let.mjo.msgsent.service.MjonMsgDetailSentVO;
 import itn.let.mjo.msgsent.service.MjonMsgSentCntVO;
 import itn.let.mjo.msgsent.service.MjonMsgSentService;
 import itn.let.mjo.msgsent.service.MjonMsgSentVO;
+import lombok.extern.slf4j.Slf4j;
 
+@Slf4j
 @Controller
 public class MjonMsgSentController {
 
@@ -99,115 +108,10 @@
 			return "redirect:/web/user/login/login.do";
 		}
     	
-    	mjonMsgSentVO.setUserId(userId);
-    	
-    	/*
-    	//전체 발송 건수 통계 불러오기
-    	mjonMsgSentVO.setMsgType("");
-    	List<MjonMsgSentVO> totalMsgCnt = mjonMsgSentService.selectDetailMsgSentCnt(mjonMsgSentVO);
-    	model.addAttribute("totalMsgCnt", totalMsgCnt);
-    	
-    	//단문 성공건, 실패건 불러오기
-    	mjonMsgSentVO.setMsgType("4");
-    	List<MjonMsgSentVO> smsMsgCnt = mjonMsgSentService.selectDetailMsgSentCnt(mjonMsgSentVO);
-    	model.addAttribute("smsMsgCnt", smsMsgCnt);
-    	
-    	//장문 성공건, 실패건 불러오기
-    	mjonMsgSentVO.setMsgType("6");
-    	mjonMsgSentVO.setFileCnt("0");
-    	List<MjonMsgSentVO> lmsMsgCnt = mjonMsgSentService.selectDetailMsgSentCnt(mjonMsgSentVO);
-    	model.addAttribute("lmsMsgCnt", lmsMsgCnt);
-    	
-    	//그림문자 성공건, 실패건 불러오기
-    	mjonMsgSentVO.setMsgType("6");
-    	mjonMsgSentVO.setFileCnt("1");
-    	List<MjonMsgSentVO> mmsMsgCnt = mjonMsgSentService.selectDetailMsgSentCnt(mjonMsgSentVO);
-    	model.addAttribute("mmsMsgCnt", mmsMsgCnt);
-    	*/
-    	
-    	/*
-    	//전체 발송 건수 통계 불러오기
-    	mjonMsgSentVO.setMsgType("");
-    	List<MjonMsgSentVO> totalMsgCnt = mjonMsgSentService.selectDetailMsgSentCntMix(mjonMsgSentVO);
-    	
-    	System.out.println("start");
-    	
-    	// H:홈페이지, A:API 로 sms, lms, mms 나누는 영역
-    	List<MjonMsgSentVO> H_totalMsgCnt = totalMsgCnt.stream().filter(t -> "H".equals(t.getSendKind())).collect(Collectors.toList());
-    	List<MjonMsgSentVO> H_smsMsgCnt = new ArrayList<MjonMsgSentVO>();
-    	List<MjonMsgSentVO> H_lmsMsgCnt = new ArrayList<MjonMsgSentVO>();
-    	List<MjonMsgSentVO> H_mmsMsgCnt = new ArrayList<MjonMsgSentVO>();
-    	
-    	System.out.println("start");
-
-    	List<MjonMsgSentVO> A_totalMsgCnt = totalMsgCnt.stream().filter(t -> "A".equals(t.getSendKind())).collect(Collectors.toList());
-    	List<MjonMsgSentVO> A_smsMsgCnt = new ArrayList<MjonMsgSentVO>();
-    	List<MjonMsgSentVO> A_lmsMsgCnt = new ArrayList<MjonMsgSentVO>();
-    	List<MjonMsgSentVO> A_mmsMsgCnt = new ArrayList<MjonMsgSentVO>();
-
-    	System.out.println(" ::H_totalMsgCnt :: "+ H_totalMsgCnt.size());
-    	System.out.println(" ::A_totalMsgCnt :: "+ A_totalMsgCnt.size());
-
-    	H_totalMsgCnt.forEach(t->{
-    		if (Integer.parseInt(t.getFilePath1())>0) {
-    			H_smsMsgCnt.add(t);
-    		} else if (Integer.parseInt(t.getFilePath2())>0) {
-    			H_lmsMsgCnt.add(t);
-    		} else if (Integer.parseInt(t.getFilePath3())>0) {
-    			H_mmsMsgCnt.add(t);
-    		}
-    	});
-    	
-    	A_totalMsgCnt.forEach(t->{
-    		if (Integer.parseInt(t.getFilePath1())>0) {
-    			A_smsMsgCnt.add(t);
-    		} else if (Integer.parseInt(t.getFilePath2())>0) {
-    			A_lmsMsgCnt.add(t);
-    		} else if (Integer.parseInt(t.getFilePath3())>0) {
-    			A_mmsMsgCnt.add(t);
-    		}
-    	});
-    	
-    	
- 
-    	 //* 홈페이지에서 보낸 데이터 LIST
-    	 //* SEND_KIND = "H"
-
-    	// 전체 영역
-    	model.addAttribute("H_allSentCntVO", this.getResultCntProc(H_totalMsgCnt));
-    	// 전체 단문(SMS)
-    	model.addAttribute("H_smsSentCntVO", this.getResultCntProc(H_smsMsgCnt));
-    	// 전체 장문(LMS)
-    	model.addAttribute("H_lmsSentCntVO", this.getResultCntProc(H_lmsMsgCnt));
-    	// 전체 장문(LMS)
-    	model.addAttribute("H_mmsSentCntVO", this.getResultCntProc(H_mmsMsgCnt));
-    	
-    	
-    	
-    	
-    	
-    	// * 홈페이지에서 보낸 데이터 LIST
-    	 //* SEND_KIND = "A"
-    	 
-    	// 전체 영역
-    	model.addAttribute("A_allSentCntVO", this.getResultCntProc(A_totalMsgCnt));
-    	// 전체 단문(SMS)
-    	model.addAttribute("A_smsSentCntVO", this.getResultCntProc(A_smsMsgCnt));
-    	// 전체 장문(LMS)
-    	model.addAttribute("A_lmsSentCntVO", this.getResultCntProc(A_lmsMsgCnt));
-    	// 전체 장문(LMS)
-    	model.addAttribute("A_mmsSentCntVO", this.getResultCntProc(A_mmsMsgCnt));
-    	*/
-    	
-    	
-    	
-    	 /*<isEqual prepend="AND" property="searchCondition" compareValue="2">
-         a.mber_nm LIKE CONCAT('%',#searchKeyword#,'%')  
-         </isEqual>
-         */
-    	ApiKeyVO apiKeyVO = new ApiKeyVO();
-    	apiKeyVO.setMberId(userId);
-		model.addAttribute("appMgmt", apiKeyMngService.selectMberApiKeyChk(apiKeyVO) > 0 ? true : false);
+//    	mjonMsgSentVO.setUserId(userId);
+//    	ApiKeyVO apiKeyVO = new ApiKeyVO();
+//    	apiKeyVO.setMberId(userId);
+//		model.addAttribute("appMgmt", apiKeyMngService.selectMberApiKeyChk(apiKeyVO) > 0 ? true : false);
     	
     	
     	
@@ -231,37 +135,67 @@
     	
     	}
     	
-    	String startDate = mjonMsgSentVO.getStartDate();
-    	String endDate = mjonMsgSentVO.getEndDate();
+//    	log.info(" + mjonMsgSentVO.getSearchStartDate() :: [{}]", mjonMsgSentVO.getSearchStartDate());
+//    	log.info(" + mjonMsgSentVO.getSearchStartDate() :: [{}]", mjonMsgSentVO.getSearchStartDate());
+//    	log.info(" + mjonMsgSentVO.getSearchStartDate() :: [{}]", mjonMsgSentVO.getSearchStartDate());
+//    	log.info(" + mjonMsgSentVO.getSearchStartDate() :: [{}]", mjonMsgSentVO.getSearchStartDate());
+//    	log.info(" + mjonMsgSentVO.getSearchStartDate() :: [{}]", mjonMsgSentVO.getSearchStartDate());
+    	String startDate = mjonMsgSentVO.getSearchStartDate();
+    	String endDate = mjonMsgSentVO.getSearchEndDate();
     	
-    	if(startDate == null && endDate == null ) {
+    	if(StringUtils.isEmpty(startDate) 
+    			&& StringUtils.isEmpty(endDate)) 
+    	{
     		
-    		
-//    		
-//    		Calendar cal = Calendar.getInstance();
-//        	Date now = new Date();
-//        	
-//        	SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
-//
-//        	//종료일은 오늘날짜
-//        	cal.setTime(now);
-//        	endDate = format.format(cal.getTime());
-//
-//        	//시작일은 전날로 셋팅
-//        	cal.add(Calendar.DATE, -1);
-//        	startDate = format.format(cal.getTime());
-    		
-        	mjonMsgSentVO.setStartDate(DateUtils.getDateMonthsAgo(3));
-        	mjonMsgSentVO.setEndDate(DateUtils.getCurrentDate());
+        	mjonMsgSentVO.setSearchStartDate(DateUtils.getDateMonthsAgo(3));
+        	mjonMsgSentVO.setSearchEndDate(DateUtils.getCurrentDate());
         	
     	}
-    	
+
+    	log.info("pageIndex :: [{}]", mjonMsgSentVO.getPageIndex());
     	model.addAttribute("searchKeyword", mjonMsgSentVO.getSearchKeyword());
     	model.addAttribute("mjonMsgSentVO", mjonMsgSentVO);
     	model.addAttribute("siteId", mjonMsgSentVO.getSiteId());
     	
 		return "web/msgsent/MsgSentView";
 	}
+	
+
+    /**
+     * 발송관리 화면 
+     * @param searchVO
+     * @param model/web/user/login/login.do
+     * @return	"/web/mjon/msgtxt/selectMsgTxtView.do"
+     * @throws Exception
+     */
+	@RequestMapping(value= {"/web/mjon/msgsent/msgSentDetailView.do"})
+	public String selectMsgSentDetailView(@ModelAttribute("searchVO") MjonMsgDetailSentVO mjonMsgDetailSentVO
+			, ModelMap model) throws Exception{
+		
+
+			//로그인 권한정보 불러오기
+			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+			String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+			if(loginVO == null) {
+				return "redirect:/web/user/login/login.do";
+			}
+		
+			Map<String, Object> resultMap = mjonMsgSentService.selectAllMsgSentDetailView(mjonMsgDetailSentVO);
+			model.addAttribute("result", resultMap.get("result"));
+		
+		return "web/msgsent/MsgSentDetailView";
+	}
+
+    // 팩스 금일 발송통계 갱신
+	@RequestMapping(value= {"/web/mjon/msgsent/findByMsgDetailListAjax.do"})
+ 	public ResponseEntity<StatusResponse> findByMsgDetailListAjax(MjonMsgDetailSentVO mjonMsgDetailSentVO) throws Exception {
+
+			
+		List<MjonMsgDetailSentVO> resultList = mjonMsgSentService.findByMsgDetailListAjax(mjonMsgDetailSentVO);
+		
+
+		return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, "", resultList));
+ 	}
 
     /**
      * 마이페이지 - 이용내역	-	ajax
@@ -275,7 +209,6 @@
     		HttpServletRequest request,
     		ModelMap model) throws Exception{
     	
-		System.out.println("MsgSentView_HA_allSentAjax");
 		
     	LoginVO	loginVO = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();
     	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
@@ -283,29 +216,24 @@
     	
     	mjonMsgSentVO.setUserId(userId);
     	
+    	log.info("+ mjonMsgSentVO.getSearchStartDate() :: [{}]", mjonMsgSentVO.getSearchStartDate());
+    	log.info("+ mjonMsgSentVO.getSearchEndDate() :: [{}]", mjonMsgSentVO.getSearchEndDate());
     	//전체 발송 건수 통계 불러오기
     	mjonMsgSentVO.setMsgType("");
+    	long startTime = System.nanoTime(); // 시작 시간 측정
     	List<MjonMsgSentVO> totalMsgCnt = mjonMsgSentService.selectDetailMsgSentCntMix(mjonMsgSentVO);
+
+    	long endTime = System.nanoTime(); // 종료 시간 측정
+    	double executionTimeInSeconds = (endTime - startTime) / 1_000_000_000.0;
+    	System.out.println("Execution time: " + executionTimeInSeconds + " seconds");
     	
-    	System.out.println("start");
     	
     	// H:홈페이지, A:API 로 sms, lms, mms 나누는 영역
-    	List<MjonMsgSentVO> H_totalMsgCnt = totalMsgCnt.stream().filter(t -> "H".equals(t.getSendKind())).collect(Collectors.toList());
     	List<MjonMsgSentVO> H_smsMsgCnt = new ArrayList<MjonMsgSentVO>();
     	List<MjonMsgSentVO> H_lmsMsgCnt = new ArrayList<MjonMsgSentVO>();
     	List<MjonMsgSentVO> H_mmsMsgCnt = new ArrayList<MjonMsgSentVO>();
     	
-    	System.out.println("start");
-
-    	List<MjonMsgSentVO> A_totalMsgCnt = totalMsgCnt.stream().filter(t -> "A".equals(t.getSendKind())).collect(Collectors.toList());
-    	List<MjonMsgSentVO> A_smsMsgCnt = new ArrayList<MjonMsgSentVO>();
-    	List<MjonMsgSentVO> A_lmsMsgCnt = new ArrayList<MjonMsgSentVO>();
-    	List<MjonMsgSentVO> A_mmsMsgCnt = new ArrayList<MjonMsgSentVO>();
-
-    	System.out.println(" ::H_totalMsgCnt :: "+ H_totalMsgCnt.size());
-    	System.out.println(" ::A_totalMsgCnt :: "+ A_totalMsgCnt.size());
-
-    	H_totalMsgCnt.forEach(t->{
+    	totalMsgCnt.forEach(t->{
     		if (Integer.parseInt(t.getFilePath1())>0) {
     			H_smsMsgCnt.add(t);
     		} else if (Integer.parseInt(t.getFilePath2())>0) {
@@ -315,59 +243,23 @@
     		}
     	});
     	
-    	A_totalMsgCnt.forEach(t->{
-    		if (Integer.parseInt(t.getFilePath1())>0) {
-    			A_smsMsgCnt.add(t);
-    		} else if (Integer.parseInt(t.getFilePath2())>0) {
-    			A_lmsMsgCnt.add(t);
-    		} else if (Integer.parseInt(t.getFilePath3())>0) {
-    			A_mmsMsgCnt.add(t);
-    		}
-    	});
-    	
-    	
- 
     	 //* 홈페이지에서 보낸 데이터 LIST
     	 //* SEND_KIND = "H"
 
     	// 전체 영역
-    	model.addAttribute("H_allSentCntVO", this.getResultCntProc(H_totalMsgCnt));
+    	log.info("all");
+    	model.addAttribute("H_allSentCntVO", this.getResultCntProc(totalMsgCnt));
     	// 전체 단문(SMS)
+    	log.info("sms");
     	model.addAttribute("H_smsSentCntVO", this.getResultCntProc(H_smsMsgCnt));
     	// 전체 장문(LMS)
+    	log.info("lms");
     	model.addAttribute("H_lmsSentCntVO", this.getResultCntProc(H_lmsMsgCnt));
-    	// 전체 장문(LMS)
+    	// 전체 그림(MMS)
+    	log.info("mms");
     	model.addAttribute("H_mmsSentCntVO", this.getResultCntProc(H_mmsMsgCnt));
     	
     	
-    	
-    	
-    	
-    	// * 홈페이지에서 보낸 데이터 LIST
-    	 //* SEND_KIND = "A"
-    	 
-    	// 전체 영역
-    	model.addAttribute("A_allSentCntVO", this.getResultCntProc(A_totalMsgCnt));
-    	// 전체 단문(SMS)
-    	model.addAttribute("A_smsSentCntVO", this.getResultCntProc(A_smsMsgCnt));
-    	// 전체 장문(LMS)
-    	model.addAttribute("A_lmsSentCntVO", this.getResultCntProc(A_lmsMsgCnt));
-    	// 전체 장문(LMS)
-    	model.addAttribute("A_mmsSentCntVO", this.getResultCntProc(A_mmsMsgCnt));
-    	
-    	
-    	
-    	
-    	 /*<isEqual prepend="AND" property="searchCondition" compareValue="2">
-         a.mber_nm LIKE CONCAT('%',#searchKeyword#,'%')  
-         </isEqual>
-         */
-    	ApiKeyVO apiKeyVO = new ApiKeyVO();
-    	apiKeyVO.setMberId(userId);
-		model.addAttribute("appMgmt", apiKeyMngService.selectMberApiKeyChk(apiKeyVO) > 0 ? true : false);
-		
-		
-		System.out.println("MsgSentView_HA_allSentAjax_end");
     	
     	return "/web/msgsent/subcontent/MsgSentView_HA_allSentAjax";
     }
@@ -395,14 +287,17 @@
     	cntVO.setWaitCnt(msgCnt.stream()
     			.filter(f->"W".equals(f.getMsgResultSts()))
     			.mapToInt(t -> Integer.parseInt(t.getMsgResultCnt())).sum());
+    	log.info(" :: cntVO.getWaitCnt() :: [{}]", cntVO.getWaitCnt());
     	// 전체 성공 갯수
     	cntVO.setSuccCnt(msgCnt.stream()
     			.filter(f->"S".equals(f.getMsgResultSts()))
     			.mapToInt(t -> Integer.parseInt(t.getMsgResultCnt())).sum());
+    	log.info(" :: cntVO.getSuccCnt() :: [{}]", cntVO.getSuccCnt());
     	// 전체 실패 갯수
     	cntVO.setFailCnt(msgCnt.stream()
     			.filter(f->"F".equals(f.getMsgResultSts()))
     			.mapToInt(t -> Integer.parseInt(t.getMsgResultCnt())).sum());
+    	log.info(" :: cntVO.getFailCnt() :: [{}]", cntVO.getFailCnt());
 
     	// 전체 갯수 구하기
     	cntVO.setTotCnt(cntVO.getWaitCnt() + cntVO.getSuccCnt() + cntVO.getFailCnt());
@@ -421,89 +316,173 @@
 	@RequestMapping(value= {"/web/mjon/msgsent/selectMsgSentListViewAjax.do"})
 	public String selectMsgSentListViewAjax(@ModelAttribute("searchVO") MjonMsgSentVO mjonMsgSentVO, ModelMap model) throws Exception{
 		
+		String pageUrl = "";
+		try {
+			
+
+	    	log.info(" ListView pageIndex :: [{}]", mjonMsgSentVO.getPageIndex());
+	    	log.info(" ListView pageUnit :: [{}]", mjonMsgSentVO.getPageUnit());
+				
+				
+			//로그인 권한정보 불러오기
+	    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+	    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+	    	
+	    	mjonMsgSentVO.setUserId(userId);
+	    	
+	    	// 검색 리스트 불러오기
+//			if(mjonMsgSentVO.getPageUnit() != 10) {
+//				mjonMsgSentVO.setPageUnit(mjonMsgSentVO.getPageUnit());
+//			}
+			
+	    	//기본 내림차순 정렬
+	    	if(StringUtils.isEmpty(mjonMsgSentVO.getSearchSortOrd())) {
+	    		
+	    		mjonMsgSentVO.setSearchSortOrd("desc");
+	    		mjonMsgSentVO.setSearchSortCnd("B.REQ_DATE");
+	    	}
+	    	
+	    	
+	    	//선택 탭 정보 저장
+	    	//mjonResvMsgVO.setSearchMsgType(mjonResvMsgVO.getTabType());
+	    	
+			/** pageing */
+			PaginationInfo paginationInfo = new PaginationInfo();
+			paginationInfo.setCurrentPageNo(mjonMsgSentVO.getPageIndex());
+			paginationInfo.setRecordCountPerPage(mjonMsgSentVO.getPageUnit());
+			paginationInfo.setPageSize(mjonMsgSentVO.getPageSize());
+	
+			mjonMsgSentVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
+			mjonMsgSentVO.setLastIndex(paginationInfo.getLastRecordIndex());
+			mjonMsgSentVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
+			
+			if(!DateUtils.dateChkAndValueChk(mjonMsgSentVO.getSearchStartDate(),mjonMsgSentVO.getSearchEndDate(), 3 )) {
+				mjonMsgSentVO.setSearchStartDate(DateUtils.getDateMonthsAgo(3));
+				mjonMsgSentVO.setSearchEndDate(DateUtils.getCurrentDate());
+			};
+	
+			model.addAttribute("searchStartDate", mjonMsgSentVO.getSearchStartDate());
+			model.addAttribute("searchEndDate", mjonMsgSentVO.getSearchEndDate());
+			
+			//전체 발송 리스트 불러오기
+			Map<String, Object> resultMap = mjonMsgSentService.selectAllMsgSentList_advc(mjonMsgSentVO);
+			
+			
+			model.addAttribute("resultAllSentList", resultMap.get("resultList"));
+			
+			
+			paginationInfo.setTotalRecordCount((Integer)resultMap.get("totalCnt"));
+			model.addAttribute("paginationInfo", paginationInfo);
+			model.addAttribute("totalRecordCount", paginationInfo.getTotalRecordCount());
+	
+			model.addAttribute("mjonMsgSentVO", mjonMsgSentVO);
+			
+			String stateType = mjonMsgSentVO.getStateType();
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+			// TODO: handle exception
+		}
+    	
+		return "web/msgsent/MsgSentAllListAjax";
+	}
+	
+	@RequestMapping(value= {"/web/mjon/msgsent/selectMsgSentListViewAjax_backup.do"})
+	public String selectMsgSentListViewAjax_backup(@ModelAttribute("searchVO") MjonMsgSentVO mjonMsgSentVO, ModelMap model) throws Exception{
+		
+			
+			
+		
 		//로그인 권한정보 불러오기
-    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
-    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
-    	
-    	mjonMsgSentVO.setUserId(userId);
-    	
-    	// 검색 리스트 불러오기
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		
+		mjonMsgSentVO.setUserId(userId);
+		
+		// 검색 리스트 불러오기
 		if(mjonMsgSentVO.getPageUnit() != 10) {
 			mjonMsgSentVO.setPageUnit(mjonMsgSentVO.getPageUnit());
 		}
 		
-    	//기본 내림차순 정렬
-    	if(mjonMsgSentVO.getSearchSortOrd().equals("")) {
-    		
-    		mjonMsgSentVO.setSearchSortOrd("desc");
-    		mjonMsgSentVO.setSearchSortCnd("regdate");
-    	}
-    	
-    	if(mjonMsgSentVO.getListType().equals("")) {
-    		
-    		mjonMsgSentVO.setListType("groupList");
-    		
-    	}
-    	
-    	//선택 탭 정보 저장
-    	//mjonResvMsgVO.setSearchMsgType(mjonResvMsgVO.getTabType());
-    	
+		//기본 내림차순 정렬
+		if(mjonMsgSentVO.getSearchSortOrd().equals("")) {
+			
+			mjonMsgSentVO.setSearchSortOrd("desc");
+			mjonMsgSentVO.setSearchSortCnd("regdate");
+		}
+		
+		if(mjonMsgSentVO.getListType().equals("")) {
+			
+			mjonMsgSentVO.setListType("groupList");
+			
+		}
+		
+		//선택 탭 정보 저장
+		//mjonResvMsgVO.setSearchMsgType(mjonResvMsgVO.getTabType());
+		
 		/** pageing */
 		PaginationInfo paginationInfo = new PaginationInfo();
 		paginationInfo.setCurrentPageNo(mjonMsgSentVO.getPageIndex());
 		paginationInfo.setRecordCountPerPage(mjonMsgSentVO.getPageUnit());
 		paginationInfo.setPageSize(mjonMsgSentVO.getPageSize());
-
+		
 		mjonMsgSentVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
 		mjonMsgSentVO.setLastIndex(paginationInfo.getLastRecordIndex());
 		mjonMsgSentVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
-    	
+		
 		
 		
 		if(!DateUtils.dateChkAndValueChk(mjonMsgSentVO.getStartDate(),mjonMsgSentVO.getEndDate(), 3 )) {
 			mjonMsgSentVO.setStartDate(DateUtils.getDateMonthsAgo(3));
 			mjonMsgSentVO.setEndDate(DateUtils.getCurrentDate());
 		};
-
-    	model.addAttribute("startDate", mjonMsgSentVO.getStartDate());
-    	model.addAttribute("endDate", mjonMsgSentVO.getEndDate());
 		
-    	//전체 발송 리스트 불러오기
-    	List<MjonMsgSentVO> resultAllSentList = mjonMsgSentService.selectAllMsgSentList(mjonMsgSentVO);
-    	model.addAttribute("resultAllSentList", resultAllSentList);
-    	model.addAttribute("resultAllSentCnt", resultAllSentList.size());
-    	
-    	model.addAttribute("searchKeyword", mjonMsgSentVO.getSearchKeyword());
-    	paginationInfo.setTotalRecordCount( resultAllSentList.size()> 0 ? (Integer.parseInt((resultAllSentList.get(0)).getTotMsgCnt())) : 0);
-    	model.addAttribute("paginationInfo", paginationInfo);
-    	model.addAttribute("totalRecordCount", paginationInfo.getTotalRecordCount());
-    	
-    	//발송 결과 성공 실패 건수 리스트 불러오기
-    	List<MjonMsgSentVO> resultMsgSucFailList = new ArrayList<MjonMsgSentVO>(); 
-    	
-    	if(resultAllSentList.size() > 0) {
-    		resultMsgSucFailList = mjonMsgSentService.selectAllMsgSentSucFailList(resultAllSentList, mjonMsgSentVO);
-    	}
-    	model.addAttribute("resultMsgSucFailList", resultMsgSucFailList);
-    	
-    	model.addAttribute("mjonMsgSentVO", mjonMsgSentVO);
-    	
-    	String stateType = mjonMsgSentVO.getStateType();
-    	String pageUrl = "web/msgsent/MsgSentAllListAjax";
-    	
-    	if(stateType.equals("ready")) {
-    		
-    		pageUrl = "web/msgsent/MsgSentReadyListAjax";
-    		
-    	}else if(stateType.equals("complete")) {
-    		
-    		pageUrl = "web/msgsent/MsgSentCompleteListAjax";
-    		
-    	}else if(stateType.equals("fail")) {
-    		
-    		pageUrl = "web/msgsent/MsgSentFailListAjax";
-    		
-    	}
+		model.addAttribute("startDate", mjonMsgSentVO.getStartDate());
+		model.addAttribute("endDate", mjonMsgSentVO.getEndDate());
+		
+		//전체 발송 리스트 불러오기
+		List<MjonMsgSentVO> resultAllSentList = mjonMsgSentService.selectAllMsgSentList(mjonMsgSentVO);
+		
+		
+		model.addAttribute("resultAllSentList", resultAllSentList);
+		model.addAttribute("resultAllSentCnt", resultAllSentList.size());
+		
+		model.addAttribute("searchKeyword", mjonMsgSentVO.getSearchKeyword());
+		paginationInfo.setTotalRecordCount( resultAllSentList.size()> 0 ? (Integer.parseInt((resultAllSentList.get(0)).getTotMsgCnt())) : 0);
+		model.addAttribute("paginationInfo", paginationInfo);
+		model.addAttribute("totalRecordCount", paginationInfo.getTotalRecordCount());
+		
+		//발송 결과 성공 실패 건수 리스트 불러오기
+		List<MjonMsgSentVO> resultMsgSucFailList = new ArrayList<MjonMsgSentVO>(); 
+		
+		if(resultAllSentList.size() > 0) {
+			System.out.println("=====resultMsgSucFailList=====");
+			resultMsgSucFailList = mjonMsgSentService.selectAllMsgSentSucFailList(resultAllSentList, mjonMsgSentVO);
+			System.out.println("//=====resultMsgSucFailList=====");
+		}
+		model.addAttribute("resultMsgSucFailList", resultMsgSucFailList);
+		
+		model.addAttribute("mjonMsgSentVO", mjonMsgSentVO);
+		
+		String stateType = mjonMsgSentVO.getStateType();
+		//    	String pageUrl = "web/msgsent/MsgSentAllListAjax";
+		String pageUrl = "web/msgsent/MsgSentAllListAjax";
+		
+		if(stateType.equals("ready")) {
+			
+			pageUrl = "web/msgsent/MsgSentReadyListAjax";
+			
+		}else if(stateType.equals("complete")) {
+			
+			pageUrl = "web/msgsent/MsgSentCompleteListAjax";
+			
+		}else if(stateType.equals("fail")) {
+			
+			pageUrl = "web/msgsent/MsgSentFailListAjax";
+			
+		}	
+		
+		log.info(" :: pageUrl   [{}]", pageUrl);
 		return pageUrl;
 	}
 	
@@ -621,6 +600,9 @@
     	
 		return "web/msgsent/MsgSentDetailPopAjax";
 	}
+	
+	
+	
 	
     /**
      * 발송관리 문자 상세보기 내용 
@@ -1138,320 +1120,9 @@
     		
     	}
     	
-    	String stateType = mjonMsgSentVO.getStateType();
-		String tabType = mjonMsgSentVO.getTabType();
     	
-    	// 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다.
-		SXSSFWorkbook wb = new SXSSFWorkbook(100);
-		String fileName ="발송관리 엑셀 리스트";		// 저장 파일명
-		String sheetTitle = "문자 발송 내역" ; 		// 셀 제목
-		Sheet sheet = wb.createSheet(sheetTitle);
-		Cell cell = null;
-		Row row = null;
-		
-		CellStyle style = wb.createCellStyle();
-		style.setBorderBottom(CellStyle.BORDER_THIN); //테두리 두껍게 
-		style.setBorderLeft(CellStyle.BORDER_THIN);
-		style.setBorderRight(CellStyle.BORDER_THIN);
-		style.setBorderTop(CellStyle.BORDER_THIN);
-		
-		// 정렬
-		style.setAlignment(CellStyle.ALIGN_CENTER); //가운데 정렬
-		style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); //높이 가운데 정렬
-		
-		Font font = wb.createFont();
-		font.setBoldweight(Font.BOLDWEIGHT_BOLD);  //글씨 bold
-		
-		
-		String type = "";
-		String fCnt = "";
-		
-		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
-		
-		try{ 
-			
-			
-			mjonMsgSentVO.setRecordCountPerPage(100000);
-			mjonMsgSentVO.setFirstIndex(0);
-
-			if("".equals(mjonMsgSentVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
-				mjonMsgSentVO.setSearchSortCnd("regdate");
-				mjonMsgSentVO.setSearchSortOrd("desc");
-			}
-			
-			//예약 관리 리스트 불러오기
-			List<MjonMsgSentVO> resultAllSentList = mjonMsgSentService.selectAllMsgSentList(mjonMsgSentVO);
-			
-			{//화면 리스트
-				
-  				row = sheet.createRow(0);
-  				
-					sheet.setColumnWidth(1, 5000); // 발송일시 칼럼의 폭 조절
-					sheet.setColumnWidth(3, 10000); // 내용 칼럼의 폭 조절
-					sheet.setColumnWidth(4, 5000); // 받는사람 이름 칼럼의 폭 조절
-					sheet.setColumnWidth(5, 5000); // 받는사람 연락처 칼럼의 폭 조절
-					sheet.setColumnWidth(6, 5000); // 발신번호  칼럼의 폭 조절
-					sheet.setColumnWidth(7, 5000); // 발송상태 칼럼의 폭 조절
-					sheet.setColumnWidth(8, 5000); // 발송건수 칼럼의 폭 조절
-					
-					//셀병합 처리
-					sheet.addMergedRegion(new CellRangeAddress(0,1,0,0)); //번호 세로 셀병합
-	  				sheet.addMergedRegion(new CellRangeAddress(0,1,1,1)); //발송일시 세로 셀병합
-	  				sheet.addMergedRegion(new CellRangeAddress(0,1,2,2)); //형태 세로 셀병합
-	  				sheet.addMergedRegion(new CellRangeAddress(0,1,3,3)); //내용 세로 셀병합
-	  				sheet.addMergedRegion(new CellRangeAddress(0,1,4,4)); //받는사람 이름 셀병합
-	  				sheet.addMergedRegion(new CellRangeAddress(0,1,5,5)); //받는사람 연락처 셀병합
-	  				sheet.addMergedRegion(new CellRangeAddress(0,1,6,6)); //발신번호 세로 셀병합
-	  				sheet.addMergedRegion(new CellRangeAddress(0,1,7,7)); //발송상태 세로 셀병합
-	  				sheet.addMergedRegion(new CellRangeAddress(0,1,8,8)); //발송건수 세로 셀병합
-	  				
-					
-					cell = row.createCell(0);
-					cell.setCellValue("번호");
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(1);
-					cell.setCellValue("발송일시");
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(2);
-					cell.setCellValue("형태");
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(3);
-					cell.setCellValue("내용");
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(4);
-					cell.setCellValue("수신자");
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(5);
-					cell.setCellValue("수신번호");
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(6);
-					cell.setCellValue("발신번호");
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(7);
-					cell.setCellValue("발송상태");
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(8);
-					cell.setCellValue("발송건수");
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(9);
-					cell.setCellValue("발송결과");
-					sheet.addMergedRegion(new CellRangeAddress(0,0,9,10)); // 발송결과 건수 가로 셀병합
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(10);
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(11);
-					cell.setCellValue("금액");
-					sheet.addMergedRegion(new CellRangeAddress(0,0,11,12)); // 발송결과 건수 가로 셀병합
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(12);
-					cell.setCellValue("예약취소");
-					cell.setCellStyle(style);
-					
-					row = sheet.createRow(1);
-					
-					cell = row.createCell(0);
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(1);
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(2);
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(3);
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(4);
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(5);
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(6);
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(7);
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(8);
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(9);
-					cell.setCellValue("성공");
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(10);
-					cell.setCellValue("실패/대기");
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(11);
-					cell.setCellValue("과금");
-					cell.setCellStyle(style);
-					
-					cell = row.createCell(12);
-					cell.setCellValue("비과금");
-					cell.setCellStyle(style);
-				} 
-				
-				for(int i=0; i < resultAllSentList.size(); i++) {
-					String msgType = "단문";
-					if(resultAllSentList.get(i).getMsgType().equals("6") && resultAllSentList.get(i).getFileCnt().equals("0")) {
-						msgType = "장문";
-					}else if(resultAllSentList.get(i).getMsgType().equals("6") && !resultAllSentList.get(i).getFileCnt().equals("0")) {
-						msgType = "그림";
-					}
-					
-					
-					int excelLen = 0;
-					row = sheet.createRow(i+2);
-					excelLen = 12;
-						
-					for(int j=0 ; j <= excelLen ; j++) {
-						cell = row.createCell(j);
-						cell.setCellStyle(style);
-						
-						if(j==0) cell.setCellValue(i+1); //번호
-						if(j==1) cell.setCellValue(sdf.format((resultAllSentList.get(i)).getReqdate())); 	//발송일자
-						if(j==2) {
-							
-							type = resultAllSentList.get(i).getMsgType();
-							fCnt = resultAllSentList.get(i).getFileCnt();
-							
-							if(type.equals("4")) {
-								
-								cell.setCellValue("단문"); 	//형태
-								
-							}else {
-								
-								if(fCnt.equals("0")) {
-									
-									cell.setCellValue("장문"); 	//형태
-									
-								}else {
-									
-									cell.setCellValue("그림"); 	//형태
-									
-								}
-								
-							}
-							
-						} 
-						if(j==3) cell.setCellValue((resultAllSentList.get(i)).getSmsTxt()); 		//내용
-						if(j==4) cell.setCellValue((resultAllSentList.get(i)).getAddrNm());
-						if(j==5) cell.setCellValue((resultAllSentList.get(i)).getCallToComma());
-						if(j==6) cell.setCellValue((resultAllSentList.get(i)).getCallFromComma()); 		//발신번호
-						if(j==7) { //발송상태 처리해주기
-							
-							String resvCYn = resultAllSentList.get(i).getReserveCYn();
-							String curState = resultAllSentList.get(i).getCurState();
-							
-							if(resvCYn.equals("Y")) {
-								
-								cell.setCellValue("예약 취소"); 		//발송상태
-								
-							}else {
-								
-								if(curState.equals("0")) {
-									
-									cell.setCellValue("발송 대기");		//발송상태
-									
-								}else if(curState.equals("1")) {
-									
-									cell.setCellValue("발송중"); 		//발송상태
-									
-								}else if(curState.equals("2")) {
-									
-									cell.setCellValue("결과 대기"); 	//발송상태
-									
-								}else if(curState.equals("3")) {
-									
-									cell.setCellValue("발송 완료"); 	//발송상태
-									
-								}
-							}
-							
-						}
-						if(j==8) cell.setCellValue((resultAllSentList.get(i)).getMsgGroupCnt());	//발송건수
-							
-						//발송결과 성공, 실패 처리
-						int resSucCnt = 0;
-						int resFailCnt = 0;
-						double resSucPrice = 0;
-						double resFailPirce = 0;
-						
-						
-						double eachPrice = Float.parseFloat(resultAllSentList.get(i).getEachPrice());
-						int resultSValue = 0;
-						int resultWFValue = 0;
-						
-						if(resultAllSentList.get(i).getResultSValue() != null) {
-							resultSValue = Integer.parseInt(resultAllSentList.get(i).getResultSValue());
-						}else {
-							resultSValue = 1;
-						}
-						
-						if(resultAllSentList.get(i).getResultWFValue() != null) {
-							resultWFValue = Integer.parseInt(resultAllSentList.get(i).getResultWFValue());
-						}else {
-							resultWFValue = 1;
-						}
-						
-						
-						if("S".equals(resultAllSentList.get(i).getMsgResult())) {
-							resSucCnt = resultSValue;
-						} else {
-							resFailCnt = resultWFValue;
-						}
-							
-						resSucPrice = eachPrice * resSucCnt;
-						resFailPirce = eachPrice * resFailCnt;
-						
-						
-						if(j==9) cell.setCellValue(resSucCnt); 		//발송결과 성공
-						if(j==10) cell.setCellValue(resFailCnt); 		//발송결과 실패
-						if(j==11) cell.setCellValue(resSucPrice); // 과금 금액
-						if(j==12) cell.setCellValue(resFailPirce); //비과금 금액
-					}
-				}
-			response.setHeader("Set-Cookie", "fileDownload=true; path=/");
-			SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyyMMdd_HHmmss", Locale.KOREA );
-			Date currentTime = new Date ();
-			String mTime = mSimpleDateFormat.format ( currentTime );
-			fileName = fileName+"("+mTime+")";
-			
-			response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((fileName).getBytes("KSC5601"),"8859_1")+".xlsx"));
-			wb.write(response.getOutputStream());
-		}catch(Exception e) {
-  			response.setHeader("Set-Cookie", "fileDownload=false; path=/");
-  			response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
-  			response.setHeader("Content-Type","text/html; charset=utf-8");
-  			OutputStream out = null;
-  			try {
-  				out = response.getOutputStream();
-  				byte[] data = new String("fail..").getBytes();
-  				out.write(data, 0, data.length);
-  			} catch(Exception ignore) {
-  				ignore.printStackTrace();
-  			} finally {
-  				if(out != null) try { out.close(); } catch(Exception ignore) {}
-  			}
-  		}finally {
-  			// 디스크 적었던 임시파일을 제거합니다.
-  			wb.dispose();
-  			try { wb.close(); } catch(Exception ignore) {}
-  		}
+    	mjonMsgSentService.msgSentExcelDownLoad(mjonMsgSentVO, response);
+    	
     	
 		
 	}
src/main/java/itn/let/mjo/pay/web/MjonPayController.java
--- src/main/java/itn/let/mjo/pay/web/MjonPayController.java
+++ src/main/java/itn/let/mjo/pay/web/MjonPayController.java
@@ -13,11 +13,9 @@
 import java.text.NumberFormat;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -41,18 +39,12 @@
 import org.json.simple.parser.JSONParser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartHttpServletRequest;
 import org.springframework.web.servlet.HandlerMapping;
@@ -67,7 +59,6 @@
 import itn.com.cmm.ComDefaultCodeVO;
 import itn.com.cmm.EgovMessageSource;
 import itn.com.cmm.LoginVO;
-import itn.com.cmm.RestResponse;
 import itn.com.cmm.service.EgovCmmUseService;
 import itn.com.cmm.service.FileVO;
 import itn.com.cmm.util.DateUtils;
@@ -76,8 +67,6 @@
 import itn.com.cmm.util.RedirectUrlMaker;
 import itn.com.cmm.util.StringUtil;
 import itn.com.utl.fcc.service.EgovStringUtil;
-import itn.let.fax.admin.service.FaxStatVO;
-import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.mjocommon.MjonCommon;
 import itn.let.mjo.msg.service.MjonMsgService;
 import itn.let.mjo.msg.service.MjonMsgVO;
@@ -107,6 +96,7 @@
 import itn.let.uss.umt.service.MberManageVO;
 import itn.let.uss.umt.service.UserManageVO;
 import itn.let.utl.fcc.service.EgovCryptoUtil;
+import itn.let.utl.user.service.ExcelUtil;
 import itn.let.utl.user.service.MjonNoticeSendUtil;
 
 @Controller
@@ -1952,7 +1942,6 @@
 		
 		model.addAttribute("prePaymentYn", userManageVO.getPrePaymentYn());
     	
-		
 		System.out.println("pattern :: "+ pattern);
     	if(pattern.equals("/web/member/pay/PayListAllAjax.do")
     			|| pattern.equals("/web/member/pay/PayListMobileAjax.do")
@@ -2051,7 +2040,7 @@
             	
     			return "/web/pay/PayListRefundAjax";
     		}
-        	
+
         	//일반 결제 페이지 처리
     		if("".equals(mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
     			mjonPayVO.setSearchSortCnd("moid");
@@ -2073,7 +2062,7 @@
     			}
     			
     		}
-    		
+	
 			if(pattern.equals("/web/member/pay/PayListAllAjax.do")) { //전체
     			mjonPayVO.setPageType("all");
     		}
@@ -2121,7 +2110,7 @@
         	
 //			mjonPayVO.setStartDate(mjonPayVO.getStartDate() == null ? DateUtil.getDateDaysAgo(365) : mjonPayVO.getStartDate());
 //			mjonPayVO.setEndDate(mjonPayVO.getEndDate() == null ? DateUtil.getCurrentDate() : mjonPayVO.getEndDate());
-			
+
 			if(!DateUtils.dateChkAndValueChk(mjonPayVO.getStartDate(),mjonPayVO.getEndDate(), 12 )) {
 				mjonPayVO.setStartDate(DateUtils.getDateMonthsAgo(12));
 				mjonPayVO.setEndDate(DateUtils.getCurrentDate());
@@ -4085,7 +4074,7 @@
 	}
     
     //결제 엑셀 다운로드 
-    @RequestMapping(value= {"/web/member/pay/PayExcelDownload.do"})
+    @RequestMapping(value= {"/web/member/pay/PayExcelDownload_OLD.do"})
   	public void PayExcelDownload( MjonPayVO mjonPayVO, 
 			HttpServletRequest request,
 			HttpServletResponse response ,
@@ -4180,6 +4169,118 @@
   		}
   	}
     
+    //결제 엑셀 다운로드 
+    @RequestMapping(value= {"/web/member/pay/PayExcelDownload.do"})
+  	public void PayNewExcelDownload( MjonPayVO mjonPayVO, 
+			HttpServletRequest request,
+			HttpServletResponse response ,
+			ModelMap model) throws Exception {
+    	
+    	//로그인 여부 체크 및 ID 획득
+    	LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		if(loginVO != null) {
+
+			String fileName ="결제내역 엑셀 리스트";	//file name
+	  		
+	  		try{
+	  			/** pageing */
+	    		PaginationInfo paginationInfo = new PaginationInfo();
+	    		paginationInfo.setCurrentPageNo(1);
+	    		paginationInfo.setRecordCountPerPage(10000);
+	    		paginationInfo.setPageSize(10);
+	    		
+	    		mjonPayVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
+	    		mjonPayVO.setLastIndex(paginationInfo.getLastRecordIndex());
+	    		mjonPayVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
+	    		
+	    		mjonPayVO.setUserId(userId);
+	    		
+	    		
+	    		//url에 따른 타입 처리
+	    		String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
+	    		System.out.println("pattern========");
+	    		System.out.println(pattern);
+	    		
+	    		//url에 따른 검색 조건 처리
+	    		mjonPayVO = this.p_checkSearchCnd(pattern, mjonPayVO);    		 
+
+	    		
+	    		//검색 기간 처리
+	    		mjonPayVO = this.p_checkSearchDate(mjonPayVO);
+	    		
+				
+	        	//정렬 처리
+	    		mjonPayVO = this.p_checkSortCnd(mjonPayVO); 
+	    		
+	    		
+	    		//결과 리스트 정보 불러오기
+	            List<MjonPayVO> resultList = mjonPayService.selectPayList(mjonPayVO);   
+	            
+	  			//필요 컬럼 추가 
+	  			for (int i=0;i<resultList.size();i++) {
+	  				MjonPayVO tMjonPayVO = resultList.get(i);
+	  				tMjonPayVO.setSeqNo(resultList.size()-i);
+	  			}
+	  			
+	  			//excel 만들기
+	  			List<Object> excelData  = new ArrayList<>();
+				excelData.addAll(resultList);
+				// 세팅값
+				String title = "요금결제내역";	//sheet name & title
+				
+				// 너비
+				int[] width = {
+						4000
+						, 4000
+						, 4000
+						, 4000					
+						, 4000
+						
+						, 4000
+						//, 4000
+						, 4000
+				};
+
+				// 헤더
+				String[] header = {
+						"번호"
+						, "결제일시"
+						, "결제방식"
+						, "결제금액"
+						, "충전금액"
+						
+						, "결제상태"
+						//, "증빙서류 발행 요청"
+						, "비고1"
+				};
+				
+				// 컬럼명
+				String[] order = {
+						"SeqNo"
+						, "RegDate"
+						, "PayMethodTxt"
+						, "Amt"
+						, "Cash"
+						
+						, "PgStatusTxt"
+						//, "RcptTypeTxt"
+						, "VbankNum"												
+						
+				};
+
+				// 호출 - download file 처리
+				SXSSFWorkbook workbook = ExcelUtil.makeSimpleFruitExcelWorkbook(excelData , header, order, width, title);				
+				response = this.p_makeResponse(response, fileName);				
+		  		workbook.write(response.getOutputStream());
+	  	    
+	  		}catch(Exception e) {
+	  			e.printStackTrace();  			
+	  		}
+        	
+		}  		
+		
+  	}
     
     //포인트 교환내역 엑셀 다운로드 
     @RequestMapping(value= {"/web/member/pay/PointExcelDownload.do"})
@@ -6088,6 +6189,119 @@
 		model.addAttribute("paginationInfo", paginationInfo);
 		
 		return "/uss/ion/pay/cashPointSendList";
-    }    
+    }
+    
+    /**
+     * @param p_pattern
+     * @param p_mjonPayVO
+     * @return
+     * @throws Exception
+     */
+    private MjonPayVO p_checkSearchCnd(
+    		String p_pattern
+    		, MjonPayVO p_mjonPayVO
+    		) throws Exception{
+    	if(p_pattern.equals("/web/member/pay/PayListAllAjax.do")) { //전체
+			p_mjonPayVO.setPageType("all");
+		}
+		if(p_pattern.equals("/web/member/pay/PayListMobileAjax.do")) { //모바일일때
+			p_mjonPayVO.setSearchCondition2("CELLPHONE");
+			p_mjonPayVO.setPayMethod("CELLPHONE");
+			p_mjonPayVO.setPageType("cellphone");
+		}
+		if(p_pattern.equals("/web/member/pay/PayListCardAjax.do")) { //신용카드
+			p_mjonPayVO.setSearchCondition2("CARD");
+			p_mjonPayVO.setPayMethod("CARD");
+			p_mjonPayVO.setPageType("card");
+		}
+		if(p_pattern.equals("/web/member/pay/PayListVBankAjax.do")) { //전용계좌
+			p_mjonPayVO.setSearchCondition2("VBANK");
+			p_mjonPayVO.setPayMethod("VBANK");
+			p_mjonPayVO.setPageType("vbank");
+		}
+		if(p_pattern.equals("/web/member/pay/PayListBankAjax.do")) { //즉시이체
+			p_mjonPayVO.setSearchCondition2("BANK");
+			p_mjonPayVO.setPayMethod("BANK");
+			p_mjonPayVO.setPageType("bank");
+		}    		
+		if(p_pattern.equals("/web/member/pay/PayListSPayAjax.do")) { //즉시이체
+			p_mjonPayVO.setSearchCondition2("SPAY");
+			p_mjonPayVO.setPayMethod("SPAY");
+			p_mjonPayVO.setPageType("SPAY");
+		}    		    		
+		if(p_pattern.equals("/web/member/pay/PayListOfflineAjax.do")) { //무통장
+			p_mjonPayVO.setSearchCondition2("OFFLINE");
+			p_mjonPayVO.setPayMethod("OFFLINE");
+			p_mjonPayVO.setPageType("offline");
+		}   
+		
+		return p_mjonPayVO;
+    }
+    
+    /**
+     * @param p_mjonPayVO
+     * @return
+     * @throws Exception
+     */
+    private MjonPayVO p_checkSortCnd(
+    		MjonPayVO p_mjonPayVO
+    		) throws Exception{
+    	//정렬 처리
+		if("".equals(p_mjonPayVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
+			p_mjonPayVO.setSearchSortCnd("moid");
+			p_mjonPayVO.setSearchSortOrd("desc");
+		}else {//포인트 교환내역에서 정렬 종류가 달라서 변환처리 해줌
+			
+			String sortCnt = p_mjonPayVO.getSearchSortCnd();
+			
+			if(sortCnt.equals("pointUseId") || sortCnt.equals("refundId")) {
+				p_mjonPayVO.setSearchSortCnd("moid");
+			}else if(sortCnt.equals("frstRegistPnttm") || sortCnt.equals("frstRegisterPnttm") || sortCnt.equals("refundHandlePnttm")) {
+				p_mjonPayVO.setSearchSortCnd("regDate");
+			}else if(sortCnt.equals("type")) {
+				p_mjonPayVO.setSearchSortCnd("payMethodTxt");
+			}else if(sortCnt.equals("point") || sortCnt.equals("refundMoney") || sortCnt.equals("refundCash")) {
+				p_mjonPayVO.setSearchSortCnd("amt");
+			}else if(sortCnt.equals("cmpltYn") || sortCnt.equals("refundStatus")) {
+				p_mjonPayVO.setSearchSortCnd("pgStatusTxt");
+			}
+			
+		}
+		
+		return p_mjonPayVO;
+    }
+    
+    /**
+     * @param p_mjonPayVO
+     * @return
+     * @throws Exception
+     */
+    private MjonPayVO p_checkSearchDate(
+    		MjonPayVO p_mjonPayVO
+    		) throws Exception{
+    	//검색 기간 처리
+		if(!DateUtils.dateChkAndValueChk(p_mjonPayVO.getStartDate(),p_mjonPayVO.getEndDate(), 12 )) 
+		{
+			p_mjonPayVO.setStartDate(DateUtils.getDateMonthsAgo(12));
+			p_mjonPayVO.setEndDate(DateUtils.getCurrentDate());
+		}
+		
+		return p_mjonPayVO;
+    }
+    
+    private HttpServletResponse p_makeResponse(
+    		HttpServletResponse p_response
+    		, String p_fileName
+    		) throws Exception{
+    	p_response.setHeader("Set-Cookie", "fileDownload=true; path=/");
+  		SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat ( "yyyy_MM_dd_HH_mm_ss", Locale.KOREA );
+  		Date currentTime = new Date ();
+  		String mTime = mSimpleDateFormat.format ( currentTime );
+  		p_fileName = p_fileName+"("+mTime+")";
+  		
+  		p_response.setHeader("Content-Disposition", String.format("attachment; filename=\""+new String((p_fileName).getBytes("KSC5601"),"8859_1")+".xlsx"));
+  		
+  		return p_response;
+    }
 }
 
src/main/java/itn/let/mjo/reservmsg/service/impl/MjonReservMsgServiceImpl.java
--- src/main/java/itn/let/mjo/reservmsg/service/impl/MjonReservMsgServiceImpl.java
+++ src/main/java/itn/let/mjo/reservmsg/service/impl/MjonReservMsgServiceImpl.java
@@ -341,6 +341,7 @@
 			}
 			
 		} catch (Exception e) {
+			e.printStackTrace();
 			System.out.println("++++++++++++++++++++++ 예약문자 취소 deleteReservMsgCancelDataAjax Service Imple Error !!! " + e);
 		}
 		
src/main/java/itn/let/mjo/reservmsg/web/MjonReservMsgController.java
--- src/main/java/itn/let/mjo/reservmsg/web/MjonReservMsgController.java
+++ src/main/java/itn/let/mjo/reservmsg/web/MjonReservMsgController.java
@@ -610,37 +610,43 @@
 	
 		ModelAndView modelAndView = new ModelAndView(); 
 		modelAndView.setViewName("jsonView");
+		try {
 		
-		//로그인 권한정보 불러오기
-		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
-    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
-
-    	if(!userId.equals("")) {
-    		
-    		mjonResvMsgVO.setUserId(userId);
-    		
-    	}else {
-    		
-    		modelAndView.addObject("message", "로그인 후 이용이 가능합니다.");
-    		modelAndView.addObject("result", "fail");
-    		
-    		return modelAndView;
-    		
-    	}
-    	
-    	 // 디비에 문자 내용을 저장해 준다.
- 		int resultSts = mjonReservMsgService.deleteReservMsgCancelDataAjax(mjonResvMsgVO);
-		
-		if(resultSts > 0) {
+			//로그인 권한정보 불러오기
+			LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+	    	String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+	
+	    	if(!userId.equals("")) {
+	    		
+	    		mjonResvMsgVO.setUserId(userId);
+	    		
+	    	}else {
+	    		
+	    		modelAndView.addObject("message", "로그인 후 이용이 가능합니다.");
+	    		modelAndView.addObject("result", "fail");
+	    		
+	    		return modelAndView;
+	    		
+	    	}
+	    	
+	    	 // 디비에 문자 내용을 저장해 준다.
+	 		int resultSts = mjonReservMsgService.deleteReservMsgCancelDataAjax(mjonResvMsgVO);
 			
-			modelAndView.addObject("message", "예약 발송이 정상적으로 취소 되었습니다.");
-			modelAndView.addObject("result", "success");
+			if(resultSts > 0) {
+				
+				modelAndView.addObject("message", "예약 발송이 정상적으로 취소 되었습니다.");
+				modelAndView.addObject("result", "success");
+				
+			}else {
+				
+				modelAndView.addObject("message", "예약 발송 취소 처리가 실패 되었습니다. 잠시 후 다시 시도해 주세요.");
+				modelAndView.addObject("result", "fail");
+				
+			}
 			
-		}else {
-			
-			modelAndView.addObject("message", "예약 발송 취소 처리가 실패 되었습니다. 잠시 후 다시 시도해 주세요.");
-			modelAndView.addObject("result", "fail");
-			
+		} catch (Exception e) {
+			e.printStackTrace();
+			// TODO: handle exception
 		}
 		
 		return modelAndView;
src/main/java/itn/let/module/base/PriceAndPoint.java
--- src/main/java/itn/let/module/base/PriceAndPoint.java
+++ src/main/java/itn/let/module/base/PriceAndPoint.java
@@ -117,6 +117,7 @@
 		MjonPayVO mjonPayVO = new MjonPayVO();
 		mjonPayVO.setCashId(idgenMjonCashId.getNextStringId());
 		mjonPayVO.setUserId(userId);
+		System.out.println(" + totPrice :: "+ totPrice);
 		mjonPayVO.setCash(totPrice);
 		mjonPayVO.setFrstRegisterId(userId);
 		mjonPayVO.setMemo(memo);
src/main/java/itn/let/uat/uia/web/EgovLoginController.java
--- src/main/java/itn/let/uat/uia/web/EgovLoginController.java
+++ src/main/java/itn/let/uat/uia/web/EgovLoginController.java
@@ -1074,12 +1074,21 @@
 		String message = (String) commandMap.get("message");
 		String goEventPay = (String) commandMap.get("goEventPay");
 		
-		// sns 회원가입 key 값 설정
-		String naverClientId = itnNaverClientId;
-		String naverClientSecret = itnNaverClientSecret;
+		/*
+		 * 	헤더에서 id/pw는 맞지만 보안로그인 설정 되어있을때 -> secure
+		 * 
+		 */
 
-		String kakaoRestApiKey = itnKakaoRestApiKey;
-		String kakaoReturnUrl = itnKakaoReturnUrl;
+		String headerLoginResult = (String) commandMap.get("headerLoginResult");
+		String id = (String) commandMap.get("id");
+		String pw = (String) commandMap.get("password");
+		
+		// sns 회원가입 key 값 설정
+//		String naverClientId = itnNaverClientId;
+//		String naverClientSecret = itnNaverClientSecret;
+//
+//		String kakaoRestApiKey = itnKakaoRestApiKey;
+//		String kakaoReturnUrl = itnKakaoReturnUrl;
 
 		// config 정보 가져오기
 		MberManageConfigVO mberConfigVO = new MberManageConfigVO();
@@ -1129,6 +1138,16 @@
 
 		model.addAttribute("userIp", userIp);
 		model.addAttribute("goEventPay", goEventPay);
+		
+		
+		if(StringUtil.isNotEmpty(headerLoginResult)) {
+			model.addAttribute("id_secure", id); 
+			model.addAttribute("pw_secure", pw);
+		}else {
+			headerLoginResult = "N";
+		}
+		
+		model.addAttribute("headerLoginResult", headerLoginResult);
 
 		return "web/login/EgovLoginGnrlUsr";
 	}
@@ -1833,6 +1852,8 @@
 			HttpServletRequest request, @RequestParam Map<String, Object> commandMap, ModelMap model,
 			HttpSession session, RedirectAttributes redirectAttributes) throws Exception {
 		
+		
+		
 		ModelAndView modelAndView = new ModelAndView();
 		modelAndView.setViewName("jsonView");
 
src/main/java/itn/let/uss/umt/service/UserDefaultVO.java
--- src/main/java/itn/let/uss/umt/service/UserDefaultVO.java
+++ src/main/java/itn/let/uss/umt/service/UserDefaultVO.java
@@ -4,6 +4,9 @@
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import lombok.Getter;
+import lombok.Setter;
+
 /**
  * 사용자정보 VO클래스로서일반회원, 기업회원, 업무사용자의  비지니스로직 처리시 기타조건성 항을 구성한다.
  * @author 공통서비스 개발팀 조재영
@@ -21,6 +24,8 @@
  *
  * </pre>
  */
+@Getter
+@Setter
 public class UserDefaultVO implements Serializable {
 	
 	/**
@@ -34,9 +39,19 @@
     /** 검색조건-성별     (0, M, F)*/
     private String searchSexdstn = "0";
     
-	/** 검색조건 */
+	/**  
+	 * 검색조건
+	 * 20250122 이호영 
+	 * 개선은 검색조건을 아래 세개만 사용하려고 함
+	 * */
     private String searchCondition ;
+    private String searchCondition01 ;
+    private String searchCondition02 ;
     
+    
+    
+    /** 검색조건 - 기존 */
+//    private String searchCondition ;
     private String searchCondition_01 ;
     
     private String searchConditionSite ;
@@ -173,45 +188,6 @@
 	
 	private String searchDeleteType;
 	
-	public String getSearchDeleteType() {
-		return searchDeleteType;
-	}
-
-	public void setSearchDeleteType(String searchDeleteType) {
-		this.searchDeleteType = searchDeleteType;
-	}
-
-	public String getSearchHotlineAgentCode() {
-		return searchHotlineAgentCode;
-	}
-
-	public void setSearchHotlineAgentCode(String searchHotlineAgentCode) {
-		this.searchHotlineAgentCode = searchHotlineAgentCode;
-	}
-
-	public String getSearchExceptSpamYn() {
-		return searchExceptSpamYn;
-	}
-
-	public void setSearchExceptSpamYn(String searchExceptSpamYn) {
-		this.searchExceptSpamYn = searchExceptSpamYn;
-	}
-
-	public String getSearchSmishingYn() {
-		return searchSmishingYn;
-	}
-
-	public void setSearchSmishingYn(String searchSmishingYn) {
-		this.searchSmishingYn = searchSmishingYn;
-	}
-
-	public String getSearchDeptPrePayment() {
-		return searchDeptPrePayment;
-	}
-
-	public void setSearchDeptPrePayment(String searchDeptPrePayment) {
-		this.searchDeptPrePayment = searchDeptPrePayment;
-	}
 
 	private String searchAdminSmsNoticeYn;
 	
@@ -224,570 +200,5 @@
 	private String searchThrDptCategoryCode; //3뎁스(하위카테고리) 검색	
 	
 		
-	public String getEditMode() {
-		return editMode;
-	}
-
-	public void setEditMode(String editMode) {
-		this.editMode = editMode;
-	}
-
-	public String getSearchSmsSalePrice() {
-		return searchSmsSalePrice;
-	}
-
-	public void setSearchSmsSalePrice(String searchSmsSalePrice) {
-		this.searchSmsSalePrice = searchSmsSalePrice;
-	}
-
-	public String getSearchAdminSmsNoticeYn() {
-		return searchAdminSmsNoticeYn;
-	}
-
-	public void setSearchAdminSmsNoticeYn(String searchAdminSmsNoticeYn) {
-		this.searchAdminSmsNoticeYn = searchAdminSmsNoticeYn;
-	}
-
-	public String getSearchDept() {
-		return searchDept;
-	}
-
-	public void setSearchDept(String searchDept) {
-		this.searchDept = searchDept;
-	}
-
-	public String getAuthorCode() {
-		return authorCode;
-	}
-
-	public void setAuthorCode(String authorCode) {
-		this.authorCode = authorCode;
-	}
-
-	public String getSearchCategoryCode() {
-		return searchCategoryCode;
-	}
-
-	public void setSearchCategoryCode(String searchCategoryCode) {
-		this.searchCategoryCode = searchCategoryCode;
-	}
-	
-	public String getSearchKeywordFrom() {
-		return searchKeywordFrom;
-	}
-
-	public void setSearchKeywordFrom(String searchKeywordFrom) {
-		this.searchKeywordFrom = searchKeywordFrom;
-	}
-
-	public String getSearchKeywordTo() {
-		return searchKeywordTo;
-	}
-
-	public void setSearchKeywordTo(String searchKeywordTo) {
-		this.searchKeywordTo = searchKeywordTo;
-	}
-
-	public String getFrstRegistPnttm() {
-		return frstRegistPnttm;
-	}
-
-	public void setFrstRegistPnttm(String frstRegistPnttm) {
-		this.frstRegistPnttm = frstRegistPnttm;
-	}
-
-	public String getFrstRegisterId() {
-		return frstRegisterId;
-	}
-
-	public void setFrstRegisterId(String frstRegisterId) {
-		this.frstRegisterId = frstRegisterId;
-	}
-
-	public String getLastUpdtPnttm() {
-		return lastUpdtPnttm;
-	}
-
-	public void setLastUpdtPnttm(String lastUpdtPnttm) {
-		this.lastUpdtPnttm = lastUpdtPnttm;
-	}
-
-	public String getLastUpdusrId() {
-		return lastUpdusrId;
-	}
-
-	public void setLastUpdusrId(String lastUpdusrId) {
-		this.lastUpdusrId = lastUpdusrId;
-	}
-
-	public int getTotCnt() {
-		return totCnt;
-	}
-
-	public void setTotCnt(int totCnt) {
-		this.totCnt = totCnt;
-	}
-
-	public String getUserTotailCount() {
-		return userTotailCount;
-	}
-
-	public void setUserTotailCount(String userTotailCount) {
-		this.userTotailCount = userTotailCount;
-	}
-
-	public String getUserNewCount() {
-		return userNewCount;
-	}
-
-	public void setUserNewCount(String userNewCount) {
-		this.userNewCount = userNewCount;
-	}
-
-	public String getUserDeleteCount() {
-		return userDeleteCount;
-	}
-
-	public void setUserDeleteCount(String userDeleteCount) {
-		this.userDeleteCount = userDeleteCount;
-	}
-
-	public String getUserNewBlock() {
-		return userNewBlock;
-	}
-
-	public void setUserNewBlock(String userNewBlock) {
-		this.userNewBlock = userNewBlock;
-	}
-
-	public String getSnsSiteId() {
-		return snsSiteId;
-	}
-
-	public void setSnsSiteId(String snsSiteId) {
-		this.snsSiteId = snsSiteId;
-	}
-
-	public String getSnsSiteName() {
-		return snsSiteName;
-	}
-
-	public void setSnsSiteName(String snsSiteName) {
-		this.snsSiteName = snsSiteName;
-	}
-
-	public String getSnsSite() {
-		return snsSite;
-	}
-
-	public void setSnsSite(String snsSite) {
-		this.snsSite = snsSite;
-	}
-
-	public String getSnsId() {
-		return snsId;
-	}
-
-	public void setSnsId(String snsId) {
-		this.snsId = snsId;
-	}
-
-	public String getSnsEmail() {
-		return snsEmail;
-	}
-
-	public void setSnsEmail(String snsEmail) {
-		this.snsEmail = snsEmail;
-	}
-
-	public static long getSerialversionuid() {
-		return serialVersionUID;
-	}
-
-	/**
-	 * sbscrbSttus attribute 값을  리턴한다.
-	 * @return String
-	 */
-	public String getSbscrbSttus() {
-		return sbscrbSttus;
-	}
-
-	/**
-	 * sbscrbSttus attribute 값을 설정한다.
-	 * @param sbscrbSttus String
-	 */
-	public void setSbscrbSttus(String sbscrbSttus) {
-		this.sbscrbSttus = sbscrbSttus;
-	}
-
-	/**
-	 * searchCondition attribute 값을  리턴한다.
-	 * @return String
-	 */
-	public String getSearchCondition() {
-		return searchCondition;
-	}
-
-	/**
-	 * searchCondition attribute 값을 설정한다.
-	 * @param searchCondition String
-	 */
-	public void setSearchCondition(String searchCondition) {
-		this.searchCondition = searchCondition;
-	}
-
-	/**
-	 * searchKeyword attribute 값을  리턴한다.
-	 * @return String
-	 */
-	public String getSearchKeyword() {
-		return searchKeyword;
-	}
-
-	/**
-	 * searchKeyword attribute 값을 설정한다.
-	 * @param searchKeyword String
-	 */
-	public void setSearchKeyword(String searchKeyword) {
-		this.searchKeyword = searchKeyword;
-	}
-
-	/**
-	 * searchUseYn attribute 값을  리턴한다.
-	 * @return String
-	 */
-	public String getSearchUseYn() {
-		return searchUseYn;
-	}
-
-	/**
-	 * searchUseYn attribute 값을 설정한다.
-	 * @param searchUseYn String
-	 */
-	public void setSearchUseYn(String searchUseYn) {
-		this.searchUseYn = searchUseYn;
-	}
-
-	/**
-	 * pageIndex attribute 값을  리턴한다.
-	 * @return int
-	 */
-	public int getPageIndex() {
-		return pageIndex;
-	}
-
-	/**
-	 * pageIndex attribute 값을 설정한다.
-	 * @param pageIndex int
-	 */
-	public void setPageIndex(int pageIndex) {
-		this.pageIndex = pageIndex;
-	}
-
-	/**
-	 * pageUnit attribute 값을  리턴한다.
-	 * @return int
-	 */
-	public int getPageUnit() {
-		return pageUnit;
-	}
-
-	/**
-	 * pageUnit attribute 값을 설정한다.
-	 * @param pageUnit int
-	 */
-	public void setPageUnit(int pageUnit) {
-		this.pageUnit = pageUnit;
-	}
-
-	/**
-	 * pageSize attribute 값을  리턴한다.
-	 * @return int
-	 */
-	public int getPageSize() {
-		return pageSize;
-	}
-
-	/**
-	 * pageSize attribute 값을 설정한다.
-	 * @param pageSize int
-	 */
-	public void setPageSize(int pageSize) {
-		this.pageSize = pageSize;
-	}
-
-	/**
-	 * firstIndex attribute 값을  리턴한다.
-	 * @return int
-	 */
-	public int getFirstIndex() {
-		return firstIndex;
-	}
-
-	/**
-	 * firstIndex attribute 값을 설정한다.
-	 * @param firstIndex int
-	 */
-	public void setFirstIndex(int firstIndex) {
-		this.firstIndex = firstIndex;
-	}
-
-	/**
-	 * lastIndex attribute 값을  리턴한다.
-	 * @return int
-	 */
-	public int getLastIndex() {
-		return lastIndex;
-	}
-
-	/**
-	 * lastIndex attribute 값을 설정한다.
-	 * @param lastIndex int
-	 */
-	public void setLastIndex(int lastIndex) {
-		this.lastIndex = lastIndex;
-	}
-
-	/**
-	 * recordCountPerPage attribute 값을  리턴한다.
-	 * @return int
-	 */
-	public int getRecordCountPerPage() {
-		return recordCountPerPage;
-	}
-
-	/**
-	 * recordCountPerPage attribute 값을 설정한다.
-	 * @param recordCountPerPage int
-	 */
-	public void setRecordCountPerPage(int recordCountPerPage) {
-		this.recordCountPerPage = recordCountPerPage;
-	}
-    
-	/*성별조건 검색*/
-	public String getSearchSexdstn() {
-		return searchSexdstn;
-	}
-
-	public void setSearchSexdstn(String searchSexdstn) {
-		this.searchSexdstn = searchSexdstn;
-	}
-
-	/**
-     * toString 메소드를 대치한다.
-     */
-    public String toString() {
-    	return ToStringBuilder.reflectionToString(this);
-    }
-
-	public String getSiteId() {
-		return siteId;
-	}
-
-	public void setSiteId(String siteId) {
-		this.siteId = siteId;
-	}
-
-	public String getSearchConditionSite() {
-		return searchConditionSite;
-	}
-
-	public void setSearchConditionSite(String searchConditionSite) {
-		this.searchConditionSite = searchConditionSite;
-	}
-
-	public String getAdminYn() {
-		return adminYn;
-	}
-
-	public void setAdminYn(String adminYn) {
-		this.adminYn = adminYn;
-	}
-
-	public String getGnrlUser() {
-		return gnrlUser;
-	}
-
-	public void setGnrlUser(String gnrlUser) {
-		this.gnrlUser = gnrlUser;
-	}
-
-	
-	public String getEmplyrSttusCode() {
-		return emplyrSttusCode;
-	}
-
-	public void setEmplyrSttusCode(String emplyrSttusCode) {
-		this.emplyrSttusCode = emplyrSttusCode;
-	}
-
-	public String[] getEsntlIdNsttusCode() {
-		return esntlIdNsttusCode;
-	}
-
-	public void setEsntlIdNsttusCode(String[] esntlIdNsttusCode) {
-		this.esntlIdNsttusCode = esntlIdNsttusCode;
-	}
-
-	public String getEmplyrId() {
-		return emplyrId;
-	}
-
-	public void setEmplyrId(String emplyrId) {
-		this.emplyrId = emplyrId;
-	}
-
-	public String getSearchCondition_01() {
-		return searchCondition_01;
-	}
-
-	public void setSearchCondition_01(String searchCondition_01) {
-		this.searchCondition_01 = searchCondition_01;
-	}
-
-	public String getSearchSortCnd() {
-		return searchSortCnd;
-	}
-
-	public void setSearchSortCnd(String searchSortCnd) {
-		this.searchSortCnd = searchSortCnd;
-	}
-
-	public String getSearchSortOrd() {
-		return searchSortOrd;
-	}
-
-	public void setSearchSortOrd(String searchSortOrd) {
-		this.searchSortOrd = searchSortOrd;
-	}
-
-	public String getNiceFailUrl() {
-		return niceFailUrl;
-	}
-
-	public void setNiceFailUrl(String niceFailUrl) {
-		this.niceFailUrl = niceFailUrl;
-	}
-
-	public String getNiceSuccUrl() {
-		return niceSuccUrl;
-	}
-
-	public void setNiceSuccUrl(String niceSuccUrl) {
-		this.niceSuccUrl = niceSuccUrl;
-	}
-
-	public boolean isMobile() {
-		return isMobile;
-	}
-
-	public void setMobile(boolean isMobile) {
-		this.isMobile = isMobile;
-	}
-
-	public String getNiceMessage() {
-		return niceMessage;
-	}
-
-	public void setNiceMessage(String niceMessage) {
-		this.niceMessage = niceMessage;
-	}
-
-	public String getNiceNm() {
-		return niceNm;
-	}
-
-	public void setNiceNm(String niceNm) {
-		this.niceNm = niceNm;
-	}
-
-	public String getMblDn() {
-		return mblDn;
-	}
-
-	public void setMblDn(String mblDn) {
-		this.mblDn = mblDn;
-	}
-
-	public String getMberSttus() {
-		return mberSttus;
-	}
-
-	public void setMberSttus(String mberSttus) {
-		this.mberSttus = mberSttus;
-	}
-
-	public String getSearchStartDate() {
-		return searchStartDate;
-	}
-
-	public void setSearchStartDate(String searchStartDate) {
-		this.searchStartDate = searchStartDate;
-	}
-
-	public String getSearchEndDate() {
-		return searchEndDate;
-	}
-
-	public void setSearchEndDate(String searchEndDate) {
-		this.searchEndDate = searchEndDate;
-	}
-
-	public String getCandidateYn() {
-		return candidateYn;
-	}
-
-	public void setCandidateYn(String candidateYn) {
-		this.candidateYn = candidateYn;
-	}
-
-	public String getSearchBestCategory() {
-		return searchBestCategory;
-	}
-
-	public void setSearchBestCategory(String searchBestCategory) {
-		this.searchBestCategory = searchBestCategory;
-	}
-
-	public String getSearchDiv() {
-		return searchDiv;
-	}
-
-	public void setSearchDiv(String searchDiv) {
-		this.searchDiv = searchDiv;
-	}
-
-	public String getSearchTwoDptCategoryCode() {
-		return searchTwoDptCategoryCode;
-	}
-
-	public void setSearchTwoDptCategoryCode(String searchTwoDptCategoryCode) {
-		this.searchTwoDptCategoryCode = searchTwoDptCategoryCode;
-	}
-
-	public String getSearchThrDptCategoryCode() {
-		return searchThrDptCategoryCode;
-	}
-
-	public void setSearchThrDptCategoryCode(String searchThrDptCategoryCode) {
-		this.searchThrDptCategoryCode = searchThrDptCategoryCode;
-	}
-	
-   	public String getSearchStartDate2() {
-		return searchStartDate2;
-	}
-
-	public void setSearchStartDate2(String searchStartDate2) {
-		this.searchStartDate2 = searchStartDate2;
-	}
-
-	public String getSearchEndDate2() {
-		return searchEndDate2;
-	}
-
-	public void setSearchEndDate2(String searchEndDate2) {
-		this.searchEndDate2 = searchEndDate2;
-	}
-	
 	
 }
 
src/main/java/itn/let/utl/user/service/ExcelUtil.java (added)
+++ src/main/java/itn/let/utl/user/service/ExcelUtil.java
@@ -0,0 +1,143 @@
+package itn.let.utl.user.service;
+
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.apache.poi.hssf.usermodel.HSSFCellStyle;
+import org.apache.poi.hssf.usermodel.HSSFDataFormat;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.apache.poi.xssf.streaming.SXSSFSheet;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ExcelUtil {
+    private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
+
+    /**
+     * 엑셀 파일을 방출합니다.
+     *
+     * @param voList 엑셀에 넣고 싶은 vo 리스트 형태로 넣습니다.
+     * @param header 엑셀 해더
+     * @param order 헤더에 해당하는 내용의 vo 필드 이름을 작성합니다. 예를 들어 String userName; 필드의 1번째 해더이름을 "사용자 이름" 으로 정했으면
+     *        순서를 맞추어 1번째 order 배열에 "UserName" 이라는 글짜를 입력해줍니다(*주의:첫 문자는 대문자, 낙타체). 첫번째 컬럼에는 "줄번호"가
+     *        들어가는데, 이것에 대한 내용은 order에 값을 입력하지 않습니다.
+     * @param width 컬럼 너비를 설정합니다. length가 해더의 length와 일치할 필요는 없습니다.
+     * @param title
+     * @throws Exception
+     * @return SXSSFSheet
+     *
+     *         특징 : 해더보다 내용의 컬럼수가 많을 때 해당 줄의 컬럼은 cut, 해더 이름이 vo와 다르게 되면 해당 컬럼 출력 안됨 require : 날짜 포멧은
+     *         지원하지 않습니다.
+     *
+     *
+     *         ***********************************************************************************************
+     *         EX String title = "게시판 리스트";
+     *         int[] width = {1500, 1500, 1500, 3000, 30000, 3000 };
+     *         String[] header = {"번호", "게시판번호", "작성자", "제목", "내용", "작성일" }; 
+     *         String[] order = { "Seq", "UserId", "Title", "Content", "RegDt" }; 
+     *         => 첫번째 "번호"에 대한 order 이름이 비어있습니다.
+     *
+     *         ***********************************************************************************************
+     */
+    public static SXSSFWorkbook makeSimpleFruitExcelWorkbook(List<Object> voList, String[] header, String[] order, int[] width, String title) throws Exception {
+    	// 시트 생성
+    	SXSSFWorkbook workbook = new SXSSFWorkbook();
+    	SXSSFSheet sheet = workbook.createSheet(title);
+		for (int i = 0; i < width.length; i++) {
+			// JSP 2022.02.24 => width 변경
+			//sheet.setColumnWidth(0, width[width.length - (i + 1)]);
+			sheet.setColumnWidth(i, width[i]);
+		}
+
+		int r = 2;// 줄부터 찍기
+		
+		CellStyle headerstyle = workbook.createCellStyle();
+		headerstyle.setAlignment(HorizontalAlignment.CENTER);
+		headerstyle.setVerticalAlignment(VerticalAlignment.CENTER);
+		headerstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
+        // 헤더 행 생
+        Row headerRow = sheet.createRow(r);
+        // 해더 값 채움 (우측 방향으로)
+        Cell headerCell = null;
+        for (int i = 0; i < header.length; i++) {
+        	headerRow.setHeight((short)512);
+        	
+            headerCell = headerRow.createCell(i);
+            headerCell.setCellStyle(headerstyle);
+            headerCell.setCellValue(header[i]);
+        }
+
+        // 내용 행 및 셀 생성
+		Row bodyRow = null;
+		Cell bodyCell = null;
+
+        bodyRow = sheet.createRow(0);
+        bodyCell = bodyRow.createCell(0);
+        bodyCell.setCellValue(title);// 읽어온 데이터 표시
+
+        //System.out.println("voList.size()");
+        //System.out.println(voList.size());
+        //System.out.println(voList.size());
+        
+        int c = 0;// 컬럼
+        for (Object vo : voList) {
+            bodyRow = sheet.createRow(r + 1);
+            bodyCell = bodyRow.createCell(0);
+            //bodyCell.setCellValue(r + 1); // 첫 컬럼은 줄 번호
+
+            PropertyDescriptor pd; // 클래스의 필드 메소드를 찾아줌. 이름을 기존에 vo.setUserId() 란 메소드를 통해서만 호출이 가능 했다면, PropertyDescriptor는 이름만으로 메소드
+                                   // 호출이 가능함. 클래스가 변경 되어도 동일한 작동으로 getter&setter 호출이 가능하도록 도와줌
+            Method[] methods = vo.getClass().getDeclaredMethods(); // 메소드들 호출함
+            // 배열로 준 이름 과 같으면 해당 열 데이터 쓰기
+            for (int i = 0; i < order.length; i++) {
+                for (Method method : methods) { // vo 내부 메소드 반복
+
+//                	System.out.println("i :: "+ i + "methods : "+ methods);
+                	/*System.out.println("voList.method()");
+                    System.out.println(method.getName());*/
+                    
+                    if (method.getName().equals("get" + (order[i] == null ? "" : order[i]))) { // vo메소드 이름과 order의 이름 비교
+                        // getter 호출 준비
+                        String getMethodName = method.getName().substring(3); // getter의 이름 가져옴
+                        pd = new PropertyDescriptor(getMethodName, vo.getClass());
+                        // vo의 데이터 세팅
+                        String cellData = (pd.getReadMethod().invoke(vo) != null ? pd.getReadMethod().invoke(vo) : "").toString();
+                        bodyCell = bodyRow.createCell(c++); // 데이터 순서
+                        if(getMethodName.equals("InstrFee") || getMethodName.equals("SpecialWorkAllow") || getMethodName.equals("DistanceAllow")
+                        	|| getMethodName.equals("TrafficFee") || getMethodName.equals("AcmdtFee")
+                        	|| getMethodName.equals("Amt") || getMethodName.equals("Cash")
+                        	){
+                        	
+                        	// JSP 2022.02.22 => null 에러 try~catch 문 추가
+                        	try {
+                            	double num = Double.parseDouble(cellData);
+                            	CellStyle bodyStyle = workbook.createCellStyle();
+                            	bodyCell.setCellValue(num);// 읽어온 데이터 표시
+                            	bodyStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0"));
+                            	bodyCell.setCellStyle(bodyStyle);
+                        	}
+                        	catch (Exception ex) {
+                        		bodyCell.setCellValue(cellData);
+                        	}                        	
+                        }else {
+                        	bodyCell.setCellValue(cellData);// 읽어온 데이터 표시	
+                        }
+                        //System.out.println("@@  :  "+getMethodName  +"       ---           " + cellData);
+                    }
+                }
+            }
+            c = 0;
+            r++;
+        }
+        return workbook;
+    }
+
+}
src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml
@@ -933,7 +933,7 @@
 	
 	</select>
 	
-	<insert id="AddrDAO.insertAddrList" parameterClass="java.util.List">
+	<update id="AddrDAO.insertAddrList" parameterClass="java.util.List">
 		/* AddrDAO.insertAddrList */
 		INSERT INTO MJ_ADDR
 		(
@@ -967,7 +967,18 @@
           )
 		</iterate>
 	
-	</insert>
+	</update>
+	
+	<update id="AddrDAO.deleteAddrPhoneNo" parameterClass="addrVO">
+		
+	DELETE FROM MJ_ADDR
+		
+	WHERE MBER_ID = #mberId#
+		<iterate prepend="AND ADDR_PHONE_NO IN" open="(" close=")" conjunction="," property="addrPhones">
+			#addrPhones[]#
+		</iterate>
+	
+	</update>
 	
 	<!-- 주소록 그룹명 중복확인 -->
 	<select id="AddrDAO.selectDuplAddrCnt" parameterClass="addrVO" resultClass="int">
src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/mjo/kakao/KakaoSent_SQL_Mysql.xml
@@ -4,11 +4,13 @@
   =========     =======    =================================================
   2023.02.17    안주영 	
 -->
-<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
+<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
 <sqlMap namespace="KakaoSent">
 	<typeAlias  alias="kakaoSentVO" type="itn.let.kakao.user.sent.service.KakaoSentVO"/>
 	<typeAlias  alias="mjonKakaoATVO" type="itn.let.kakao.admin.kakaoAt.service.MjonKakaoATVO"/>
 	<typeAlias  alias="kakaoAtStatVO" type="itn.let.kakao.admin.kakaoAt.service.MjonKakaoAtStatVO"/>
+	<typeAlias  alias="kakaoSentDetailVO" type="itn.let.kakao.user.sent.service.KakaoSentDetailVO"/>
+	
 
 	<!-- 공통 쿼리 부분 문자 발송 관련 -->
 	<sql id="KakaoSentDAO.selectJoinQuery">
@@ -1350,4 +1352,559 @@
 		) M2
 	</select>
 	
+	<!-- 전체 발송결과 조회  (그룹별)-->
+	<select id="KakaoSentDAO.selectAllKakaoSentList_advc" parameterClass="kakaoSentVO" resultClass="kakaoSentVO">
+		/*	KakaoSentDAO.selectAllKakaoSentList_advc	*/
+		SELECT t1.totMsgCnt,
+		       t1.userId,
+		       t1.msgGroupId,
+		       t1.msgGroupCnt,
+		       t1.smsTxt,
+		       t1.subject,
+		       t1.subjectChkYn,
+		       t1.regDate,
+		       t1.reqDate,
+		       t1.delayOrgTime,
+		       t1.callFrom,
+		       t1.totPrice,
+		       t1.eachPrice,
+		       t1.msgType,
+		       t1.fileCnt,
+		       t1.agentCode,
+		       t1.canceldate,
+		       t1.delFlag,
+		       t1.sendKind,
+		       t1.msgKind,
+		       t1.delayYn,
+		       t1.delayCompleteYn,
+		       t1.reserveYn,
+		       t1.reserveCYn,
+		       t1.diffMin,
+		       t1.atDelayYn,
+		       t1.atDelayCompleteYn,
+		       t1.msgNoticetalkSenderKey,
+		       t1.bizKakaoResendYn,
+		       t1.atDelayOrgTime
+		FROM   (
+				SELECT   COUNT(B.USER_ID) OVER()                                                                                              AS totMsgCnt,
+						 B.USER_ID                                                                                                            AS userId ,
+				         B.MSG_GROUP_ID                                                                                                       AS msgGroupId ,
+				         B.MSG_GROUP_CNT                                                                                                      AS msgGroupCnt ,
+				         B.SMS_TXT                                                                                                            AS smsTxt ,
+				         B.SUBJECT                                                                                                            AS subject ,
+				         B.SUBJECT_CHK_YN                                                                                                     AS subjectChkYn ,
+				         B.REGDATE                                                                                                            AS regDate ,
+				         B.REQ_DATE                                                                                                           AS reqDate , 
+				         (	CASE
+			                	WHEN B.DELAY_YN              = 'Y'
+			                	AND      B.DELAY_COMPLETE_YN = 'N'
+			                	THEN DATE_ADD(B.REQ_DATE, INTERVAL -30 MINUTE)
+			                	ELSE B.REQ_DATE
+				         	END )                                                                                                             AS delayOrgTime ,
+				         B.CALL_FROM                                                                                                          AS callFrom ,
+				         B.TOT_PRICE                                                                                                          AS totPrice ,
+				         B.EACH_PRICE                                                                                                         AS eachPrice ,
+				         B.MSG_TYPE                                                                                                           AS msgType ,
+				         B.FILE_CNT                                                                                                           AS fileCnt ,
+				         B.AGENT_CODE                                                                                                         AS agentCode ,
+				         B.RESERVE_C_YN                                                                                                       AS reserveCYn ,
+				         B.CANCELDATE                                                                                                         AS canceldate ,
+				         B.DEL_FLAG                                                                                                           AS delFlag ,
+				         B.SEND_KIND                                                                                                          AS sendKind ,
+				         B.MSG_KIND                                                                                                           AS msgKind ,
+				         B.DELAY_YN                                                                                                           AS delayYn ,
+				         B.DELAY_COMPLETE_YN                                                                                                  AS delayCompleteYn ,
+				         B.RESERVE_YN                                                                                                         AS reserveYn ,
+				         TIMESTAMPDIFF(minute, CAST(DATE_FORMAT(B.REQ_DATE, '%Y-%m-%d %H:%i') AS CHAR), DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i')) AS diffMin,
+				         B.AT_DELAY_YN                                                                                                        AS atDelayYn,
+				         B.AT_DELAY_COMPLETE_YN                                                                                               AS atDelayCompleteYn,
+				         A.MSG_NOTICETALK_SENDER_KEY                                                                                          AS msgNoticetalkSenderKey,
+				         A.BIZ_KAKAO_RESEND_YN                                                                                                AS bizKakaoResendYn,
+				         IF(B.AT_DELAY_YN = 'Y' and B.AT_DELAY_COMPLETE_YN = 'N', DATE_ADD(B.REQ_DATE, INTERVAL -30 MINUTE), B.REQ_DATE) 	  AS atDelayOrgTime
+				FROM     MJ_MSG_DATA A
+				         JOIN MJ_MSG_GROUP_DATA B
+				         ON       A.MSG_GROUP_ID = B.MSG_GROUP_ID
+				WHERE    (
+				                  B.DEL_FLAG = 'N' OR B.DEL_FLAG IS NULL
+				         )
+				AND      A.DEL_FLAG                          = 'N'
+<!-- 				AND      B.REQ_DATE <![CDATA[ <= ]]> DATE_ADD(NOW(), INTERVAL 60 MINUTE) -->
+				AND      B.USER_ID                           = #userId#
+				<isNotEmpty property="startDate">
+					AND      DATE_FORMAT(B.REGDATE, '%Y-%m-%d') <![CDATA[ >= ]]> DATE_FORMAT(#startDate#, '%Y-%m-%d')
+				</isNotEmpty>
+				<isNotEmpty property="endDate">
+					AND      DATE_FORMAT(B.REGDATE, '%Y-%m-%d') <![CDATA[ <= ]]> DATE_FORMAT(#endDate#, '%Y-%m-%d')
+				</isNotEmpty>
+				<isNotEmpty property="tabType">
+					<isEqual property="tabType" compareValue="at">
+						AND A.MSG_TYPE = '8'
+					</isEqual>
+					<isEqual property="tabType" compareValue="ft">
+						AND A.MSG_TYPE = '9'
+					</isEqual>
+					<isEqual property="tabType" compareValue="all">
+						AND A.MSG_TYPE  IN ('8','9')
+					</isEqual>
+				</isNotEmpty>
+				<isEmpty property="tabType">
+						AND A.MSG_TYPE IN ('8','9')
+				</isEmpty>
+				<isNotEmpty property="stateType">
+					<isEqual property="stateType" compareValue="Y">
+						AND B.RESERVE_YN  = 'Y'
+					</isEqual>
+					<isEqual property="stateType" compareValue="N">
+						AND B.RESERVE_YN  = 'N'
+					</isEqual>
+				</isNotEmpty>
+				GROUP BY B.MSG_GROUP_ID
+				ORDER BY 1=1
+				<isNotEmpty property="searchSortCnd">
+					<isEqual property="searchSortCnd" compareValue="curState">
+						, A.CUR_STATE  $searchSortOrd$
+						, IF((RSLT_CODE != '7000'),'1','0')
+					</isEqual>
+					<isNotEqual  property="searchSortCnd" compareValue="curState">
+						,$searchSortCnd$
+					</isNotEqual>
+				</isNotEmpty>
+				<isNotEmpty property="searchSortOrd">
+					$searchSortOrd$
+				</isNotEmpty>
+				LIMIT    #recordCountPerPage#
+				OFFSET   #firstIndex#
+				) t1
+	</select>
+	
+	
+	<!-- 발송결과 상단 전광판 조회(전체, 알림톡, 친구톡) MIX 결과 수량 -->
+	<select id="KakaoSentDAO.selectKakaoSentCntAll_advc" parameterClass="kakaoSentVO" resultClass="kakaoSentVO">
+		/*	발송결과 상단 전광판 조회(전체, 알림톡, 친구톡) MIX 결과 수량	*/
+		SELECT
+			A0.MSG_GROUP_ID				AS msgGroupId
+			, COUNT(A0.RESULT)			AS msgResultCnt
+			, A0.RESULT					AS msgResultSts
+			, A0.RSLT_CODE				AS rsltCode
+			, A0.RSLT_CODE2				AS rsltCode2
+			, A0.AGENT_CODE				AS agentCode
+			, A0.EACH_PRICE				AS eachPrice
+			, sum(if(A0.tab1=0,0,1)) as filePath1		/*	알림톡	*/
+			, sum(if(A0.tab2=0,0,1)) as filePath2		/*	친구톡	*/
+		FROM(
+			SELECT
+				MD.MSG_ID
+				, MD.MSG_GROUP_ID
+				, MD.MSG_SEQ
+				, MD.CUR_STATE
+				, MD.SENT_DATE
+				, (CASE
+						WHEN 
+							MD.RSLT_CODE = '7000'
+						THEN 'S'
+						WHEN
+							( 
+							MD.RSLT_CODE  IS NULL
+							AND MD.SENT_DATE  IS NULL
+							AND MD.RSLT_DATE  IS NULL
+							)
+						THEN 'W'
+						ELSE 'F'
+					END) AS RESULT
+				, MD.RSLT_CODE
+				, MD.RSLT_CODE2
+				, MD.AGENT_CODE
+				, MG.EACH_PRICE
+				, if (MD.MSG_TYPE= '8','01','00') AS tab1
+				, if (MD.MSG_TYPE= '9','01','00') AS tab2
+			FROM
+				MJ_MSG_DATA MD
+			INNER JOIN
+				MJ_MSG_GROUP_DATA MG
+			ON
+				MD.MSG_GROUP_ID = MG.MSG_GROUP_ID
+			INNER JOIN	
+				BIZ_KAKAO_PRICE BZP
+			ON
+				MG.MSG_GROUP_ID = BZP.MSG_GROUP_ID
+			WHERE 1=1
+			AND IFNULL(MG.DEL_FLAG,'N')   = 'N'
+			AND	MD.USER_ID    = #userId#
+			<isNotEmpty property="ntceBgnde">
+				AND DATE_FORMAT(MG.REQ_DATE, '%Y/%m/%d') BETWEEN #ntceBgnde# AND #ntceEndde#
+			</isNotEmpty>
+			AND MD.MSG_TYPE IN ('8','9')
+			AND MG.RESERVE_C_YN = 'N'
+		) A0
+		GROUP BY
+			A0.MSG_GROUP_ID
+			, A0.RESULT
+			, A0.RSLT_CODE
+			, A0.RSLT_CODE2
+			, A0.AGENT_CODE
+		ORDER BY
+			A0.MSG_GROUP_ID DESC
+	</select>
+	
+	<select id="KakaoSentDAO.selectKakaoSentCntEachCnt_advc" parameterClass="kakaoSentVO" resultClass="kakaoSentVO">
+		SELECT a.MSG_GROUP_ID AS msgGroupId,
+		       a.successCount,
+		       a.waitCount,
+		       a.failCount,
+		       a.kakaoResendSuccCount,
+		       a.kakaoResendFailCount,
+		       a.successCount * bkp.BIZ_KAKAO_AT_PRICE                                        AS successPrice,
+		       (a.smsCnt      * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_MMS_PRICE)			  AS kakaoResendSuccPrice,
+		       a.divideYn
+		FROM   (SELECT  t1.MSG_GROUP_ID,
+		                ( SELECT COUNT(0)
+		                FROM    MJ_MSG_DATA C
+		                WHERE   C.RESERVE_C_YN = 'N'
+		                AND     C.MSG_GROUP_ID = t1.MSG_GROUP_ID
+		                AND     C.RSLT_CODE    = '7000'
+		                )
+		                AS successCount ,
+		                ( SELECT COUNT(0)
+		                FROM    MJ_MSG_DATA C
+		                WHERE   C.RESERVE_C_YN = 'N'
+		                AND     C.MSG_GROUP_ID = t1.MSG_GROUP_ID
+		                AND
+		                        (
+		                                C.RSLT_CODE IS NULL
+		                        AND     C.SENT_DATE IS NULL
+		                        AND     C.RSLT_DATE IS NULL
+		                        )
+		                )
+		                AS waitCount ,
+		                ( SELECT COUNT(0)
+		                FROM    MJ_MSG_DATA C
+		                WHERE   C.RESERVE_C_YN = 'N'
+		                AND     C.MSG_GROUP_ID = t1.MSG_GROUP_ID
+		                AND
+		                        (
+		                                C.RSLT_CODE          != '7000'
+		                        AND     C.RSLT_CODE IS NOT NULL
+		                        )
+		                )
+		                AS failCount ,
+		                ( SELECT COUNT(0)
+		                FROM    BIZ_LOG BL1,
+		                        MJ_MSG_DATA MMD1
+		                WHERE   t1.BIZ_KAKAO_RESEND_YN = 'Y'
+		                AND     t1.MSG_GROUP_ID        = MMD1.MSG_GROUP_ID
+		                AND     MMD1.BIZ_UMID          = BL1.CMID
+		                AND     (
+		                                CASE
+		                                        WHEN BL1.CALL_STATUS IN ('6600',
+		                                                                 '4100')
+		                                        THEN 'S'
+		                                        ELSE 'F'
+		                                END ) = 'S'
+		                )
+		                kakaoResendSuccCount,
+		                ( SELECT COUNT(0)
+		                FROM    BIZ_LOG BL1,
+		                        MJ_MSG_DATA MMD1
+		                WHERE   t1.BIZ_KAKAO_RESEND_YN = 'Y'
+		                AND     t1.MSG_GROUP_ID        = MMD1.MSG_GROUP_ID
+		                AND     MMD1.BIZ_UMID          = BL1.CMID
+		                AND     (
+		                                CASE
+		                                        WHEN BL1.CALL_STATUS IN ('6600',
+		                                                                 '4100')
+		                                        THEN 'S'
+		                                        ELSE 'F'
+		                                END ) = 'F'
+		                )
+		                kakaoResendFailCount,
+		                ( SELECT COUNT(0)
+		                FROM    BIZ_LOG BL1,
+		                        MJ_MSG_DATA MMD1
+		                WHERE   t1.BIZ_KAKAO_RESEND_YN = 'Y'
+		                AND     t1.MSG_GROUP_ID        = MMD1.MSG_GROUP_ID
+		                AND     MMD1.BIZ_UMID          = BL1.CMID
+		                AND     (
+		                                CASE
+		                                        WHEN BL1.CALL_STATUS IN ('6600',
+		                                                                 '4100')
+		                                        THEN 'S'
+		                                        ELSE 'F'
+		                                END )              = 'S'
+		                AND     MMD1.BIZ_KAKAO_RESEND_TYPE = 'SMS'
+		                )
+		                smsCnt,
+		                ( SELECT COUNT(0)
+		                FROM    BIZ_LOG BL1,
+		                        MJ_MSG_DATA MMD1
+		                WHERE   t1.BIZ_KAKAO_RESEND_YN = 'Y'
+		                AND     t1.MSG_GROUP_ID        = MMD1.MSG_GROUP_ID
+		                AND     MMD1.BIZ_UMID          = BL1.CMID
+		                AND     (
+		                                CASE
+		                                        WHEN BL1.CALL_STATUS IN ('6600',
+		                                                                 '4100')
+		                                        THEN 'S'
+		                                        ELSE 'F'
+		                                END )              = 'S'
+		                AND     MMD1.BIZ_KAKAO_RESEND_TYPE = 'MMS'
+		                )
+		                mmsCnt,
+		                CASE
+							WHEN COUNT(DISTINCT t1.REQ_DATE) > 1 THEN 'Y'
+							ELSE 'N'
+						END AS divideYN
+		FROM     mj_msg_data t1
+        WHERE    t1.DEL_FLAG = 'N'
+        AND      t1.MSG_TYPE IN ('8',
+                                '9')
+        AND      t1.CUR_STATE IN ('0',
+                                  '1',
+                                  '2',
+                                  '3')
+        AND      t1.MSG_GROUP_ID = #msgGroupId#
+        GROUP BY t1.MSG_GROUP_ID
+        )
+        a
+        LEFT OUTER JOIN BIZ_KAKAO_PRICE bkp
+        ON     bkp.MSG_GROUP_ID = a.MSG_GROUP_ID
+	</select>
+	
+	<!-- 알림톡 발송결과 상세 데이터-->
+	<select id="KakaoSentDAO.selectKakaoSentDetailView" parameterClass="kakaoSentDetailVO" resultClass="kakaoSentDetailVO">
+		/* KakaoSentDAO.selectKakaoSentDetailView */
+		select
+			a.msgGroupId
+			, a.msgGroupCnt 
+			, a.reserveYn
+			, a.reserveCYn
+			, a.canceldate
+			, a.callFrom 
+			, a.userId
+			, a.smsTxt
+			, a.subject
+			, a.reqDate 
+			, a.regDate
+			, a.msgType
+			, a.msgKind
+			, a.eachPrice
+			, a.sentDate
+			, a.diffMin
+			, a.subjectChkYn
+			, a.msgGroupId
+	    	, a.successCount
+		    , a.waitCount
+		    , a.failCount
+		    , a.kakaoResendSuccCount
+		    , a.kakaoResendFailCount
+		    , a.successCount * bkp.BIZ_KAKAO_AT_PRICE                                        AS successPrice
+		    , (a.smsCnt      * bkp.BIZ_SMS_PRICE) + (a.mmsCnt * bkp.BIZ_MMS_PRICE)			 AS kakaoResendSuccPrice
+		    , a.divideYn
+		    , a.bizKakaoResendYn
+		    , MKPI.YELLOW_ID AS yellowId
+		    , a.MSG_NOTICETALK_TMP_KEY as msgNoticetalkTmpKey
+		FROM   (SELECT  MD.MSG_GROUP_ID,
+		               ( SELECT COUNT(0)
+		               FROM    MJ_MSG_DATA C
+		               WHERE   C.RESERVE_C_YN = 'N'
+		               AND     C.MSG_GROUP_ID = MD.MSG_GROUP_ID
+		               AND     C.RSLT_CODE    = '7000'
+		               )
+		               AS successCount ,
+		               ( SELECT COUNT(0)
+		               FROM    MJ_MSG_DATA C
+		               WHERE   C.RESERVE_C_YN = 'N'
+		               AND     C.MSG_GROUP_ID = MD.MSG_GROUP_ID
+		               AND
+		                       (
+		                               C.RSLT_CODE IS NULL
+		                       AND     C.SENT_DATE IS NULL
+		                       AND     C.RSLT_DATE IS NULL
+		                       )
+		               )
+		               AS waitCount ,
+		               ( SELECT COUNT(0)
+		               FROM    MJ_MSG_DATA C
+		               WHERE   C.RESERVE_C_YN = 'N'
+		               AND     C.MSG_GROUP_ID = MD.MSG_GROUP_ID
+		               AND
+		                       (
+		                               C.RSLT_CODE          != '7000'
+		                       AND     C.RSLT_CODE IS NOT NULL
+		                       )
+		               )
+		               AS failCount ,
+		               ( SELECT COUNT(0)
+		               FROM    BIZ_LOG BL1,
+		                       MJ_MSG_DATA MMD1
+		               WHERE   MD.BIZ_KAKAO_RESEND_YN = 'Y'
+		               AND     MD.MSG_GROUP_ID        = MMD1.MSG_GROUP_ID
+		               AND     MMD1.BIZ_UMID          = BL1.CMID
+		               AND     (
+		                               CASE
+		                                       WHEN BL1.CALL_STATUS IN ('6600',
+		                                                                '4100')
+		                                       THEN 'S'
+		                                       ELSE 'F'
+		                               END ) = 'S'
+		               )
+		               kakaoResendSuccCount,
+		               ( SELECT COUNT(0)
+		               FROM    BIZ_LOG BL1,
+		                       MJ_MSG_DATA MMD1
+		               WHERE   MD.BIZ_KAKAO_RESEND_YN = 'Y'
+		               AND     MD.MSG_GROUP_ID        = MMD1.MSG_GROUP_ID
+		               AND     MMD1.BIZ_UMID          = BL1.CMID
+		               AND     (
+		                               CASE
+		                                       WHEN BL1.CALL_STATUS IN ('6600',
+		                                                                '4100')
+		                                       THEN 'S'
+		                                       ELSE 'F'
+		                               END ) = 'F'
+		               )
+		               kakaoResendFailCount,
+		               ( SELECT COUNT(0)
+		               FROM    BIZ_LOG BL1,
+		                       MJ_MSG_DATA MMD1
+		               WHERE   MD.BIZ_KAKAO_RESEND_YN = 'Y'
+		               AND     MD.MSG_GROUP_ID        = MMD1.MSG_GROUP_ID
+		               AND     MMD1.BIZ_UMID          = BL1.CMID
+		               AND     (
+		                               CASE
+		                                       WHEN BL1.CALL_STATUS IN ('6600',
+		                                                                '4100')
+		                                       THEN 'S'
+		                                       ELSE 'F'
+		                               END )              = 'S'
+		               AND     MMD1.BIZ_KAKAO_RESEND_TYPE = 'SMS'
+		               )
+		               smsCnt,
+		               ( SELECT COUNT(0)
+		               FROM    BIZ_LOG BL1,
+		                       MJ_MSG_DATA MMD1
+		               WHERE   MD.BIZ_KAKAO_RESEND_YN = 'Y'
+		               AND     MD.MSG_GROUP_ID        = MMD1.MSG_GROUP_ID
+		               AND     MMD1.BIZ_UMID          = BL1.CMID
+		               AND     (
+		                               CASE
+		                                       WHEN BL1.CALL_STATUS IN ('6600',
+		                                                                '4100')
+		                                       THEN 'S'
+		                                       ELSE 'F'
+		                               END )              = 'S'
+		               AND     MMD1.BIZ_KAKAO_RESEND_TYPE = 'MMS'
+		               )
+		               mmsCnt,
+		               CASE
+						WHEN COUNT(DISTINCT MD.REQ_DATE) > 1 THEN 'Y'
+						ELSE 'N'
+					END AS divideYN,
+					MGD.MSG_GROUP_ID as msgGroupId
+					, MGD.MSG_GROUP_CNT as msgGroupCnt 
+					, MGD.RESERVE_YN as reserveYn
+					, MGD.RESERVE_C_YN as reserveCYn
+					, DATE_FORMAT(MGD.CANCELDATE, '%Y-%m-%d %T') as canceldate
+					, MGD.CALL_FROM  as callFrom 
+					, MGD.USER_ID as userId
+					, MGD.SMS_TXT as smsTxt
+					, MGD.SUBJECT as subject
+					, DATE_FORMAT(MGD.REQ_DATE, '%Y-%m-%d %T') as reqDate 
+					, DATE_FORMAT(MGD.REGDATE, '%Y-%m-%d %T') as regDate
+					, MGD.MSG_TYPE as msgType
+					, MGD.MSG_KIND as msgKind
+					, MGD.EACH_PRICE  as eachPrice
+					, DATE_FORMAT(MD.SENT_DATE, '%Y-%m-%d %T') as sentDate
+					, MD.FILE_CNT  as fileCnt
+					, MD.FILE_PATH1 as filePath1
+					, MD.FILE_PATH2 as filePath2
+					, MD.FILE_PATH3 as filePath3 
+					, TIMESTAMPDIFF(minute, DATE_FORMAT(MGD.REQ_DATE, '%Y-%m-%d %T'), DATE_FORMAT(NOW(), '%Y-%m-%d %T')) as diffMin
+					, SUBJECT_CHK_YN as subjectChkYn
+					, MD.BIZ_KAKAO_RESEND_YN as bizKakaoResendYn
+					, MD.MSG_NOTICETALK_SENDER_KEY
+					, MD.MSG_NOTICETALK_TMP_KEY
+				FROM     MJ_MSG_DATA MD
+		        inner join MJ_MSG_GROUP_DATA MGD on
+					MGD.MSG_GROUP_ID = MD.MSG_GROUP_ID
+					and MGD.USER_ID = MD.USER_ID
+		        AND      MGD.MSG_GROUP_ID = #msgGroupId#
+		        GROUP BY MGD.MSG_GROUP_ID
+        )
+        a
+        LEFT OUTER JOIN BIZ_KAKAO_PRICE bkp
+        ON     bkp.MSG_GROUP_ID = a.MSG_GROUP_ID
+        LEFT OUTER JOIN
+              (SELECT  a.SENDER_KEY,
+                       a.YELLOW_ID
+              FROM     mj_kakao_profile_info a
+              GROUP BY a.SENDER_KEY
+              )
+              MKPI
+       	ON     MKPI.SENDER_KEY = a.MSG_NOTICETALK_SENDER_KEY
+			
+	</select>
+	
+	<!-- REQ_DATE 조회-->
+	<select id="KakaoSentDAO.findByReqDateWhereMsgGroupId" parameterClass="String" resultClass="String">
+		/* MjonMsgSentDAO.findByReqDateWhereMsgGroupId*/
+		
+		SELECT REQ_DATE  FROM MJ_MSG_DATA WHERE MSG_GROUP_ID =#msgGroupId#
+			
+	</select>
+	
+	<!-- 발신 내용 상세보기 조회 (상세보기 버튼 클릭시)-->
+	<select id="KakaoSentDAO.selectKakaoSentDetailViewPhoneAjax" parameterClass="mjonKakaoATVO" resultClass="mjonKakaoATVO">
+
+		SELECT
+		    MGD.MSG_GROUP_ID				as msgGroupId
+			, MGD.USER_ID					as userId
+			, MD.MSG_TYPE					as msgType
+			, MD.REQ_DATE					as reqDate /* 발송 시간 */
+			, MD.MSG_NOTICETALK_SENDER_KEY	as msgNoticetalkSenderKey 	/* api key */
+			, MD.MSG_NOTICETALK_TMP_KEY		as msgNoticetalkTmpKey 		/* 특정 템플릿 key */
+			, MGD.SMS_TXT					as smsTxt 					/* 알림톡 본문 내용 치환(X) */
+			, MD.SMS_TXT					as smsTxtTrans 				/* 알림톡 본문 내용 치환(O)*/
+			, MD.BIZ_KAKAO_TITLE			as bizKakaoTitle 			/* 강조형 타이틀 */
+			, MD.BIZ_KAKAO_RESEND_YN		as bizKakaoResendYn 		/* 대체 문자 사용 여부*/
+			, MD.BIZ_KAKAO_RESEND_TYPE		as bizKakaoResendType		/* MMS / LMS / SMS */
+			, MD.BIZ_KAKAO_RESEND_DATA		as bizKakaoResendData 		/* 대체 문자 (치환O) */
+			, MGD.BIZ_KAKAO_RESEND_ORGNL_TXT   as bizKakaoResendOrgnlTxt /* 대체 문자( 치환X ) */
+			, MD.BIZ_KAKAO_JSON_FILE		as bizKakaoJsonFile			/* Json 파일 경로 */
+			, MKPI.YELLOW_ID as yellowId
+			, COUNT_TYPE.cnt AS bizKakaoResendTypeCnt
+			, ifnull(MGD.BIZ_KAKAO_RESEND_TYPE, MD.BIZ_KAKAO_RESEND_TYPE) AS bizKakaoResendType
+			, MD.BIZ_KAKAO_RESEND_YN                                      AS bizKakaoResendYn
+		FROM MJ_MSG_GROUP_DATA MGD
+				INNER JOIN MJ_MSG_DATA MD 
+					ON MGD.MSG_GROUP_ID = MD.MSG_GROUP_ID
+				AND MGD.USER_ID = MD.USER_ID
+				LEFT OUTER JOIN (SELECT  a.SENDER_KEY,
+					                       a.YELLOW_ID
+					              FROM     mj_kakao_profile_info a
+					              GROUP BY a.SENDER_KEY
+					              )
+					              MKPI
+       			ON     MKPI.SENDER_KEY = MD.MSG_NOTICETALK_SENDER_KEY
+       			LEFT OUTER JOIN
+		                  ( SELECT  MSG_GROUP_ID,
+		                           COUNT(*) AS cnt
+		                  FROM     ( SELECT  MSG_GROUP_ID,
+		                                    BIZ_KAKAO_RESEND_TYPE
+		                           FROM     MJ_MSG_DATA
+		                           WHERE    MSG_GROUP_ID = 'MSGGID_0000000332753' 
+		                           GROUP BY MSG_GROUP_ID,
+		                                    BIZ_KAKAO_RESEND_TYPE
+		                           )
+		                           t
+		                  GROUP BY MSG_GROUP_ID
+		                  )
+		                  COUNT_TYPE
+		         ON       COUNT_TYPE.MSG_GROUP_ID = MGD.MSG_GROUP_ID
+		WHERE
+			MGD.USER_ID				= #userId#
+		AND 
+			MGD.MSG_GROUP_ID	= #msgGroupId#
+		GROUP BY MGD.MSG_GROUP_ID
+	</select>
+	
 </sqlMap>
(No newline at end of file)
src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/mjo/kakao/Kakao_AT_SQL_Mysql.xml
@@ -4,9 +4,10 @@
   =========     =======    =================================================
   2023.02.02       우영두	
 -->
-<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
+<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
 <sqlMap namespace="kakaoAlimTalk">
 	<typeAlias  alias="kakaoVO" type="itn.let.kakao.kakaoComm.KakaoVO"/>
+	<typeAlias  alias="kakaoSendAdvcVO" type="itn.let.kakao.kakaoComm.KakaoSendAdvcVO"/>
 	
 	<insert id="kakaoAlimTalkDAO.insertKakaoAtDataInfo" parameterClass="java.util.List">
 		INSERT INTO MJ_MSG_DATA
@@ -54,6 +55,119 @@
 		</iterate>
 	</insert>
 	
+	<insert id="kakaoAlimTalkDAO.insertKakaoAtDataInfo_advc" parameterClass="java.util.List">
+		INSERT INTO MJ_MSG_DATA
+		(
+			MSG_ID
+			, MSG_GROUP_ID
+			, USER_ID
+			, AGENT_CODE
+			, CUR_STATE
+			
+			, MSG_NOTICETALK_SENDER_KEY
+			, MSG_NOTICETALK_TMP_KEY
+			, CALL_TO
+			, CALL_FROM
+			, MSG_TYPE
+			
+			, SMS_TXT
+			, BIZ_KAKAO_TITLE
+			
+			, BIZ_KAKAO_RESEND_YN
+			, BIZ_KAKAO_RESEND_DATA
+			, BIZ_KAKAO_RESEND_TYPE
+			, BIZ_KAKAO_JSON_FILE
+			, REQ_DATE
+		)VALUES
+		<iterate conjunction=",">
+		(
+			#[].msgId#
+			, #[].msgGroupId#
+			, #[].userId#
+			, #[].agentCode#
+			, 0
+			
+			, #[].senderKey#
+			, #[].templateCode#
+			, #[].callTo#
+			, #[].callFrom#
+			, #[].msgType#
+			
+			, #[].templateContent#
+			, #[].templateTitle#
+			
+			, #[].subMsgSendYn#
+			, #[].subMsgTxt#
+			, #[].subMsgType#
+			, #[].bizJsonName#
+			, #[].reqDate#
+		)
+		</iterate>
+	</insert>
+	<insert id="kakaoAlimTalkDAO.insertKakaoAtDataJsonInfo_advc" parameterClass="java.util.List">
+		INSERT INTO BIZ_ATTACHMENTS
+		(
+			MSG_KEY
+			, TYPE
+			, CONTENTS
+		)VALUES
+		<iterate conjunction=",">
+		(
+			#[].msgId#
+			, 'JSON'
+			, #[].jsonStr#
+		)
+		</iterate>
+	</insert>
+	
+	<insert id="kakaoAlimTalkDAO.insertKakaoGroupDataTb_advc" parameterClass="kakaoSendAdvcVO">
+		INSERT INTO MJ_MSG_GROUP_DATA
+		(
+            MSG_GROUP_ID,
+            USER_ID,
+            CALL_FROM,
+            SMS_TXT,
+            
+            REQ_DATE,
+            MSG_GROUP_CNT,
+            MSG_TYPE,
+            
+            AGENT_CODE,
+            EACH_PRICE,
+            RESERVE_YN,
+            BEF_CASH,
+            BEF_POINT,
+            
+            TOT_PRICE,
+            
+            AT_DELAY_YN,
+            BIZ_KAKAO_RESEND_ORGNL_TXT,
+            BIZ_KAKAO_RESEND_TYPE
+		)VALUES
+		(
+           #msgGroupId#,
+           #userId#,
+           #callFrom#,
+           #templateContent#,
+
+           #reqDate#,
+           #msgGroupCnt#,
+           #msgType#,
+
+           #agentCode#,
+           #eachPrice#,
+           #reserveYn#,
+           #befCash#,
+           #befPoint#,
+
+           #totPrice#,
+           
+           #atDelayYn#,
+           #bizKakaoResendOrgnlTxt#,
+           #bizKakaoResendType#
+		)
+	</insert>
+	
 	<insert id="kakaoAlimTalkDAO.insertKakaoSendPrice" parameterClass="kakaoVO">
 		INSERT INTO BIZ_KAKAO_PRICE
 		(
src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml
--- src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml
@@ -2319,7 +2319,8 @@
            EVENT_YN,
            DELAY_YN,
            AT_DELAY_YN,
-            BIZ_KAKAO_RESEND_ORGNL_TXT
+            BIZ_KAKAO_RESEND_ORGNL_TXT,
+            SUBJECT_CHK_YN
        )
        VALUES
        
@@ -2345,7 +2346,8 @@
            #eventYn#,
            #delayYn#,
            #atDelayYn#,
-           #kakaoSubMagOrgnlTxt#
+           #kakaoSubMagOrgnlTxt#,
+           #subjectChkYn#
        )
 	</insert>
 	
@@ -3307,10 +3309,16 @@
 				, (
 					<include refid="MjonMsgSentDAO.selectAgentWithKakaoResultQuery_A"/>
 				) AS RESULT
-			<include refid="MjonMsgSentDAO.selectJoinQuery"/>
+			from
+				MJ_MSG_DATA A ,
+				MJ_MSG_GROUP_DATA B
+			where
+				A.MSG_GROUP_ID = B.MSG_GROUP_ID
+				/*and IFNULL(B.DEL_FLAG, 'N') = 'N'*/
+				/*and A.DEL_FLAG = 'N'*/
 				AND A.USER_ID	= #userId#
 				AND B.USER_ID	= #userId#
-				AND B.RESERVE_C_YN = 'N'
+				/*AND B.RESERVE_C_YN = 'N'*/
 			ORDER BY 1=1
 				, msgGroupId DESC
 				, sentDate DESC
@@ -4020,6 +4028,8 @@
 	</select>
 	
 	<select id="MjonMsgDataDAO.selectReSendMsgDataList" parameterClass="mjonMsgDataVO" resultClass="mjonMsgVO">
+		
+		/* MjonMsgDataDAO.selectReSendMsgDataList */
 		
 		SELECT MSG_ID       AS msgId,
 		       USER_ID      AS userId,
@@ -7895,6 +7905,7 @@
 		SELECT 
 			CALL_FROM AS callFrom
 			, SUBJECT AS subject
+			, SUBJECT_CHK_YN AS subjectChkYn
 			, SMS_TXT AS smsTxt
  			,(
 				SELECT
@@ -7936,6 +7947,7 @@
 	</select>
 
 	<select id="MjonMsgDataDAO.selectMjMsgListByResend" parameterClass="mjonMsgDataVO" resultClass="mjonMsgDataVO">
+		/* MjonMsgDataDAO.selectMjMsgListByResend */
 		SELECT 
 			CALL_TO AS callTo 
 		FROM MJ_MSG_DATA 
src/main/resources/egovframework/sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml
--- src/main/resources/egovframework/sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/msg/MjonMsgSent_SQL_mysql.xml
@@ -3,8 +3,10 @@
   =========     =======    =================================================
   2021.06.21    우영두 	
 -->
-<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
+<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
 <sqlMap namespace="Msg">
+	<typeAlias  alias="mjonMsgSWFDTO" type="itn.let.mjo.msgsent.service.MjonMsgSWFDTO"/>
+	<typeAlias  alias="mjonMsgDetailSentVO" type="itn.let.mjo.msgsent.service.MjonMsgDetailSentVO"/>
 	<typeAlias  alias="mjonMsgSentVO" type="itn.let.mjo.msgsent.service.MjonMsgSentVO"/>
 	<typeAlias  alias="mjonMsgVO" type="itn.let.mjo.msg.service.MjonMsgVO"/>
 	<typeAlias  alias="addrGroupVO" type="itn.let.mjo.addr.service.AddrGroupVO"/>
@@ -46,8 +48,8 @@
                 	,'01','00') AS tab2
                 , if (A.MSG_TYPE= '6' AND B.MSG_TYPE= '6' AND B.FILE_CNT > '0'
                 	,'01','00') AS tab3				
-				
 			<include refid="MjonMsgSentDAO.selectJoinQuery"/>
+			
 				AND	A.USER_ID    = #userId#
 				AND	B.USER_ID    = #userId#
 			<isNotEmpty property="ntceBgnde">
@@ -60,10 +62,6 @@
 			<isEmpty property="msgType">
 				AND A.MSG_TYPE IN ('4','6')
 			</isEmpty>
-				AND B.RESERVE_C_YN = 'N'
-				<![CDATA[ 
-					AND B.REQ_DATE <= DATE_ADD(NOW(), INTERVAL 60 MINUTE)
-				]]>
 			<isNotEmpty property="fileCnt">
 				<isEqual property="fileCnt" compareValue="0">
 					AND     B.FILE_CNT   = '0'
@@ -71,6 +69,16 @@
 				<isNotEqual property="fileCnt" compareValue="0">
 					<![CDATA[ AND B.FILE_CNT > '0' ]]>
 				</isNotEqual>
+			</isNotEmpty>
+			<isNotEmpty property="searchStartDate">
+				<![CDATA[
+					AND DATE_FORMAT(B.REGDATE, '%Y-%m-%d') >= DATE_FORMAT(#searchStartDate#, '%Y-%m-%d')
+				]]>
+			</isNotEmpty>
+			<isNotEmpty property="searchEndDate">
+				<![CDATA[
+					AND 	DATE_FORMAT(B.REGDATE, '%Y-%m-%d')  <=  DATE_FORMAT(#searchEndDate#, '%Y-%m-%d')
+				]]>
 			</isNotEmpty>
 		) A0
 		GROUP BY
@@ -222,6 +230,293 @@
 		
 	</select>
 	
+	<!-- 전체 발송결과 조회  (전송사별) 카운트-->
+	<select id="MjonMsgSentDAO.countAllMsgSentList" parameterClass="mjonMsgSentVO" resultClass="int">
+
+			select 
+				COUNT(DISTINCT B.MSG_GROUP_ID) as totalGroupCount
+			from
+				MJ_MSG_DATA A
+			join MJ_MSG_GROUP_DATA B on
+				A.MSG_GROUP_ID = B.MSG_GROUP_ID
+			WHERE (B.DEL_FLAG = 'N' OR B.DEL_FLAG IS NULL)
+				AND A.DEL_FLAG = 'N'
+				AND B.USER_ID = #userId#
+				<isNotEmpty property="searchKeyword">
+					<isEqual property="searchCondition" compareValue="1" >
+						AND B.SUBJECT LIKE CONCAT('%', #searchKeyword#, '%')
+					</isEqual>
+					<isEqual property="searchCondition" compareValue="2" >
+						AND B.CALL_FROM LIKE CONCAT('%', #searchKeyword#, '%')
+					</isEqual>
+					<isEqual property="searchCondition" compareValue="3" >
+						AND B.SMS_TXT LIKE CONCAT('%', #searchKeyword#, '%')
+					</isEqual>
+				</isNotEmpty>
+				<isNotEmpty property="searchCondition01">
+					AND B.RESERVE_YN = #searchCondition01#
+				</isNotEmpty>
+				<isNotEmpty property="searchCondition02">
+					<isEqual property="searchCondition02" compareValue="S">
+						AND B.MSG_TYPE = '4'
+					</isEqual>
+					<isEqual property="searchCondition02" compareValue="L">
+						AND B.MSG_TYPE = '6'
+						AND B.FILE_CNT = '0'
+					</isEqual>
+					<isEqual property="searchCondition02" compareValue="M">
+					<![CDATA[  
+						AND B.MSG_TYPE = '6'
+						AND B.FILE_CNT > '0'
+					]]>
+					</isEqual>
+				</isNotEmpty>
+				<isNotEmpty property="searchStartDate">
+					<![CDATA[
+						AND DATE_FORMAT(REGDATE, '%Y-%m-%d') >= DATE_FORMAT(#searchStartDate#, '%Y-%m-%d')
+					]]>
+				</isNotEmpty>
+				<isNotEmpty property="searchEndDate">
+					<![CDATA[
+						AND 	DATE_FORMAT(REGDATE, '%Y-%m-%d')  <=  DATE_FORMAT(#searchEndDate#, '%Y-%m-%d')
+					]]>
+				</isNotEmpty>
+	</select>	
+	
+	
+	<!-- 전체 발송결과 조회  (전송사별) 카운트-->
+	<select id="MjonMsgSentDAO.findBySWF" parameterClass="String" resultClass="mjonMsgSWFDTO">
+	/* MjonMsgSentDAO.findBySWF */
+	select 
+		SUM(IF(aa.result = 'S', 1, 0)) AS resultSValue,
+		SUM(IF(aa.result = 'W', 1, 0)) AS resultWValue,
+		SUM(IF(aa.result = 'F', 1, 0)) AS resultFValue,
+		CASE
+			WHEN COUNT(DISTINCT REQ_DATE) > 1 THEN 'Y'
+			ELSE 'N'
+		END AS divideYN
+	from
+		(
+		select 
+			case
+				when A.AGENT_CODE = '01'
+				and ( A.RSLT_CODE = '100'
+				and (A.RSLT_CODE2 = '0')) then 'S'
+				when A.AGENT_CODE = '02'
+				and (A.RSLT_CODE = '0') then 'S'
+				when A.AGENT_CODE = '03'
+				and (A.RSLT_CODE = '100'
+				or A.RSLT_CODE = '101'
+				or A.RSLT_CODE = '110'
+				or A.RSLT_CODE = '800') then 'S'
+				when 
+					A.AGENT_CODE = '04'
+					and (A.RSLT_CODE = '4100'
+					or A.RSLT_CODE = '6600'
+					or A.RSLT_CODE = '7000') then 'S'
+				when 
+					A.AGENT_CODE = '05'
+					and (A.RSLT_CODE = '1000'
+					or A.RSLT_CODE = '1001') then 'S'
+				when 
+					A.AGENT_CODE = '07'
+					and (A.RSLT_CODE = '6'
+					or A.RSLT_CODE = '1000') then 'S'
+				when 
+					A.AGENT_CODE = '08'
+					and (A.RSLT_CODE = '1000'
+					or A.RSLT_CODE = '1001') then 'S'
+				when 
+					A.AGENT_CODE = '09'
+					and (A.RSLT_CODE = '1000'
+					or A.RSLT_CODE = '1001') then 'S'
+				when ( 
+					A.RSLT_CODE is null
+					and A.RSLT_CODE2 is null
+					and A.SENT_DATE is null
+					and A.RSLT_DATE is null ) then 'W'
+				else 'F'
+			end as result /* common query */
+			, A.REQ_DATE 
+		from
+			MJ_MSG_DATA A
+		where
+			A.MSG_GROUP_ID = #msgGroupId# 
+	) aa
+	</select>
+	
+	
+	
+	<!-- 발송결과 상세 데이터-->
+	<select id="MjonMsgSentDAO.selectAllMsgSentDetailView" parameterClass="mjonMsgDetailSentVO" resultClass="mjonMsgDetailSentVO">
+		/* MjonMsgSentDAO.selectAllMsgSentDetailView */
+		select
+			MGD.MSG_GROUP_ID as msgGroupId
+			, MGD.MSG_GROUP_CNT as msgGroupCnt 
+			, MGD.RESERVE_YN as reserveYn
+			, MGD.RESERVE_C_YN as reserveCYn
+			, DATE_FORMAT(MGD.CANCELDATE, '%Y-%m-%d %H:%i') as canceldate
+			, MGD.CALL_FROM  as callFrom 
+			, MGD.USER_ID as userId
+			, MGD.SMS_TXT as smsTxt
+			, MGD.SUBJECT as subject
+			, DATE_FORMAT(MGD.REQ_DATE, '%Y-%m-%d %H:%i') as reqDate 
+			, DATE_FORMAT(MGD.REGDATE, '%Y-%m-%d %H:%i') as regDate
+			, MGD.MSG_TYPE as msgType
+			, MGD.MSG_KIND as msgKind
+			, MGD.EACH_PRICE  as eachPrice
+			, DATE_FORMAT(MD.SENT_DATE, '%Y-%m-%d %H:%i') as sentDate
+			, MD.FILE_CNT  as fileCnt
+			, MD.FILE_PATH1 as filePath1
+			, MD.FILE_PATH2 as filePath2
+			, MD.FILE_PATH3 as filePath3 
+			, TIMESTAMPDIFF(minute, DATE_FORMAT(MGD.REQ_DATE, '%Y-%m-%d %T'), DATE_FORMAT(NOW(), '%Y-%m-%d %T')) as diffMin
+			, SUBJECT_CHK_YN as subjectChkYn
+		from
+			MJ_MSG_GROUP_DATA MGD
+		inner join MJ_MSG_DATA MD on
+			MGD.MSG_GROUP_ID = MD.MSG_GROUP_ID
+			and MGD.USER_ID = MD.USER_ID
+		where 
+			MGD.MSG_GROUP_ID = #msgGroupId#
+		limit 1
+			
+	</select>
+	
+	
+	<!-- 전체 발송결과 조회  (전송사별)-->
+	<select id="MjonMsgSentDAO.findByMsgDetailListAjax" parameterClass="mjonMsgDetailSentVO" resultClass="mjonMsgDetailSentVO">
+		/* MjonMsgSentDAO.findByMsgDetailListAjax*/
+		
+		SELECT
+			A.USER_ID as userId,
+			A.CALL_TO as callTo,
+			case
+				WHEN A.AGENT_CODE = '01' AND (A.RSLT_CODE = '100' and (A.RSLT_CODE2 = '0')) then '성공'
+				WHEN A.AGENT_CODE = '02' AND (A.RSLT_CODE = '0') then '성공'
+				WHEN A.AGENT_CODE = '03' AND (A.RSLT_CODE in ('100', '101', '110', '800')) then '성공'
+				WHEN A.AGENT_CODE = '04' AND (A.RSLT_CODE in ('4100', '6600', '7000')) then '성공'
+				WHEN A.AGENT_CODE = '05' AND (A.RSLT_CODE in ('1000', '1001')) then '성공'
+				WHEN A.AGENT_CODE = '07' AND (A.RSLT_CODE in ('6', '1000')) then '성공'
+				WHEN A.AGENT_CODE = '08' AND (A.RSLT_CODE in ('1000', '1001')) then '성공'
+				WHEN A.AGENT_CODE = '09' AND (A.RSLT_CODE in ('1000', '1001')) then '성공'
+				WHEN (A.RSLT_CODE is null AND A.RSLT_CODE2 IS NULL AND A.SENT_DATE IS NULL AND A.RSLT_DATE IS NULL) then '대기'
+				ELSE '실패'
+			END as statusTxt
+		from
+			MJ_MSG_DATA A
+		where
+			A.MSG_GROUP_ID = #msgGroupId#
+	
+			
+	</select>
+	
+	<!-- REQ_DATE 조회-->
+	<select id="MjonMsgSentDAO.findByReqDateWhereMsgGroupId" parameterClass="String" resultClass="String">
+		/* MjonMsgSentDAO.findByReqDateWhereMsgGroupId*/
+		
+		SELECT REQ_DATE  FROM MJ_MSG_DATA WHERE MSG_GROUP_ID =#msgGroupId#
+			
+	</select>
+	
+	
+	<!-- 전체 발송결과 조회  (전송사별)-->
+	<select id="MjonMsgSentDAO.selectAllMsgSentList_advc" parameterClass="mjonMsgSentVO" resultClass="mjonMsgSentVO">
+		/* MjonMsgSentDAO.selectAllMsgSentList_advc */
+		SELECT
+			B.USER_ID as userId
+			, B.MSG_GROUP_ID as msgGroupId
+			, B.MSG_GROUP_CNT as msgGroupCnt
+			, B.SMS_TXT as smsTxt
+			, B.SUBJECT as subject
+			, B.SUBJECT_CHK_YN as subjectChkYn
+			, CAST(DATE_FORMAT(B.REGDATE, '%Y-%m-%d %H:%i') AS CHAR) AS regDate
+			, CAST(DATE_FORMAT(B.REQ_DATE, '%Y-%m-%d %H:%i') AS CHAR) AS reqDate
+			, (
+				CASE
+					WHEN B.DELAY_YN = 'Y' AND B.DELAY_COMPLETE_YN = 'N' THEN DATE_ADD(B.REQ_DATE, INTERVAL -30 MINUTE)
+					ELSE B.REQ_DATE
+					END
+				) AS delayOrgTime
+			, B.CALL_FROM as callFrom
+			, B.TOT_PRICE as totPrice
+			, B.EACH_PRICE as eachPrice
+			, B.MSG_TYPE as msgType
+			, B.FILE_CNT as fileCnt
+			, B.AGENT_CODE as agentCode
+			, B.RESERVE_C_YN as reserveCYn
+			, B.CANCELDATE as canceldate
+			, B.DEL_FLAG as delFlag
+			, B.SEND_KIND as sendKind
+			, B.MSG_KIND as msgKind
+			, B.DELAY_YN as delayYn
+			, B.DELAY_COMPLETE_YN as delayCompleteYn
+			, B.RESERVE_YN as reserveYn
+			, B.RESERVE_C_YN as reserveCYn
+			, TIMESTAMPDIFF(minute, CAST(DATE_FORMAT(B.REQ_DATE, '%Y-%m-%d %H:%i') AS CHAR), DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i')) as diffMin
+		FROM MJ_MSG_DATA A
+				 JOIN MJ_MSG_GROUP_DATA B ON A.MSG_GROUP_ID = B.MSG_GROUP_ID
+		WHERE (B.DEL_FLAG = 'N' OR B.DEL_FLAG IS NULL)
+			AND A.DEL_FLAG = 'N'
+			AND B.USER_ID = #userId#
+			<isNotEmpty property="searchKeyword">
+				<isEqual property="searchCondition" compareValue="2" >
+					AND B.CALL_FROM LIKE CONCAT('%', #searchKeyword#, '%')
+				</isEqual>
+				<isEqual property="searchCondition" compareValue="3" >
+					AND B.SMS_TXT LIKE CONCAT('%', #searchKeyword#, '%')
+				</isEqual>
+			</isNotEmpty>
+			<isNotEmpty property="searchCondition01">
+				AND B.RESERVE_YN = #searchCondition01#
+			</isNotEmpty>
+			<isNotEmpty property="searchCondition02">
+				<isEqual property="searchCondition02" compareValue="S">
+					AND B.MSG_TYPE = '4'
+				</isEqual>
+				<isEqual property="searchCondition02" compareValue="L">
+					AND B.MSG_TYPE = '6'
+					AND B.FILE_CNT = '0'
+				</isEqual>
+				<isEqual property="searchCondition02" compareValue="M">
+				<![CDATA[  
+					AND B.MSG_TYPE = '6'
+					AND B.FILE_CNT > '0'
+				]]>
+				</isEqual>
+			</isNotEmpty>
+			<isEmpty property="searchCondition02">
+				AND B.MSG_TYPE in ('4', '6')
+			</isEmpty>
+			<isNotEmpty property="searchStartDate">
+				<![CDATA[
+					AND DATE_FORMAT(B.REGDATE, '%Y-%m-%d') >= DATE_FORMAT(#searchStartDate#, '%Y-%m-%d')
+				]]>
+			</isNotEmpty>
+			<isNotEmpty property="searchEndDate">
+				<![CDATA[
+					AND 	DATE_FORMAT(B.REGDATE, '%Y-%m-%d')  <=  DATE_FORMAT(#searchEndDate#, '%Y-%m-%d')
+				]]>
+			</isNotEmpty>
+		GROUP BY B.MSG_GROUP_ID
+		ORDER BY 1=1
+			<isNotEmpty property="searchSortCnd">
+				<isEqual property="searchSortCnd" compareValue="curState">
+					, curState  $searchSortOrd$
+					, orderByrsltCode
+				</isEqual>
+				<isNotEqual  property="searchSortCnd" compareValue="curState">
+					,$searchSortCnd$
+				</isNotEqual>
+			</isNotEmpty>
+			<isNotEmpty property="searchSortOrd">
+				$searchSortOrd$
+			</isNotEmpty>
+		LIMIT  #recordCountPerPage# OFFSET #firstIndex#
+	
+		
+	</select>
+	
 	<!-- 전체 발송결과 조회  (전송사별)-->
 	<select id="MjonMsgSentDAO.selectAllMsgSentList" parameterClass="mjonMsgSentVO" resultClass="mjonMsgSentVO">
 		SELECT
src/main/resources/egovframework/sqlmap/let/uss/ion/bnr/MainPopupManage_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/uss/ion/bnr/MainPopupManage_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/uss/ion/bnr/MainPopupManage_SQL_Mysql.xml
@@ -12,6 +12,7 @@
 	<typeAlias  alias="PopupManageVO" type="itn.com.uss.ion.pwm.service.PopupManageVO" />
 	<typeAlias  alias="popupzoneVO" type="itn.com.uss.ion.pwm.service.PopupzoneVO"/>
 	<typeAlias  alias="mainPopupVO" type="itn.com.uss.ion.bnr.pop.service.MainPopupVO"/>
+	<typeAlias  alias="mainPopupLinkVO" type="itn.com.uss.ion.bnr.pop.service.MainPopupLinkVO"/>
 	
 
 
@@ -19,7 +20,7 @@
 		<result property="popId" column="POP_ID"></result>
 		<result property="mlink" column="MLINK"></result>
 		<result property="coords" column="COORDS"></result>
-		<result property="sort" column="SORT"></result>
+		<result property="popLinkId" column="POP_LINK_ID"></result>
 	</resultMap>
 	
 		
@@ -146,17 +147,17 @@
 		WHERE MP.POP_ID = #popId#
 	</select>
 
+
 	<select id="mainPopup.selectMainPopupVOLink" parameterClass="String" resultMap="MainPopupLinkResultMap">
 																	 
-	/* mainPopup.selectMainPopupVO */
+	/* mainPopup.selectMainPopupVOLink */
 		SELECT
+			POP_LINK_ID,
 			POP_ID,
 			MLINK,
-			COORDS,
-			SORT
+			COORDS
 		FROM MAIN_POPUP_LINK
 		WHERE POP_ID = #popId#
-		order by SORT asc
 	</select>
 
 
@@ -196,6 +197,16 @@
 		DELETE FROM MAIN_POPUP WHERE POP_ID=#popId#
 	</delete>
 	
+	<delete id="mainPopup.deleteMainPopupLinkInfo" parameterClass="mainPopupLinkVO">
+	/* mainPopup.deleteMainPopupLinkInfo */
+	
+		DELETE FROM MAIN_POPUP_LINK 
+		WHERE 
+			POP_ID=#popId#
+		AND
+			POP_LINK_ID = #popLinkId# 
+	</delete>
+
 	
 	<update id="mainPopup.resetMainPopupSort" parameterClass="mainPopupVO">
 			/*mainPopup.resetMainPopupSort*/
src/main/resources/egovframework/sqlmap/let/uss/pwm/PopupManage_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/uss/pwm/PopupManage_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/uss/pwm/PopupManage_SQL_Mysql.xml
@@ -1083,7 +1083,6 @@
 			POP_ID
 			, MLINK
 			, COORDS
-			, SORT
 			)
 		VALUES
 		<iterate conjunction=",">
@@ -1091,7 +1090,6 @@
 				#[].popId#
 				, #[].mlink#
 				, #[].coords#
-				, #[].sort# 
 			)
 		</iterate>
 		
@@ -1123,7 +1121,6 @@
 		SET 
 			  MLINK     = #mlink#
 			, COORDS    = #coords#
-			, SORT		= #sort#
 		WHERE POP_ID = #popId#
 	</update>
 	
src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml
@@ -1315,6 +1315,7 @@
 			ADMIN_SMS_NOTICE_YN 		AS adminSmsNoticeYn
 			,PRE_PAYMENT_YN				AS prePaymentYn
 			,SMISHING_YN				AS smishingYn
+            ,AT_SMISHING_YN             AS atSmishingYn
 			,AUTO_CASH					AS autoCash
 			,IFNULL(BLINE_CODE, 'N')	AS blineCode
 			,IFNULL(RECOMMEND_ID, '')	AS recommendId
src/main/webapp/WEB-INF/jsp/cmm/sym/ccm/EgovCcmCmmnCodeTree.jsp
--- src/main/webapp/WEB-INF/jsp/cmm/sym/ccm/EgovCcmCmmnCodeTree.jsp
+++ src/main/webapp/WEB-INF/jsp/cmm/sym/ccm/EgovCcmCmmnCodeTree.jsp
@@ -553,6 +553,9 @@
 			<div id="kopost_organization" class="orgCont"></div>
 		</div>	
 		<div class="tbWrap">
+			<div class="btnWrap">
+				<input type="button" class="btnType1 bg_456ded main1_save_btn" value="저 장" onClick="fn_save_menuInfo(); return false;">
+			</div>
 			<span class="tbTit" id="menuTopNm" >코드를 선택하세요</span>
 			<table class="tbType2">
 				<colgroup>
src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp
--- src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp
+++ src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovGnrlUserSelectUpdt.jsp
@@ -22,6 +22,7 @@
 <%@ taglib prefix="double-submit" uri="http://www.egovframe.go.kr/tags/double-submit/jsp" %>
 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
 <%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%>
+<%@ taglib prefix="fnc" uri="/WEB-INF/tld/functions.tld"%>
 <% pageContext.setAttribute("newLineChar", "\r\n"); %>
 <% pageContext.setAttribute("newLineChar2", "\n"); %>
 <% String serverName = request.getServerName(); %>
@@ -4157,8 +4158,10 @@
 													</td>
 													<td>
 														<c:choose>
-															<c:when test="${not empty mjonMsgSentList.regdate}">
-																<fmt:formatDate value="${mjonMsgSentList.regdate}" pattern="MM-dd HH:mm"/>
+															<c:when test="${not empty mjonMsgSentList.regDate}">
+<%-- 																<fmt:formatDate value="${mjonMsgSentList.regDate}" pattern="MM-dd HH:mm"/> --%>
+																${fnc:setStrToDataFormatter(mjonMsgSentList.regDate, 'MM-dd HH:mm') }
+<%-- 																<c:out value="${mjonMsgSentList.regDate}" /> --%>
 															</c:when>
 															<c:otherwise>
 																-
@@ -4190,7 +4193,8 @@
 																	</c:when>																
 																	<c:when test="${mjonMsgSentList.reserveYn eq 'Y' && mjonMsgSentList.reserveCYn eq 'N'}">
 																		[예약]<br />
-																		<fmt:formatDate value="${mjonMsgSentList.reqdate}" pattern="MM-dd HH:mm"/>
+<%-- 																		<fmt:formatDate value="${mjonMsgSentList.reqDate}" pattern="MM-dd HH:mm"/> --%>
+																		${fnc:setStrToDataFormatter(mjonMsgSentList.regDate, 'MM-dd HH:mm') }
 																	</c:when>
 																	<c:otherwise>
 																		-
@@ -4367,8 +4371,11 @@
 													</td>
 													<td>
 														<c:choose>
-															<c:when test="${not empty mjonMsgSentList.regdate}">
-																<fmt:formatDate value="${mjonMsgSentList.regdate}" pattern="MM-dd HH:mm"/>
+															<c:when test="${not empty mjonMsgSentList.regDate}">
+<%-- 																<fmt:formatDate value="${mjonMsgSentList.regDate}" pattern="MM-dd HH:mm"/> --%>
+<%-- 																<c:out value="${mjonMsgSentList.regDate}" /> --%>
+																
+																${fnc:setStrToDataFormatter(mjonMsgSentList.regDate, 'MM-dd HH:mm') }
 															</c:when>
 															<c:otherwise>
 																-
@@ -4400,7 +4407,8 @@
 																	</c:when>																
 																	<c:when test="${mjonMsgSentList.reserveYn eq 'Y' && mjonMsgSentList.reserveCYn eq 'N'}">
 																		[예약]<br />
-																		<fmt:formatDate value="${mjonMsgSentList.reqdate}" pattern="yyyy-MM-dd HH:mm"/>
+																		${fnc:setStrToDataFormatter(mjonMsgSentList.regDate, 'yyyy-MM-dd HH:mm') }
+<%-- 																		<fmt:formatDate value="${mjonMsgSentList.reqDate}" pattern="yyyy-MM-dd HH:mm"/> --%>
 																	</c:when>
 																	<c:otherwise>
 																		-
@@ -4586,8 +4594,8 @@
 												</td>
 												<td>
 													<c:choose>
-														<c:when test="${not empty mjonMsgDelaySentList.regdate}">
-															<fmt:formatDate value="${mjonMsgDelaySentList.regdate}" pattern="yyyy-MM-dd HH:mm"/>
+														<c:when test="${not empty mjonMsgDelaySentList.regDate}">
+															<fmt:formatDate value="${mjonMsgDelaySentList.regDate}" pattern="yyyy-MM-dd HH:mm"/>
 														</c:when>
 														<c:otherwise>
 															-
@@ -4605,7 +4613,7 @@
 														<c:otherwise>
 															<c:choose>
 																<c:when test="${mjonMsgDelaySentList.delayYn eq 'Y'}">
-																	[스미싱의심] <fmt:formatDate value="${mjonMsgDelaySentList.reqdate}" pattern="yyyy-MM-dd HH:mm"/>
+																	[스미싱의심] <fmt:formatDate value="${mjonMsgDelaySentList.reqDate}" pattern="yyyy-MM-dd HH:mm"/>
 																</c:when>
 																<c:otherwise>
 																	-
@@ -4785,6 +4793,10 @@
 														<td>
 															<c:choose>
 																<c:when test="${not empty kakaoResultList.regDate}">
+																
+																	<c:out value="${kakaoResultList.regDate}" />
+																	
+<%-- 																		${fnc:setStrToDataFormatter(kakaoResultList.regDate, 'MM-dd HH:mm') } --%>
 																	<fmt:parseDate value="${kakaoResultList.regDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/>
 																	<fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/>
 																</c:when>
@@ -4925,8 +4937,10 @@
 														<td>
 															<c:choose>
 																<c:when test="${not empty kakaoReserveList.regDate}">
-																	<fmt:parseDate value="${kakaoReserveList.regDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/>
-																	<fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/>
+																	<c:out value="${kakaoReserveList.regDate}" />
+																	${fnc:setStrToDataFormatter(kakaoReserveList.regDate, 'MM-dd HH:mm') }
+<%-- 																	<fmt:parseDate value="${kakaoReserveList.regDate}" var="dateValue" pattern="yyyy-MM-dd HH:mm:ss"/> --%>
+<%-- 																	<fmt:formatDate value="${dateValue}" pattern="MM-dd HH:mm"/> --%>
 																	
 																</c:when>
 																<c:otherwise>
@@ -5073,8 +5087,11 @@
 													<td>
 														<c:choose>
 															<c:when test="${not empty kakaoDelayInfo.regDate}">
-																<fmt:parseDate value="${kakaoDelayInfo.regDate}" var="kakaoDelayRegdate" pattern="yyyy-MM-dd HH:mm:ss"/>
-																<fmt:formatDate value="${kakaoDelayRegdate}" pattern="MM-dd HH:mm"/>
+<%-- 																<c:out value="${kakaoDelayInfo.regDate}" /> --%>
+																	${fnc:setStrToDataFormatter(kakaoDelayInfo.regDate, 'MM-dd HH:mm') }
+<%-- 																<fmt:formatDate value="${kakaoDelayRegdate}" pattern="MM-dd HH:mm"/> --%>
+<%-- 																<fmt:parseDate value="${kakaoDelayInfo.regDate}" var="kakaoDelayRegdate" pattern="yyyy-MM-dd HH:mm:ss"/> --%>
+<%-- 																<fmt:formatDate value="${kakaoDelayRegdate}" pattern="MM-dd HH:mm"/> --%>
 															</c:when>
 															<c:otherwise>
 																-
src/main/webapp/WEB-INF/jsp/uss/ion/bnr/pop/mainPopupModify.jsp
--- src/main/webapp/WEB-INF/jsp/uss/ion/bnr/pop/mainPopupModify.jsp
+++ src/main/webapp/WEB-INF/jsp/uss/ion/bnr/pop/mainPopupModify.jsp
@@ -31,8 +31,18 @@
 	
 	makeDate('ntceBgndeYYYMMDD');
 	makeTomorrow('ntceEnddeYYYMMDD');
-	
-	
+	// class="mlink"인 모든 input 요소에 대해 이벤트 리스너 추가
+	document.getElementById('linkTable').addEventListener('paste', function(event) {
+		if (event.target.classList.contains('mlink')) {
+			let pastedText = event.clipboardData.getData("text");
+			console.log("붙여넣기 한 URL:", pastedText);
+			let cleanedUrl = cleanUrlParameters(pastedText);
+			setTimeout(() => {
+				event.target.value = cleanedUrl;
+				console.log("정리된 URL:", cleanedUrl);
+			}, 0);
+		}
+	});
 });
 
 /**
@@ -40,39 +50,37 @@
  * @param {string} url 원본 URL 문자열
  * @returns {string} 불필요한 파라미터가 제거된 URL
  */
-	function cleanUrlParameters(url) {
-		try {
-			// URL이 절대경로 (/web/... 형태)인지 확인
-			let hasFullDomain = url.startsWith("http://") || url.startsWith("https://");
-			let urlObj;
-
-			if (hasFullDomain) {
-				// 도메인이 포함된 URL 처리
-				urlObj = new URL(url);
-			} else {
-				// 절대경로 URL 처리 (가상의 도메인 추가 후 파싱)
-				urlObj = new URL("https://www.munjaon.co.kr" + url);
-			}
-
-			let params = new URLSearchParams(urlObj.search);
-
-			// ❗ 값이 비어있는 모든 파라미터 제거
-			for (let [key, value] of [...params.entries()]) {  // `params.entries()`를 배열로 변환하여 반복
-				if (!value.trim()) {  // 값이 비어있는 경우 제거
-					params.delete(key);
-				}
-			}
-
-			// 정리된 URL 반환
-			let cleanedPath = urlObj.pathname + (params.toString() ? "?" + params.toString() : "");
-			// 정리된 URL 반환 (도메인을 제거하고 절대경로만 반환)
-			return cleanedPath.replace(/^https:\/\/www\.munjaon\.co\.kr/, "");
-
-		} catch (e) {
-			console.warn("잘못된 URL 형식:", url);
-			return url; // URL 파싱 실패 시 원본 유지
+function cleanUrlParameters(url) {
+	try {
+		// URL이 절대경로 (/web/... 형태)인지 확인
+		let hasFullDomain = url.startsWith("http://") || url.startsWith("https://");
+		let urlObj;
+		
+		if (hasFullDomain) {
+			// 도메인이 포함된 URL 처리
+			urlObj = new URL(url);
+		} else {
+			// 절대경로 URL 처리 (가상의 도메인 추가 후 파싱)
+			urlObj = new URL("https://www.munjaon.co.kr" + url);
 		}
+		
+		let params = new URLSearchParams(urlObj.search);
+		
+		// 값이 비어있는 모든 파라미터 제거
+		for (let [key, value] of [...params.entries()]) {
+			if (!value.trim()) { // 값이 비어있는 경우 제거
+				params.delete(key);
+			}
+		}
+		
+		// 정리된 URL 반환
+		let cleanedPath = urlObj.pathname + (params.toString() ? "?" + params.toString() : "");
+		return cleanedPath.replace(/^https:\/\/www\.munjaon\.co\.kr/, "");
+	} catch (e) {
+		console.warn("잘못된 URL 형식:", url);
+		return url; // URL 파싱 실패 시 원본 유지
 	}
+}
 
 //게시기간이 없으면 초기 값 입력
 function makeDate(id){
@@ -141,17 +149,6 @@
 	for (let i = 0; i < linkRows.length; i++) {
 		let linkInput = document.querySelector('input[name="mainPopupLinkList['+i+'].mlink"]');
 		let coordInput = document.querySelector('input[name="mainPopupLinkList['+i+'].coords"]');
-		let sortInput = document.querySelector('input[name="mainPopupLinkList['+i+'].sort"]');
-
-		if (!linkInput.value && !coordInput.value) {
-			if(sortInput.value){
-				let trElement = sortInput.closest("tr");
-				if (trElement) {
-					trElement.remove();
-				}
-			}
-			continue; // 요소가 없으면 건너뛴다.
-		}
 
 		if (linkInput.value.trim() === "") {
 			alert('['+(i + 1)+']번째 링크주소를 입력해 주십시오');
@@ -165,11 +162,6 @@
 			return false;
 		}
 
-		if (sortInput.value.trim() === "") {
-			alert('['+(i + 1)+']번째 순서를 입력해 주십시오');
-			sortInput.focus();
-			return false;
-		}
 	}
 	
 	console.log('isTbodyEmpty("tbody_fiielist") : ', isTbodyEmpty("tbody_fiielist"));
@@ -286,30 +278,77 @@
 	coordTd.innerHTML = '<input type="text" name="mainPopupLinkList['+rowCount+'].coords" maxlength="200" />';
 	
 	// 세 번째 컬럼 (링크 좌표)
-	let sortTh = document.createElement("th");
-	sortTh.innerHTML = '<span>순서</span>';
 	let sortTd = document.createElement("td");
-	sortTd.innerHTML = '<input type="text" name="mainPopupLinkList['+rowCount+'].sort" maxlength="200" value="'+rowCountP+'"  />';
-
+	sortTd.setAttribute("colspan", "2");
+	sortTd.innerHTML = '<input type="button" class="btnType2" value="삭제" onclick="fn_linkDel(\'\')" />';
 	// tr에 추가
 	newRow.appendChild(linkTh);
 	newRow.appendChild(linkTd);
 	newRow.appendChild(coordTh);
 	newRow.appendChild(coordTd);
-	newRow.appendChild(sortTh);
 	newRow.appendChild(sortTd);
 
 	// tbody에 추가
 	tbody.appendChild(newRow);
 }
 
-
+function fn_linkDel(p_linkId) {
+	// event.target을 저장
+	const $target = $(event.target);
+	
+	if (!p_linkId) {
+		
+		$target.closest('tr').remove();
+	}else{
+		
+		var p_popId = $('#popId').val();
+		var p_popLinkId = p_linkId;
+		
+		var sendData = {
+				"popId" : p_popId
+				, "popLinkId" : p_popLinkId
+		}
+ 
+		$.ajax({
+			type: 'POST',
+			url: '<c:url value="/uss/ion/bnr/pop/mainPopupLinkDeleteAjax.do" />',
+			contentType: 'application/json',
+			data: JSON.stringify(sendData),
+			dataType: 'json',
+			success : function(data) {
+				alert(data.msg);
+				console.log('data : ', data);
+				if(data.status == 'OK')
+				{
+					console.log('data OK : ', data);
+					$target.closest('tr').remove();
+				}
+				else
+				{
+					// 실패 처리 로직
+				}
+			},
+			error : function(jqXHR, textStatus, errorThrown) {
+				console.error("AJAX Error:", textStatus, errorThrown);
+				console.error("Response:", jqXHR.responseText);
+			}
+		});
+		
+	} 
+	
+	
+	
+}
 </script>
 <style>
 .date_format{width:91px !important;}
 .del_file_btn{border: none;background-color: transparent;background-image: url(/direct/img/upload_delect_img.png);background-repeat: no-repeat;background-position: center center;vertical-align: middle;margin-top: -4px;margin-right: 15px;}
 .file_size{color: #0388d2;font-weight: bold;}
 .uploaded_obj{width: 100%;}
+.btnType2 {
+	border: 1px solid #456ded;
+	color: #456ded;
+}
 </style>
 </head>
 <body>
@@ -441,30 +480,12 @@
 										<td>
 											<form:input path="mainPopupLinkList[${status.index}].coords" class="mlink" maxlength="200" />
 										</td>
-										<th><span>순서</span></th>
-										<td>
-											<form:input path="mainPopupLinkList[${status.index}].sort" class="mlink" maxlength="200" oninput="this.value = this.value.replace(/[^0-9]/g, '');" />
+										<td colspan="2">
+											<input type="button" class="btnType2" value="삭제" onclick="fn_linkDel('${link.popLinkId }'); return false;">
 										</td>
 									</tr>
 								</c:forEach>
 							</c:when>
-							<c:otherwise>
-								<!-- 값이 없을 때 빈 input 생성 -->
-								<tr>
-									<th><span>[1]링크주소</span></th>
-									<td>
-										<form:input path="mainPopupLinkList[0].mlink" class="mlink" maxlength="200" />
-									</td>
-									<th><span>링크좌표</span></th>
-									<td>
-										<form:input path="mainPopupLinkList[0].coords" maxlength="200" />
-									</td>
-									<th><span>순서</span></th>
-									<td>
-										<form:input path="mainPopupLinkList[0].sort" maxlength="200" value="1" oninput="this.value = this.value.replace(/[^0-9]/g, '');" />
-									</td>
-								</tr>
-							</c:otherwise>
 						</c:choose>
 						</tbody>
 						<tr>
src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp
--- src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp
+++ src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp
@@ -341,8 +341,8 @@
 }
 
 function actionLogin() {
-	location.href="<c:url value='/web/user/login/login.do'/>";
-	/*
+// 	location.href="<c:url value='/web/user/login/login.do'/>";
+	
 	// 아이디 공백 제거
 	document.loginForm.id_text.value = $.trim(document.loginForm.id_text.value);
 	
@@ -353,16 +353,6 @@
         alert("비밀번호를 입력하세요");
         return;
     } else {
-    	
-     	// Whois IP 국가코드
-    	//whoisIpCountry();
-    	setTimeout(function() {
-    		if (isKoreaIpAddress == false) {
-    			alert("해외 IP로 감지되어 로그인이 제한되었습니다.\n문자온 고객센터로 문의 바랍니다.");
-    			location.href='/web/uat/uia/actionLogout.do';
-    			return false;	 	
-    		}    	
-
     		// 로그인 START
     		var rsa = new RSAKey();
 	        rsa.setPublic($('#RSAModulus').val(),$('#RSAExponent').val());
@@ -373,13 +363,84 @@
 	        $("#id").val(rsa.encrypt(id.val().toLowerCase()));
 	        $("#password").val(rsa.encrypt(pw.val()));
 	        
-	        document.loginForm.action="<c:url value='/web/user/login/actionSecurityLogin.do'/>";
 	        saveid(document.loginForm);
-	        document.loginForm.submit(); 
-    	}, 600);		
-    	
+
+	        var checkForm = $("form[name=loginForm]").serialize() ;
+			
+			$.ajax({
+			    type : "POST",
+			    async : false,
+			    url : "/web/user/login/actionSecurityLoginBeforeHpAjax.do",
+			    data : checkForm,
+			    dataType:'json',
+			    success : function(data) {
+			      if (data.status=="success"){
+	
+			    	    document.loginForm.passFlag.value = data.passFlag;
+				    	if(data.passFlag == "Y")
+			    		{
+				    		actionLogin_end();
+			    		}
+				    	else
+				    	{
+							goLoginPage(id.val(), pw.val(), "secure");
+				    	}
+			   		}else if (data.status=="fail"){
+			   			
+			   			if (data.returnType == "A"){
+							//휴면 회원
+			   				document.loginForm.action="<c:url value='/web/user/humanPage.do'/>";
+					 	    document.loginForm.submit();
+			   			}else if (data.returnType == "B"){
+							//기업회원 기업정보 기입
+			   				document.cmpChangeForm.mberId.value = data.mberId;
+			   				document.cmpChangeForm.action="<c:url value='/web/user/login/membershipAttachDocBefore.do'/>";
+					 	    document.cmpChangeForm.submit();
+			   			}else if (data.returnType == "C"){
+			   				document.cmpChangeForm.mberId.value = data.mberId;
+			   				document.cmpChangeForm.action="<c:url value='/web/user/login/loginRestrictionUse.do'/>";
+					 	    document.cmpChangeForm.submit();
+			   			}else{
+							//로그인 실패 page이동
+			   				goLoginPage(id.val(), pw.val(), data.msg);
+			   			}
+			   		}
+			      
+		      	//alert(JSON.stringify(data));
+				      	console.log("sucess data1 : " + JSON.stringify(data));        	
+					if (data.isSuccess == true) {
+				      	console.log("fn_click_banner_add_stat sucess data2 : " + JSON.stringify(data));
+					}
+					else {
+				      	console.log("data.isSuccess not true ");
+				      	console.log("sucess data.msg : " + data.msg);
+				      	console.log("sucess data1 : " + JSON.stringify(data));        	
+					}
+		      },
+		      error : function(xhr, status, error) {
+			      	console.log("fn_click_banner_add_stat error : " + error);
+			        console.log("fn_click_banner_add_stat xhr : " +  JSON.stringify(xhr)  + "\r\status : " + JSON.stringify(status) + "\r\error : " + JSON.stringify(error));	      	
+		          return false;
+		      }
+		  });	
     }
-    */
+    
+}
+
+function goLoginPage(id, pw, headerLoginResult){
+	document.loginForm.id.value = id;
+	document.loginForm.password.value = pw;
+	document.loginForm.headerLoginResult.value = headerLoginResult;
+	document.loginForm.action = "<c:url value='/web/user/login/login.do'/>";
+	
+	document.loginForm.submit();
+}
+
+//아이디/휴대폰 번호 체크
+function actionLogin_end(){
+	    document.loginForm.action="<c:url value='/web/user/login/actionSecurityLoginAfterHp.do'/>";
+	    saveid(document.loginForm);
+	    document.loginForm.submit();
 }
 
 	function saveid(form) {
@@ -1636,14 +1697,19 @@
 			  	<input type="hidden" id="id" name="id">
 			    <input type="hidden" id="password" name="password">
 			    <input type="hidden" id="ip" name="ip" value="${userIp}">
+			    <input type="hidden" id="passFlag" name="passFlag">
+			    <input type="hidden" id="headerLoginResult" name="headerLoginResult">
+			    
         		<div id="login" class="login">
 		            <div class="inner">
 		                <div class="login_left">
 		                    <div class="login_put">
 		                        <label for="id_text" class="label"></label>
-		                        <input type="text" placeholder="아이디를 입력해주세요"id="id_text" name="id_text" class="id_text" maxlength="20" size="18" onclick="actionLogin();">
+<!-- 		                        <input type="text" placeholder="아이디를 입력해주세요"id="id_text" name="id_text" class="id_text" maxlength="20" size="18" onclick="actionLogin();"> -->
+		                        <input type="text" placeholder="아이디를 입력해주세요"id="id_text" name="id_text" class="id_text" maxlength="20" size="18">
 		                        <label for="password_text" class="label"></label>
-		                        <input type="password" placeholder="비밀번호를 입력해주세요"   id="password_text" class="password_text" maxlength="30"size="18" onkeypress="if(event.keyCode==13) {actionLogin(); return false;}" onclick="actionLogin();">
+<!-- 		                        <input type="password" placeholder="비밀번호를 입력해주세요"   id="password_text" class="password_text" maxlength="30"size="18" onkeypress="if(event.keyCode==13) {actionLogin(); return false;}" onclick="actionLogin();"> -->
+		                        <input type="password" placeholder="비밀번호를 입력해주세요"   id="password_text" class="password_text" maxlength="30"size="18" onkeypress="if(event.keyCode==13) {actionLogin(); return false;}">
 		                        <label for="login_button" class="label"></label>
 		                        <button type="button" id="login_button" class="btnType btnType1" class="login_button" onclick="actionLogin();">로그인</button>
 		                    </div>
@@ -1758,5 +1824,9 @@
 			<input type="hidden" name="tr_url"   id="tr_urlHeader"   value = "">
 			<input type="hidden" name="tr_add"  id="tr_addHeader"     value = "">	
 		</form>
+		
+		<form name="cmpChangeForm" id="cmpChangeForm" method="post" action="#">
+			<input type="hidden" name="mberId" value=""/>	
+		</form>
         
     </header><!--// header 영역 -->
src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp
@@ -142,10 +142,10 @@
 
 	<ul class="tabType4">
         <li id="tabAt" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabAlim');">알림톡</button></li>
-<%--         <c:if test="${fn:contains(pageContext.request.requestURL , 'localhost')  --%>
-<%--         						|| fn:contains(pageContext.request.requestURL , '119.193.215.98')}"> --%>
-<!-- 	        <li id="tabFt" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabFriend');">친구톡</button></li> -->
-<%--         </c:if> --%>
+						<c:if test="${pageContext.request.serverName == 'localhost' 
+						            || pageContext.request.serverName == '119.193.215.98'}">
+	        <li id="tabFt" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabFriend');">친구톡</button></li>
+       					 </c:if>
         <li id="tabConf" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabConf');">카카오톡 설정</button></li>
         <li id="tabIntro" class="tab topTab"><button type="button" onclick="javascript:fnLinkPageTopTab('tabAlimtalkIntrd');">알림톡 소개</button></li>
     </ul>
(No newline at end of file)
src/main/webapp/WEB-INF/jsp/web/kakao/include/KakaoSentTopMentTap.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/include/KakaoSentTopMentTap.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/include/KakaoSentTopMentTap.jsp
@@ -25,16 +25,23 @@
 	console.log('uri:', uri);
 	
 	
-	if(uri.includes('selectMsgSentView')){
-		$('.topTab').removeClass("active");
-		$("#smsTab").addClass("active");
-	}else if(uri.includes('selectKakaoSentView')){
-		$('.topTab').removeClass("active");
-		$("#kakaoTab").addClass("active");
-	}else if(uri.includes('faxSendList')){
-		$('.topTab').removeClass("active");
-		$("#faxTab").addClass("active");
+	// URI 키워드와 해당 탭 ID를 매핑
+	const tabMapping = [
+		{ keyword: 'selectMsgSentView', tabId: '#smsTab' }, // 'selectMsgSentView' 키워드를 '#smsTab'으로 매핑
+		{ keyword: 'selectKakaoSentView', tabId: '#kakaoTab' }, // 'selectKakaoSentView' 키워드를 '#kakaoTab'으로 매핑
+		{ keyword: 'faxSendList', tabId: '#faxTab' } // 'faxSendList' 키워드를 '#faxTab'으로 매핑
+	];
+
+	// URI에 특정 키워드가 포함되어 있는지 확인하여 활성 탭 정보를 찾음
+	const activeTab = tabMapping.find(mapping => uri.includes(mapping.keyword)); // 'uri'에 키워드가 포함된 첫 번째 매핑을 검색
+
+	// 매칭된 탭이 있으면 UI를 업데이트하여 해당 탭을 활성화
+	if (activeTab) {
+		$('.topTab').removeClass("active"); // 모든 탭에서 "active" 클래스 제거
+		$(activeTab.tabId).addClass("active"); // 매핑된 탭 ID에 "active" 클래스 추가
 	}
+	
+	
 }
 
 function fnLinkPageTab(tabInfo){
src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView.jsp
@@ -7,15 +7,18 @@
 
 <!-- <script src="/publish/js/content.js"></script> -->
 <!-- 주소록관련 js -->
+
+
 <script type="text/javascript" defer src="<c:out value='/js/kakao/at/init.js' />"></script>
 <script type="text/javascript" src="<c:out value='/js/kakao/at/tabulator.js' />"></script>
 <script type="text/javascript" src="<c:out value='/js/kakao/at/addr.js' />"></script>
 <script type="text/javascript" src="<c:out value='/js/kakao/at/alimtalkExcel.js' />"></script>
 <script type="text/javascript" src="<c:out value='/js/kakao/at/priceClclt.js' />"></script>
 <script type="text/javascript" src="<c:out value='/js/common/popup.js' />"></script>
+<!-- 주소록 유효성 체크 공통유틸로 인해 추가 -->
+<script type="text/javascript" src="<c:url value='/js/web/addr/cmn.js?date=202409021440'/>"></script>
 <script type="text/javascript">
 var loginVO = '${loginVO}';
-
 // 체크박스 동적 바인딩
 $(document).on('click','.wrap01C', function(){
 	var total = $(".wrap01C").length;
@@ -87,28 +90,52 @@
 	
 	//선택삭제 버튼 클릭 이벤트
 	$("#select_del").on('click', function(){
-		
-		if($('.wrap01C:checkbox:checked').length < 1)
-		{
-			alert("삭제할 연락처를 선택해주세요.!!");
+
+
+		if(tableL == null || tableL == ""){
+			
+			alert("받는사람을 추가해 주세요.");
 			return false;
+		
 		}
 		
-		$('.wrap01C').each(function(index, item){
-			if($(item).is(':checked'))
-				$(item).parent().parent().remove();
-		});
-		updateTotCnt();
+		var selectedData = tableL.getSelectedRows();
+		
+		if(selectedData == "" || selectedData == null){
+			
+			alert("삭제할 연락처를 선택해주세요.");
+			return false;
+			
+			// 선택한 Row 데이터 삭제하기
+		}else if(confirm("선택하신 받는 사람을 삭제하시겠습니까?")){
+				
+			// 선택 데이터 삭제
+			selectedData.forEach(row => row.delete());
+			
+			
+			totRows = tableL.getRows().length;
+			updateTotCnt(totRows);
+			
+			var smsTxtArea = $('#smsTxtArea').val();
+			
+			//일괄변환 문구 결제금액 처리
+			
+		}
+		
 	});
 
 	//선택삭제 버튼 클릭 이벤트
  	$("#all_del").on('click', function(){
-		
+
+        
 		if(!confirm("받는사람 목록을 모두 삭제하시겠습니까?"))
 			return false;
 		
 		$('#wrap01_body .list_body').remove();
 
+		tableL.clearData();
+		
+		
 		$('#rowTotCnt').text(0);
 		$('#rowDupCnt').text(0);
 	});
@@ -509,19 +536,13 @@
 		return false;
 	}
 	
-	//수신자 목록 체크
-	if($('.phoneArea').length < 1)
-	{
-		alert('받는 사람 입력 후 발송해 주세요');
-		return false;
-	}
 	
 	//수신자 목록 체크
-	if($('.phoneArea').length > 500)
+	/* if($('.phoneArea').length > 500)
 	{
 		alert("최대 발송 건수는 500건 입니다.");
 		return false;
-	}
+	} */
 	
 
 	if($('#errorChk').val() === 'N' 
@@ -550,7 +571,7 @@
 	
 	// 초기화
 	$('.varValList').remove();
-	$('#bizForm #varNmList').val('');
+// 	$('#bizForm #varNmList').val('');
 
 
 	// 대체문자 전송 확인
@@ -613,133 +634,225 @@
 	}else{
 		$('#bizForm #reqDate').val("");
 	}
-	
+
+    var dataList = [];
 	// 치환문자 있는 데이터 파씽
 	if($('#bizForm #txtReplYn').val() === 'Y'){
-		fn_excelDataTransParsing();
+		// fn_excelDataTransParsing();
 		// 치환문자 있는 수신자 리스트 
-		fn_transCallToListParsing();
+		dataList = fn_transCallToListParsing();
 	}else{
-		// 치환문자 없는 수신자 리스트 
-		fn_callToListParsing();
+		// 치환문자 없는 수신자 리스트
+		dataList = fn_callToListParsing();
 	}
 
-	$('#bizForm #senderKey').val($('#selectKakaoProfileList').val());
-	$('#bizForm #templateCode').val($('#selectTemplateList').val());
 	
+
+    //수신자 목록 체크
+    if(dataList.length < 1)
+    {
+        alert('받는 사람 입력 후 발송해 주세요');
+        return false;
+    }
+	
+	
+	// 채널 ID
+	$('#bizForm #senderKey').val($('#selectKakaoProfileList').val());
+    // 채널 > 템플릿
+	$('#bizForm #templateCode').val($('#selectTemplateList').val());
 	// 발신번호
 	$('#bizForm #callFrom').val(removeDash($('#callFromList option:selected').val()));
 	
-	if(confirm("알림톡을 발송하시겠습니까?")){
-		var spamChk = true;
-		//2023.09.06 알림톡 스팸체크 기능 제거요청으로 인한 주석처리
-		/*var spamChk = false;
-		var spmData = new FormData(document.bizForm);
-		$.ajax({
-			type: "POST"
-			, url: "/web/mjon/alimtalk/selectSpamKakaoAlimtalkMsgChkAjax.do"
-			, data: spmData
-			, dataType:'json'
-			, async: false
-			, processData: false
-			, contentType: false
-			, cache: false
-			, success: function (returnData, status) {
-				if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
-					
-					if("fail" == returnData.result){
-						alert(returnData.message);
-						return false;
-					}else if("loginFail" == returnData.result){
-						alert(returnData.message);
-						return false;
-					}else if("spams" == returnData.result){
-						alert("전송 내용에  스팸문구가 포함되어 있습니다.")
-						return false;
-					}else{
-						spamChk = true;
-						return false;
-					}
-					
-				} else if(status== 'fail'){
-					alert(returnData.message);
-					return false;
-				}
-			}
-			, error: function (e) {
-				alert("문자 발송에 실패하였습니다.");
-				console.log("ERROR : ", e);
-				return false;
-			}
-		}); */
-		
-		if(spamChk){
-			var data = new FormData(document.bizForm);
-			$.ajax({
-				type: "POST"
-				, url: "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax.do"
-				, data: data
-				, dataType: 'json'
-				, async: true
-				, processData: false
-				, contentType: false
-				, cache: false
-				, success: function (returnData, status) {
-					if(status == 'success'){
-						if("loginFail" == returnData.result){
-							
-							alert(returnData.message);
-							return false;
-							
-						}else  if('fail' == returnData.result){
-							
-							alert(returnData.message);
-							return false;
-							
-						}else if('authFail' == returnData.result){
-							
-							alert(returnData.message);
-							location.reload();
-							
-						} else if(status == 'success'){
-							
-							var kakaoSendCnt = returnData.resultSts;
-							
-							$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
-							
-							//예약발송 건의 경우 결과 팝업 문구 변경
-							if(reserYn == 'Y'){
-								$('.pop_msg_success .msg_text').html("예약 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 예약 되었습니다.");
-							}else{
-								$('.pop_msg_success .msg_text').html("발송 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 발송 되었습니다.");
-							}
-							
-							$('.mask').addClass('on');
-						}
-					}
-				}
-				,beforeSend : function(xmlHttpRequest) {
-					//로딩창 show
-					$('.loading_layer').addClass('active');
-				}
-				,complete : function(xhr, textStatus) {
-					//로딩창 hide
-					$('.loading_layer').removeClass('active');
-				}
-				,error: function (e) {
-					console.log("ERROR : ", e);
-					alert("카카오 알림톡 전송에 실패하였습니다.");
-				}
-			}); 
+	// 폼 데이터를 배열로 직렬화
+	var form = $('#bizForm');
+	var formDataArray = form.serializeArray();
+	
+	// 배열을 객체로 변환
+	var formData = {};
+	$.each(formDataArray, function(index, field) {
+	    formData[field.name] = field.value;
+	});
+	
+	// 빈 값 제거 (참고 코드 기반)
+	for (var key in formData) {
+		if (formData[key] === '' || formData[key] === null || formData[key] === undefined) {
+		    delete formData[key];
 		}
 	}
+	
+// 	delete formData['varNmList'];
+	
+	// 선택된 데이터 추가 (varListMap)
+	formData["varListMap"] = dataList;
+	console.log('formData : ', formData);
+	
+	if(confirm("알림톡을 발송하시겠습니까?")){
+
+	// 프로그래스파 시간을 위한 계산
+	var estimtedTime = calculateEstimatedTime(dataList.length);
+
+	$.ajax({
+		type: "POST",
+		url: "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax_advc.do",
+		data: JSON.stringify(formData),
+		contentType: 'application/json',
+		dataType: 'json',
+		success: function (data) {
+				console.log('data : ', data);
+				
+				var status = data.status;
+				if("OK" == status){
+					var resultSts = data.object.resultSts;
+					var reserYn = data.object.reserYn;
+					var resText = (reserYn === 'Y') ? '예약' : '발송';
+						
+					$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
+					$('.pop_msg_success .msg_text').html(resText+" 성공 : <strong>"+ resultSts + "</strong>건의<br>알림톡이 " + resText + " 되었습니다.");
+					
+				}else if("UNAUTHORIZED" == status){
+					alert(data.message);
+				    location.reload();
+				}else{
+					alert(data.message);
+					return false;
+				}
+				
+				
+// 				if(data == 'success'){
+					/* if("loginFail" == returnData.result){
+						
+						alert(returnData.message);
+						return false;
+						
+					}else  if('fail' == returnData.result){
+						
+						alert(returnData.message);
+						return false;
+						
+					}else if('authFail' == returnData.result){
+						
+						alert(returnData.message);
+						location.reload();
+						
+					} else if(status == 'success'){
+						
+						var kakaoSendCnt = returnData.resultSts;
+						
+						$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
+						
+						//예약발송 건의 경우 결과 팝업 문구 변경
+						if(reserYn == 'Y'){
+							$('.pop_msg_success .msg_text').html("예약 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 예약 되었습니다.");
+						}else{
+							$('.pop_msg_success .msg_text').html("발송 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 발송 되었습니다.");
+						}
+						
+						$('.mask').addClass('on');
+					} */
+// 				}
+			}
+			,beforeSend : function(xmlHttpRequest) {
+				//로딩창 show
+// 				$('.loading_layer').addClass('active');
+				// 프로그래스 바 실행
+				progressStart(estimtedTime);
+			}
+			,complete : function(xhr, textStatus) {
+				//로딩창 hide
+// 				$('.loading_layer').removeClass('active');
+
+				// 프로그래스 바 종료
+				progressComplete();;
+			}
+			,error: function (e) {
+				console.log("ERROR : ", e);
+				alert("카카오 알림톡 전송에 실패하였습니다.");
+			}
+		}); 
+	}
+}
+//선택된 데이터의 길이에 따라 예상 시간 계산 함수
+function calculateEstimatedTime(selectedCount) {
+    //기준값
+    // const processTimePerBatch = 130; // 130초
+    
+    
+    // 30만건 기준 10분으로 기준을 잡아서 
+    // 시간계산함
+    const processTimePerBatch = 600;
+    const batchSize = 300000;
+    
+    // 1건당 처리 시간
+    const timePerRecord = processTimePerBatch / batchSize;
+
+    // 예상 시간 계산
+    const estimatedTimeInSeconds = selectedCount * timePerRecord;
+
+    return estimatedTimeInSeconds.toFixed(2);
+}
+
+
+//프로그레스바 
+var start, change;
+var progressInterval = null; // 전역 변수로 타이머 ID 관리
+function progressStart(time) {
+    // 기존 타이머 정지 및 초기화
+    if (progressInterval !== null) {
+        clearInterval(progressInterval); // 이전 타이머 정지
+        progressInterval = null; // 타이머 ID 초기화
+    }
+    resetProgressBar(); // 프로그레스바 초기화
+
+    // 프로그레스바 보이기
+    $(".progress_bar_wrap").css("display", "flex");
+
+    // 프로그레스바 요소 가져오기
+    var timeText = document.querySelector(".time_text");
+    var bar = document.querySelector(".change_bar");
+
+    // 초기 상태 설정
+    var width = 1;
+    var totalTime = time * 1000; // 총 실행 시간 (밀리초)
+    var cmpWid = totalTime / 100; // width 증가 간격 (밀리초)
+
+    // 새 타이머 시작
+    progressInterval = setInterval(changeWidth, cmpWid);
+
+    function changeWidth() {
+        if (width >= 100) {
+            // 프로그레스바 100% 도달
+            clearInterval(progressInterval); // 타이머 종료
+            progressInterval = null; // 타이머 ID 초기화
+
+            timeText.innerHTML = "100%";
+
+            setTimeout(function () {
+                // 100% 표시 후 "잠시만 기다려주세요" 변경
+                timeText.innerHTML = "잠시만 기다려주세요...";
+                $(".time_text").addClass("animation");
+            }, 1000);
+        } else {
+            // 프로그레스바 진행
+            width++;
+            bar.style.width = width + "%";
+            timeText.innerHTML = width + "%";
+        }
+    }
+}
+
+
+//프로그레스바 완료
+function progressComplete() {
+ // var width = parseInt($(".time_text").text().replace('%', '')) || 0; // 현재 width 가져오기
+
+ $(".progress_bar_wrap").hide();
 }
 
 /*
  *	치환문자 있는 수신자 목록 파씽
  */
 function fn_transCallToListParsing(){
-	var callToList = [];
+/* 	var callToList = [];
 	// excel body
 	$('.excelBody').each(function(indexBody, itemBody){
 		$(itemBody).find('.list_table_name').each(function(indexRow, itemRow){
@@ -750,7 +863,31 @@
 		});
 	});
 	$('#bizForm #callToList').val(callToList);
+ */
 
+	var dataList = [];
+	
+	var headers = [];
+	$('#excelHead .list_table_name').each(function() {
+	  headers.push($(this).text().trim());
+	});
+	
+	$('.excelBody').each(function() {
+		var row = {};
+		$(this).find('.list_table_name').each(function(index) {
+			var key = headers[index];
+			var value = $(this).text().trim();
+			if (index === 0) {
+			    row["callToList"] = value; // 수신번호는 별도로 처리
+			} else {
+			    row[key] = value; // 
+			}
+		});
+		console.log(row)
+		dataList.push(row);
+	});
+
+	return dataList;
 }
 
 /*
@@ -758,13 +895,28 @@
  */
 function fn_callToListParsing(){
 
-	var callToList = [];
-	// excel body
-	$('.phoneArea').each(function(index, item){
-			callToList.push($(item).text().replaceAll('\\t', ''));
+    var dataList = [];
+	
+/* 	$('.phoneArea').each(function(index, item){
+        var row = {};
+        var value = $(item).text().replaceAll('\\t', '')
+        row["callToList"] = value; // 수신번호는 별도로 처리
+        dataList.push(row);
+    });
+	 */
+	   
+	// Tabulator 테이블의 데이터 가져오기
+	var tableData = tableL.getData(); 
+	
+	tableData.forEach(function(row){
+		var dataRow = {};
+		dataRow["callToList"] = row.phone; // phone 필드 값을 callToList로 저장
+		dataList.push(dataRow);
 	});
 	
-	$('#bizForm #callToList').val(callToList);
+	return dataList;
+
+	
 
 }
 
@@ -777,9 +929,8 @@
 	// title 배열
 	var varHead = [];
 	// 값 배열
-	var varVal = [];
+// 	var varVal = [];
 	
-	var inputTag = '<input type="hidden" class="varValList" name="varValList[$INDEX$]" value="$VAL$">';
 	
 	// excel title
 	$('#excelHead').find('div').each(function(index, item){
@@ -803,7 +954,7 @@
 		$("#bizForm").append(inputTag.replace('$VAL$',varValTemp ).replace('$INDEX$',index ));
 	}); */
 	
-	$('.excelBody').each(function(index, item){
+/* 	$('.excelBody').each(function(index, item){
 		
 		var valLeng = $('#excelHead').find('.list_table_name').length-1;
 		varValTemp = '';
@@ -821,7 +972,7 @@
 		console.log('varValTemp : ',varValTemp);
 		varVal.push(varValTemp);
 	});
-	$('#bizForm #varValList').val(varVal);
+	$('#bizForm #varValList').val(varVal); */
 }
 
 
@@ -881,9 +1032,9 @@
 	$('#smsLen').val(conLeng);
 	
 	
+	$('#msgLeng').html(conLeng + " / ");
 	if(conLeng > 90){
 		
-		$('#msgLeng').html(conLeng + " / ");
 		$('#limitLeng').html("2000");
 		$('.msg_com').html("장문");
 		$('#msgType').val("6"); // 메세지 타입 설정
@@ -897,7 +1048,6 @@
 		
 	}else{
 		
-		$('#msgLeng').html(conLeng + " / ");
 		$('#limitLeng').html("90");
 		$('.msg_com').html("단문");
 		$('#msgType').val("4"); // 메세지 타입 설정
@@ -910,7 +1060,7 @@
 	}
 		
 	//수신목록 전체 데이터 갯수 구하기
-	updateTotCnt(totRows);
+	//updateTotCnt(totRows);
 }
 
 /**
@@ -1076,6 +1226,62 @@
   return true;
 }
 
+//재전송 스크립트 수정
+$(window).on('load', function() {
+    if(${msgResendAllFlag eq 'Y'}) {
+        // 채널 ID 및 템플릿 선택 코드는 유지
+        $("#selectKakaoProfileList option").filter(function() {
+            return $(this).text() === '${kakaoVO.msgResendAllYellowId}';
+        }).prop('selected', true).parent().trigger("click");
+        
+        // 템플릿 선택
+        $("#selectTemplateList option").remove();
+        selectTemplateList();
+        $("#selectTemplateList").val("${kakaoVO.msgResendAllTmpKey}");
+        selectTemplateInfo("${kakaoVO.msgResendAllTmpKey}");
+        fn_viewDataInit02();
+        priceInit();
+        
+        try {
+            // JSON 파싱
+            var resendListObj = JSON.parse('${resendListJson}');
+            var listCnt = resendListObj.length;
+            
+            // 중복 제거 - Set 사용
+            var uniquePhones = new Set();
+            var uniqueResendList = [];
+            
+            // 중복 제거 로직
+            for(var i = 0; i < resendListObj.length; i++) {
+                var phone = removeDash(resendListObj[i].callTo);
+                if(!uniquePhones.has(phone)) {
+                    uniquePhones.add(phone);
+                    uniqueResendList.push(resendListObj[i]);
+                }
+            }
+            
+            
+            // 중복 제거된 데이터로 처리
+            for(var i = 0; i < uniqueResendList.length; i++) {
+                var phoneNumber = removeDash(uniqueResendList[i].callTo);
+                
+                // callTo 입력 필드에 값 설정 후 번호추가 버튼 클릭
+                $("#callTo").val(phoneNumber);
+                $(".addCallToF").trigger("click");
+                
+            }
+            
+            // 총 건수 확인
+            setTimeout(function() {
+                updateTotCnt();
+            }, 500);
+            
+        } catch(e) {
+            console.error("재전송 데이터 처리 오류:", e);
+        }
+    }
+});
+
 </script>
 
 	<div class="loading_layer">
@@ -1085,6 +1291,17 @@
 		</div>
 	</div>
 	
+    <div class="progress_bar_wrap">
+        <div class="progress_box">
+            <p class="time_text">0%</p>
+            <div class="bar">
+                <span class="change_bar"></span>
+            </div>
+        </div>
+        <div class="btn_wrap">
+        </div>
+
+    </div>
 	<!-- 기업회원 이동 팝업 -->
 	<div class="tooltip-wrap cvt_member_popup_wrap">
 	    <div class="popup-com cvt_member_layer" tabindex="0" data-tooltip-con="cvt_member_layer" data-focus="cvt_member_layer" data-focus-prev="cvt_member_layer-close">
@@ -1136,8 +1353,8 @@
 		<input type="hidden" id="divideTime" name="divideTime" value="">				<!--전송일자-->
 		
 		<input type="hidden" id="callFrom" name="callFrom" value="">					<!--완  보내는사람 -->	
-		<input type="hidden" id="callToList" name="callToList" value="">				<!--완  받는사람 리스트-->
-		<input type="hidden" id="varNmList" name="varNmList" value="">					<!--완  변수 이름  리스트-->
+<!-- 		<input type="hidden" id="callToList" name="callToList" value="">				완  받는사람 리스트 -->
+<!-- 		<input type="hidden" id="varNmList" name="varNmList" value="">					완  변수 이름  리스트 -->
 		<input type="hidden" id="varValList" name="varValList" value="">				<!--완  변수 리스트-->
 		
 		<input type="hidden" id="atSmishingYn" name="atSmishingYn" value="${atSmishingYn}">		<!--알림톡 스미싱 여부-->
@@ -1298,32 +1515,32 @@
 													</span>
 												</div>
 												<div class="receipt_num_midde">
-													<div class="listType list01" >
-														<div class="list_table list_head">
+													<div class="listType list01 callList_box_P">
+														<!-- <div class="list_table list_head">
 															<div class="cb_wrap">
 																<label for="select_all" class="label"></label>
 																<input type="checkbox" id="select_all">
 															</div>
 															<div class="list_table_num">
 																<p>휴대폰</p>
-<!--                                                                 <img src="/publish/images/sortUp.png"> -->
-<!--                                                                 <img src="/publish/images/sortDown.png"> -->
+                                                                <img src="/publish/images/sortUp.png">
+                                                                <img src="/publish/images/sortDown.png">
 															</div>
-<!-- 															<div class="list_table_name"> -->
-<!-- 																<p>이름</p> -->
-<!--                                                                 <img src="/publish/images/sortUp.png"> -->
-<!--                                                                 <img src="/publish/images/sortDown.png"> -->
-<!-- 															</div> -->
+															<div class="list_table_name">
+																<p>이름</p>
+                                                                <img src="/publish/images/sortUp.png">
+                                                                <img src="/publish/images/sortDown.png">
+															</div>
 														</div>
 														<div class="list_body_wrap" id="wrap01_body">
-														</div>
+														</div> -->
 													</div>
 													<div class="put_right">
 														<div class="btn_popup_wrap spc_wrap">
 															<button type="button" data-tooltip="popup06" class="btnType btnType7 popupAddr">주소록 불러오기</button>
 														</div>
 														<div class="btn_popup_wrap">
-															<button type="button" data-tooltip="popup02" class="btnType btnType7">엑셀 불러오기</button>
+															<button type="button" data-tooltip="popup07" class="btnType btnType7">엑셀 불러오기</button>
 														</div>
 														<div class="btn_popup_wrap">
 															<button type="button" data-tooltip="popup03" class="btnType btnType7 tab1">최근 전송내역</button>
@@ -1331,13 +1548,13 @@
 														<div class="btn_popup_wrap">
 															<button type="button" data-tooltip="popup03" class="btnType btnType7 tab2">자주보내는 번호</button>
 														</div>
-														<div class="btn_popup_wrap check_validity_wrap">
+														<!-- <div class="btn_popup_wrap check_validity_wrap">
 															<button type="button" class="btnType btnType7" id="check_validity">오류검사 <i class="qmMark"></i></button>
 															<div class="error_hover_cont send_hover_cont">
 																<p>휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능</p>
 																<span>(예시) 010-1234-0001(O) / 010-123-0001(X)</span>
 															</div>
-														</div>
+														</div> -->
 													</div>
 												</div>
 												<div class="list_bottom clearfix">
@@ -1577,7 +1794,7 @@
 		
 <!-- 주소록 불러오기 -->
 <div class="tooltip-wrap">
-	<div class="popup-com import_layer popup06" tabindex="0" data-tooltip-con="popup06" data-focus="popup06" data-focus-prev="popup06-close" style="width: 1000px">
+	<div class="popup-com import_layer popup06 adr_call_popup" tabindex="0" data-tooltip-con="popup06" data-focus="popup06" data-focus-prev="popup06-close" style="width: 1000px">
 		<div class="popup_heading">
 			<p><span>주소록 불러오기</p>
 			<button type="button" onClick="javascript:addrClose(); return false;">
@@ -1628,7 +1845,9 @@
 							<!--// table -->
 						</div>
 						<div class="popup_btn_wrap2">
-							<button type="button" onClick="javascript:addrToList(); return false;">추가</button>
+							<button type="button" onClick="javascript:addrToList_advc('all'); return false;">전체추가</button>
+							<button type="button" onClick="javascript:addrToList_advc('select'); return false;">선택추가</button>
+<!-- 							<button type="button" onClick="javascript:addrToList(); return false;">추가</button> -->
 							<button type="button" onClick="javascript:addrClose(); return false;">닫기</button>
 						</div>
 						<%-- 주소록 레이어 팝업 닫기 실행 코드 --%>
@@ -1717,44 +1936,58 @@
 
 
 
+<!--         <div class="popup-com import_layer popup07" tabindex="0" data-tooltip-con="popup07" data-focus="popup07" data-focus-prev="popup07-close"> -->
+<%--             <%@include file="/WEB-INF/jsp/web/kakao/msgdata/include/atDataIncludeExcel.jsp" %> --%>
+<!--         </div> -->
+
 <!-- 엑셀 불러오기 -->
+
 <form id="excelToolTipForm" name="excelToolTipForm" method="post">
-	<div class="tooltip-wrap">
-		<div class="popup-com import_layer popup02" tabindex="0" data-tooltip-con="popup02" data-focus="popup02" data-focus-prev="popup02-close">
-			<div class="popup_heading">
-				<p><span>엑셀</span> 불러오기</p>
-				<button type="button" class="tooltip-close" data-focus="popup02-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
-			</div>
-			<div class="layer_in">
-				<!-- 엑셀파일 불러오기 -->
-				<div class="hascont">
-					<div class="titBox">
-						<p>- 최대 2만 건까지 등록할 수 있습니다.</p>
-						<p>- [엑셀 불러오기]시 문서의 A, B열을 불러옵니다.(지원하는 파일 형식 : xls, xlsx)</p>
-						<p>- 휴대폰 항목은 숫자, 하이픈(-)만 인식하며, 번호 앞에 0이 생략되어도 정상 등록됩니다.
-						</p>
-						<!-- <button type="button" class="excel_btn" onclick="location.href='/cmm/fms/FileDown.do?atchFileId=FILE_000000000011651&fileSn=1'"><i></i>샘플파일 다운로드</button> -->
-						<button type="button" class="excel_btn" onclick="location.href='/download/msg/알림톡_엑셀주소록_등록양식.xlsx'"><i class="downroad"></i>샘플파일 다운로드</button>
-					</div>
-					<div class="attachedFile">
-						<label for="excelNm01" class="attachedFile_label">첨부파일</label>
-						<input type="text" id="excelNm01" value="" readonly>
-						<input type="file" id="excelFile01" accept=".xls, .xlsx" onchange="excelExportAjax(event); return false;" style="display:none"/>
-						<!-- <input type="file" id="excelFile01" accept=".xls, .xlsx" onchange="excelExport01(event); return false;" style="display:none"/> -->
-						<button type="button" class="btnType btnType6 c1">찾아보기</button>
-<!-- 						<p><span class="vMiddle">*</span> 첨부된 파일은 <span class="c_e40000">[추가]버튼을 클릭</span>하셔야 받는 사람에 등록됩니다.</p> -->
-						<p><span class="vMiddle">*</span> 첨부된 파일은 <span class="c_e40000">[추가]버튼을 클릭</span>하셔야 받는 사람에 등록됩니다.</p>
-					</div>
-				</div><!--// 엑셀파일 불러오기 -->
-				<div class="popup_btn_wrap2">
-					<button type="button" class="tooltip-close" data-focus="popup02-close"  data-focus-next="popup02" onclick="excelAddAjax()">추가</button>
-					<!-- <button type="button" class="tooltip-close" data-focus="popup02-close"  data-focus-next="popup02" onclick="excelAdd()">추가</button> -->
-					<button type="button" class="tooltip-close" data-focus="popup02-close"  data-focus-next="popup02">닫기</button>                      
-				</div>
-			</div>
-		</div>
-	</div><!--// 엑셀 불러오기 -->
+    <div class="tooltip-wrap">
+        <div class="popup-com import_layer popup07" tabindex="0" data-tooltip-con="popup07" data-focus="popup07" data-focus-prev="popup07-close">
+        
+            <%@include file="/WEB-INF/jsp/web/kakao/msgdata/include/atDataIncludeExcel.jsp" %>
+        </div>
+    </div>
 </form>
+<!-- 엑셀 불러오기 -->
+<!-- <form id="excelToolTipForm" name="excelToolTipForm" method="post">
+    <div class="tooltip-wrap">
+        <div class="popup-com import_layer popup07" tabindex="0" data-tooltip-con="popup07" data-focus="popup07" data-focus-prev="popup07-close">
+        
+        
+            <div class="popup_heading">
+                <p><span>엑셀</span> 불러오기</p>
+                <button type="button" class="tooltip-close" data-focus="popup07-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+            </div>
+            <div class="layer_in">
+                엑셀파일 불러오기
+                <div class="hascont">
+                    <div class="titBox">
+                        <p>- 최대 2만 건까지 등록할 수 있습니다.</p>
+                        <p>- [엑셀 불러오기]시 문서의 A, B열을 불러옵니다.(지원하는 파일 형식 : xls, xlsx)</p>
+                        <p>- 휴대폰 항목은 숫자, 하이픈(-)만 인식하며, 번호 앞에 0이 생략되어도 정상 등록됩니다.
+                        </p>
+                        <button type="button" class="excel_btn" onclick="location.href='/cmm/fms/FileDown.do?atchFileId=FILE_000000000011651&fileSn=1'"><i></i>샘플파일 다운로드</button>
+                        <button type="button" class="excel_btn" onclick="location.href='/download/msg/알림톡_엑셀주소록_등록양식.xlsx'"><i class="downroad"></i>샘플파일 다운로드</button>
+                    </div>
+                    <div class="attachedFile">
+                        <label for="excelNm01" class="attachedFile_label">첨부파일</label>
+                        <input type="text" id="excelNm01" value="" readonly>
+                        <input type="file" id="excelFile01" accept=".xls, .xlsx" onchange="excelExportAjax(event); return false;" style="display:none"/>
+                        <button type="button" class="btnType btnType6 c1">찾아보기</button>
+                        <p><span class="vMiddle">*</span> 첨부된 파일은 <span class="c_e40000">[추가]버튼을 클릭</span>하셔야 받는 사람에 등록됩니다.</p>
+                    </div>
+                </div>// 엑셀파일 불러오기
+                <div class="popup_btn_wrap2">
+                    <button type="button" class="tooltip-close" data-focus="popup07-close"  data-focus-next="popup07" onclick="excelAddAjax()">추가</button>
+                    <button type="button" class="tooltip-close" data-focus="popup07-close"  data-focus-next="popup07" onclick="excelAdd()">추가</button>
+                    <button type="button" class="tooltip-close" data-focus="popup07-close"  data-focus-next="popup07">닫기</button>                      
+                </div>
+            </div>
+        </div>
+    </div>// 엑셀 불러오기
+</form> -->
 <form id="excelVarFileForm" name="excelVarFileForm" method="post">
 	<input type="hidden" id="excelVarCnt" name="excelVarCnt" value="0"/>
 	<input type="hidden" id="excelVarList" name="excelVarList" value=""/>
 
src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_advcbackup_20250310.jsp
@@ -0,0 +1,1773 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ page import="itn.com.cmm.LoginVO" %>
+
+<!-- <script src="/publish/js/content.js"></script> -->
+<!-- 주소록관련 js -->
+<script type="text/javascript" defer src="<c:out value='/js/kakao/at/init.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/kakao/at/tabulator.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/kakao/at/addr.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/kakao/at/alimtalkExcel.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/kakao/at/priceClclt.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/common/popup.js' />"></script>
+<script type="text/javascript">
+var loginVO = '${loginVO}';
+
+// 체크박스 동적 바인딩
+$(document).on('click','.wrap01C', function(){
+	var total = $(".wrap01C").length;
+	var checked = $(".wrap01C:checked").length;
+	if(total != checked) $("#select_all").prop("checked", false);
+	else $("#select_all").prop("checked", true);
+});
+
+$(document).ready(function(){
+
+	//채널 ID change function
+	$("#selectKakaoProfileList").on("change", function(){
+		
+		if(usrDeptChk()){
+			
+			$("#selectTemplateList option").remove();
+			selectTemplateList();
+			
+		}else {
+			
+			$("#selectKakaoProfileList option:eq(0)").prop("selected", true);
+			
+		}
+		
+	});
+	
+	//템플릿 change function
+	$("#selectTemplateList").on("change", function(){
+		selectTemplateInfo($(this).val());
+		fn_viewDataInit02();
+		priceInit(); // 발송금액 라인 text / 금액 초기화
+	});
+	
+	$("#fileClick").click(function(){
+		if($('#selectTemplateList').val() == '')
+		{
+			alert('템플릿을 선택 후 진행해 주세요.');
+			return false;
+		}
+		if($("#tpButtonTypeDs").val() == "DS"){
+			alert("템플릿 내용에 배송조회 버튼이 포함되어 있습니다. \n운송장 번호는 숫자만 등록해주세요")
+		}
+		$('#excelFile').val('');
+		$("#excelFile").click();
+	});
+
+	//즉시 발송 라디오 버튼 선택시 숨김처리
+	$("#reserYnN").on('click', function(){
+		$('.rev_selected').hide();
+		$('.send_rev .send_content').css('padding-bottom','108px');
+		$('.send_btn .btnType:first-child').html('발송하기');
+		$('#bizForm #reserveYn').val($(this).val());
+	});
+
+	//예약 발송 라디오 버튼 선택시 숨김 해제처리
+	$("#reserYnY").on('click', function(){
+		$('.rev_selected').show();
+		$('.send_rev .send_content').css('padding-bottom','0');
+		$('.send_btn .btnType:first-child').html('예약하기');
+		$('#bizForm #reserveYn').val($(this).val());
+	});
+
+	//전체선색 버튼 이벤트
+	$("#select_all").on('click', function(){
+		if($("#select_all").is(":checked")) $(".wrap01C").prop("checked", true);
+		else $(".wrap01C").prop("checked", false);
+		
+	});
+	
+	//선택삭제 버튼 클릭 이벤트
+	$("#select_del").on('click', function(){
+		
+		if($('.wrap01C:checkbox:checked').length < 1)
+		{
+			alert("삭제할 연락처를 선택해주세요.!!");
+			return false;
+		}
+		
+		$('.wrap01C').each(function(index, item){
+			if($(item).is(':checked'))
+				$(item).parent().parent().remove();
+		});
+		updateTotCnt();
+	});
+
+	//선택삭제 버튼 클릭 이벤트
+ 	$("#all_del").on('click', function(){
+		
+		if(!confirm("받는사람 목록을 모두 삭제하시겠습니까?"))
+			return false;
+		
+		$('#wrap01_body .list_body').remove();
+
+		$('#rowTotCnt').text(0);
+		$('#rowDupCnt').text(0);
+	});
+
+	/* 
+	* 오류 검사
+	*/
+	$('#check_validity').click(function(){
+		var regExp_ctn = /^(01[016789]{1}|02|0[3-9]{1}[0-9]{1})([0-9]{3,4})([0-9]{4})$/;
+		// 치환문자 있는 데이터
+		if($('#bizForm #txtReplYn').val() === 'N'){
+
+			if($('.phoneArea').length < 1){
+				alert("등록된 연락처가 없습니다.")
+				return false;
+			}
+
+			$('.phoneArea').each(function(index, item){
+				var phoneVal = $(item).text().trim();
+				if(phoneVal.length==11 || phoneVal.length==10) 
+				{
+					if(!regExp_ctn.test(phoneVal))
+					{
+						alert(phoneVal+"는 유효하지 않은 전화번호 입니다.");
+						return false;
+					}
+				}
+				else
+				{
+					alert("유효하지 않은 전화번호 입니다.");
+					return false;
+				}
+			});
+			alert("오류 데이터가 없습니다.");
+		}
+	});
+	
+	/**
+	* 템플릿 재선택 버튼 function
+	*/
+	$('#reSelectBtn').click(function(){
+		var senderKey = $('#selectKakaoProfileList option:selected').val();
+
+		if(!senderKey)
+		{
+			alert("채널ID를 선택하고 다시 시도해 주세요.");
+			return false;
+		}
+			
+			
+		var url = "";
+		var windowTargetName = "KakaoAlimtalkTemplateListPopupAjax";
+// 		var features = "width=930, height=860, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=yes";
+		// 2.POST로 데이터 전달
+		document.templateListPopup.senderKey.value=$('#selectKakaoProfileList option:selected').val();
+		document.templateListPopup.yellowId.value=$('#selectKakaoProfileList option:selected').text();
+		document.templateListPopup.target=windowTargetName;
+		showPopup2('',windowTargetName ,'930','860');
+		document.templateListPopup.submit();
+	
+	});
+	
+	
+
+	$("#send_fail_check").change(function(){
+		if($("#send_fail_check").is(":checked")){
+
+			
+			if(loginVO == "" || loginVO == null){
+				alert("로그인 후 사용 가능한 기능입니다.");
+				location.href="<c:url value='/web/user/login/login.do'/>";
+				return false;
+				
+				$("#send_fail_check").prop("checked", false);
+			}
+			
+			if($('#callFromList').val() === ''){
+				
+				if(confirm('대체문자 전송을 위한 발신번호가 등록되지 않았습니다. \n대체문자 발신번호를 지금 등록하시겠습니까?')){
+					window.location="<c:out value='/web/user/sendNumberManage.do' />";
+				}
+				$("#send_fail_check").prop("checked", false);
+				
+			}else if($('#selectTemplateList').val() == '')
+			{
+				alert('템플릿을 선택 후 진행해 주세요.');
+				$("#send_fail_check").prop("checked", false);
+				return false;
+			}else{
+				// 에러버튼 체크 초기화
+				fn_insertErrorYN('N');
+				
+				$('#smsTxtArea').val('');
+// 				// 미리보기 텍스트를 가져와 줄바꿈 처리 후 대체문자 내용으로 입력
+				var template_text = $('.template_text').html().trim();
+				template_text = XSSChange(template_text);
+				$('#smsTxtArea').val(template_text);
+
+// 				//문자 내용 입력시 바이트수 계산하기
+				
+				$(".replace_send_wrap").slideDown(400);
+				thisFnByteString($('#smsTxtArea').val());
+			}
+		}else{
+			$(".replace_send_wrap").slideUp(400);
+			// 초기화 버튼 클릭
+			$('#failCheckInit').click();
+			$('.send_top .send_right .phone').css({'top': '0','transition': 'top .4s linear'});
+		}
+
+		// 금액 계산 fn 호출
+		fn_priceClclt();
+	});
+	
+	// 대체문자 내용 수정
+	$('#smsTxtArea').keyup(function(){
+		// 금액 계산 fn 호출
+		fn_priceClclt();
+		// 문자 바이트수 체크
+		thisFnByteString($('#smsTxtArea').val());
+		// 에러버튼 체크 초기화
+		fn_insertErrorYN('N');
+		
+	});
+});
+function sendFailCheckInit(){
+	
+	$("#send_fail_check").prop("checked", false);
+	
+}
+
+function fnTemplateReg(){
+	if(loginVO == "" || loginVO == null){
+		alert("신규 템플릿 등록 서비스는 로그인 후 이용 가능합니다.");
+		location.href="<c:url value='/web/user/login/login.do'/>";
+		return false;
+	}
+	if(usrDeptChk()){
+		
+		if(confirm('신규 템플릿 등록 화면으로 이동하시겠습니까?')){
+			location.href="<c:url value='/web/mjon/kakao/template/selectKaKaoTemplateList.do'/>";
+		}
+	}
+	
+}
+
+/*
+ * 탬플릿 재선택 팝업에서 실행하는 function
+ */
+function call_templateChange(templateId){
+	
+	$('#selectTemplateList').val(templateId).prop('selected', true);
+	selectTemplateInfo(templateId);
+// 	$('#selectTemplateList').val('bizp_2023021711142018819557746').prop('selected', true);
+}
+
+
+/**
+ * 먼저 불러온 DATA가 있으면 삭제
+ * !! 화면에 보이는 data만 삭제 !!
+ * 치환 데이터 
+ */
+function fn_viewDataInit01(){
+
+	// excel Data (치환 문자 table) 비우기
+	$('#excelHead').empty();
+	$('.excelBody').remove();
+	$('#excelNm01').val('');
+	// 치환문자 없을 경우
+// 	$('#wrap01_body .list_body').remove();
+}
+
+/**
+ * 먼저 불러온 DATA가 있으면 삭제
+ * !! 화면에 보이는 data만 삭제 !!
+ * 총건수, 중복건수 데이터 0으로 초기화
+ * 엑셀 불러오기 데이터 
+ */
+function fn_viewDataInit02(){
+	$('.excelBody').remove();
+	$('#excelHead').empty();
+	$('#rowTotCnt').text("0");
+	$('#rowDupCnt').text("0");
+}
+
+/*
+ *변수 다운로드 excel show function
+ */
+function variableWrapShow(){
+	$(".receiver_wrap02").attr("style","display: block !important;");
+	$(".receiver_wrap01").attr("style","display: none !important;");
+	$(".variable_wrap").show();
+	$('#bizForm #txtReplYn').val('Y');
+	
+}
+
+/*
+ * 변수 다운로드 excel hide function
+ */
+function variableWrapHide(){
+	$(".receiver_wrap01").attr("style","display: block !important;");
+	$(".receiver_wrap02").attr("style","display: none !important;");
+	$(".variable_wrap").hide();
+	$('#bizForm #txtReplYn').val('N');
+	
+}
+
+
+/*
+ * 등록된 발신 탬플릿 목록 조회 function
+ */
+function selectTemplateList(){
+	var selectAgentCode = $("select[name='selectKakaoProfileList']").val();
+	$.ajax({
+		type: "POST"
+		, url: "<c:out value ='/web/mjon/kakao/alimtalk/selectKakaoApiTemplateAjax.do' />"
+		, data:{ "senderKey":selectAgentCode, "pageType":"notityTalk"}
+		, dataType:'json'
+		, cache: false
+		, async: false
+		, timeout: 600000
+		, success: function (returnData, status) {
+			if(status == 'success'){
+				
+				$("#selectTemplateList option").remove();
+				$("#selectTemplateList").append("<option value=''>알림톡 템플릿 선택</option>");
+				
+				var list =  returnData.kakaoTemplateList;
+				for(var i=0; i < list.templatList.length; i++){
+					$("#selectTemplateList").append("<option value='"+list.templatList[i].templateCode+"'>"+list.templatList[i].templateName+"</option>");
+				}
+				
+			} else if(status== 'fail'){
+				alert(returnData.message);
+			}
+		}
+		,error: function (e) {
+			console.log("ERROR : ", e);
+			alert("관리자에게 문의해 주세요");
+		}
+	});
+}
+
+/*
+ * 템플릿 선택하여 정보 가져오는 function
+ */
+function selectTemplateInfo(id){
+	
+	var selectAgentCode = $("select[name='selectKakaoProfileList']").val();
+	
+	$("#alimtalkTemplate").empty();
+	
+	// 우측 본문내용 만들기
+	$("#alimtalkTemplate").load("/web/mjon/kakao/template/selectKakaoApiTemplateDataViewLoadAjax.do"
+	, {
+		"senderKey":selectAgentCode
+		, "templateCode" : id
+	},function(){
+		
+
+		// =================== 대체문자 숨김 / html 초기화
+		$(".replace_send_wrap").slideUp(400);
+		// 초기화 버튼 클릭
+		$('#failCheckInit').click();
+		$('.send_top .send_right .phone').css({'top': '0','transition': 'top .4s linear'});
+		$("#send_fail_check").prop("checked", false);
+		// //=================== 대체문자 숨김 / html 초기화
+		
+		
+		// 미리보기에 채널ID 노출 
+		$('#prev_p_top').text($('#selectKakaoProfileList option:selected').text());
+		
+		
+		var tpTemplateContent = $('#tpTemplateContent').val();
+		$("#senderKeyInfo").val(selectAgentCode);
+		$("#templateCodeInfo").val($('#tpTemplateCode').val());
+			
+		//엑셀 샘플 정보 - 내용만 변수처리하기
+		$("#excelTemplateContent").val(tpTemplateContent);
+		$("#excelTemplateSubtitle").val($('#tpTemplateSubtitle').val());
+		$("#excelTemplateTitle").val($('#tpTemplateTitle').val());
+		
+		if(($('#tpTemplateEmphasizeType').val() != "NONE") || $('#tpBottonListSize').val() != "0"){
+			$('#bizForm #bizJsonYn').val('Y');
+		}else{
+			$('#bizForm #bizJsonYn').val('N');
+		}
+		
+		
+		if($('#tpTemplateEmphasizeType').val() == "TEXT"){
+			$("#templateEmphasizeType").val($('#tpTemplateEmphasizeType').val());
+			$("#templateTitle").val($('#tpTemplateTitle').val());
+			$("#templateSubtitle").val($('#tpTemplateSubtitle').val());
+		}
+		
+		$("#bizForm  #templateContent").val(tpTemplateContent);
+		templateChange();
+	
+	});
+}
+
+/*
+ * 알림톡 변수가 있는지 체크해서 변수 다운로드 excel show / hide 하는 function
+ */
+function templateChange(){
+	var varList = $("#excelTemplateContent").val().match(/#\{([^}]+)\}/g);
+	if(varList == null)
+		variableWrapHide();
+	else
+		variableWrapShow();
+	
+}
+//엑셀 업로드 양식 다운로드 받기
+function excelDownload(){
+	
+	if(loginVO == "" || loginVO == null){
+		alert("변수설정 엑셀파일 다운로드는 서비스는 로그인 후 이용 가능합니다.");
+		location.href="<c:url value='/web/user/login/login.do'/>";
+		return false;
+	}
+	
+	var profile = $("#selectKakaoProfileList").val();
+	var template = $("#selectTemplateList").val();
+	
+	if(profile == ''){
+		
+		alert("채널ID를 선택해주세요.");
+		return false;
+		
+	}
+	
+	if(template == ''){
+		
+		alert("알림톡 템플릿을 선택해주세요.");
+		return false;
+		
+	}
+	
+	//합친 내용에서 변수 문자열 뽑기 - #과{}미포함
+	var fullVarList = $("#excelTemplateContent").val().match(/(?<=\#\{)(.*?)(?=\})/g);
+	$('#excelForm #varNmList').val(fullVarList);
+	$('#excelForm').submit();
+	
+}
+
+function checkConf() {
+	var confCheck = false;
+	
+	$.ajax({
+		type: "POST",
+		url: "/web/mjon/conf/selectMjonMsgUseConfAjax.do",
+		data: {},
+		dataType:'json',
+		async: false,
+		success: function (returnData, status) {
+			if(returnData.result == "fail") {
+				console.log(returnData.message);
+			}else if(returnData.result == "success"){
+				confCheck = true;
+			}
+		}
+		,error: function (e) {console.log("ERROR : ", e); }
+	});	
+	
+	return confCheck;
+}
+
+/*
+ *	등록된 발신 탬플릿 카카오톡 전송 
+ */
+function sendTemplateInfo(){
+
+	if(!checkConf()){	//문자온 conf-check
+		alert("현재 알림톡 발송하기 기능 점검 중입니다.\n\n1분 후 다시 시도해주세요.");
+		return false;
+	}
+	
+	if(loginVO == "" || loginVO == null){
+		alert("카카오톡 발송 서비스는 로그인 후 이용 가능합니다.");
+		location.href="<c:url value='/web/user/login/login.do'/>";
+		return false;
+	}
+	
+	if(!usrDeptChk()){
+		return false;
+	}
+	
+	//채널ID / 템플릿 선택
+	if(!$('#selectKakaoProfileList').val())
+	{
+		alert('채널ID를 선택 후 발송해 주세요');
+		return false;
+	}
+	
+	if(!$('#selectTemplateList').val() )
+	{
+		alert('템플릿을 선택 후 발송해 주세요');
+		return false;
+	}
+	
+	//수신자 목록 체크
+	if($('.phoneArea').length < 1)
+	{
+		alert('받는 사람 입력 후 발송해 주세요');
+		return false;
+	}
+	
+	//수신자 목록 체크
+	if($('.phoneArea').length > 500)
+	{
+		alert("최대 발송 건수는 500건 입니다.");
+		return false;
+	}
+	
+
+	if($('#errorChk').val() === 'N' 
+			&& $("#send_fail_check").is(":checked")
+			&& $('#txtReplYn').val() === 'Y'
+	)
+	{
+		alert('대체문자 전송을 원하시면 오류검사 버튼을 확인해 주세요.');
+		return false;
+	}
+	
+	// 금액 확인
+	// 사용자 금액
+	var userMoney = $('#oriUserMoney').val();
+	// 발송 금액
+	var totalPriceTxt = $('#totalPriceTxt').text();
+	// 금액 확인
+	var resutlPrice = parseFloat(userMoney)-parseFloat(totalPriceTxt);
+
+	// 음수면 -1 값
+	if(Math.sign(resutlPrice) < 0)
+	{
+		alert("발송에 필요한 회원님의 보유 잔액이 부족 합니다.");
+		return false;
+	}
+	
+	// 초기화
+	$('.varValList').remove();
+	$('#bizForm #varNmList').val('');
+
+
+	// 대체문자 전송 확인
+	if($('#send_fail_check').is(':checked')){
+		$('#bizForm #subMsgSendYn').val("Y");
+		$('#bizForm #subMsgTxt').val($("#smsTxtArea").val());
+		
+		var subMsgTxt = $("#smsTxtArea").val().match(/#\{([^}]+)\}/g);
+		if(subMsgTxt == null){
+			$('#bizForm #subMsgTxtReplYn').val("N");
+		}else{
+			$('#bizForm #subMsgTxtReplYn').val("Y");
+		}
+	}else{
+		$('#bizForm #subMsgSendYn').val("N");
+	}
+	
+	// 예약문자 및 분할전송 확인
+	var reserYn = $("input[name=reserYn]:checked").val(); // 예약 발송 여부 확인
+	$('#bizForm #reserveYn').val(reserYn);
+	if(reserYn == 'Y'){
+		
+		var date = $(".resDate").val();//form.msgResDate.value;
+		var hour = $("select[name='msgResHour']").val();
+		var min = $("select[name='msgResMin']").val();
+		
+		if(date == ""){
+			alert("예약전송 날짜를 선택해 주세요.");
+			return false;
+			
+		}else{
+			
+			var now = new Date();
+			var reqDate = date + " " + hour + ":" + min + ":00";
+			var gapDate = getGapDayTime(date, hour, min);
+			
+			if(gapDate < 0){ // 음수이면 이전날짜, 크면 이후 날짜.
+				alert("예약 날짜는 현재 시간 이후의 날짜 및 시간을 선택해 주세요.");
+				return false;
+			}else{
+				$('#bizForm #reqDate').val(reqDate);
+			}
+		}
+		
+		var divideChk =  "";
+		if($('#inputDivideChk').is(':checked')){
+			divideChk = "Y";
+		}else{
+			divideChk = "N"
+		}
+		
+		//var divideCnt = $("select[name='frmDivideCnt']").val();
+		var divideCnt = $('#frmDivideCnt').val();
+		var divideTime = $("select[name='divideTime']").val();
+		
+		$('#bizForm #divideChk').val(divideChk);
+		$('#bizForm #divideCnt').val(divideCnt);
+		$('#bizForm #divideTime').val(divideTime);
+		
+	}else{
+		$('#bizForm #reqDate').val("");
+	}
+	
+	// 치환문자 있는 데이터 파씽
+	if($('#bizForm #txtReplYn').val() === 'Y'){
+		fn_excelDataTransParsing();
+		// 치환문자 있는 수신자 리스트 
+		fn_transCallToListParsing();
+	}else{
+		// 치환문자 없는 수신자 리스트 
+		fn_callToListParsing();
+	}
+
+	$('#bizForm #senderKey').val($('#selectKakaoProfileList').val());
+	$('#bizForm #templateCode').val($('#selectTemplateList').val());
+	
+	// 발신번호
+	$('#bizForm #callFrom').val(removeDash($('#callFromList option:selected').val()));
+	
+	if(confirm("알림톡을 발송하시겠습니까?")){
+		var spamChk = true;
+		//2023.09.06 알림톡 스팸체크 기능 제거요청으로 인한 주석처리
+		/*var spamChk = false;
+		var spmData = new FormData(document.bizForm);
+		$.ajax({
+			type: "POST"
+			, url: "/web/mjon/alimtalk/selectSpamKakaoAlimtalkMsgChkAjax.do"
+			, data: spmData
+			, dataType:'json'
+			, async: false
+			, processData: false
+			, contentType: false
+			, cache: false
+			, success: function (returnData, status) {
+				if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
+					
+					if("fail" == returnData.result){
+						alert(returnData.message);
+						return false;
+					}else if("loginFail" == returnData.result){
+						alert(returnData.message);
+						return false;
+					}else if("spams" == returnData.result){
+						alert("전송 내용에  스팸문구가 포함되어 있습니다.")
+						return false;
+					}else{
+						spamChk = true;
+						return false;
+					}
+					
+				} else if(status== 'fail'){
+					alert(returnData.message);
+					return false;
+				}
+			}
+			, error: function (e) {
+				alert("문자 발송에 실패하였습니다.");
+				console.log("ERROR : ", e);
+				return false;
+			}
+		}); */
+		
+		if(spamChk){
+			var data = new FormData(document.bizForm);
+			$.ajax({
+				type: "POST"
+				, url: "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax.do"
+//				, url: "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax_advc.do"
+				, data: data
+				, dataType: 'json'
+				, async: true
+				, processData: false
+				, contentType: false
+				, cache: false
+				, success: function (returnData, status) {
+					console.log('returnData : ', returnData);
+					if(status == 'success'){
+						/* if("loginFail" == returnData.result){
+							
+							alert(returnData.message);
+							return false;
+							
+						}else  if('fail' == returnData.result){
+							
+							alert(returnData.message);
+							return false;
+							
+						}else if('authFail' == returnData.result){
+							
+							alert(returnData.message);
+							location.reload();
+							
+						} else if(status == 'success'){
+							
+							var kakaoSendCnt = returnData.resultSts;
+							
+							$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
+							
+							//예약발송 건의 경우 결과 팝업 문구 변경
+							if(reserYn == 'Y'){
+								$('.pop_msg_success .msg_text').html("예약 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 예약 되었습니다.");
+							}else{
+								$('.pop_msg_success .msg_text').html("발송 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 발송 되었습니다.");
+							}
+							
+							$('.mask').addClass('on');
+						} */
+					}
+				}
+				,beforeSend : function(xmlHttpRequest) {
+					//로딩창 show
+					$('.loading_layer').addClass('active');
+				}
+				,complete : function(xhr, textStatus) {
+					//로딩창 hide
+					$('.loading_layer').removeClass('active');
+				}
+				,error: function (e) {
+					console.log("ERROR : ", e);
+					alert("카카오 알림톡 전송에 실패하였습니다.");
+				}
+			}); 
+		}
+	}
+}
+
+/*
+ *	치환문자 있는 수신자 목록 파씽
+ */
+function fn_transCallToListParsing(){
+	var callToList = [];
+	// excel body
+	$('.excelBody').each(function(indexBody, itemBody){
+		$(itemBody).find('.list_table_name').each(function(indexRow, itemRow){
+			if(indexRow == 0)
+			{
+				callToList.push($(itemRow).text().replaceAll('\\t', ''));
+			}
+		});
+	});
+	$('#bizForm #callToList').val(callToList);
+
+}
+
+/*
+ *	치환문자 없는 수신자 목록 파씽
+ */
+function fn_callToListParsing(){
+
+	var callToList = [];
+	// excel body
+	$('.phoneArea').each(function(index, item){
+			callToList.push($(item).text().replaceAll('\\t', ''));
+	});
+	
+	$('#bizForm #callToList').val(callToList);
+
+}
+
+/*
+ *	받는사람 excel data 파씽
+ */
+function fn_excelDataTransParsing(){
+
+	
+	// title 배열
+	var varHead = [];
+	// 값 배열
+	var varVal = [];
+	
+	var inputTag = '<input type="hidden" class="varValList" name="varValList[$INDEX$]" value="$VAL$">';
+	
+	// excel title
+	$('#excelHead').find('div').each(function(index, item){
+		if(index != 0)
+			varHead.push($(item).text().replaceAll('\\t', ''));
+	});
+	$('#bizForm #varNmList').val(varHead);
+	
+	// excel body
+/* 	$('.excelBody').each(function(index, item){
+		varValTemp = [];
+		$(item).find('.list_table_name').each(function(index, item){
+			if(index != 0){
+				if(index == 1){
+					varValTemp = $(item).text().replaceAll('\\t', '');
+				}else
+					varValTemp += ","+$(item).text().replaceAll('\\t', '');
+			}
+		});
+		
+		$("#bizForm").append(inputTag.replace('$VAL$',varValTemp ).replace('$INDEX$',index ));
+	}); */
+	
+	$('.excelBody').each(function(index, item){
+		
+		var valLeng = $('#excelHead').find('.list_table_name').length-1;
+		varValTemp = '';
+		
+		$(item).find('.list_table_name').each(function(index, item){
+			if(index != 0)
+			{
+				var itemText = $(item).text().replaceAll('\\t', '');
+				if(index !== 1)
+					varValTemp += '§'+itemText.replaceAll(',', 'Ï');
+				else
+					varValTemp += itemText.replaceAll(',', 'Ï');
+			}
+		});
+		console.log('varValTemp : ',varValTemp);
+		varVal.push(varValTemp);
+	});
+	$('#bizForm #varValList').val(varVal);
+}
+
+
+
+//주소록 불러오기 버튼 클릭시
+$('.popupAddr').click(function(){
+	
+	if(loginVO == "" || loginVO == null){
+		alert("주소록 불러오기 서비스는 로그인 후 이용 가능합니다.");
+		location.href="<c:url value='/web/user/login/login.do'/>";
+		return false;
+	}
+	
+	$("#addrGroupLoad").load("/web/mjon/msgdata/selectAddrGroupListAjax.do", "" ,function(response, status, xhr){
+		//리스트 스크롤 처리해주기
+		$(".adr_pop_list").mCustomScrollbar({
+			axis: 'y',
+			scrollbarPosition: "outside",
+			theme: "dark",
+			autoHideScrollbar: false
+		});
+	});
+	
+});
+
+
+//알림톡 상세보기 화면 호출
+function fnTemplateDetail(templateCode){
+	var form = document.templateForm;
+	var selectAgentCode = $("select[name='selectKakaoProfileList']").val();				// 선택 채널ID
+	
+	form.senderKey.value = selectAgentCode;
+	form.templateCode.value = templateCode;
+	form.target='_blank';
+	form.action="/web/mjon/kakao/template/requestKakaoApiTemplateDetail.do";
+	form.submit();
+	
+}
+
+
+//문자 바이트수 계산하기 함수
+function thisFnByteString(contents){
+	var totalByte = 0; 
+	//var content = contents;
+	var adverYn = $("input[name='send_adYn']:checked").val();
+	var adTxtLeng = 0;
+	var denyTxtLeng = 0;
+
+	$('#msgLeng').html("");
+	$('#limitLeng').html("");
+	var conLeng = conByteLeng(contents); // 내용 문자 입력 바이트 수 계산하기
+	
+		
+	$('#msgLeng').text(conLeng);
+	
+	//문자 길이 변수에 저장해주기
+	$('#smsLen').val(conLeng);
+	
+	
+	if(conLeng > 90){
+		
+		$('#msgLeng').html(conLeng + " / ");
+		$('#limitLeng').html("2000");
+		$('.msg_com').html("장문");
+		$('#msgType').val("6"); // 메세지 타입 설정
+		
+		$('.msg_com').removeClass("msg_short"); //단문 클래스 삭제하고
+		$('.put_left').removeClass("short"); //내용 입력 박스 클래스 삭제
+		$('.msg_com').addClass("msg_long"); // 장문 클래스 삽입
+// 		$('.put_left').addClass("long");  // 내용 입력 박스에 클래스 삽입
+// 		$('.msg_title').addClass('active');
+		//document.getElementById("mmsSubject").disabled = false;
+		
+	}else{
+		
+		$('#msgLeng').html(conLeng + " / ");
+		$('#limitLeng').html("90");
+		$('.msg_com').html("단문");
+		$('#msgType').val("4"); // 메세지 타입 설정
+		$('.msg_com').removeClass("msg_long"); //단문 클래스 삭제하고
+		$('.put_left').removeClass("long"); //내용 입력 박스 클래스 삭제
+		$('.msg_com').addClass("msg_short"); // 장문 클래스 삽입
+// 		$('.put_left').addClass("short");  // 내용 입력 박스에 클래스 삽입
+// 		$('.msg_title, .title_wrap .textbox').removeClass('active');
+		
+	}
+		
+	//수신목록 전체 데이터 갯수 구하기
+	updateTotCnt(totRows);
+}
+
+/**
+ * @description 대체문자 오류체크 funciton
+ */
+function fn_errorChk(){
+
+	// 대체문자가 없을 시 return false;
+	if($('#txtReplYn').val() === 'N')
+	{
+		alert('오류가 없습니다.');
+		return false;
+	}
+
+	// 치환 부분 변수명만 추출 = 배열
+	var varList = $("#excelTemplateContent").val().match(/#\{([^}]+)\}/g);
+	
+	var smsTxt = $('#smsTxtArea').val();
+	for(var i=0; i < varList.length; i++){
+		if(smsTxt.indexOf(varList[i]) < 0){
+			if(confirm(varList[i] + '값이 없습니다. 치환문자 없이 진행하시겠습니까?')){
+				fn_insertErrorYN('Y');
+			};
+			return false;
+		}
+		smsTxt = smsTxt.replace(varList[i], '');
+	};
+	alert('오류가 없습니다.');
+	fn_insertErrorYN('Y');
+}
+
+
+function fn_insertErrorYN(val){
+	$('#errorChk').val(val);
+}
+
+function msgResultLink(){
+	var reserYn = $("input[name=reserYn]:checked").val(); // 예약 발송 여부 확인
+	if(reserYn == 'Y'){
+		
+		location.href="/web/mjon/reservmsg/selectReservKaKaoView.do";
+		
+	}else{
+		location.href="/web/kakao/sent/selectKakaoSentView.do";
+	}
+}
+
+function msgSuccessClose(obj){
+	$(obj).closest('.pop_msg_success').attr('style','');
+	location.reload(true);
+	$('html').scrollTop(0);
+}
+
+function goToKakaoTestPopUp(){
+	
+	if(loginVO == "" || loginVO == null){
+		alert("테스트 발송 서비스는 로그인 후 이용 가능합니다.");
+		location.href="<c:url value='/web/user/login/login.do'/>";
+		return false;
+	}
+	
+	//기업회원 체크
+	if(!usrDeptChk()){
+		return false;
+	}
+	
+	var form = document.kakaoAtDataTestPopupForm;
+	var selectAgentCode = $("select[name='selectKakaoProfileList']").val();
+	var selectTemplateCode = $("select[name='selectTemplateList']").val();
+	var selectAgentTxt = $('#selectKakaoProfileList option:selected').text()
+	var txtRepYn =  $('#bizForm #txtReplYn').val();
+	var tpTemplateContent = $('#tpTemplateContent').val();
+	var jsonYn = $('#bizForm #bizJsonYn').val();
+	
+	if(selectAgentCode == '') {
+		alert("채널ID를 선택하고 다시 시도해 주세요.");
+		return false;
+	}
+	
+	if(selectTemplateCode == ''){
+		alert('템플릿을 선택 후 진행해 주세요.');
+		return false;
+	}
+
+	// 치환문자 있는 데이터 파씽
+	if($('#bizForm #txtReplYn').val() === 'Y'){
+		
+		//수신자 목록 체크
+		if($('.phoneArea').length < 1){
+			alert('받는 사람 입력 후 발송해 주세요');
+			return false;
+		}
+		
+		// title 배열
+		var varHead = [];
+		// 값 배열
+		var varVal = [];
+		
+		// excel title
+		$('#excelHead').find('div').each(function(index, item){
+			if(index != 0)
+				varHead.push($(item).text().replaceAll('\\t', ''));
+		});
+		form.varNmList.value = varHead;
+		
+		$('.excelBody').each(function(index, item){
+			varValTemp = '';
+			
+			if(index == 0){
+				$(item).find('.list_table_name').each(function(index, item){
+					if(index != 0)
+					{
+						if(index !== 1)
+							varValTemp += '§'+$(item).text().replaceAll('\\t', '');
+						else
+							varValTemp += $(item).text().replaceAll('\\t', '');
+					}
+				});
+				varVal.push(varValTemp);
+			}
+		});
+		form.varValList.value = varVal;
+	}
+	
+	form.senderKey.value = selectAgentCode;
+	form.templateCode.value = selectTemplateCode;
+	form.agentCodeTxt.value = selectAgentTxt;
+	form.txtReplYn.value = txtRepYn;
+	form.templateContent.value = tpTemplateContent;
+	form.bizJsonYn.value = jsonYn;
+	
+	form.method = "post"; 
+	window.open("about:blank", 'testSendPop', 'width=770, height=850, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=1');
+	form.target = "testSendPop";
+	form.action = "/web/mjon/kakao/alimtalk/selectKakaoAlimtalkTemplateDataTestPopup.do";
+	form.submit();
+}
+
+function goToReservKaKaoView(){
+	location.href="/web/mjon/reservmsg/selectReservKaKaoView.do";
+}
+
+function goToSendKaKaoView(){
+	location.href="/web/kakao/sent/selectKakaoSentView.do";
+}
+function goToPayUserKaKaoView(){
+	location.href="/web/member/pay/PayUserWithKakaoList.do";
+}
+
+function checkNumber(event) {
+	var divideCnt = $('#frmDivideCnt').val();
+	if(!(event.key >= 0 && event.key <= 9)) {
+		return false;
+	}
+	
+	var totCnt = divideCnt + "" + event.key;
+	if(Number(totCnt) > 5000){
+		alert("분할전송 건수는 5,000건을 초과할 수 없습니다.");
+		$('#frmDivideCnt').val("20");
+		return false;
+	}
+  
+  return true;
+}
+
+</script>
+
+	<div class="loading_layer">
+		<div class="loading_container">
+			<div class="bar"></div>
+			<div class="text">Loading</div>
+		</div>
+	</div>
+	
+	<!-- 기업회원 이동 팝업 -->
+	<div class="tooltip-wrap cvt_member_popup_wrap">
+	    <div class="popup-com cvt_member_layer" tabindex="0" data-tooltip-con="cvt_member_layer" data-focus="cvt_member_layer" data-focus-prev="cvt_member_layer-close">
+	       <div class="popup_heading">
+	           <p>알림</p>
+	           <button type="button" class="tooltip-close" data-focus="cvt_member_layer-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+	       </div>
+	       <div class="layer_in">
+	           <p>카카오톡 알림톡은 기업회원만 전송 가능합니다.<br>기업회원 전환 페이지로 이동하시겠습니까?</p>
+	           <div class="popup_btn_wrap2">
+	           	<button type="button" onclick="location.href='/web/user/membershipChange.do'">확인</button>
+	               	<button type="button" class="tooltip-close" data-focus="cvt_member_layer-close" data-focus-next="cvt_member_layer">취소</button>
+	            </div>
+	        </div>
+	    </div>
+	</div>
+	<button type="button" id="btnDeptPop" data-tooltip="cvt_member_layer" style="display: none;"></button>
+		
+
+	<!-- 템플릿 설정 디테일을 위한 FORM -->
+	<form id="templateForm" name="templateForm" method="post">
+		<input type="hidden" name="senderKey" value=""/>
+		<input type="hidden" name="templateCode" value=""/>
+		<input type="hidden" name="arrTemplateCode" value=""/>
+	</form>
+
+	<form id="bizForm" name="bizForm" method="post">
+		<input type="hidden" id="menuTopTab" name="menuTopTab" value="tabAlim">
+		<input type="hidden" id="senderKey" name="senderKey" value="">					<!-- 카카오 보내는 사람 Key -->
+		<input type="hidden" id="templateCode" name="templateCode" value="">			<!-- 카카오 전송 templat Code -->
+		
+		<input type="hidden" id="templateEmphasizeType" name="templateEmphasizeType" value="">		<!-- 카카오 전송 templateEmphasizeType 타입 -->
+		
+		<input type="hidden" id="templateContent" name="templateContent" value="">		<!-- 카카오 전송 templat내용 -->
+		<input type="hidden" id="templateTitle" name="templateTitle" value="">			<!-- 카카오 전송 templat 타이틀 -->
+		<input type="hidden" id="templateSubtitle" name="templateSubtitle" value="">	<!-- 카카오 전송 templat 서브 타이틀 -->
+		
+		<input type="hidden" id="subMsgTxtReplYn" name="subMsgTxtReplYn" value="">		<!-- 대체문자 전송내용에 변환문자가 있는지-->
+		<input type="hidden" id="subMsgSendYn" name="subMsgSendYn" value="">			<!-- 대체문자 전송여부 - 알림톡 전송 실패 시 문자 전송-->  
+		<input type="hidden" id="subMsgTxt" name="subMsgTxt" value="">					<!-- 대체문자 전송내용 -->
+		<input type="hidden" id="txtReplYn" name="txtReplYn" value="N">					<!-- 완 치환문자 여부 - --> 	
+		<input type="hidden" id="bizJsonYn" name="bizJsonYn" value="">					<!-- JSON 생성 여부 -->
+		
+		<input type="hidden" id="reserveYn" name="reserveYn" value="">					<!-- 예약문자 여부 - 예약 선택 여부 // 아래 하단 화면 노출 여부도 같이-->	
+		<input type="hidden" id="reqDate" name="reqDate" value="">						<!--전송일자-->
+		
+		<input type="hidden" id="divideChk" name="divideChk" value="">					<!--전송일자-->
+		<input type="hidden" id="divideCnt" name="divideCnt" value="">					<!--전송일자-->
+		<input type="hidden" id="divideTime" name="divideTime" value="">				<!--전송일자-->
+		
+		<input type="hidden" id="callFrom" name="callFrom" value="">					<!--완  보내는사람 -->	
+		<input type="hidden" id="callToList" name="callToList" value="">				<!--완  받는사람 리스트-->
+		<input type="hidden" id="varNmList" name="varNmList" value="">					<!--완  변수 이름  리스트-->
+		<input type="hidden" id="varValList" name="varValList" value="">				<!--완  변수 리스트-->
+		
+		<input type="hidden" id="atSmishingYn" name="atSmishingYn" value="${atSmishingYn}">		<!--알림톡 스미싱 여부-->
+	</form>
+
+	<form id="excelForm" name="excelForm" action="<c:url value='/web/mjon/alimtalk/kakaoApiNotityTalkSampleExcelDownload.do'/>">
+		<input type="hidden" id="excelTemplateContent" name="excelTemplateContent" value="">
+		<input type="hidden" id="excelTemplateSubtitle" name="excelTemplateSubtitle" value="">
+		<input type="hidden" id="excelTemplateTitle" name="excelTemplateTitle" value="">
+		<input type="hidden" id="varNmList" name="varNmList" value="">
+		<input type="hidden" id="varValList" name="varValList[]" value="">
+	</form>
+
+<%-- 	<form id="templateListPopup" name="templateListPopup" action="<c:url value='/web/mjon/kakao/template/selectKakaoAlimtalkTemplateListPopupAjax.do'/>" method="post"> --%>
+	<form id="templateListPopup" name="templateListPopup" action="<c:url value='/web/mjon/kakao/template/selectKakaoAlimtalkTemplateListPopupAjax.do'/>" method="post">
+		<input type="hidden" id="senderKey" name="senderKey" value="">
+		<input type="hidden" id="yellowId" name="yellowId" value="">
+		<input type="hidden" id="page" name="page" value="1">
+		<input type="hidden" id="formListType" name="formListType" value="thumbnail">
+		<input type="hidden" id="templateStatus" name="templateStatus" value="ACT"> <!-- 기본값 ACT:정상  -->
+	</form>
+	
+	<!-- 테스트 전송 FORM -->
+	<form id="kakaoAtDataTestPopupForm" name="kakaoAtDataTestPopupForm" method="post">
+		<input type="hidden" id="senderKey" name="senderKey" value="">					<!-- 카카오 보내는 사람 Key -->
+		<input type="hidden" id="templateCode" name="templateCode" value="">			<!-- 카카오 전송 templat Code -->
+		<input type="hidden" id="templateContent" name="templateContent" value="">		<!-- 카카오 전송 templat내용 -->
+		<input type="hidden" id="agentCodeTxt" name="agentCodeTxt" value="">			<!-- 카카오 전송 templat Code -->
+		<input type="hidden" id="txtReplYn" name="txtReplYn" value="N">					<!-- 치환문자 여부 - -->
+		<input type="hidden" id="varNmList" name="varNmList" value="">					<!-- 변수 이름  리스트-->
+		<input type="hidden" id="varValList" name="varValList" value="">				<!-- 변수 리스트-->
+		<input type="hidden" id="bizJsonYn" name="bizJsonYn" value="">				<!-- 변수 리스트-->
+	</form>
+	
+	<!-- 유저 보유잔액 -->
+	<input type="hidden" id="oriUserMoney" value="<c:out value='${userMoney }' />">
+	
+	<!-- 각 금액 단가  -->
+	<input type="hidden" id="kakaoAtPrice" value="<c:out value='${sendPrice.kakaoAtPrice }' />"> <!-- 알림톡 단가  -->
+	<input type="hidden" id="longPrice" value="<c:out value='${sendPrice.longPrice }' />"> <!-- mms 단가  -->
+	<input type="hidden" id="shortPrice" value="<c:out value='${sendPrice.shortPrice }' />"> <!-- sms 단가  -->
+
+	<!-- 각 금액 단가  -->
+	<input type="hidden" id="errorChk" value="N"> <!-- sms 단가  -->
+	
+
+	<div class="tooltip-wrap">
+		<!-- 문자발송 성공 레이어팝업 -->
+		<div class="popup-com pop_msg_success">
+			<div class="popup_heading">
+				<p>알림톡 전송 결과</p>
+				<button type="button" class="tooltip-close" onclick="msgSuccessClose(this);"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+			</div>
+			<div class="layer_in">
+				<div class="msg_text">발송 성공 : <strong>1</strong> 건,수신거부 : <span>0</span>건의<br>알림톡이 발송 되었습니다.</div>
+			</div>
+			<div class="popup_btn">
+				<button type="button" onclick="msgResultLink(); return false;">알림톡 발송결과 바로가기</button>
+				<button type="button" class="tooltip-close" onclick="msgSuccessClose(this);">확인</button>
+			</div>
+		</div>
+	</div>
+	<div class="tooltip-wrap">
+		<!-- 문자발송 실패 레이어팝업 -->
+		<div class="popup-com pop_msg_fails">
+			<div class="popup_heading">
+				<p>문자 전송 결과</p>
+				<button type="button" class="tooltip-close" onclick="msgFailsClose(this);"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+			</div>
+			<div class="layer_in">
+				<div class="msg_text">발송 성공 : <strong>1</strong> 건,수신거부 : <span>0</span>건의<br>문자가 발송 되었습니다.</div>
+			</div>
+			<div class="popup_btn">
+				<button type="button" class="tooltip-close" onclick="msgFailsClose(this);">확인</button>
+			</div>
+		</div>
+	</div>
+	<div class="tooltip-wrap">
+		<!-- 문자발송 스팸 이용정지 레이어팝업 -->
+		<div class="popup-com pop_msg_spam">
+			<div class="popup_heading">
+				<p>문자 전송 결과</p>
+				<button type="button" class="tooltip-close" onclick="msgSpamClose(this);"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+			</div>
+			<div class="layer_in">
+				<div class="msg_text"></div>
+			</div>
+			<div class="popup_btn">
+				<button type="button" class="tooltip-close" onclick="msgSpamClose(this);">확인</button>
+			</div>
+		</div>
+	</div>
+	<div class="inner">
+			<!-- send top -->
+			<div class="send_top">
+				<!-- tab button -->
+				<%@include file="/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp" %>
+				<!--// tab button -->
+				<!-- 카카오톡 설정 - 알림톡 템플릿 등록/관리 - 내템플릿 -->
+				<div class="top_content kakaotalksend_cont current pay_tab_wrap">
+					<div class="send_general kakao_wrap">
+						<div class="send_left">
+							<table class="tType1">
+								<colgroup>
+									<col style="width: 90px;">
+									<col style="width: auto;">
+								</colgroup>
+								<tbody>
+									<tr>
+										<th>채널ID</th>
+										<td>
+											<label for="selectKakaoProfileList" class="채널ID 선택"></label>
+											<select class="select_gray_type" id="selectKakaoProfileList" name="selectKakaoProfileList">
+												<option value="">채널ID 선택</option>
+												<c:forEach var="kakaoProfileInfo" items="${kakaoProfileList}" varStatus="status">
+													<option value="${kakaoProfileInfo.senderKey}"><c:out value='${kakaoProfileInfo.yellowId}'/></option>
+												</c:forEach>
+											</select>
+											
+										</td>
+									</tr>
+									<tr>
+										<th>템플릿</th>
+										<td>
+											<select class="select_gray_type" id="selectTemplateList" name="selectTemplateList">
+<!--                                             <select name="" id="" class="select_gray_type"> -->
+												<option value="">알림톡 템플릿 선택</option>
+											</select>
+<!--                                             <button type="button" class="btnType btnType6" onclick="window.open('popup_allimtalk_template_choice.html','_blank','width=930, height=860, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=yes')">템플릿 선택</button> -->
+											<button type="button" class="btnType btnType6"  onclick="javascript:fnTemplateReg(); return false;">템플릿 등록</button>
+											<div class="variable_wrap">
+												<ul>
+													<li>* 변수명 설정파일을 다운로드 받으신 후 전송대상과 변수를 입력 후 업로드해주세요.</li>
+													<li>* 엑셀서식은 반드시 <span>텍스트 서식으로 등록</span>해주세요.</li>
+													<li>* 한번에 전송가능한 <span>최대 발송건은 500건</span>입니다.</li>
+													<li>* 배송조회시 운송장 번호는 <span>숫자만 등록</span>해주세요.</li>
+												</ul>
+												<button type="button" class="excel_btn" onclick="excelDownload();"><i></i> <c:out value="#"/>{변수명} 설정 파일 다운로드</button>
+<!--                                                 <button type="button" class="excel_btn"><i></i> 변수명 설정 파일 다운로드</button> -->
+											</div>
+										</td>
+									</tr>
+									<tr>
+										<th>받는사람</th>
+										<td class="putText">
+											<div class="clearfix receipt_num receiver_wrap01">
+												<div class="receipt_num_top">
+													<label for="callTo" class="label">받는 번호입력</label>
+													<input type="text" id="callTo" name="callTo" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');"  placeholder="번호를 입력하세요" onfocus="this.placeholder=''" onblur="this.placeholder='번호를 입력하세요'" style="width:340px;">
+													<button type="button" class="btnType btnType6 addCallToF">번호추가</button>
+													</br>
+													<span>
+														<span class="vMiddle">*</span> 중복번호는 한번만 발송됩니다.
+													</span>
+													</br>
+													<span>
+														<span class="vMiddle">*</span> 한번에 전송가능한 최대 발송건은 500건 입니다.
+													</span>
+												</div>
+												<div class="receipt_num_midde">
+													<div class="listType list01" >
+														<div class="list_table list_head">
+															<div class="cb_wrap">
+																<label for="select_all" class="label"></label>
+																<input type="checkbox" id="select_all">
+															</div>
+															<div class="list_table_num">
+																<p>휴대폰</p>
+<!--                                                                 <img src="/publish/images/sortUp.png"> -->
+<!--                                                                 <img src="/publish/images/sortDown.png"> -->
+															</div>
+<!-- 															<div class="list_table_name"> -->
+<!-- 																<p>이름</p> -->
+<!--                                                                 <img src="/publish/images/sortUp.png"> -->
+<!--                                                                 <img src="/publish/images/sortDown.png"> -->
+<!-- 															</div> -->
+														</div>
+														<div class="list_body_wrap" id="wrap01_body">
+														</div>
+													</div>
+													<div class="put_right">
+														<div class="btn_popup_wrap spc_wrap">
+															<button type="button" data-tooltip="popup06" class="btnType btnType7 popupAddr">주소록 불러오기</button>
+														</div>
+														<div class="btn_popup_wrap">
+															<button type="button" data-tooltip="popup02" class="btnType btnType7">엑셀 불러오기</button>
+														</div>
+														<div class="btn_popup_wrap">
+															<button type="button" data-tooltip="popup03" class="btnType btnType7 tab1">최근 전송내역</button>
+														</div>
+														<div class="btn_popup_wrap">
+															<button type="button" data-tooltip="popup03" class="btnType btnType7 tab2">자주보내는 번호</button>
+														</div>
+														<div class="btn_popup_wrap check_validity_wrap">
+															<button type="button" class="btnType btnType7" id="check_validity">오류검사 <i class="qmMark"></i></button>
+															<div class="error_hover_cont send_hover_cont">
+																<p>휴대폰 번호 입력 시 해당 휴대폰 번호에 대한 형식이 어긋나거나 휴대폰 번호에 오류가 있는지 등을 검사하는 기능</p>
+																<span>(예시) 010-1234-0001(O) / 010-123-0001(X)</span>
+															</div>
+														</div>
+													</div>
+												</div>
+												<div class="list_bottom clearfix">
+													<div class="remove_btnWrap">
+														<button type="button" class="btnType15" id="all_del"><i class="remove_img"></i>전체삭제</button>
+														<button type="button" class="btnType15" id="select_del"><i class="remove_img"></i>선택삭제</button>
+													</div>
+													<div class="list_bottom_right">
+														<p>총 <span class="c_e40000" id="rowTotCnt">0</span>건 / 중복 <span class="c_002c9a" id="rowDupCnt">0</span>건</p>
+<!-- 														<button type="button" class="address_reg2">주소록에 등록</button> -->
+													</div>
+												</div>
+											</div>
+											<div class="clearfix receipt_num receiver_wrap02">
+												<div class="receipt_num_top">
+													<input type="text" placeholder="선택된 파일이 없습니다." onfocus="this.placeholder=''" onblur="this.placeholder='번호를 입력하세요'" style="width:340px;">
+													<button type="button" class="btnType btnType6" id="fileClick"/>파일선택</button>
+													<input type="file" id="excelFile" accept=".xls, .xlsx" onchange="excelExportVarAjax(event); return false;" style="display:none"/>
+													<!-- <input type="file" id="excelFile" accept=".xls, .xlsx" onchange="excelExport02(event); return false;" style="display:none"/> -->
+												</div>
+												<div class="receipt_num_midde">
+													<div class="listType list01" id="wrap02">
+														<!-- /publish/kakao_allimtalk_send.html 참고 -->
+														<div class="list_table list_head" id="excelHead">
+														</div>
+														<div class="list_body_wrap" id="excelBody02">
+														</div>
+													</div>
+												</div>
+											</div>
+										</td>
+									</tr>
+									<tr>
+										<th colspan="2" class="billingAmount">
+											<div>
+												<div class="final_pay">
+													<div class="pay_info_list">
+														<p>발송금액 :</p>
+                                                        <div class="info" id="repPriceTxt" style="display: none;">
+<!-- 														<div class="info" id="repPriceTxt"> -->
+<!-- 															단문 : <strong>20</strong>건<span>/</span> -->
+<!-- 															장문 :<strong>150</strong>건<span>/</span> -->
+<!-- 															그림문자 :<strong>30</strong>건 -->
+														</div>
+													</div>
+													<p class="price"><span id="repPriceTxt"></span><span id="totalPriceTxt">0.0</span> 원<span></span></p>
+												</div>
+												<div class="pay_type clearfix">
+								  					<fmt:formatNumber type="number" maxFractionDigits="3" value="${userMoney}" var="commaPrice" />
+													<div>
+														<input type="radio" id="radio_bill_1" name="radio_bill" checked="checked">
+														<label for="radio_bill_1">보유잔액</label>
+														<label for="userMoney" class="la bel">보유잔액</label>
+														<input type="text" id="userMoney" name="userMoney" value="<c:out value='${commaPrice}'/>" readonly>
+														<span class="won">원</span>
+														<button type="button" class="btnType btnType21" onclick="location.href='/web/member/pay/PayView.do'">충전</button>
+													</div>
+													<div></div>
+												</div>
+											</div>
+										</th>
+									</tr>
+									<tr>
+										<th colspan="2" class="replace_send_th">
+											<div class="title_th"><p>대체문자</p> 
+												<input type="checkbox" id="send_fail_check" style="margin: 0 8px 0 0;"><label for="send_fail_check">알림톡 전송 실패 시 문자 전송</label>
+											</div>
+											<div class="replace_send_wrap">
+<!--                                             <div class="replace_send_wrap"  style="display: block;"> -->
+												<table class="tType1">
+													<colgroup>
+														<col style="width: 90px;">
+														<col style="width: auto;">
+													</colgroup>
+													<tbody>
+														<tr>
+															<th>발신번호</th>
+															<td class="put_num">
+																<label for="callFromList" class="label"></label>
+																<select id="callFromList" name="callFromList" class="sel_number">
+																	<c:choose>
+																		<c:when test="${not empty resultPhonList}">
+																			<c:forEach var="phonList" items="${resultPhonList}" varStatus="status">
+																				<option value="${phonList}">${phonList}</option>
+																			</c:forEach>
+																		</c:when>
+																		<c:otherwise>
+																			<option value="">등록된 발신 번호가 없습니다.</option>
+																		</c:otherwise>
+																	</c:choose>
+																</select>
+																<button type="button" class="btnType btnType6" onclick="location.href='/web/user/sendNumberManage.do'">번호등록</button>
+															</td>
+														</tr>
+														<tr>
+															<th>내용</th>
+															<td class="putText">
+																<div class="clearfix">
+																	<div class="put_left short">
+																		<!-- 업로드한 이미지의 썸네일 영역 -->
+																		<ul class="thumb_wrap liOnImg ui-sortable"></ul>
+																		<!-- //업로드한 이미지의 썸네일 영역 -->
+																		<label for="smsTxtArea" class="label"></label>
+																		<textarea id="smsTxtArea" name="smsTxtArea" class="put_text"></textarea>
+																		<div class="text_length">
+																			<div name="afterDeny" id="afterDeny">
+																				<p>
+																					<span class="fwMd" id="msgLeng">0 /
+																					</span>
+																					<span class="c_002c9a fwMd" id="limitLeng">90</span>byte
+																				</p>
+																				<span
+																					class="msg_com msg_short">단문</span>
+																			</div>
+																		</div>
+																	</div>
+																	<div class="put_right">
+																		<button type="button" class="btnType btnType9" id="failCheckInit">초기화</button>
+                                                                        <button type="button" class="btnType btnType7" onclick="javascript:fn_errorChk(); return false;">오류검사<i class="qmMark"></i></button>
+<!--                                                                         <button type="button" class="btnType btnType8" onclick="showPotoediter();">이미지 불러오기</button> -->
+<!--                                                                         <div class="send_btnWrap"> -->
+<!--                                                                             <button type="button" class="btnType btnType9">문자저장</button> -->
+<!-- 																		</div> -->
+																	</div>
+
+																</div>
+<!--                                                                 <p id="lowText">* 현재 [<span id="nowMsgType">단문</span>] <span class="c_e40000 fwBold nowMsgCnt">0</span>건 발송 가능합니다.</p> -->
+															</td>
+														</tr>
+													</tbody>
+												</table>
+											</div>
+										</th>
+									</tr>
+								</tbody>
+							</table>
+						</div>
+						<div class="send_right">
+							<div class="phone">
+								<div class="phoneIn">
+									<p class="prev_p" id="prev_p_top"><img src="/publish/images/content/kakao_prev_icon.png" alt=""></p>
+									<!-- 텍스트 미리보기 -->
+									<div class="text_preview">
+										<div class="allimtalk_title">
+											<img src="/publish/images/content/icon_allimtalk.png" alt="">알림톡 도착
+										</div>
+										<div class="allimtalk_content" id="alimtalkTemplate">
+											<p class="emphasis_side_text">템플릿을 선택해 주세요</p>
+										</div>
+									</div>
+									<!-- //텍스트 미리보기 -->
+									<div class="template_info_wrap">
+										<div class="template_byte">
+<!--                                             <p><span class="fwMd" id="msgLeng">50 / </span><span class="c_002c9a fwMd" id="limitLeng">2000</span>byte</p> -->
+										</div>
+										<button type="button" class="btn_template_choice" id="reSelectBtn">템플릿 재선택</button>
+									</div>
+								</div>
+								<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다<p>
+							</div>
+							<div class="phone_bottom">
+								<div class="send_rev">
+									<div class="send_content" style="padding-bottom: 0;">
+										<div class="rev_radio">
+											<ul>
+												<li>
+													<input type="radio" id="reserYnN" name="reserYn" value="N" checked="checked"><label for="reserYnN">즉시</label>
+												</li>
+												<li>
+													<input type="radio" id="reserYnY" name="reserYn" value="Y"><label for="reserYnY">예약</label>
+												</li>
+											</ul>
+										</div>
+										<div class="send_btn">
+											<button type="button" class="btnType btnType11" onclick="javascript:sendTemplateInfo(); return false;">발송하기</button>
+											<button type="button" class="btnType btnType10" onclick="javascript:goToKakaoTestPopUp(); return false;">테스트발송</button>
+										</div>
+									</div>
+									<div class="rev_selected">
+										<div class="rev_top">
+											<span>날짜 :</span>
+											<div class="calendar_wrap">
+												<input type="text" class="startDate2 inp resDate calendar picker__input picker__input--active" title="검색 시작일" id="startDate2" name="startDate2" value="" data-datecontrol="true" readonly="" aria-haspopup="true" aria-expanded="true" aria-readonly="false" aria-owns="startDate2_root">
+											</div>
+											<label for="msgResHour" class="label">시 선택</label>
+											<div class="selBox">
+												<select class="selType1" id="msgResHour" name="msgResHour">
+													<c:forEach  var="hour"  begin="0" end="23" step="1" varStatus="status">
+														<c:choose>
+															<c:when test="${hour < 10}">
+																<option value="0${hour}">0${hour}시</option>
+															</c:when>
+															<c:otherwise>
+																<option value="${hour}">${hour}시</option>
+															</c:otherwise>
+														</c:choose>
+													</c:forEach>
+												</select>
+												<label for="msgResMin" class="label">분 선택</label>
+												<select class="selType1" id="msgResMin" name="msgResMin">
+													<c:forEach var="min" begin="0" end="55" step="5">
+														<c:choose>
+															<c:when test="${min < 10}">
+																<option value="0${min}">0${min}분</option>
+															</c:when>
+															<c:otherwise>
+																<option value="${min}">${min}분</option>
+															</c:otherwise>
+														</c:choose>
+													</c:forEach>
+												</select>
+											</div>
+										</div>
+										<div class="rev_bottom">
+											<input type="checkbox" id="inputDivideChk" name="inputDivideChk">
+											<label for="inputDivideChk">분할전송</label>
+											<input type="text" class="dividType1" id="frmDivideCnt" name="frmDivideCnt" value="20" onkeypress='return checkNumber(event)' maxlength="4"/>
+     		            					<label for="frmDivideCnt">건씩</label>
+											<select class="selType1" id="divideTime" name="divideTime">
+						 						<option value="5">05분</option>
+						 						<option value="10">10분</option>
+						 						<option value="15">15분</option>
+						 						<option value="20">20분</option>
+						 						<option value="30">30분</option>
+						 					</select>
+						 					<label for="divideTime">간격</label>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<!--// send top -->
+		
+<!-- 주소록 불러오기 -->
+<div class="tooltip-wrap">
+	<div class="popup-com import_layer popup06" tabindex="0" data-tooltip-con="popup06" data-focus="popup06" data-focus-prev="popup06-close" style="width: 1000px">
+		<div class="popup_heading">
+			<p><span>주소록 불러오기</p>
+			<button type="button" onClick="javascript:addrClose(); return false;">
+			<img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+		</div>
+		<div class="layer_in">
+			<div class="titBox titBox_pad">
+				<p>- 주소록 수정 및 변경은 <span>[주소록 관리]</span>에서만 가능합니다.</p>
+				<button type="button" class="adr_admin" onClick="location.href='/web/mjon/addr/selectAddrList.do'">주소록 관리</button>
+			</div>
+			<div class="adr_wrap">
+				<form id="searchAddrGrpForm" name="searchAddrGrpForm" method="post" style="display: flex; justify-content: space-between;">
+					<input type="hidden" id="searchAddrGrpId" name="searchAddrGrpId" value=""/>
+					<input type="hidden" id="type" name="type" value="all"/>
+					<input type="hidden" id="searchKeyword" name="searchKeyword" value=""/>
+					<input type="hidden" name="searchCondition" id="searchCondition" value="0" />
+					<div class="adr_pop_left">
+						<div class="adr_left_search">
+							<label for="searchGrpKeyword" class="label">그룹명 검색</label>
+							<input type="text" name="searchGrpKeyword" id="searchGrpKeyword"  placeholder="그룹명 검색" onfocus="this.placeholder=''" onblur="this.placeholder='그룹명 검색'" class="inputLight">
+							<button type="button" onClick="javascrit:fnAddrGrpSearch(); return false;"><img src="/publish/images/popup/search.png" alt="검색"></button>
+						</div>
+						<div class="adr_pop_box">
+							<div id="addrGroupLoad">
+							</div>
+						</div>
+						<!-- <div class="popup_btn">
+							<button type="button" class="btnType" onClick="javascript:fnSelectAddrGrpList(); return false;">선택 그룹 추가</button>
+						</div> -->
+					</div>
+					<div class="adr_pop_right">
+						<div class="clearfix">
+							<div class="btnWrap_last">
+								<label for="searchAddrCondition" class="label">카테고리 선택</label>
+								<select id="searchAddrCondition" name="searchAddrCondition" class="selType2">
+									<option value='0'>전체</option>
+									<option value='1'>그룹명</option>
+									<option value='2'>이름</option>
+									<option value='3'>핸드폰번호</option>
+								</select>
+								<label for="searchAddrKeyword" class="label">검색어 입력</label>
+								<input type="text" id="searchAddrKeyword" name="searchAddrKeyword" placeholder="검색어를 입력하세요"  onfocus="this.placeholder=''" onblur="this.placeholder='검색어를 입력하세요'" >
+								<button type="button" class="btnType btnType17"  onClick="javascrit:fnAddrSearch(); return false;">검색</button>
+							</div>
+							<!-- table -->
+							<div class="adr_excel adr_pop_list2 callAddr_box">
+							</div>
+							<!--// table -->
+						</div>
+						<div class="popup_btn_wrap2">
+							<button type="button" onClick="javascript:addrToList(); return false;">추가</button>
+							<button type="button" onClick="javascript:addrClose(); return false;">닫기</button>
+						</div>
+						<%-- 주소록 레이어 팝업 닫기 실행 코드 --%>
+						<input type="hidden" name="btnAddrClose" id="btnAddrClose" class="tooltip-close closeAddr" data-focus="popup06-close" />         
+					</div>
+				</form>
+			</div>
+		</div>
+	</div>
+</div>
+<!--// 주소록 불러오기 -->
+
+<!-- 최근 전송 내역 -->
+<div class="tooltip-wrap">
+	<div class="popup-com history_layer popup03" tabindex="0" data-tooltip-con="popup03" data-focus="popup03" data-focus-prev="popup03-close">
+		<div class="popup_heading">
+			<p><span>전송내역</p>
+			<button type="button" class="tooltip-close" data-focus="popup03-close" id="btnLatestAddPhoneClose"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+		</div>
+		<div class="layer_in">
+			<!-- tab button -->
+			<ul class="tabType6"> 
+				<li class="tab active"><button type="button" onclick="TabType(this,'1');">최근 전송내역</button></li>
+				<li class="tab"><button type="button" onclick="TabType(this,'2');">자주보내는 번호</button></li>
+			</ul><!--// tab button -->
+			<!-- 최근 전송내역 -->
+			<div class="history_cont hascont current">
+				<div class="histroy_trans latestMsgArea" id="latestMsgArea">
+					<ul id="latestMsgUl">
+						<c:choose>
+							<c:when test="${not empty resultLatestMsgList}">
+								<c:forEach var="latestMsgList" items="${resultLatestMsgList}" varStatus="status">
+									<li id="latestLi">
+										<input type="checkbox" id="addrChk_${status.count}" name="latAddrChk" value="<c:out value='${latestMsgList.callTo}'/>">
+										<label for="addrChk_${status.count}" class="label">최근 전송내역</label>
+										<p><c:out value="${latestMsgList.callTo}"/></p>
+										<button type="button" id="latestAddrDel"><img src="/publish/images/popup/close3.png"  alt="전화번호 삭제"></button>
+									</li>
+								</c:forEach>
+							</c:when>
+							<c:otherwise>
+								<li>
+									<p>최근 발송 내역이 없습니다.</p>
+								</li>
+							</c:otherwise>
+						</c:choose>
+					</ul>
+				</div>
+				<div class="popup_btn_wrap2 hisroy_btn">
+					<button type="button" id="latestAddPhone">선택추가</button>
+					<button type="button" id="latestCancelPhone">선택취소</button>
+				</div>
+			</div><!--// 최근 전송내역 -->
+			<!-- 자주보내는 번호 -->
+			<div class="history_cont hascont">
+				<div class="histroy_trans" id="bookMarkMsgArea">
+					<ul id="bookMsgUl">
+						<c:choose>
+							<c:when test="${not empty resultBookMarkMsgList}">
+								<c:forEach var="bookMarkMsgList" items="${resultBookMarkMsgList}" varStatus="status">
+									<li id="bookMarkLi">
+										<input type="checkbox" id="bokAddrChk_${status.count}" name="bookAddrChk" value="<c:out value='${bookMarkMsgList.addrPhoneNo}'/>">
+										<label for="addrChk_${status.count}" class="label">최근 전송내역</label>
+										<p><c:out value="${bookMarkMsgList.addrPhoneNo}"/></p>
+										<button type="button" id="bookMarkAddrDel"><img src="/publish/images/popup/close3.png"  alt="전화번호 삭제"></button>
+									</li>
+								</c:forEach>
+							</c:when>
+							<c:otherwise>
+								<li>
+									<p>등록된 자주 보내는 번호 내역이 없습니다.</p>
+								</li>
+							</c:otherwise>
+						</c:choose>
+					</ul> 
+				</div>
+				<div class="popup_btn_wrap2 hisroy_btn">
+					<button type="button" id="bookMarkAddPhone">선택추가</button>
+					<button type="button" id="bookMarkCancelPhone">선택취소</button>                      
+				</div>
+			</div><!--// 자주보내는 번호  -->         
+		</div>
+	</div>
+</div>
+<!--// 전송내역 팝업 -->
+
+
+
+<!-- 엑셀 불러오기 -->
+<form id="excelToolTipForm" name="excelToolTipForm" method="post">
+	<div class="tooltip-wrap">
+		<div class="popup-com import_layer popup02" tabindex="0" data-tooltip-con="popup02" data-focus="popup02" data-focus-prev="popup02-close">
+			<div class="popup_heading">
+				<p><span>엑셀</span> 불러오기</p>
+				<button type="button" class="tooltip-close" data-focus="popup02-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+			</div>
+			<div class="layer_in">
+				<!-- 엑셀파일 불러오기 -->
+				<div class="hascont">
+					<div class="titBox">
+						<p>- 최대 2만 건까지 등록할 수 있습니다.</p>
+						<p>- [엑셀 불러오기]시 문서의 A, B열을 불러옵니다.(지원하는 파일 형식 : xls, xlsx)</p>
+						<p>- 휴대폰 항목은 숫자, 하이픈(-)만 인식하며, 번호 앞에 0이 생략되어도 정상 등록됩니다.
+						</p>
+						<!-- <button type="button" class="excel_btn" onclick="location.href='/cmm/fms/FileDown.do?atchFileId=FILE_000000000011651&fileSn=1'"><i></i>샘플파일 다운로드</button> -->
+						<button type="button" class="excel_btn" onclick="location.href='/download/msg/알림톡_엑셀주소록_등록양식.xlsx'"><i class="downroad"></i>샘플파일 다운로드</button>
+					</div>
+					<div class="attachedFile">
+						<label for="excelNm01" class="attachedFile_label">첨부파일</label>
+						<input type="text" id="excelNm01" value="" readonly>
+						<input type="file" id="excelFile01" accept=".xls, .xlsx" onchange="excelExportAjax(event); return false;" style="display:none"/>
+						<!-- <input type="file" id="excelFile01" accept=".xls, .xlsx" onchange="excelExport01(event); return false;" style="display:none"/> -->
+						<button type="button" class="btnType btnType6 c1">찾아보기</button>
+<!-- 						<p><span class="vMiddle">*</span> 첨부된 파일은 <span class="c_e40000">[추가]버튼을 클릭</span>하셔야 받는 사람에 등록됩니다.</p> -->
+						<p><span class="vMiddle">*</span> 첨부된 파일은 <span class="c_e40000">[추가]버튼을 클릭</span>하셔야 받는 사람에 등록됩니다.</p>
+					</div>
+				</div><!--// 엑셀파일 불러오기 -->
+				<div class="popup_btn_wrap2">
+					<button type="button" class="tooltip-close" data-focus="popup02-close"  data-focus-next="popup02" onclick="excelAddAjax()">추가</button>
+					<!-- <button type="button" class="tooltip-close" data-focus="popup02-close"  data-focus-next="popup02" onclick="excelAdd()">추가</button> -->
+					<button type="button" class="tooltip-close" data-focus="popup02-close"  data-focus-next="popup02">닫기</button>                      
+				</div>
+			</div>
+		</div>
+	</div><!--// 엑셀 불러오기 -->
+</form>
+<form id="excelVarFileForm" name="excelVarFileForm" method="post">
+	<input type="hidden" id="excelVarCnt" name="excelVarCnt" value="0"/>
+	<input type="hidden" id="excelVarList" name="excelVarList" value=""/>
+	
+</form>
+
+<form id="msgResendForm" name="msgResendForm" method="post">
+	<input name="msgResendFlag" type="hidden" value="N"/>
+	<input name="msgSeqList" type="hidden" value=""/>
+</form>
+<form id="moveAddrForm" name="moveAddrForm" method="post">
+	<input name="moveAddrFlag" type="hidden" value="N"/>
+	<input name="addrIdList" type="hidden" value=""/>
+</form>
 
src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_tmp.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/at/KakaoAlimtalkMsgDataView_tmp.jsp
@@ -0,0 +1,219 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ page import="itn.com.cmm.LoginVO" %>
+
+<!-- <script src="/publish/js/content.js"></script> -->
+<!-- 주소록관련 js -->
+<script type="text/javascript" defer src="<c:out value='/js/kakao/at/init.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/kakao/at/tabulator.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/kakao/at/addr.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/kakao/at/alimtalkExcel.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/kakao/at/priceClclt.js' />"></script>
+<script type="text/javascript" src="<c:out value='/js/common/popup.js' />"></script>
+<script type="text/javascript">
+/*
+ *	등록된 발신 탬플릿 카카오톡 전송 
+ */
+ 
+ 
+function send_many(cnt){
+	for(var i = 0 ; i < cnt ; i ++){
+		sendTemplateInfo();
+	}
+}
+ 
+ 
+
+function sendTemplateInfo(){
+
+	var data = new FormData(document.bizForm);
+	$.ajax({
+		type: "POST"
+		, url: "/web/mjon/kakao/alimtalk/kakaoAlimTalkMsgSendAjax.do"
+		, data: data
+		, dataType: 'json'
+		, async: true
+		, processData: false
+		, contentType: false
+		, cache: false
+		, success: function (returnData, status) {
+			if(status == 'success'){
+				if("loginFail" == returnData.result){
+					
+					alert(returnData.message);
+					return false;
+					
+				}else  if('fail' == returnData.result){
+					
+					alert(returnData.message);
+					return false;
+					
+				}else if('authFail' == returnData.result){
+					
+					alert(returnData.message);
+					location.reload();
+					
+				} else if(status == 'success'){
+					
+					var kakaoSendCnt = returnData.resultSts;
+					
+					$('.pop_msg_success').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
+					
+					//예약발송 건의 경우 결과 팝업 문구 변경
+					if(reserYn == 'Y'){
+						$('.pop_msg_success .msg_text').html("예약 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 예약 되었습니다.");
+					}else{
+						$('.pop_msg_success .msg_text').html("발송 성공 : <strong>"+ kakaoSendCnt + "</strong>건의<br>알림톡이 발송 되었습니다.");
+					}
+					
+					$('.mask').addClass('on');
+				}
+			}
+		}
+		,beforeSend : function(xmlHttpRequest) {
+			//로딩창 show
+			$('.loading_layer').addClass('active');
+		}
+		,complete : function(xhr, textStatus) {
+			//로딩창 hide
+			$('.loading_layer').removeClass('active');
+		}
+		,error: function (e) {
+			console.log("ERROR : ", e);
+			alert("카카오 알림톡 전송에 실패하였습니다.");
+		}
+	}); 
+}
+
+
+</script>
+
+	<div class="loading_layer">
+		<div class="loading_container">
+			<div class="bar"></div>
+			<div class="text">Loading</div>
+		</div>
+	</div>
+
+	<form id="bizForm" name="bizForm" method="post">
+		<input type="hidden" id="menuTopTab" name="menuTopTab" value="tabAlim">
+		<input type="hidden" id="senderKey" name="senderKey" value="669143473b1af459628b8bdf2f48da090c8895de">					<!-- 카카오 보내는 사람 Key -->
+		<input type="hidden" id="templateCode" name="templateCode" value="bizp_2023040511022617802391882">			<!-- 카카오 전송 templat Code -->
+		
+		<input type="hidden" id="templateEmphasizeType" name="templateEmphasizeType" value="TEXT">		<!-- 카카오 전송 templateEmphasizeType 타입 -->
+		
+		<input type="hidden" id="templateContent" name="templateContent" value="test">		<!-- 카카오 전송 templat내용 -->
+		<input type="hidden" id="templateTitle" name="templateTitle" value="test">			<!-- 카카오 전송 templat 타이틀 -->
+		<input type="hidden" id="templateSubtitle" name="templateSubtitle" value="test">	<!-- 카카오 전송 templat 서브 타이틀 -->
+		
+		<input type="hidden" id="subMsgTxtReplYn" name="subMsgTxtReplYn" value="">		<!-- 대체문자 전송내용에 변환문자가 있는지-->
+		<input type="hidden" id="subMsgSendYn" name="subMsgSendYn" value="N">			<!-- 대체문자 전송여부 - 알림톡 전송 실패 시 문자 전송-->  
+		<input type="hidden" id="subMsgTxt" name="subMsgTxt" value="">					<!-- 대체문자 전송내용 -->
+		<input type="hidden" id="txtReplYn" name="txtReplYn" value="N">					<!-- 완 치환문자 여부 - --> 	
+		<input type="hidden" id="bizJsonYn" name="bizJsonYn" value="N">					<!-- JSON 생성 여부 -->
+		
+		<input type="hidden" id="reserveYn" name="reserveYn" value="N">					<!-- 예약문자 여부 - 예약 선택 여부 // 아래 하단 화면 노출 여부도 같이-->	
+		<input type="hidden" id="reqDate" name="reqDate" value="">						<!--전송일자-->
+		
+		<input type="hidden" id="divideChk" name="divideChk" value="">					<!--전송일자-->
+		<input type="hidden" id="divideCnt" name="divideCnt" value="">					<!--전송일자-->
+		<input type="hidden" id="divideTime" name="divideTime" value="">				<!--전송일자-->
+		
+		<input type="hidden" id="callFrom" name="callFrom" value="01093414986">					<!--완  보내는사람 -->	
+		<input type="hidden" id="callToList" name="callToList" value="01012345678,01012345679,01012345680,01012345681,01012345682,01012345683,01012345684,01012345685,01012345686,01012345687,01012345688,01012345689,01012345690,01012345691,01012345692,01012345693,01012345694,01012345695,01012345696,01012345697,01012345698,01012345699,01012345700,01012345701,01012345702,01012345703,01012345704,01012345705,01012345706,01012345707,01012345708,01012345709,01012345710,01012345711,01012345712,01012345713,01012345714,01012345715,01012345716,01012345717,01012345718,01012345719,01012345720,01012345721,01012345722,01012345723,01012345724,01012345725,01012345726,01012345727,01012345728,01012345729,01012345730,01012345731,01012345732,01012345733,01012345734,01012345735,01012345736,01012345737,01012345738,01012345739,01012345740,01012345741,01012345742,01012345743,01012345744,01012345745,01012345746,01012345747,01012345748,01012345749,01012345750,01012345751,01012345752,01012345753,01012345754,01012345755,01012345756,01012345757,01012345758,01012345759,01012345760,01012345761,01012345762,01012345763,01012345764,01012345765,01012345766,01012345767,01012345768,01012345769,01012345770,01012345771,01012345772,01012345773,01012345774,01012345775,01012345776,01012345777,01012345778,01012345779,01012345780,01012345781,01012345782,01012345783,01012345784,01012345785,01012345786,01012345787,01012345788,01012345789,01012345790,01012345791,01012345792,01012345793,01012345794,01012345795,01012345796,01012345797,01012345798,01012345799,01012345800,01012345801,01012345802,01012345803,01012345804,01012345805,01012345806,01012345807,01012345808,01012345809,01012345810,01012345811,01012345812,01012345813,01012345814,01012345815,01012345816,01012345817,01012345818,01012345819,01012345820,01012345821,01012345822,01012345823,01012345824,01012345825,01012345826,01012345827,01012345828,01012345829,01012345830,01012345831,01012345832,01012345833,01012345834,01012345835,01012345836,01012345837,01012345838,01012345839,01012345840,01012345841,01012345842,01012345843,01012345844,01012345845,01012345846,01012345847,01012345848,01012345849,01012345850,01012345851,01012345852,01012345853,01012345854,01012345855,01012345856,01012345857,01012345858,01012345859,01012345860,01012345861,01012345862,01012345863,01012345864,01012345865,01012345866,01012345867,01012345868,01012345869,01012345870,01012345871,01012345872,01012345873,01012345874,01012345875,01012345876,01012345877">				<!--완  받는사람 리스트-->
+		<input type="hidden" id="varNmList" name="varNmList" value="">					<!--완  변수 이름  리스트-->
+		<input type="hidden" id="varValList" name="varValList" value="">				<!--완  변수 리스트-->
+		
+		<input type="hidden" id="atSmishingYn" name="atSmishingYn" value="N">		<!--알림톡 스미싱 여부-->
+	</form>
+
+	<div class="inner">
+			<!-- send top -->
+			<div class="send_top">
+				<!-- tab button -->
+				<%@include file="/WEB-INF/jsp/web/kakao/include/KaKaoAlimtalkTopMenuTap.jsp" %>
+				<!--// tab button -->
+				<!-- 카카오톡 설정 - 알림톡 템플릿 등록/관리 - 내템플릿 -->
+				<div class="top_content kakaotalksend_cont current pay_tab_wrap">
+					<div class="send_general kakao_wrap">
+						<div class="send_right">
+							<div class="phone_bottom">
+								<div class="send_rev">
+									<div class="send_content" style="padding-bottom: 0;">
+										<div class="rev_radio">
+											<ul>
+												<li>
+													<input type="radio" id="reserYnN" name="reserYn" value="N" checked="checked"><label for="reserYnN">즉시</label>
+												</li>
+												<li>
+													<input type="radio" id="reserYnY" name="reserYn" value="Y"><label for="reserYnY">예약</label>
+												</li>
+											</ul>
+										</div>
+										<div class="send_btn">
+											<button type="button" class="btnType btnType11" onclick="javascript:sendTemplateInfo(); return false;">발송하기</button>
+											<button type="button" class="btnType btnType11" onclick="javascript:send_many(2000); return false;">여러번발송하기</button>
+											<button type="button" class="btnType btnType10" onclick="javascript:goToKakaoTestPopUp(); return false;">테스트발송</button>
+										</div>
+									</div>
+									<div class="rev_selected">
+										<div class="rev_top">
+											<span>날짜 :</span>
+											<div class="calendar_wrap">
+												<input type="text" class="startDate2 inp resDate calendar picker__input picker__input--active" title="검색 시작일" id="startDate2" name="startDate2" value="" data-datecontrol="true" readonly="" aria-haspopup="true" aria-expanded="true" aria-readonly="false" aria-owns="startDate2_root">
+											</div>
+											<label for="msgResHour" class="label">시 선택</label>
+											<div class="selBox">
+												<select class="selType1" id="msgResHour" name="msgResHour">
+													<c:forEach  var="hour"  begin="0" end="23" step="1" varStatus="status">
+														<c:choose>
+															<c:when test="${hour < 10}">
+																<option value="0${hour}">0${hour}시</option>
+															</c:when>
+															<c:otherwise>
+																<option value="${hour}">${hour}시</option>
+															</c:otherwise>
+														</c:choose>
+													</c:forEach>
+												</select>
+												<label for="msgResMin" class="label">분 선택</label>
+												<select class="selType1" id="msgResMin" name="msgResMin">
+													<c:forEach var="min" begin="0" end="55" step="5">
+														<c:choose>
+															<c:when test="${min < 10}">
+																<option value="0${min}">0${min}분</option>
+															</c:when>
+															<c:otherwise>
+																<option value="${min}">${min}분</option>
+															</c:otherwise>
+														</c:choose>
+													</c:forEach>
+												</select>
+											</div>
+										</div>
+										<div class="rev_bottom">
+											<input type="checkbox" id="inputDivideChk" name="inputDivideChk">
+											<label for="inputDivideChk">분할전송</label>
+											<input type="text" class="dividType1" id="frmDivideCnt" name="frmDivideCnt" value="20" onkeypress='return checkNumber(event)' maxlength="4"/>
+     		            					<label for="frmDivideCnt">건씩</label>
+											<select class="selType1" id="divideTime" name="divideTime">
+						 						<option value="5">05분</option>
+						 						<option value="10">10분</option>
+						 						<option value="15">15분</option>
+						 						<option value="20">20분</option>
+						 						<option value="30">30분</option>
+						 					</select>
+						 					<label for="divideTime">간격</label>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<!--// send top -->(No newline at end of file)
 
src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/include/atDataIncludeExcel.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/kakao/msgdata/include/atDataIncludeExcel.jsp
@@ -0,0 +1,916 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script>
+
+<script type="text/javascript">
+
+var $tableExcel = null; //엑셀입력 탭
+var $tableError = null; //엑셀입력 탭
+$(document).ready(function(){
+	
+	//Tabulator AJAX Data Loading
+	$tableError = new Tabulator("#tabulator_error", {
+		height:"255px",
+		width:"100%",
+	    layout:"fitColumns",
+	    autoColumns:false,
+	    headerHozAlign:"center", 
+	    validationMode:"highlight",
+	    clipboard:false,
+	    clipboardCopySelector:"table",
+	    clipboardPasteAction:"insert", // insert, update, replace
+	    placeholder:"등록 팝업에서 휴대폰을 선택 후 확인해주세요.", //fit columns to width of table (optional)
+	 	columns:[ //Define Table Columns
+// 		 	{title:"이름", field:"name", hozAlign:"center", headerHozAlign: "center", width:125},
+		 	{title:"휴대폰", field:"phone", hozAlign:"center", headerHozAlign: "center"},
+		 	{title:"미등록 결과", field:"result", hozAlign:"center", headerHozAlign: "center"}
+	 	]
+	});
+	
+
+	//Tabulator AJAX Data Loading
+	$tableExcel = new Tabulator("#tabulator_excel", {
+		height:"255px",
+		width:"100%",
+	    layout:"fitColumns",
+	    autoColumns:false,
+	    headerHozAlign:"center", 
+	    validationMode:"highlight",
+	    clipboard:false,
+	    clipboardCopySelector:"table",
+	    clipboardPasteAction:"insert", // insert, update, replace
+	    placeholder:"Excel 파일을 업로드 해주세요.", //fit columns to width of table (optional)
+	 	columns:[ //Define Table Columns
+	 		{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, headerHozAlign:"center", hozAlign:"center", headerSort:false, cellClick:function(e, cell){
+	 	        cell.getRow().toggleSelect();
+		 		}
+		 	}, 
+			{formatter:"rownum", align:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:50},
+		 	{title:"휴대폰", field:"addrPhoneNo", hozAlign:"center", headerHozAlign: "center", width:600, validator:["maxLength:100", "string"]}
+	 	],
+	 	validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 
+	        var valid = cell.isValid();
+	 		if(!valid){
+	 			alert("양식에 맞지 않는 정보가 입력되었습니다.");
+	 			
+	 			//해당 셀 데이터 삭제
+	 			cell.setValue("");
+	 		}
+	 		return value % parameters.phone;
+	    },
+	});
+	
+	
+    
+	
+	// 타뷸레이터 width값 변경 시 위에 select width 값 변경
+	var titleArray = ["No","A","B","C","D","E","F"];
+
+	$tableExcel.on("columnWidth",function(column){
+		var titleIndex = titleArray.indexOf(column._column.definition.title);
+		titleIndex += 1;
+		
+		if(titleIndex != 0){
+			$('.select_adr_hd>div').eq(titleIndex).css('width', column._column.width);
+		}else{
+			$('.select_adr_hd>div').eq(0).css('width', column._column.width);
+			
+		}
+	});
+
+	$tableExcel.on("scrollHorizontal",function(left){
+	      $(".adr_excel").scrollLeft(left);
+	})
+
+
+	$(".adr_excel").on("scroll",function(){
+		$(".tabulator-tableholder").scrollLeft($(this).scrollLeft());
+	});
+
+	
+	
+
+    $("#excelFileC4").on("change", function(event) {
+    	var fileInfo =  event.target.files;
+        if(fileInfo.length > 0){
+            excelFileChange(fileInfo[0]);
+        } else {
+            fn_loadRemoveActive(); // 파일이 선택되지 않은 경우 로딩 상태 제거
+            setTimeout(() => { $(this).val(''); }, 0);  // 파일 선택 초기화
+        }
+    });
+	
+
+
+    $(document).on('click', '#btnAddrMassClose', function() {
+
+    	$('.field-selector').each(function() { $(this).val(''); });
+    	setAddrMassClose();
+    });
+    
+
+    $(document).on('click', '#closeBtn', function() {
+    	// 대량등록 닫기
+    	setAddrMassClose();
+    });
+    
+
+    
+
+ // 엑셀등록 닫기
+	function setAddrMassClose() {
+		$tableExcel.clearData();
+		$("#excelRowTotCnt").text(0); //총건수 수정
+		$("#excelRowDupCnt").text(0); //중복건수 수정
+		$("#excelRowErrorCnt").text(0); //중복건수 수정
+// 		dupliPhoneDataRealList.length = 0;	// 중복 휴대폰번호 초기화
+		
+		
+		// 중복 카운트
+		$("#errorPopDupCnt").text(0);
+		// 에러 카운트
+		$("#errorPopErrorCnt").text(0);
+		// 
+		$("#errorPopTotCnt").text(0);
+
+        // popup 영역
+        $tableError.clearData();
+		
+	}
+    
+  //#############################################################################################
+  //파일업로드 드래그앤 드롭
+  //#############################################################################################
+  var objDragAndDrop = $(".upload_area");
+  $(document).on("dragenter",".upload_area",function(e){
+    e.stopPropagation();
+    e.preventDefault();
+    //$(this).css('border', '2px solid #0B85A1');
+  });
+  $(document).on("dragover",".upload_area",function(e){
+    e.stopPropagation();
+    e.preventDefault();
+  });
+  $(document).on("drop",".upload_area",function(e){
+  	fn_loadAddActive();
+  	e.preventDefault();
+  	var files = e.originalEvent.dataTransfer.files;
+  	excelFileChange(files[0]);
+  });
+
+  $(document).on('dragenter', function (e){
+    e.stopPropagation();
+    e.preventDefault();
+  });
+  $(document).on('dragover', function (e){
+  	e.stopPropagation();
+  	e.preventDefault();
+  //objDragAndDrop.css('border', '2px dotted #0B85A1');
+  });
+  $(document).on('drop', function (e){
+    e.stopPropagation();
+    e.preventDefault();
+  });
+  //파일 드래그앤드롭 종료
+	
+	
+	
+	
+  
+
+	// 받는사람 선택삭제 버튼 처리해주기
+	$('#in_select_del').click(function(){
+		
+		if($tableExcel == null || $tableExcel == ""){
+			
+			alert("받는사람을 추가해 주세요.");
+			return false;
+		
+		}
+		
+		var selectedData = $tableExcel.getSelectedRows();
+		
+		if(selectedData == "" || selectedData == null){
+			
+			alert("삭제할 연락처를 선택해주세요.");
+			return false;
+		
+		}else{ // 선택한 Row 데이터 삭제하기
+			
+			if(confirm("선택하신 받는 사람을 삭제하시겠습니까?")){
+				
+				// 선택 데이터 삭제
+			    selectedData.forEach(row => row.delete());
+			    
+			    
+				totRows = $tableExcel.getRows().length;
+			    $("#excelRowTotCnt").text(totRows);
+			    
+				
+			}
+
+		}
+		
+	});
+
+	// 추가버튼
+	$('#btnAddrMassReg').click(function(){
+		
+		if($tableExcel.getData().length < 1){
+			alert("한 개 이상의 연락처를 입력하세요");
+			return false;
+		}
+//	 	else if (selectedData.length > 20000) {
+//	 		alert("2만줄 이상의 업로드는 데이터 부하로 업로드 할수 없습니다.");
+//	 		return false;
+//	 	}
+		
+		
+		// tableExcel 그룹의 select 요소들을 확인
+		var columns = $tableExcel.getColumns();
+		var isAddrPhoneNoSelected = columns.some(column => column.getField() === 'addrPhoneNo');
+
+		if (!isAddrPhoneNoSelected) {
+			alert('휴대폰이 선택되지 않았습니다.');
+			return false;
+
+		} 
+
+		var addrData = $tableExcel.getData().map((row, index) => ({
+		    name: row.addrNm,
+		    phone: removeDash(row.addrPhoneNo),
+		    rep1: row.addrInfo1,
+		    rep2: row.addrInfo2,
+		    rep3: row.addrInfo3,
+		    rep4: row.addrInfo4,
+		}));
+
+
+		
+		// 기존 tableL의 데이터를 가져옵니다.
+		var existingData = tableL.getData();
+		// 기존 데이터와 새로운 데이터를 합칩니다.
+		var combinedData = existingData.concat(addrData);
+
+
+		/** 
+		* @ phone을 기준으로 중복 제거 및 갯수 계산
+		* @ 결과 반환
+		* 	return {
+		* 		uniqueArray,       // 중복 제거된 배열                    
+		* 		uniqueCount, // 중복 제거된 데이터 개수  
+		* 		duplicateArray,    // 중복된 데이터 배열                   
+		* 		duplicateCount: duplicateArray.length // 중복된 데이터 개수
+		* 	};
+		*/
+		const result = removeDuplicatesAndCount(combinedData, 'phone');
+
+		
+		// 총 30만건이 넘으면 false
+		if (!validateRowLimit(result.uniqueCount)) {
+			return false;
+		}
+		
+
+        // 6. 수량/가격 계산
+        setAllCntData(result);
+        fn_priceClclt();
+		
+		
+		$('#closeBtn').click();
+	});
+		
+  
+
+	//받는사람 전체삭제 버튼 처리
+	$('#allDel').click(function(){
+		var data = $tableExcel.getRows();	
+		$tableExcel.clearData();
+		$("#excelRowTotCnt").text(0); //총건수 수정
+		$("#excelRowDupCnt").text(0); //중복건수 수정
+		$("#excelRowErrorCnt").text(0); //중복건수 수정
+		dupliPhoneDataRealList.length = 0;	// 중복 휴대폰번호 초기화
+        $tableError.clearData();
+		
+		// select box 초기화
+		$('.field-selector').each(function() { $(this).val(''); });
+		
+	});
+	
+  
+
+    //치환문자 있는 엑섹불러오기 버튼 클릭시 파일 첨부 실행
+    $('.c3').click(function(){ // 엑셀파일 불러오기 선택 시
+        
+        $("#excelFileC4").click();
+        
+    });
+});
+
+
+
+function excelFileChange(file) {
+	if (file) {
+
+		// 파일 크기 체크 (20MB)
+		const maxSize = 20 * 1024 * 1024; // 20MB in bytes
+		if (file.size > maxSize) {
+			alert('파일 크기는 20MB를 초과할 수 없습니다.');
+			return;
+		}
+		
+		fn_loadAddActive();
+		var reader = new FileReader();
+		var extension = file.name.split('.').pop().toLowerCase();
+		reader.onload = function(e) {
+			setTimeout(() => { // 파일 읽기 완료 후 실행되도록 함
+				if (extension === 'xlsx') {
+					var data = new Uint8Array(e.target.result);
+					var workbook = XLSX.read(data, {type: 'array'});
+					var firstSheet = workbook.Sheets[workbook.SheetNames[0]];
+					var jsonData = XLSX.utils.sheet_to_json(firstSheet, {header: 1});
+					// 문제 데이터를 확인하는 함수 호출
+					findInvalidDBCharacters(jsonData);
+					processExcelData(jsonData);
+				} else if (extension === 'xls') {
+					var data = e.target.result;
+					var workbook = XLSX.read(data, { type: 'binary' });
+					var firstSheet = workbook.Sheets[workbook.SheetNames[0]];
+					var jsonData = XLSX.utils.sheet_to_json(firstSheet, { header: 1 });
+
+					// 문제 데이터를 확인하는 함수 호출
+					findInvalidDBCharacters(jsonData);
+
+					
+					processExcelData(jsonData);
+				} else if (extension === 'txt') {
+					var textData = e.target.result;
+					processTextData(textData);
+				} else {
+					alert('지원되지 않는 파일 형식입니다.');
+				}
+				fn_loadRemoveActive();
+			}, 0); // 지연 없이 즉시 실행되도록 0ms 지연을 설정
+		};
+		if (extension === 'xlsx') {
+			reader.readAsArrayBuffer(file);
+		} else if (extension === 'xls') {
+			reader.readAsBinaryString(file); // xls 파일에 적절한 read 메서드 호출
+		} else if (extension === 'txt') {
+			reader.readAsText(file);
+		}
+	}
+}
+
+//문제 데이터를 확인하는 함수
+function findInvalidDBCharacters(jsonData) {
+	console.log('DB 입력 값 검사 중...');
+	const invalidCharPattern = /[\uD800-\uDBFF][\uDC00-\uDFFF]/; // 4바이트 유니코드 문자 (이모지 등)
+	for (let rowIndex = 0; rowIndex < jsonData.length; rowIndex++) {
+		const row = jsonData[rowIndex];
+		if (Array.isArray(row)) {
+			for (let colIndex = 0; colIndex < row.length; colIndex++) {
+				const cell = row[colIndex];
+				if (typeof cell === 'string' && invalidCharPattern.test(cell)) {
+					console.warn('허용되지 않는 문자: row', rowIndex + 1,', col ', colIndex + 1, ', value:', cell);
+					// 허용되지 않는 문자를 제거 (선택 사항)
+					row[colIndex] = cell.replace(invalidCharPattern, '');
+					console.log('수정된 값:', row[colIndex]);
+				}
+			}
+		}
+	}
+}
+
+
+// 엑셀 데이터 처리 함수
+function processExcelData(data) {
+    console.log('data : ', data);
+
+    let tableData = data.slice(1).map(row => {
+        return {
+            addrPhoneNo: row[0], // 필드명을 fn_phoneDupl()에서 사용하는 이름으로!
+            addrNm: "", // 이름 필드가 없어도 오류 방지용으로 추가
+        };
+    });
+
+    console.log("변환된 데이터: ", tableData);
+
+    // Tabulator에 데이터 설정
+    $tableExcel.setData(tableData);
+
+    // 중복/오류 처리 함수 호출
+    fn_phoneDupl($tableExcel);
+}
+
+
+
+/* function processExcelData(data) {
+	console.log('data : ', data);
+	var keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
+	var tableData = [];
+	var totalRows = data.length - 2; // 전체 데이터 수 (1, 2행 제외)
+	console.log('data: ', data);
+	
+	// 3번째 행부터 입력 
+	data.slice(0).forEach((row, index) => {
+		var rowData = {};
+		keys.forEach((key, idx) => { // index 변수명 변경 (내부와 외부에서 사용되므로 충돌 방지)
+// 			console.log('row[idx] : ', row[idx]);
+			   rowData[key] = row[idx] ? row[idx].trim() : ""; // 각 컬럼에 대해 기본값을 설정
+			rowData[key] = (typeof row[idx] === 'string') ? row[idx].trim() : row[idx];
+		});
+		tableData.push(rowData);
+	
+	});
+	console.log('tableData :: ', tableData);
+	updateTable(tableData);
+} */
+
+
+// 텍스트 데이터 처리 함수
+function processTextData(text) {
+	var lines = text.split('\n'); // 각 줄을 배열로 분리
+	var keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
+	var tableData = [];
+	
+	lines.forEach(line => {
+		var rowData = {};
+		var row = line.split(','); // 쉼표로 분리
+		keys.forEach((key, index) => {
+			rowData[key] = row[index] ? row[index].trim() : ""; // 각 컬럼에 대해 기본값을 설정
+		});
+		tableData.push(rowData);
+	});
+	
+	updateTable(tableData);
+}
+
+//공통 테이블 업데이트 함수
+function updateTable(tableData) {
+	$tableExcel.setColumns([ //Define Table Columns
+ 		{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, headerHozAlign:"center", hozAlign:"center", headerSort:false, cellClick:function(e, cell){
+ 	        cell.getRow().toggleSelect();
+	 		}
+	 	}, 
+		{formatter:"rownum", align:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:60},
+	 	{title:"A", field:"A", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
+	 	{title:"B", field:"B", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
+	 	{title:"C", field:"C", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
+	 	{title:"D", field:"D", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
+	 	{title:"E", field:"E", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]},
+	 	{title:"F", field:"F", hozAlign:"center", headerHozAlign: "center", width:140, validator:["maxLength:100", "string"]}
+ 	]);
+
+	$tableExcel.setData(tableData).then(() => {
+		// excelRowTotCnt 업데이트
+		document.getElementById("excelRowTotCnt").innerText = tableData.length;
+	});
+	
+	fn_loadRemoveActive();
+}
+
+
+
+/* 
+* 타이틀 select 선택할때마다 실행해서         
+* 데이터테이블 필드값 수정                  
+*/
+function updateTableFields($objTabul) {
+	var currentData = $objTabul.getData();
+	var columns = [
+		{formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
+			cell.getRow().toggleSelect();
+		}}
+		,{formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:60}
+	];
+
+	var fieldMapping = [];
+	$('.field-selector').each(function(index) {
+		var selectedField = $(this).val();
+		//  ASCII 문자 코드 사용 - 65=A, 66=B ...
+		var field = String.fromCharCode(65 + index);
+		if (selectedField) {
+			columns.push({
+				title: field
+				, field: selectedField
+				, hozAlign: "center"
+				, headerHozAlign: "center"
+// 				, editor: "input"
+				, editor: false
+				, width: 140
+				, validator: ["maxLength:100", "string"]
+			});
+			fieldMapping.push(selectedField);
+		} else {
+			columns.push({
+				title: field
+				, field: field
+				, hozAlign: "center"
+				, headerHozAlign: "center"
+				, editor: false
+// 				, editor: "input"
+				, width: 140
+				, validator: ["maxLength:100", "string"]
+			});
+			fieldMapping.push(field);
+		}
+	});
+
+	var updatedData = currentData.map(row => {
+		console.log('row : ', row);
+		var newRow = {};
+		fieldMapping.forEach((field, index) => {
+			newRow[field] = row[Object.keys(row)[index]] ?? "";
+		});
+		return newRow;
+	});
+
+	$objTabul.setColumns(columns);
+	$objTabul.setData(updatedData);
+}
+
+
+/**
+ * @ 핸드폰 중복 데이터
+ * */
+function fn_phoneDupl($objTabul) {
+	 
+	$tableError.clearData();
+	
+	var data = $objTabul.getData();
+	var phoneNumberChk = false;
+	var existingNumbers = new Set(); // 배열에서 Set으로 변경
+	
+	let errorCount = 0; // 중복 번호 개수를 저장할 변수
+	let duplicateCount = 0; // 중복 번호 개수를 저장할 변수
+	
+	const errors = [];  // 오류 데이터를 저장할 배열
+	const newData = []; // 유효한 데이터만 저장할 새로운 배열
+	
+	data.forEach((row, index) => {
+		
+		const number = row.addrPhoneNo;
+		
+		// number가 null, undefined, 빈 문자열이거나 숫자인 경우 처리
+		if (!number || (typeof number === 'string' && !number.trim())){
+			console.log("number : ", number);
+			 return;
+		}
+		
+		const formattedNumber = formatPhoneNumber(number); // 번호 표준화
+		const cleanedNumber = formattedNumber.replace(/[^0-9]/g, ''); // 숫자만 남김
+		
+		if (!existingNumbers.has(cleanedNumber)) { // 중복 번호 체크
+		    if (isValidPhoneNumber(formattedNumber)) { // 유효성 검사
+		        row.addrPhoneNo = formattedNumber;
+		        existingNumbers.add(cleanedNumber); // 추가된 번호를 기존 목록에 추가
+		        newData.push(row); // 유효한 데이터만 새로운 배열에 추가
+		    } else {
+				// 오류: 유효성 통과 못함
+				errorCount++;
+				
+				errors.push({ 
+					name: row.addrNm, // 이름
+					phone: row.addrPhoneNo, // 폰번호
+					result: "오류" // 결과 메시지 추가
+				});
+		    }
+		} else {
+			// 중복
+			duplicateCount++;
+			
+			errors.push({ 
+				name: row.addrNm, // 이름
+				phone: row.addrPhoneNo, // 폰번호
+				result: "중복" // 결과 메시지 추가
+			});
+		}
+	});
+	
+	// data 배열을 newData 배열로 대체
+	
+	data = newData;
+	console.log('data : ', data);
+
+	// 수정된 데이터로 테이블 업데이트
+	$objTabul.setData(data);
+	// 오류 총 카운트
+    $("#excelRowTotCnt").text($objTabul.getDataCount());
+	// 중복 카운트
+	$("#excelRowDupCnt").text(duplicateCount);
+	// 에러 카운트
+	$("#excelRowErrorCnt").text(errorCount);
+	
+	// popup 영역
+	$("#errorPopTotCnt").text($objTabul.getDataCount());
+	// 중복 카운트
+	$("#errorPopDupCnt").text(duplicateCount);
+	// 에러 카운트
+	$("#errorPopErrorCnt").text(errorCount);
+	
+	
+	$tableError.setData(errors);
+	
+	if(errorCount > 0){
+		alert('휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.\nex) 발송불가 특수문자, 자릿수 오류 등');
+	}
+	
+	
+	
+}
+
+function fn_dupliPopupShow(){
+
+	$("#tableExcelDupliBtn").show();
+}
+
+
+// 상단 설명 더보기 
+function popMore(e){
+	$(e).closest(".pop_more_cont").toggleClass("pop_more_click");
+	
+	if($(e).closest(".pop_more_cont").is(".pop_more_click")){
+		$(e).html('숨기기');
+		$(e).append('<i></i>');
+	}else {
+		$(e).html('더보기');
+		$(e).append('<i></i>');
+	}
+}
+
+// excel 오류정보 테스트
+$(document).on('click', '#errorExcelBtn', function() {
+	if($tableError.getDataCount()<1){
+		alert('오류 정보가 없습니다.');
+		return false;
+	}
+	$tableError.download("xlsx", "error_data.xlsx");
+});
+
+
+</script>
+
+<!-- 중복전화번호 data-tooltip:addrMassDupli_layer -->
+<div class="tooltip-wrap">
+	<div class="popup-com addrMassDupli_layer" tabindex="0" data-tooltip-con="addrMassDupli_layer" data-focus="addrMassDupli_layer" data-focus-prev="addrMassDupli_layer-close" style="width: 270px; height: 500px;">
+		<div class="popup_heading">
+			<p>중복 휴대폰번호</p>
+			<button type="button" class="tooltip-close" data-focus="addrMassDupli_layer-close" onclick="setAddrDupliClose();"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+		</div>
+		<div class="layer_in" style="padding:20px 0px;" id="addrMassDupli_layer">
+		</div>
+		
+		<div class="popup_btn_wrap2" style="margin-top: 0px;">
+			<button type="button" class="tooltip-close" data-focus="addrMassDupli_layer-close" data-focus-next="addrMassDupli_layer">닫기</button>
+		</div>		
+		
+	</div>		
+</div>
+
+
+<!-- 주소록 상세 결과 팝업 data-tooltip:adr_popup14 -->
+	<div class="tooltip-wrap">
+		<div class="popup-com adr_layer adr_detail_result adr_popup14" tabindex="0" data-tooltip-con="adr_popup14" data-focus="adr_popup14" data-focus-prev="adr_popu14-close" style="width: 525px;z-index:125;">
+			<div class="popup_heading">
+				<p>주소록 상세 결과</p>
+				<button type="button" class="tooltip-close" data-focus="adr_popup14-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+			</div>
+			<div class="layer_in" style="padding:30px 20px;">
+				<div class="table_top">
+					<p>
+						총 <span class="c_e40000" id="errorPopTotCnt">0</span>건 
+						/ 중복 <span class="c_002c9a" id="errorPopDupCnt">0</span>건
+						/ 오류 <span class="c_002c9a" id="errorPopErrorCnt">0</span>건</p>
+						<button type="button" class="excel_btn btnType" id="errorExcelBtn"><i class="downroad"></i>엑셀 다운로드</button>
+				</div>
+				<div class="tb_wrap adr_list" id="tabulator_error">
+				<!-- $tableError 참고  -->
+                </div>
+                <ul class="cf_text_ul">
+                    <li>*중복번호는 하나의 번호만 등록됩니다.</li>
+                    <li>*휴대폰 형식에 맞지 않는 데이터는 삭제 후 업로드 됩니다.</li>
+                    <li>ex) 발송불가 특수문자, 자릿수 오류 등</li>
+                </ul>
+                <div class="popup_btn_wrap2">
+<!--                     <button type="button">저장</button> -->
+                    <button type="button" class="tooltip-close" data-focus="adr_popup14-close" data-focus-next="adr_popup14">닫기</button>                      
+                </div>
+			</div>
+		</div>
+	</div>
+
+<!--// 중복전화번호 팝업 -->
+				<div class="popup_heading">
+					<p>엑셀 불러오기</p>
+					<button type="button" class="tooltip-close" id="closeBtn" data-focus="popup07-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+			   </div>
+				<div class="layer_in execl_upload_layer" style="padding: 25px 30px;">
+<!-- 					<div class="list_tab_wrap2"> -->
+						<!-- tab button -->
+<!-- 						<ul class="list_tab" id="tbTabl">  -->
+<!-- 							<li class="tab active" data-tabul="tableExcel"><button type="button" onclick="popupTab(this,'1'); fn_tabToggle('1');">엑셀입력</button></li> -->
+<!-- 							<li class="tab" data-tabul="tableClip"><button type="button" onclick="popupTab(this,'2'); fn_tabToggle('2');">붙여넣기</button></li> -->
+<!-- 							<li class="tab" data-tabul="tableSelf"><button type="button" onclick="popupTab(this,'3'); fn_tabToggle('3');">직접입력</button></li> -->
+<!-- 						</ul>// tab button -->
+<!-- 					</div> -->
+					<!-- 엑셀입력 -->
+					<div class="popCont current pop_more_cont" id="popCont_1">
+						<div class="titBox">
+							<p>- 주소록은 한 번에 최대 30만건까지 등록(EXCEL파일, 최대용량 20MB) 가능합니다. </p>
+							<p>- 엑셀 파일에 비밀번호 설정, 제한된 보기, 수식 등이 설정되어 있는 경우 업로드가 불가합니다.</p>
+							<p>- 구분선(|), 역슬래시(\, ₩), 큰따옴표("), 이모지(이모티콘) 등 발송불가 특수문자는 저장되지 않습니다.</p>
+							<p>- 이름 200byte, [*1*]~[*4*] 200byte, 메모 250byte까지 입력 가능합니다.</p>
+							<p>- 주소록 등록이 어려우신 경우에는 <a href="<c:url value='/web/mjon/addragency/selectAddrAgencyList.do'/>" style="font-weight: bold; color: blue;">주소록 입력대행</a> 메뉴를 이용하실 수 있습니다. </p>
+						</div>
+						<div class="pop_more_wrap">
+								<button type="button" class="pop_more" onclick="popMore(this);">더보기<i></i></button>
+						</div>
+					</div><!--// 엑셀입력 -->
+
+					<!-- 공통 -->
+					<div>
+		                <table class="layer_tType1">
+		                    <caption>엑셀입력 표</caption>
+		                    <colgroup>
+		                        <col style="width: 95px">
+		                        <col style="width: auto">
+		                    </colgroup>
+		                    <tbody>
+		                        <tr>
+		                            <!-- <th>그룹 선택</th>
+		                            <td>
+		                                <label for="" class="label">그룹 선택</label>
+		                                <select id="addrGrpIdInfo" name="addrGrpIdInfo">
+		                                </select>
+	                                    <label for="" class="label">그룹명 입력</label>
+	                                    <input type="text" id="addrGrpNm" name="addrGrpNm" placeholder="새 그룹명을 입력해주세요." onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'"class="inputLight" style="width: 300px;">
+		                                <input type="file" id="excelFile" accept=".xls, .xlsx, .txt" style="display:none"/>
+		                                <button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀, TXT파일 업로드</button>
+		                            </td> -->
+		                            <td colspan="2" style="padding:10px 0;">
+		                            	<div class="file_upload_wrap" style="width:100%;display:flex;">
+						                	<div class="file_add upload_area">
+												<p><img src="/publish/images/content/file_add.png" alt="파일 붙여넣기">마우스로 엑셀파일을 여기에 끌어다 놓으세요</p>
+											</div>
+											<input type="file" id="excelFileC4" accept=".xls, .xlsx, .txt" style="display:none"/>
+					                        <button type="button" class="excel_btn2 btnType c3"><i class="uproad"></i>엑셀파일 업로드</button>
+						                </div>
+		                            </td>
+		                        </tr>
+		                    </tbody>
+		                </table>
+	                </div>
+	                
+					
+					<div class="excel_middle2">
+						<p>
+							총 <span class="c_e40000 fwBold" id="excelRowTotCnt">0</span>건 
+							/ 중복 <span class="c_002c9a fwBold" id="excelRowDupCnt">0</span>건
+							/ 오류 <span class="c_002c9a fwBold" id="excelRowErrorCnt">0</span>건
+							<button type="button" class="btn_list_detail" data-tooltip="adr_popup14"><img src="/publish/images/search.png"></button>
+						</p>
+<!-- 							&nbsp;  -->
+<!-- 							<button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" id="tableExcelDupliBtn">중복번호</button> -->
+<!-- 							&nbsp; -->
+<!-- 							<button type="button" class="btnType btnType6" data-tooltip="addrMassSaveDupli_layer" onclick="GetAddrMassSaveDupli()" id="btnAddrMassSaveDupli">중복번호</button> -->
+						</p>
+<!-- 						<button type="button" class="btnType btnType6 addCallToF">번호추가</button> -->
+					</div>
+					
+					
+					<!-- 
+
+					<div class="adr_excel" style="margin-top: 13px; overflow-x:auto;">
+                    <div class="adr_excel" style="margin-top: 13px;">
+                        thead
+                        <div class="adr_hd select_adr_hd msg" data-group="tableExcel">
+                        	<div style="width: 100px;"></div>
+                            <div style="width: 100px;"></div>
+                            <div style="width: 140px;">
+                            	<label for="" class="label"></label>
+								<select class="field-selector">
+									<option value="">선택하기</option>
+									<option value="addrNm">이름</option>
+									<option value="addrPhoneNo">휴대폰</option>
+									<option value="addrInfo1">[*1*]</option>
+									<option value="addrInfo2">[*2*]</option>
+									<option value="addrInfo3">[*3*]</option>
+									<option value="addrInfo4">[*4*]</option>
+									<option value="addrComment">메모</option>
+								</select>
+                            </div>
+                            <div style="width: 140px;">
+                                <label for="" class="label"></label>
+								<select class="field-selector">
+									<option value="">선택하기</option>
+									<option value="addrNm">이름</option>
+									<option value="addrPhoneNo">휴대폰</option>
+									<option value="addrInfo1">[*1*]</option>
+									<option value="addrInfo2">[*2*]</option>
+									<option value="addrInfo3">[*3*]</option>
+									<option value="addrInfo4">[*4*]</option>
+									<option value="addrComment">메모</option>
+								</select>
+                            </div>
+                            <div style="width: 140px;">
+                                <label for="" class="label"></label>
+								<select class="field-selector">
+									<option value="">선택하기</option>
+									<option value="addrNm">이름</option>
+									<option value="addrPhoneNo">휴대폰</option>
+									<option value="addrInfo1">[*1*]</option>
+									<option value="addrInfo2">[*2*]</option>
+									<option value="addrInfo3">[*3*]</option>
+									<option value="addrInfo4">[*4*]</option>
+									<option value="addrComment">메모</option>
+								</select>
+                            </div>
+                            <div style="width: 140px;">
+                                <label for="" class="label"></label>
+								<select class="field-selector">
+									<option value="">선택하기</option>
+									<option value="addrNm">이름</option>
+									<option value="addrPhoneNo">휴대폰</option>
+									<option value="addrInfo1">[*1*]</option>
+									<option value="addrInfo2">[*2*]</option>
+									<option value="addrInfo3">[*3*]</option>
+									<option value="addrInfo4">[*4*]</option>
+									<option value="addrComment">메모</option>
+								</select>
+                            </div>
+                            <div style="width: 140px;">
+                                <label for="" class="label"></label>
+								<select class="field-selector">
+									<option value="">선택하기</option>
+									<option value="addrNm">이름</option>
+									<option value="addrPhoneNo">휴대폰</option>
+									<option value="addrInfo1">[*1*]</option>
+									<option value="addrInfo2">[*2*]</option>
+									<option value="addrInfo3">[*3*]</option>
+									<option value="addrInfo4">[*4*]</option>
+									<option value="addrComment">메모</option>
+								</select>
+                            </div>
+                            <div style="width: 140px;">
+                                <label for="" class="label"></label>
+								<select class="field-selector">
+									<option value="">선택하기</option>
+									<option value="addrNm">이름</option>
+									<option value="addrPhoneNo">휴대폰</option>
+									<option value="addrInfo1">[*1*]</option>
+									<option value="addrInfo2">[*2*]</option>
+									<option value="addrInfo3">[*3*]</option>
+									<option value="addrInfo4">[*4*]</option>
+									<option value="addrComment">메모</option>
+								</select>
+                            </div>
+                            <div style="width: 125px;">
+                                <label for="" class="label"></label>
+								<select class="field-selector">
+									<option value="">선택하기</option>
+									<option value="addrNm">이름</option>
+									<option value="addrPhoneNo">휴대폰</option>
+									<option value="addrInfo1">[*1*]</option>
+									<option value="addrInfo2">[*2*]</option>
+									<option value="addrInfo3">[*3*]</option>
+									<option value="addrInfo4">[*4*]</option>
+									<option value="addrComment">메모</option>
+								</select>
+                            </div>
+                        </div>
+                     </div>		 -->			
+					
+					<div class="drag_drop_wrap callList_includ_box" id="tabulator_excel">
+<!-- 						<img src="/publish/images/content/excel.jpg" style="width: 100%;"> -->
+					</div>
+					<div class="excel_middle">
+						<div class="select_btnWrap clearfix">
+							<div>
+								<button type="button" id="allDel"><i class="remove_img"></i>전체삭제</button>
+								<button type="button" id="in_select_del"><i class="remove_img"></i>선택삭제</button>
+							</div>
+	
+						</div>
+					</div><!--// 공통 -->     
+	
+					<!-- 붙여놓기 설명 -->
+<!-- 	                <div class="req_area"> -->
+<!-- 	                  	<div class="text_box"> -->
+<!-- 	                    	- 휴대폰 번호가 입력된 txt 파일을 열어 복사(Ctrl+c) + 붙여넣기(Ctrl+v)로도 입력하실 수 있습니다.<br> -->
+<!-- 							- 휴대폰 번호는 필수입력 항목입니다.<br> -->
+<!-- 							- 이름,휴대폰 번호,[*1*],[*2*],[*3*],[*4*],메모 순서대로 입력해주세요.(예 : 010-1234-5678,홍길동,변수1…메모)<br> -->
+<!-- 							- 이름은 24byte, [*1*]~[*4*] 40byte, 메모는 250byte까지 입력 가능합니다.<br> -->
+<!-- 							- '오류 검사'를 통해 등록된 데이터에 전화번호 입력 오류를 확인하실 수 있습니다. -->
+<!-- 						</div> -->
+<!-- 	                </div> -->
+					<div class="popup_btn_wrap2" style="margin: 0 auto 30px auto;">
+						<button type="button" id="btnAddrMassReg">추가</button>
+						<button type="button" id="btnAddrMassClose" class="tooltip-close" data-focus="adr_popup07-close"  data-focus-next="popup07">닫기</button>                      
+					</div>
+				
+				</div>(No newline at end of file)
src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentAllListAjax.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentAllListAjax.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentAllListAjax.jsp
@@ -3,6 +3,7 @@
 <%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
 <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%>
 <%@ page import="itn.com.cmm.LoginVO" %>
 <script src="/publish/js/content.js"></script>
 <script src="/publish/js/popupLayer.js"></script>
@@ -48,102 +49,145 @@
 
 		}
 	});
-	
-	if($("#tdType").val() == "groupList" || $("#tdType").val() == ""){
-		$("#privateListTable").hide();
-		$("#groupListTable").show();
-	}else{
-		$("#privateListTable").show();
-		$("#groupListTable").hide();
-	}
 });
 
+function fnReservCancel(msgGroupId){
+	
+	var form = document.resCancelForm;
+	var loginVO = '${LoginVO}';
+	
+	form.msgGroupId.value = msgGroupId;
+	
+	if(loginVO == "" || loginVO == null){
+		
+		alert("로그인 후 이용이 가능합니다.");
+		return false;
+		
+	}
+	
+	var data = new FormData(form);
+	url = "/web/mjon/reservmsg/deleteReservMsgCancelDataAjax.do";
+	
+	if(confirm("정말 예약을 취소하시겠습니까?")){
+		
+		$.ajax({
+	        type: "POST",
+	        url: url,
+	        data: data,
+	        dataType:'json',
+	        async: false,
+	        processData: false,
+	        contentType: false,
+	        cache: false,
+	        success: function (returnData, status) {
+				if(status == 'success'){
+					if("fail"==returnData.result){
+						
+						alert(returnData.message);
+						return false;
+					}
+				
+					var smsCnt = returnData.resultSts;
+				
+					alert("예약 발송이 정상적으로 취소 되었습니다.");
+					
+					linkPage(1);
+					
+				} else if(status== 'fail'){
+					alert(returnData.message);
+				}
+			},
+	        error: function (e) { alert("예약 취소에 실패하였습니다."); console.log("ERROR : ", e); }
+	    });
+		
+	}
+	
+}
+
+function fn_sentDetailView(msgGroupId) {
+	// msgGroupId 값을 form에 설정
+	$("#searchForm #msgGroupId").val(msgGroupId);
+
+	// form을 해당 URL로 제출
+	$("#searchForm").attr("action", "/web/kakao/sent/selectKakaoSentDetailView.do");
+	$("#searchForm").submit();
+}
+
 </script>
-	<input type="button" id="tooltopClick" data-tooltip="rev_popup01" style="display:none;"/>
     <div class="list_info">
-    	<input type="hidden"  id="tdType" value="${kakaoSentVO.listType}">
-        <p>총 <span class="c_e40000"><c:out value="${totalRecordCount}"/></span>건</p>
-        <div>
-            <label for="pageUnit" class="label">줄보기 선택</label>
-            <select id="pageUnit" name="pageUnit" class="selType2">
-                <option value="10" <c:if test="${paginationInfo.recordCountPerPage == '10'}">selected</c:if> >10개보기</option>
+		<p>총 발송건수 <span class="c_e40000"><c:out value="${totalRecordCount}"/></span>건</p>
+		<div>
+			<p class="cf_text c_e40000">※ 예약 발송취소는 예약 발송시간 기준 5분 전까지만 가능</p>
+			<label for="pageUnit" class="label">줄보기 선택</label>
+			<select id="pageUnit" name="pageUnit" class="selType2">
+				<option value="10" <c:if test="${paginationInfo.recordCountPerPage == '10'}">selected</c:if> >10개보기</option>
                 <option value="20" <c:if test="${paginationInfo.recordCountPerPage == '20'}">selected</c:if> >20개보기</option>
                 <option value="30" <c:if test="${paginationInfo.recordCountPerPage == '30'}">selected</c:if> >30개보기</option>
-            </select>
-        </div>
-    </div>
-	<!-- 전송건별 - groupList - -->
-	<div class="tb_wrap" id="groupListTable">
+			</select>
+		</div>
+	</div>
+	<!-- 발송화면 개선 : 카카오톡 테이블 수정 -->
+	<div class="tb_wrap">
 		<table class="tType4">
 			<colgroup>
-				<col style="width: 40px;">
-				<col style="width: 14%;">
-				<col style="width: 7%;">
-				<col style="width: 10%;">
-				<col style="width: 18%;">
-				<col style="width: 12%;">
-				<col style="width: 10%;">
+				<col style="width: 45px;">
 				<col style="width: 12%;">
 				<col style="width: 7%;">
-				<col style="width: 12%;">
+				<col style="width: auto;">
 				<col style="width: 7%;">
-				<%-- <col style="width: 10%;"> --%>
+				<col style="width: 6%;">
+				<col style="width: 6%;">
+				<col style="width: 6%;">
+				<col style="width: 6%;">
+				<col style="width: 6%;">
+				<col style="width: 8%;">
+				<col style="width: 8%;">
 			</colgroup>
 			<thead>
 				<tr>
-					<th>
+					<th rowspan="2">
 						<label for="" class="label">전체 선택</label>
 						<input type="checkbox">
 					</th>
-					<th>
-						발송일시
+					<th rowspan="2">발송일시
 						<div class="sort_wrap">
 							<input type="button" class="sort sortBtn" id="sort_reqdate">
 						</div>
 					</th>
-					<th>
-						형태
+					<th rowspan="2">형태
 						<div class="sort_wrap">
-							<input type="button" class="sort sortBtn" id="sort_msgType">
+							<input type="button" class="sort sortBtn" id="sort_orderByCode">
 						</div>
 					</th>
-					<th>내용</th>
-					<th>
-						받는사람
-						<div class="sort_wrap">
-							<input type="button" class="sort sortBtn" id="sort_callTo">
-						</div>
-					</th>
-					<th>
-						발신번호
-						<div class="sort_wrap">
-							<input type="button" class="sort sortBtn" id="sort_callFrom">
-						</div>
-					</th>
-					<th>
-						발송건수
+					<th rowspan="2">내용</th>
+					<th rowspan="2">발송건수
 						<div class="sort_wrap">
 							<input type="button" class="sort sortBtn" id="sort_msgGroupCnt">
 						</div>
 					</th>
-					<th>카카오톡 결과</th>
-					<th>건수</th>
-					<th>대체문자 결과</th>
-					<th>건수</th>
-					<!-- <th>금액</th> -->
+					<th rowspan="2">대기</th>												
+					<th colspan="2">카카오톡결과</th>
+					<th colspan="2">대체문자결과</th>
+					<th rowspan="2">금액(원)</th>
+					<th rowspan="2">진행상황</th>
 				</tr>
+				<tr>
+					<th>성공</th>
+					<th>실패</th>
+					<th>성공</th>
+					<th>실패</th>
+				</tr>
+
 			</thead>
-			
 			<tbody>
 				<c:if test="${not empty resultAllSentList}">
 					<c:forEach var="resultAllSentList" items="${resultAllSentList}" varStatus="status">
 						<tr>
-							<td rowspan="2">
+							<td>
 								<label for="msgSentDel${status.count}" class="label">선택</label>
-								<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" 
-									value="${resultAllSentList.msgGroupId}" <c:if test="${resultAllSentList.curState eq '0'}">disabled</c:if>> 
+								<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${resultAllSentList.msgGroupId}" <c:if test="${resultAllSentList.curState eq '0'}">disabled</c:if>> 
 							</td>
-							<td rowspan="2">
+							<td>
 								<c:choose>
 									<c:when test="${resultAllSentList.atDelayYn eq 'Y' && resultAllSentList.atDelayCompleteYn eq 'N'}">
 										<c:choose>
@@ -165,240 +209,89 @@
 									</c:otherwise>
 								</c:choose>
 							</td>
-							<td rowspan="2">
-								<p class="c_222 fwRg">
-									<c:if test="${resultAllSentList.msgType eq '8'}">알림톡</c:if>
-									<c:if test="${resultAllSentList.msgType eq '9'}">친구톡</c:if>
-								</p>
+							<td>
+								<c:if test="${resultAllSentList.msgType eq '8'}">알림톡</c:if>
+								<c:if test="${resultAllSentList.msgType eq '9'}">친구톡</c:if>
 							</td>
-							<td rowspan="2">
-<%-- 								<button class="btnType btnType20" data-tooltip="rev_popup01" onClick="javascript:fnRevDetailPop('${resultAllSentList.msgGroupId}','${resultAllSentList.msgId}','${resultAllSentList.fileCnt}'); return false;">상세보기</button> --%>
-								<button class="btnType btnType20" onClick="javascript:fnRevDetailPop('${resultAllSentList.msgGroupId}','${resultAllSentList.msgId}'); return false;">상세보기</button>
+							<td class="result_cont">
+                                <div class="icon_wrap">
+                                    <c:if test="${resultAllSentList.reserveYn eq 'Y'}">
+										<span class="re">예약</span>
+										<!-- 예약일때만 분할이 있음 -->
+										<c:if test="${resultAllSentList.divideYn eq 'Y'}">
+											<span class="di">분할</span>
+										</c:if>
+									</c:if>
+                                    <a href="#none" onclick="fn_sentDetailView('${resultAllSentList.msgGroupId}');">
+                                    	<c:out value="${resultAllSentList.smsTxt}"/>
+                                   	</a>
+                                </div>
+                            </td>
+							<td>
+								<c:out value="${resultAllSentList.msgGroupCnt}"/>
 							</td>
-							<td rowspan="2">
+							<td>
+								<fmt:formatNumber value="${resultAllSentList.waitCount}" type="number" groupingUsed="true" />
+							</td>
+							<td>
+								<p class="c_002c9a"><fmt:formatNumber value="${resultAllSentList.successCount}" type="number" groupingUsed="true" /></p>
+							</td>
+							<td>
+								<p class="c_e40000"><fmt:formatNumber value="${resultAllSentList.failCount}" type="number" groupingUsed="true" /></p>
+							</td>
+							<td>
+								<p class="c_002c9a"><fmt:formatNumber value="${resultAllSentList.kakaoResendSuccCount}" type="number" groupingUsed="true" /></p>
+							</td>
+							<td>
+								<p class="c_e40000"><fmt:formatNumber value="${resultAllSentList.kakaoResendFailCount}" type="number" groupingUsed="true" /></p>
+							</td>
+							<td>
+								<c:if test="${resultAllSentList.totPrice ne '-'}">
+									<fmt:formatNumber value="${resultAllSentList.totPrice}" type="number" groupingUsed="true" minFractionDigits="0" maxFractionDigits="1" />
+								</c:if>
+								<c:if test="${resultAllSentList.totPrice eq '-'}">
+									-
+								</c:if>
+							</td>
+							<td>
 								<c:choose>
-									<c:when test="${resultAllSentList.msgGroupCnt > 1}">
-										<p>
-											<c:choose>
-												<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
-													<c:out value="${resultAllSentList.addrNm}"/>
-												</c:when>
-												<c:otherwise>
-													<c:out value="${resultAllSentList.callToComma}"/>
-												</c:otherwise>
-											</c:choose> 외 <fmt:formatNumber value="${resultAllSentList.msgGroupCnt - 1}" pattern="#,###"/>명
-										</p>	
-									</c:when>
-									<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
-										<p><c:out value="${resultAllSentList.addrNm}"/></p>
+									<c:when test="${resultAllSentList.statusCd ne '03' }">
+										<ec:code codeId="ITN057" code="${resultAllSentList.statusCd }" />
 									</c:when>
 									<c:otherwise>
-										<p><c:out value="${resultAllSentList.callToComma}"/></p>
+										<p><button class="btnType btnType20" onClick="javascript:fnReservCancel('${resultAllSentList.msgGroupId}'); return false;">예약취소</button></p>
 									</c:otherwise>
 								</c:choose>
 							</td>
-							<td rowspan="2"><p><c:out value="${resultAllSentList.callFromComma}"/></p></td>
-							<td rowspan="2"><p><c:out value="${resultAllSentList.msgGroupCnt}"/></p></td>
-							
-							
-							
-							<td><p class="c_002c9a fwRg">정상수신</p></td>
-							<td>
-								<!-- 성공건이 1건 이상이면 클릭이벤트 추가 -->
-								<p class="c_002c9a fwRg" <c:if test="${resultAllSentList.successCount > 0}">onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'S'); return false;" style="cursor:pointer;"</c:if>>
-								<fmt:formatNumber value="${resultAllSentList.successCount}" pattern="#,###.#"/></p>
-							</td>
-							<td><p class="c_002c9a fwRg">정상수신</p></td>
-							<td>
-								<!-- 성공건이 1건 이상이면 클릭이벤트 추가 -->
-								<p class="c_002c9a fwRg" <c:if test="${resultAllSentList.kakaoResendSuccCount > 0}">onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'S'); return false;" style="cursor:pointer;"</c:if>>
-								<fmt:formatNumber value="${resultAllSentList.kakaoResendSuccCount}" pattern="#,###.#"/></p>
-							</td>
-							<%-- <td>
-								<p class="c_002c9a fwRg">
-								<c:if test="${succPrice > 0}"><fmt:formatNumber value="${succPrice}" pattern="#,###.#"/></c:if>
-								<c:if test="${succPrice eq 0}">0</c:if>
-								</p>
-							</td> --%>
-						</tr>
-						<tr>
-							<td class="c_222"><p>실패/대기</p></td>
-							<td class="c_222">
-								<!-- 실패건이 1건 이상이면 클릭이벤트 추가 -->
-								<p <c:if test="${(resultAllSentList.waitCount+resultAllSentList.failCount) > 0}"> onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'F'); return false;" style="cursor:pointer;"</c:if>>
-								<fmt:formatNumber value="${resultAllSentList.failCount}" pattern="#,###"/> / <fmt:formatNumber value="${resultAllSentList.waitCount}" pattern="#,###"/></p>
-							</td>
-							<td class="c_222"><p>실패</p></td>
-							<td class="c_222"><!-- 실패건이 1건 이상이면 클릭이벤트 추가 -->
-								<p <c:if test="${resultAllSentList.kakaoResendFailCount > 0}"> onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'F'); return false;" style="cursor:pointer;"</c:if>>
-								<fmt:formatNumber value="${resultAllSentList.kakaoResendFailCount}" pattern="#,###"/></p></td>
-							<%--<td class="c_222">
-								<p>
-									 <c:if test="${(failPrice+waitPrice) > 0}"><fmt:formatNumber value="${(failPrice+waitPrice)}" pattern="#,###.#"/></c:if>
-									<c:if test="${(failPrice+waitPrice) eq 0}">0</c:if> 
-								</p>
-							</td>--%>
 						</tr>
 					</c:forEach>
 				</c:if>
 				<c:if test="${empty resultAllSentList}">
 						<tr>
-							<td colspan="11">발송 내역이 없습니다.</td>
+							<td colspan="12">발송 내역이 없습니다.</td>
 						</tr>
 				</c:if>
 			</tbody>
 		</table>
 	</div>
-	<!-- 전송건별 끝 -->
 	
-	<!-- 받는사람(개인별) privatevate -->
-	<div class="tb_wrap" id="privateListTable" style="display:none;">
-		<table class="tType4">
-			<colgroup>
-				<col style="width: 40px;">
-				<col style="width: 15%;">
-				<col style="width: 12%;">
-				<col style="width: 90px;">
-				<col style="width: 12%;">
-				<col style="width: 14%;">
-				<col style="width: 11%;">
-				<col style="width: 11%;">
-			</colgroup>
-			<thead>
-				<tr>
-					<th>
-						<label for="" class="label">전체 선택</label>
-						<input type="checkbox">
-					</th>
-					<th>
-						발송일시
-						<div class="sort_wrap">
-							<input type="button" class="sort sortBtn" id="sort_reqdate">
-						</div>
-					</th>
-					<th>
-						형태
-						<div class="sort_wrap">
-							<input type="button" class="sort sortBtn" id="sort_msgType">
-						</div>
-					</th>
-					<th>내용</th>
-					<th>
-						받는사람
-						<div class="sort_wrap">
-							<input type="button" class="sort sortBtn" id="sort_callTo">
-						</div>
-					</th>
-					<th>
-						발신번호
-						<div class="sort_wrap">
-							<input type="button" class="sort sortBtn" id="sort_callFrom">
-						</div>
-					</th>
-					<th>카카오톡 결과</th>
-					<th>대체문자 결과</th>
-				</tr>
-			</thead>
-			
-			<tbody>
-				<c:if test="${not empty resultAllSentList}">
-					<c:forEach var="resultAllSentList" items="${resultAllSentList}" varStatus="status">
-						<tr>
-							<td>
-								<label for="msgSentDel${status.count}" class="label">선택</label>
-								<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" 
-									value="${resultAllSentList.msgSeq}" <c:if test="${resultAllSentList.curState eq '0'}">disabled</c:if>> 
-							</td>
-							<td><p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.reqdate}" /></p></td>
-							<td>
-								<p class="c_222 fwRg">
-									<c:if test="${resultAllSentList.msgType eq '8'}">알림톡</c:if>
-									<c:if test="${resultAllSentList.msgType eq '9'}">친구톡</c:if>
-								</p>
-							</td>
-							<td>
-<%-- 								<button class="btnType btnType20" data-tooltip="rev_popup01" onClick="javascript:fnRevDetailPop('${resultAllSentList.msgGroupId}','${resultAllSentList.msgId}','${resultAllSentList.fileCnt}'); return false;">상세보기</button> --%>
-								<button class="btnType btnType20" onClick="javascript:fnRevDetailPop('${resultAllSentList.msgGroupId}','${resultAllSentList.msgId}'); return false;">상세보기</button>
-								<!-- <button class="btnType btnType20" data-tooltip="rev_popup03">상세보기</button> -->
-							</td>
-							<td>
-								<c:choose>
-									<c:when test="${resultAllSentList.msgGroupCnt > 1}">
-										<p>
-											<c:choose>
-												<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
-													<c:out value="${resultAllSentList.addrNm}"/>
-												</c:when>
-												<c:otherwise>
-													<c:out value="${resultAllSentList.callToComma}"/>
-												</c:otherwise>
-											</c:choose> 외 <fmt:formatNumber value="${resultAllSentList.msgGroupCnt - 1}" pattern="#,###"/>명
-										</p>	
-									</c:when>
-									<c:when test="${resultAllSentList.addrNm ne '-' and resultAllSentList.addrNm ne ''}">
-										<p><c:out value="${resultAllSentList.addrNm}"/></p>
-									</c:when>
-									<c:otherwise>
-										<p><c:out value="${resultAllSentList.callToComma}"/></p>
-									</c:otherwise>
-								</c:choose>
-							</td>
-							<td><p><c:out value="${resultAllSentList.callFromComma}"/></p></td>
-							<td>
-								<c:choose>
-									<c:when test="${resultAllSentList.msgResult eq 'S'}">
-										<p class="c_002c9a fwRg">정상수신</p>
-									</c:when>
-									<c:when test="${resultAllSentList.msgResult eq 'W'}">
-										<p class="fwRg c_19b32b">발송대기</p>
-									</c:when>
-									<c:when test="${resultAllSentList.msgResult eq 'F'}">
-										<p class="fwRg c_e40000">수신오류</p>
-									</c:when>
-									<c:otherwise>-</c:otherwise>
-								</c:choose>
-							</td>
-							<td>
-							<!--  알림톡 수신오류인 경우, 대체문자 발송 여부에 따라 정상수신/수신오류 표기 -->
-								<c:choose>
-									<c:when test="${resultAllSentList.msgResult eq 'F' and resultAllSentList.bizKakaoResendYn eq 'Y' and resultAllSentList.callStatus eq 'S'}">
-										<p class="c_002c9a fwRg">정상수신</p>
-									</c:when>
-									<c:when test="${resultAllSentList.msgResult eq 'F' and resultAllSentList.bizKakaoResendYn eq 'Y' and resultAllSentList.callStatus eq 'F'}">
-										<p class="fwRg c_e40000">수신오류</p>
-									</c:when>
-									<c:otherwise>-</c:otherwise>
-								</c:choose>
-							</td>
-							
-						</tr>
-					</c:forEach>
-				</c:if>
-				<c:if test="${empty resultAllSentList}">
-						<tr>
-							<td colspan="8">발송 내역이 없습니다.</td>
-						</tr>
-				</c:if>
-			</tbody>
-		</table>
-	</div>
-	<!-- 수신자별 끝 -->
-	
+	<!--// 발송화면 개선 : 카카오톡 테이블 수정 -->
+
 	<div class="table_btn clearfix">
-		<div class="table_btn_left">
-		<!-- 2022.07.04 발송결과 화면에 리스트 선택삭제 기능 제거(카운팅 및 금액 합산 오류 관련) -->
-<!-- 			<button type="button" class="btnType btnType15" onClick="javascript:fnDelete(); return false;"><i class="remove_img"></i>선택삭제</button> -->
-			<button type="button" data-tooltip="rev_popup02" class="btnType btnType15"><i class="add_img"></i>그룹등록</button>
-			<button type="button" class="btnType btnType15" onClick="javascript:fnDeleteAddrNo('${kakaoSentVO.listType}'); return false;"><i class="remove_img"></i>주소록에서 번호 삭제</button>
-            <button type="button" class="btnType btnType15" onClick="javascript:fnAddBlockNo('${kakaoSentVO.listType}'); return false;"></i>수신거부번호 등록</button>
+                             <div class="table_btn_left">
+			<button type="button" onclick="javascript:fnDelete(); return false;" class="btnType btnType15"><i class="remove_img"></i>선택삭제</button>
 		</div>
 		<div class="table_btn_right">
-			<button type="button" class="excel_btn btnType" onClick="javascript:fnExcelDownLoad('all','${kakaoSentVO.listType}'); return false;"><i class="downroad"></i>엑셀 다운로드</button>
-			<button type="button" class="print_btn btnType" onClick="javascript:fnShowPrintPopup('all','${kakaoSentVO.tabType}'); return false;"><i class="print_img"></i>발송결과 출력하기</button>
+			<button type="button" class="excel_btn btnType"><i class="downroad"></i>발송결과 리스트</button>
 		</div>
-	</div>
+	</div>								
+
 	<c:if test="${!empty resultAllSentList}">
 	   <ul class="pagination">
 	       <ui:pagination paginationInfo = "${paginationInfo}"  type="imageWeb" jsFunction="linkPage" />
 	   </ul>
 	</c:if>
+	
+	<form id="resCancelForm" name="resCancelForm" method="post">
+		<input type="hidden" id="msgGroupId" name="msgGroupId" value=""/>
+	</form>
(No newline at end of file)
 
src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentAllListAjax_back_250318.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentAllListAjax_back_250318.jsp
This diff is skipped because there are too many other diffs.
src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax.jsp
This diff is skipped because there are too many other diffs.
 
src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax_back_250320.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailPopAjax_back_250320.jsp
This diff is skipped because there are too many other diffs.
 
src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentDetailView.jsp
This diff is skipped because there are too many other diffs.
src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp
--- src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView.jsp
This diff is skipped because there are too many other diffs.
 
src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView_back_250305.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/kakao/sent/KakaoSentView_back_250305.jsp
This diff is skipped because there are too many other diffs.
src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr.jsp
--- src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr.jsp
+++ src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr.jsp
This diff is skipped because there are too many other diffs.
 
src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr_back_250325.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr_back_250325.jsp
This diff is skipped because there are too many other diffs.
src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataSMLView.jsp
This diff is skipped because there are too many other diffs.
src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgdata/MsgDataView.jsp
This diff is skipped because there are too many other diffs.
src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax.jsp
This diff is skipped because there are too many other diffs.
 
src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax_advc_backup_20250115.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentAllListAjax_advc_backup_20250115.jsp
This diff is skipped because there are too many other diffs.
 
src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentDetailView.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentDetailView.jsp
This diff is skipped because there are too many other diffs.
src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentView.jsp
This diff is skipped because there are too many other diffs.
src/main/webapp/WEB-INF/jsp/web/msgsent/subcontent/MsgSentView_HA_allSentAjax.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgsent/subcontent/MsgSentView_HA_allSentAjax.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgsent/subcontent/MsgSentView_HA_allSentAjax.jsp
This diff is skipped because there are too many other diffs.
src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp
--- src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp
+++ src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp
This diff is skipped because there are too many other diffs.
 
src/main/webapp/WEB-INF/tld/functions.tld (added)
+++ src/main/webapp/WEB-INF/tld/functions.tld
This diff is skipped because there are too many other diffs.
src/main/webapp/js/MJUtill.js
--- src/main/webapp/js/MJUtill.js
+++ src/main/webapp/js/MJUtill.js
This diff is skipped because there are too many other diffs.
src/main/webapp/js/kakao/at/addr.js
--- src/main/webapp/js/kakao/at/addr.js
+++ src/main/webapp/js/kakao/at/addr.js
This diff is skipped because there are too many other diffs.
src/main/webapp/js/kakao/at/alimtalkExcel.js
--- src/main/webapp/js/kakao/at/alimtalkExcel.js
+++ src/main/webapp/js/kakao/at/alimtalkExcel.js
This diff is skipped because there are too many other diffs.
src/main/webapp/js/kakao/at/init.js
--- src/main/webapp/js/kakao/at/init.js
+++ src/main/webapp/js/kakao/at/init.js
This diff is skipped because there are too many other diffs.
src/main/webapp/js/kakao/at/priceClclt.js
--- src/main/webapp/js/kakao/at/priceClclt.js
+++ src/main/webapp/js/kakao/at/priceClclt.js
This diff is skipped because there are too many other diffs.
src/main/webapp/js/kakao/at/tabulator.js
--- src/main/webapp/js/kakao/at/tabulator.js
+++ src/main/webapp/js/kakao/at/tabulator.js
This diff is skipped because there are too many other diffs.
src/main/webapp/js/web/msgdata/msgDataView.js
--- src/main/webapp/js/web/msgdata/msgDataView.js
+++ src/main/webapp/js/web/msgdata/msgDataView.js
This diff is skipped because there are too many other diffs.
src/main/webapp/publish/css/content.css
--- src/main/webapp/publish/css/content.css
+++ src/main/webapp/publish/css/content.css
This diff is skipped because there are too many other diffs.
 
src/main/webapp/publish/images/content/kakaoBg_01.png (Binary) (added)
+++ src/main/webapp/publish/images/content/kakaoBg_01.png
Binary file is not shown
src/main/webapp/publish/publish_m/munjaon_intro_campaign.html (Renamed from src/main/webapp/publish/publish_m/munjaon_intro_03.html)
--- src/main/webapp/publish/publish_m/munjaon_intro_03.html
+++ src/main/webapp/publish/publish_m/munjaon_intro_campaign.html
This diff is skipped because there are too many other diffs.
src/main/webapp/publish/textingmsg_2025_detail_kakao.html
--- src/main/webapp/publish/textingmsg_2025_detail_kakao.html
+++ src/main/webapp/publish/textingmsg_2025_detail_kakao.html
This diff is skipped because there are too many other diffs.
src/main/webapp/publish/textingmsg_2025_list.html
--- src/main/webapp/publish/textingmsg_2025_list.html
+++ src/main/webapp/publish/textingmsg_2025_list.html
This diff is skipped because there are too many other diffs.
Add a comment
List