이호영 이호영 2025-03-04
Merge branch 'advc'
@0018554058981bb6abcb144434565c60d28c5cd6
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
@@ -276,7 +276,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);
 
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/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
@@ -498,7 +498,6 @@
      * 발송관리 엑셀다운로드 기능  - 카카오톡
      * @param searchVO
      * @param model
-     * @return	"/web/mjon/msgsent/msgSentExcelDownLoadAjax.do"
      * @throws Exception
      */
 	@RequestMapping(value= {"/web/mjon/msgsent/kakaoSentExcelDownLoadAjax.do"})
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/msg/service/MjonMsgVO.java
--- src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java
+++ src/main/java/itn/let/mjo/msg/service/MjonMsgVO.java
@@ -34,6 +34,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
@@ -4150,6 +4150,7 @@
 				
 				instTotalCnt += instCnt;
 				this.insertMsgGroupDataTb_advc(instCnt, mjonMsgVO, groupedMsgList);
+				log.info(" :: group data insert :: ");
 
 				// 금액 및 포인트 insert
 				priceAndPoint.insertCashAndPoint(
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);
 		
 		//문자발송 이미지 처리 - 사용하지 않아서 주석처리함.
@@ -5961,7 +5963,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/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/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/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/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,290 @@
 		
 	</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>
+			<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/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/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/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
@@ -946,10 +946,10 @@
 					<ul class="list_tab">
 						<li class="tab active"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li>
 						<li class="tab"><button type="button" onclick="fnTabLoad('at', 1); return false;">알림톡</button></li>
-<%-- 						<c:if test="${fn:contains(pageContext.request.requestURL , 'localhost')  --%>
-<%-- 				        || fn:contains(pageContext.request.requestURL , '119.193.215.98')}"> --%>
-<!-- 							<li class="tab"><button type="button" onclick="fnTabLoad('ft', 2); return false;">친구톡</button></li> -->
-<%-- 				        </c:if> --%>
+						<c:if test="${pageContext.request.serverName == 'localhost' 
+						            || pageContext.request.serverName == '119.193.215.98'}">
+							<li class="tab"><button type="button" onclick="fnTabLoad('ft', 2); return false;">친구톡</button></li>
+				        </c:if>
 					</ul><!--// tab button -->
 				</div>
 				<!-- 예약관리 > 전체 -->
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
@@ -19,7 +19,7 @@
 $(document).ready(function(){
 
 	
-	console.log("12111111111111");
+	console.log(": MsgDataSMLView :");
 
 // 	console.log(' + $(#tabDision).val() : ',$('#tabDision').val())
 // 	if($('#tabDision').val() == 'tab02'){
@@ -3397,7 +3397,7 @@
 		}
 		
 		//제목 사용한 경우
-		if($("input[name=title_status]:checked").val() == 'Y') {
+		if($("input[name=subjectChkYn]:checked").val() == 'Y') {
 			form.mmsSubject.value = msgForm.mmsSubject.value;
 		} else {
 			form.mmsSubject.value = ""; //초기화
@@ -3411,7 +3411,7 @@
 		form.eachPrice.value = '<c:out value="${longPrice}" />';
 		
 		//제목 사용한 경우
-		if($("input[name=title_status]:checked").val() == 'Y') {
+		if($("input[name=subjectChkYn]:checked").val() == 'Y') {
 			form.mmsSubject.value = msgForm.mmsSubject.value;
 		} else {
 			form.mmsSubject.value = ""; //초기화
@@ -3964,6 +3964,8 @@
 					</c:otherwise>
 				</c:choose>
 			</h2>
+			<!-- /web/mjon/msgdata/selectMsgDataSMLViewAjax.do -->
+			<!-- MsgDataSMLView.jsp -->
 			<button type="button" class="button info" onclick="infoPop('selectMsgDataView1');">사용안내</button>
 	    </div>
 	    <div class="send_general">
@@ -4018,9 +4020,9 @@
                             <td>
                            		<ul class="title_wrap">
                            			<li>
-                           				<input id="title_y" type="radio"name="title_status" value="Y" onchange="titleStatus(this);">
+                           				<input id="title_y" type="radio"name="subjectChkYn" value="Y" onchange="titleStatus(this);">
 			                            <label for="title_y">사용</label>
-			                            <input id="title_n" type="radio" name="title_status" value="N" onchange="titleStatus(this);" checked="checked">
+			                            <input id="title_n" type="radio" name="subjectChkYn" value="N" onchange="titleStatus(this);" checked="checked">
 			                            <label for="title_n">사용안함</label>
                            			</li>
                            			<li class="textbox">
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
@@ -123,18 +123,18 @@
 			</div>
 		</div>
 	</div>
-    <div class="inner">
-        <!-- send top -->
-        <div class="send_top">
-            <!-- tab button -->
-            <ul class="tabType1">
-                <li class="tab ${tabDision eq 'tab01' ? 'active' : ''}">
-                	<button type="button" onclick="javascript:fnMsgDataView(); return false;">일반문자</button>
-                </li>
-                <li class="tab ${tabDision eq 'tab02' ? 'active' : ''}">
-                	<button type="button" onclick="javascript:fnMsgExcelDataView(); return false;">대량문자(광고문자)</button>
-                </li>
-            </ul><!--// tab button -->
+	<div class="inner">
+		<!-- send top -->
+		<div class="send_top">
+			<!-- tab button -->
+			<ul class="tabType1">
+				<li class="tab ${tabDision eq 'tab01' ? 'active' : ''}">
+					<button type="button" onclick="javascript:fnMsgDataView(); return false;">일반문자</button>
+				</li>
+				<li class="tab ${tabDision eq 'tab02' ? 'active' : ''}">
+					<button type="button" onclick="javascript:fnMsgExcelDataView(); return false;">대량문자(광고문자)</button>
+				</li>
+			</ul><!--// tab button -->
 			<!-- tab content1 -->
 			<!-- <span id="contentArea"></span> -->
 			<div class="top_content  ${tabDision eq 'tab02' ? 'get_excel' : ''} current contentArea" id="tab1_1" style="min-height: 555px;"></div>
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
@@ -3,19 +3,23 @@
 <%@ 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>
 <script type="text/javascript">
+/* 문자 발송결과 리스트 advc*/
 $(document).ready(function(){
-	var startDate = '${startDate}';
-	var endDate = '${endDate}';
+// 	var searchStartDate = '${searchStartDate}';
+// 	console.log('searchStartDate : ', searchStartDate);
+// 	var searchEndDate = '${searchEndDate}';
+// 	console.log('searchEndDate : ', searchEndDate);
     
-	// DatePicker 값 수정
-    var startDatePicker = $('#startDate').pickadate('picker');
-    startDatePicker.set('select', startDate, { format: 'yyyy/mm/dd' });
-    startDatePicker = $('#endDate').pickadate('picker');
-    startDatePicker.set('select', endDate, { format: 'yyyy/mm/dd' });
+// 	// DatePicker 값 수정
+//     var startDatePicker = $('#searchStartDate').pickadate('picker');
+//     startDatePicker.set('select', searchStartDate, { format: 'yyyy/mm/dd' });
+//     startDatePicker = $('#searchEndDate').pickadate('picker');
+//     startDatePicker.set('select', searchEndDate, { format: 'yyyy/mm/dd' });
     
 	
 	/* 목록 정렬 항목 아이콘 표시 */ 
@@ -58,21 +62,96 @@
 		}
 	});
 	
-	if($("#tdType").val() == "groupList"){
-		$('td[name="listTd"]').attr("rowspan", "2")
-	}else{
-		$('tr[name="listTr"]').remove();
-		$('td[name="listSucc"]').remove();
-	}
 });
+
+
+function fn_sentDetailView(msgGroupId) {
+	// msgGroupId 값을 form에 설정
+	$("#searchForm #msgGroupId").val(msgGroupId);
+
+	// form을 해당 URL로 제출
+	$("#searchForm").attr("action", "/web/mjon/msgsent/msgSentDetailView.do");
+	$("#searchForm").submit();
+}
+
+
+// function fnReservCancel(msgGroupId, agentCode, msgType){
+function fnReservCancel(msgGroupId){
+	
+	var form = document.resCancelForm;
+	var loginVO = '${LoginVO}';
+	
+	form.msgGroupId.value = msgGroupId;
+// 	form.agentCode.value = agentCode;
+// 	form.msgType.value = msgType;
+	
+	if(loginVO == "" || loginVO == null){
+		
+		alert("로그인 후 이용이 가능합니다.");
+		return false;
+		
+	}
+	console.log('msgGroupId : ', msgGroupId);
+	var data = new FormData(form);
+	url = "/web/mjon/reservmsg/deleteReservMsgCancelDataAjax.do";
+	
+	if(confirm("정말 예약을 취소하시겠습니까?")){
+		
+		$.ajax({
+			type: "POST",
+			url: url,
+			data: data,
+			dataType:'json',
+			async: true,
+			processData: false,
+			contentType: false,
+			cache: false,
+			success: function (returnData, status) {
+				if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
+					if("fail"==returnData.result){
+						
+						alert(returnData.message);
+						return false;
+					}
+				
+// 					var smsCnt = returnData.resultSts;
+				
+					alert("예약 발송이 정상적으로 취소 되었습니다.");
+					
+					//예약 관리 리스트 다시 불러오기
+					linkPage(1);
+					//현황도 갱신 필요하여 새로고침으로 변경
+// 					location.reload(true);
+					
+				} else if(status== 'fail'){
+					alert(returnData.message);
+				}
+			},
+	        error: function (e) { 
+	        	alert("예약 취소에 실패하였습니다."); console.log("ERROR : ", e); 
+	        },
+			beforeSend : function(xmlHttpRequest) {
+	        	//로딩창 show
+	        	$('.loading_layer').addClass('active');				
+			},	        	        
+	        complete : function(xhr, textStatus) {
+	        	//로딩창 hide
+	        	$('.loading_layer').removeClass('active');
+			}
+	    });
+		
+	}
+	
+}
+
 
 </script>
     <div class="list_info">
-    	<input type="hidden"  id="tdType" value="${mjonMsgSentVO.listType}">
-        <p>총 <span class="c_e40000"><c:out value="${totalRecordCount}"/></span>건</p>
+        <p>총 <span class="c_e40000" id="testId"><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">
+            <select id="pageUnitS" 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>
@@ -84,134 +163,100 @@
 	<div class="tb_wrap">
 		<table class="tType4">
 			<colgroup>
-				<col style="width: 40px;">
+				<col style="width: 45px;">
 				<col style="width: 12%;">
 				<col style="width: 8%;">
-				<col style="width: 90px;">
-				<col style="width: 10%;">
-				<col style="width: 15%;">
-				<col style="width: 12%;">
+				<col style="width: auto;">
 				<col style="width: 8%;">
-			<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
-				<col style="width: 8%;">
-				<col style="width: 8%;">
-			</c:if>
+				<col style="width: 6%;">
+				<col style="width: 6%;">
+				<col style="width: 6%;">
+				<col style="width: 6%;">
+				<col style="width: 11%;">
 			</colgroup>
 			<thead>
 				<tr>
-					<th>
+					<th rowspan="2">
 						<label for="allCheck" class="label">전체 선택</label>
 						<input type="checkbox" id="allCheck" name="allCheck">
 					</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_orderByCode">
 						</div>
 					</th>
-					<th>발송방식
-						<div class="sort_wrap">
-							<input type="button" class="sort sortBtn" id="sort_sendKind">
-						</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>
-					<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
-					<th>
+					<th rowspan="2">내용</th>
+					<th rowspan="2">
 						발송건수
 						<div class="sort_wrap">
 							<input type="button" class="sort sortBtn" id="sort_msgGroupCnt">
 						</div>
 					</th>
-					</c:if>
-					<th>결과</th>
-					<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
-					<th>건수</th>
-					</c:if>
-					<th>금액</th>
+					<th colspan="3">결과</th>
+					<th rowspan="2">금액(원)</th>
+					<th rowspan="2">진행상황</th>
+<!-- 					<th>금액</th> -->
+				</tr>
+				<tr>
+					<th>대기</th>
+					<th>성공</th>
+					<th>실패</th>
 				</tr>
 			</thead>
 			<tbody>
 				<c:choose>
 					<c:when test="${not empty resultAllSentList}">
-					<c:forEach var="resultAllSentList" items="${resultAllSentList}" varStatus="status">
-						<c:set var="replaceCnt" value="0" />
-						<c:set var="electionCnt" value="0" />
-						<c:set var="advertisementCnt" value="0" />		
-
-						<c:if test="${fn:indexOf(resultAllSentList.smsTxt,'[*이름*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*1*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*2*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*3*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*4*]') != -1}">
-							<c:set var="replaceCnt" value="1" />
-						</c:if>
-						<c:if test="${fn:indexOf(resultAllSentList.smsTxt,'(선거운동정보)') == 0}">
-							<c:set var="electionCnt" value="1" />
-						</c:if>					
-						<c:if test="${fn:indexOf(resultAllSentList.smsTxt,'(광고)') == 0}">
-							<c:set var="advertisementCnt" value="1" />
-						</c:if>											
+					<c:forEach var="result" items="${resultAllSentList}" varStatus="status">
 						<tr>
-							<td name="listTd">
+							<td>
 								<label for="msgSentDel${status.count}" class="label">선택</label>
 								<c:choose>
-									<c:when test="${resultAllSentList.curState == '0'}">
-										<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${resultAllSentList.msgGroupId}" disabled> 
+									<c:when test="${result.statusCd eq '03' or result.statusCd eq '01'}">
+										<input type="checkbox" disabled> 
 									</c:when>
 									<c:otherwise>
-										<c:choose>
-											<c:when test="${mjonMsgSentVO.listType == 'groupList'}">
-												<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${resultAllSentList.msgGroupId}">	
-											</c:when>
-											<c:otherwise>
-												<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${resultAllSentList.msgSeq}">
-											</c:otherwise>
-										</c:choose>
+										<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${result.msgGroupId}">	
 									</c:otherwise>
 								</c:choose>
 								
 							</td>
-							<td name="listTd">
+							<td>
 								<c:choose>
-									<c:when test="${resultAllSentList.delayYn eq 'Y' && resultAllSentList.delayCompleteYn eq 'N'}">
+									<c:when test="${result.delayYn eq 'Y' && result.delayCompleteYn eq 'N'}">
 									
 										<c:choose>
-											<c:when test="${resultAllSentList.curState eq '0'}">
+											<c:when test="${result.curState eq '0'}">
 												<%-- 
 													20240906 추가
 													발송 대기 상태일 때만 원래 발송시간을 보여주고, 발송이 완료되면 발송 처리 완료 시간(reqDate)을 보여준다.
 													30분 딜레이 된 건으로 관리자 승인/취소 처리가 완료 되지 않은 건에 대해서 -30분 처리하여 원래 사용자가 보내려던 시간을 표시해줌
 												 --%>
-												<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.delayOrgTime}" /></p>	
+												<p>${result.delayOrgTime}</p>	
 											</c:when>
 											<c:otherwise>
-												<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.reqdate}" /></p>
+												<p>${result.reqDate}</p>
 											</c:otherwise>
 										</c:choose>
 										
 									</c:when>
 									<c:otherwise>
-										<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.reqdate}" /></p>
+										<p>${result.reqDate}</p>
+										
 									</c:otherwise>
 								</c:choose>
 							</td>
-							<td name="listTd">
+							<td>
 								<p>
 									<c:choose>
-										<c:when test="${resultAllSentList.msgType eq '6' && resultAllSentList.fileCnt eq 0 }">
+										<c:when test="${result.msgType eq '6' && result.fileCnt eq 0 }">
 											장문
 										</c:when>
-										<c:when test="${resultAllSentList.msgType eq '6' && resultAllSentList.fileCnt ne 0 }">
+										<c:when test="${result.msgType eq '6' && result.fileCnt ne 0 }">
 											그림
 										</c:when>
 										<c:otherwise>
@@ -220,239 +265,69 @@
 									</c:choose>
 								</p>
 							</td>
-							<td name="listTd">
-								<p>
-									<c:choose>
-										<c:when test="${resultAllSentList.sendKind eq 'H' }">
-											WEB
-										</c:when>
-										<c:when test="${resultAllSentList.sendKind eq 'A'}">
-											API
-										</c:when>
-										<c:otherwise>
-											-
-										</c:otherwise>
-									</c:choose>
-								</p>
-							</td>
-							<td name="listTd">
-								<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:fnMjMsgReSendAll('${resultAllSentList.msgGroupId}','${replaceCnt}','${electionCnt}','${advertisementCnt}'); return false;">재전송</button>
-							</td>
-							<td name="listTd">
-								<c:choose>
-									<c:when test="${mjonMsgSentVO.listType == 'groupList'}">
+							<td class="result_cont">
+								<div class="icon_wrap">
+									<c:if test="${result.reserveYn eq 'Y'}">
+										<span class="re">예약</span>
+										<!-- 예약일때만 분할이 있음 -->
+										<c:if test="${result.divideYN eq 'Y'}">
+											<span class="di">분할</span>
+										</c:if>
+									</c:if>
+									<a href="#none" onclick="fn_sentDetailView('${result.msgGroupId}')">
 										<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="${result.subjectChkYn eq 'Y' }">
+												<c:out value="${result.subject }" />
 											</c:when>
 											<c:otherwise>
-												<p><c:out value="${resultAllSentList.callToComma}"/></p>
+												<c:out value="${result.smsTxt}" />
 											</c:otherwise>
 										</c:choose>
-									</c:when>
-									<c:otherwise>
-										<c:choose>
-											<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>
-									</c:otherwise>
-								</c:choose>
+									</a>
+								</div>
 							</td>
-							<td name="listTd">
-								<p><c:out value="${resultAllSentList.callFromComma}"/></p>
+							<td>
+								<p><fmt:formatNumber value="${result.msgGroupCnt}" type="number" groupingUsed="true" /> </p>
 							</td>
-						<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
-							<td name="listTd">
-								<p><c:out value="${resultAllSentList.msgGroupCnt}"/></p>
+							<td>
+								<p><fmt:formatNumber value="${result.resultWValue}" type="number" groupingUsed="true" /> </p>
 							</td>
-						</c:if>
-							<!-- 발송 성공/실패 listType에 따른 전송건별(groupList), 개인별 리스트 처리-->
-							<c:set var="succ" value="0"/> <!-- 정상수신-->
-							<c:set var="fail" value="0"/> <!-- 수신실패-->
-							<c:set var="wait" value="0"/> <!-- 결과대기-->
-							<c:set var="succPrice" value="0"/> <!-- 정상수신 가격-->
-							<c:set var="failPrice" value="0"/> <!-- 수신실패 가격-->
-							<c:set var="waitPrice" value="0"/> <!-- 결과대기 가격-->
-							<c:set var="msgResultSts" value=""/><!-- 결과상태 확인 -->
-							<c:forEach var="resultMsgSFList" items="${resultMsgSucFailList}" varStatus="status">
+							<td>
+								<p class="c_002c9a"><fmt:formatNumber value="${result.resultSValue}" type="number" groupingUsed="true" /> </p>
+							</td>
+							<td>
+								<p class="c_e40000"><fmt:formatNumber value="${result.resultFValue}" type="number" groupingUsed="true" /> </p>
+							</td>
+							<td>
 								<c:choose>
-									<c:when test="${mjonMsgSentVO.listType == 'groupList'}">
-										<c:if test="${resultAllSentList.msgGroupId == resultMsgSFList.msgGroupId}">
-											<c:if test="${resultMsgSFList.msgResultSts == 'S'}">
-												<c:set var="succ" value="${resultMsgSFList.msgResultCnt}"/>
-												<c:set var="succPrice" value="${resultMsgSFList.eachPrice * succ}"/>
-											</c:if>
-											<c:if test="${resultMsgSFList.msgResultSts == 'F'}">
-												<c:set var="fail" value="${resultMsgSFList.msgResultCnt}"/>
-												<c:set var="failPrice" value="${resultMsgSFList.eachPrice * fail}"/>
-											</c:if>
-											<c:if test="${resultMsgSFList.msgResultSts == 'W'}">
-												<c:set var="wait" value="${resultMsgSFList.msgResultCnt}"/>
-												<c:set var="waitPrice" value="${resultMsgSFList.eachPrice * wait}"/>
-											</c:if>
-										</c:if>
+									<c:when test="${result.totPrice eq '-' }">
+										<c:out value="${result.totPrice }" />
 									</c:when>
 									<c:otherwise>
-										<c:if test="${resultAllSentList.msgGroupId == resultMsgSFList.msgGroupId && resultAllSentList.msgSeq == resultMsgSFList.msgSeq}">
-											<c:set var="msgResultSts" value="${resultMsgSFList.msgResultSts}"/>
-											<c:if test="${resultMsgSFList.msgResultSts == 'S'}">
-												<c:set var="succ" value="${resultMsgSFList.msgResultCnt}"/>
-												<c:set var="succPrice" value="${resultMsgSFList.eachPrice * succ}"/>
-											</c:if>
-											<c:if test="${resultMsgSFList.msgResultSts == 'F'}">
-												<c:set var="fail" value="${resultMsgSFList.msgResultCnt}"/>
-												<c:set var="failPrice" value="${resultMsgSFList.eachPrice * fail}"/>
-											</c:if>
-											<c:if test="${resultMsgSFList.msgResultSts == 'W'}">
-												<c:set var="wait" value="${resultMsgSFList.msgResultCnt}"/>
-												<c:set var="waitPrice" value="${resultMsgSFList.eachPrice * wait}"/>
-											</c:if>
-										</c:if>
+										<fmt:formatNumber value="${result.totPrice }" type="number" groupingUsed="true" minFractionDigits="0" maxFractionDigits="1" />
 									</c:otherwise>
 								</c:choose>
-							</c:forEach>
-							<td name="listSucc">
-								<p class="fwRg c_002c9a">정상수신</p>
 							</td>
-							<td name="listSucc">
+							<td>
 								<c:choose>
-									<c:when test="${mjonMsgSentVO.listType == 'groupList' && succ > 0}">
-										<p class="fwRg c_002c9a" onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'S'); return false;" style="cursor:pointer;"><fmt:formatNumber value="${succ}" pattern="#,###.#"/></p>	
+									<c:when test="${result.statusCd ne '03' }">
+										<ec:code codeId="ITN057" code="${result.statusCd }" />
 									</c:when>
 									<c:otherwise>
-										<p class="fwRg c_002c9a"><fmt:formatNumber value="${succ}" pattern="#,###.#"/></p>
+										<p><button class="btnType btnType20" onClick="javascript:fnReservCancel('${result.msgGroupId}'); return false;">예약취소</button></p>
 									</c:otherwise>
 								</c:choose>
-							</td>
-							<!-- 과금/비과금 -->
-							<td name="listSucc">
-								<p class="fwRg c_002c9a">
-									<c:choose>
-										<c:when test="${succPrice > 0}">
-											<fmt:formatNumber value="${succPrice}" pattern="#,###.#"/>
-										</c:when>
-										<c:otherwise>
-											0
-										</c:otherwise>
-									</c:choose>
-								</p>
+							
+								<!--  -->
 							</td>
 							
-							<c:if test="${mjonMsgSentVO.listType != 'groupList'}">
-								<c:if test="${msgResultSts == 'S'}">
-									<td>
-										<p class="fwRg c_002c9a">정상수신</p>
-									</td>
-									<!-- 과금/비과금 -->
-									<td>
-										<p class="fwRg c_002c9a">
-											<c:choose>
-												<c:when test="${succPrice > 0}">
-													<fmt:formatNumber value="${succPrice}" pattern="#,###.#"/>
-												</c:when>
-												<c:otherwise>
-													0
-												</c:otherwise>
-											</c:choose>
-										</p>
-									</td>
-								</c:if>
-								<c:if test="${msgResultSts == 'F'}">
-									<td>
-										<p class="fwRg c_e40000">수신오류</p>
-									</td>
-									<!-- 과금/비과금 -->
-									<td>
-										<p class="fwRg c_e40000">
-											<c:choose>
-												<c:when test="${failPrice > 0}">
-													<fmt:formatNumber value="${failPrice}" pattern="#,###.#"/>
-												</c:when>
-												<c:otherwise>
-													0
-												</c:otherwise>
-											</c:choose>
-										</p>
-									</td>
-								</c:if>
-								<c:if test="${msgResultSts == 'W'}">
-									<td>
-										<p class="fwRg c_e40000">결과대기</p>
-									</td>
-									<!-- 과금/비과금 -->
-									<td>
-										<p class="fwRg c_e40000">
-											<c:choose>
-												<c:when test="${waitPrice > 0}">
-													<fmt:formatNumber value="${waitPrice}" pattern="#,###.#"/>
-												</c:when>
-												<c:otherwise>
-													0
-												</c:otherwise>
-											</c:choose>
-										</p>
-									</td>
-								</c:if>
-							</c:if>
-						</tr>
-						<tr name="listTr">
-							<td>
-								<p class="c_222">실패/대기</p>
-							</td>
-							<td>
-								<c:choose>
-									<c:when test="${mjonMsgSentVO.listType == 'groupList' && (fail+wait) > 0}">
-										<p class="c_222" onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'F'); return false;" style="cursor:pointer;">
-											<fmt:formatNumber value="${fail}" pattern="#,###"/> / <fmt:formatNumber value="${wait}" pattern="#,###"/>
-										</p>
-									</c:when>
-									<c:otherwise>
-										<p class="c_222">
-											<fmt:formatNumber value="${fail}" pattern="#,###"/> / <fmt:formatNumber value="${wait}" pattern="#,###"/>
-										</p>
-									</c:otherwise>
-								</c:choose>
-							</td>
-							<td>
-								<p class="c_222">
-									<c:choose>
-										<c:when test="${(failPrice+waitPrice) > 0}">
-											<fmt:formatNumber value="${(failPrice+waitPrice)}" pattern="#,###.#"/>
-										</c:when>
-										<c:otherwise>
-											0
-										</c:otherwise>
-									</c:choose>
-								</p>
-							</td>
+							
 						</tr>
 					</c:forEach>
 					</c:when>
 					<c:otherwise>
 					<tr>
-						<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
-							<td colspan="11">발송 내역이 없습니다.</td>
-						</c:if>
-						<c:if test="${mjonMsgSentVO.listType ne 'groupList'}">
-							<td colspan="9">발송 내역이 없습니다.</td>
-						</c:if>
+						<td colspan="10">발송 내역이 없습니다.</td>
 					</tr>
 					</c:otherwise>
 				</c:choose>
@@ -462,14 +337,14 @@
 	<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('${mjonMsgSentVO.listType}'); return false;"><i class="remove_img"></i>주소록에서 번호 삭제</button>
-            <button type="button" class="btnType btnType15" onClick="javascript:fnAddBlockNo('${mjonMsgSentVO.listType}'); return false;"></i>수신거부번호 등록</button>
+			<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('${mjonMsgSentVO.listType}'); return false;"><i class="remove_img"></i>주소록에서 번호 삭제</button> --%>
+<%--             <button type="button" class="btnType btnType15" onClick="javascript:fnAddBlockNo('${mjonMsgSentVO.listType}'); return false;"></i>수신거부번호 등록</button> --%>
 		</div>
 		<div class="table_btn_right">
-			<button type="button" class="excel_btn btnType" onClick="javascript:fnExcelDownLoad('all','${mjonMsgSentVO.tabType}'); return false;"><i class="downroad"></i>엑셀 다운로드</button>
-			<button type="button" class="print_btn btnType" onClick="javascript:fnShowPrintPopup('all','${mjonMsgSentVO.tabType}'); return false;"><i class="print_img"></i>발송결과 출력하기</button>
+			<button type="button" class="excel_btn btnType" onClick="javascript:fnExcelDownLoad(); return false;"><i class="downroad"></i>발송결과 리스트</button>
+<%-- 			<button type="button" class="print_btn btnType" onClick="javascript:fnShowPrintPopup('all','${mjonMsgSentVO.tabType}'); return false;"><i class="print_img"></i>발송결과 출력하기</button> --%>
 		</div>
 	</div>
 	<c:if test="${!empty resultAllSentList}">
@@ -477,3 +352,12 @@
 	       <ui:pagination paginationInfo = "${paginationInfo}"  type="imageWeb" jsFunction="linkPage" />
 	   </ul>
 	</c:if>
+	
+	<form name="detailForm" id="detailForm" method="post">
+		<input type="hidden" name="msgGroupId" id="msgGroupId" value=""/> 
+	</form>
+	
+	
+	<form id="resCancelForm" name="resCancelForm" method="post">
+		<input type="hidden" id="msgGroupId" name="msgGroupId" value=""/>
+	</form>
 
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
@@ -0,0 +1,479 @@
+<%@ 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>
+<script src="/publish/js/popupLayer.js"></script>
+<script type="text/javascript">
+$(document).ready(function(){
+	var startDate = '${startDate}';
+	var endDate = '${endDate}';
+    
+	// DatePicker 값 수정
+    var startDatePicker = $('#startDate').pickadate('picker');
+    startDatePicker.set('select', startDate, { format: 'yyyy/mm/dd' });
+    startDatePicker = $('#endDate').pickadate('picker');
+    startDatePicker.set('select', endDate, { format: 'yyyy/mm/dd' });
+    
+	
+	/* 목록 정렬 항목 아이콘 표시 */ 
+	var searchSortCnd = $("[name='searchSortCnd']").val();
+	var searchSortOrd = $("[name='searchSortOrd']").val();
+	if (searchSortCnd != "" && searchSortOrd != "" && searchSortCnd  != undefined && searchSortOrd  != undefined) {
+		var $sort_div = $("#sort_"+ searchSortCnd);
+		var sortClass = 'sortBtn' ;
+		if (searchSortOrd == "desc") sortClass = "sortBtnDesc";
+		$sort_div.replaceClass('sortBtn' , sortClass) ;
+		$sort_div.attr("sortOrd", searchSortOrd);
+	}
+	
+	//체크박스 전체 선택 및 해제
+	var allChkSts = false;
+	$("#allCheck").click(function(){
+		
+		if(!allChkSts){// 전체선택이 해제되어 있을 경우
+			
+			$("input[name=msgSentDel]").prop("checked", true);
+			allChkSts = true;
+			
+			//발송 대기건은 선택 삭제가 안되도록 처리함
+			$("input:checkbox[name='msgSentDel']:checked").each(function(index){
+				
+				var disabledChk = $(this).prop('disabled');
+				if(disabledChk){ //checkbox disabled 인 것은 제외하고 아이디 저장
+					
+					$(this).prop("checked", false);
+					
+				}
+				
+			});
+			
+		}else{
+			
+			$("input[name=msgSentDel]").prop("checked", false);
+			allChkSts = false;
+
+		}
+	});
+	
+	if($("#tdType").val() == "groupList"){
+		$('.listTd').attr("rowspan", "2")
+	}else{
+		$('.listTr').remove();
+		$('.listSucc').remove();
+	}
+});
+
+</script>
+    <div class="list_info">
+    	<input type="hidden"  id="tdType" value="${mjonMsgSentVO.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>
+                <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>
+                <option value="100" <c:if test="${paginationInfo.recordCountPerPage == '100'}">selected</c:if> >100개보기</option>
+            </select>
+        </div>
+    </div>
+	<!-- 받는사람(전송건별) - 전체 -->
+	<div class="tb_wrap">
+		<table class="tType4">
+			<colgroup>
+				<col style="width: 40px;">
+				<col style="width: 12%;">
+				<col style="width: 8%;">
+				<col style="width: 90px;">
+				<col style="width: 10%;">
+				<col style="width: 15%;">
+				<col style="width: 12%;">
+				<col style="width: 8%;">
+			<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
+				<col style="width: 8%;">
+				<col style="width: 8%;">
+			</c:if>
+			</colgroup>
+			<thead>
+				<tr>
+					<th>
+						<label for="allCheck" class="label">전체 선택</label>
+						<input type="checkbox" id="allCheck" name="allCheck">
+					</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_orderByCode">
+						</div>
+					</th>
+					<th>발송방식
+						<div class="sort_wrap">
+							<input type="button" class="sort sortBtn" id="sort_sendKind">
+						</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>
+					<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
+					<th>
+						발송건수
+						<div class="sort_wrap">
+							<input type="button" class="sort sortBtn" id="sort_msgGroupCnt">
+						</div>
+					</th>
+					</c:if>
+					<th>결과</th>
+					<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
+					<th>건수</th>
+					</c:if>
+					<th>금액</th>
+				</tr>
+			</thead>
+			<tbody>
+				<c:choose>
+					<c:when test="${not empty resultAllSentList}">
+					<c:forEach var="resultAllSentList" items="${resultAllSentList}" varStatus="status">
+						<c:set var="replaceCnt" value="0" />
+						<c:set var="electionCnt" value="0" />
+						<c:set var="advertisementCnt" value="0" />		
+
+						<c:if test="${fn:indexOf(resultAllSentList.smsTxt,'[*이름*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*1*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*2*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*3*]') != -1 || fn:indexOf(resultAllSentList.smsTxt,'[*4*]') != -1}">
+							<c:set var="replaceCnt" value="1" />
+						</c:if>
+						<c:if test="${fn:indexOf(resultAllSentList.smsTxt,'(선거운동정보)') == 0}">
+							<c:set var="electionCnt" value="1" />
+						</c:if>					
+						<c:if test="${fn:indexOf(resultAllSentList.smsTxt,'(광고)') == 0}">
+							<c:set var="advertisementCnt" value="1" />
+						</c:if>											
+						<tr>
+							<td class="listTd">
+								<label for="msgSentDel${status.count}" class="label">선택</label>
+								<c:choose>
+									<c:when test="${resultAllSentList.curState == '0'}">
+										<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${resultAllSentList.msgGroupId}" disabled> 
+									</c:when>
+									<c:otherwise>
+										<c:choose>
+											<c:when test="${mjonMsgSentVO.listType == 'groupList'}">
+												<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${resultAllSentList.msgGroupId}">	
+											</c:when>
+											<c:otherwise>
+												<input type="checkbox" id="msgSentDel${status.count}" name="msgSentDel" value="${resultAllSentList.msgSeq}">
+											</c:otherwise>
+										</c:choose>
+									</c:otherwise>
+								</c:choose>
+								
+							</td>
+							<td class="listTd">
+								<c:choose>
+									<c:when test="${resultAllSentList.delayYn eq 'Y' && resultAllSentList.delayCompleteYn eq 'N'}">
+									
+										<c:choose>
+											<c:when test="${resultAllSentList.curState eq '0'}">
+												<%-- 
+													20240906 추가
+													발송 대기 상태일 때만 원래 발송시간을 보여주고, 발송이 완료되면 발송 처리 완료 시간(reqDate)을 보여준다.
+													30분 딜레이 된 건으로 관리자 승인/취소 처리가 완료 되지 않은 건에 대해서 -30분 처리하여 원래 사용자가 보내려던 시간을 표시해줌
+												 --%>
+												<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.delayOrgTime}" /></p>	
+											</c:when>
+											<c:otherwise>
+												<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.reqdate}" /></p>
+											</c:otherwise>
+										</c:choose>
+										
+									</c:when>
+									<c:otherwise>
+										<p><fmt:formatDate pattern = "yyyy-MM-dd HH:mm" value = "${resultAllSentList.reqdate}" /></p>
+									</c:otherwise>
+								</c:choose>
+							</td>
+							<td class="listTd">
+								<p>
+									<c:choose>
+										<c:when test="${resultAllSentList.msgType eq '6' && resultAllSentList.fileCnt eq 0 }">
+											장문
+										</c:when>
+										<c:when test="${resultAllSentList.msgType eq '6' && resultAllSentList.fileCnt ne 0 }">
+											그림
+										</c:when>
+										<c:otherwise>
+											단문
+										</c:otherwise>
+									</c:choose>
+								</p>
+							</td>
+							<td class="listTd">
+								<p>
+									<c:choose>
+										<c:when test="${resultAllSentList.sendKind eq 'H' }">
+											WEB
+										</c:when>
+										<c:when test="${resultAllSentList.sendKind eq 'A'}">
+											API
+										</c:when>
+										<c:otherwise>
+											-
+										</c:otherwise>
+									</c:choose>
+								</p>
+							</td>
+							<td class="listTd">
+								<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:fnMjMsgReSendAll('${resultAllSentList.msgGroupId}','${replaceCnt}','${electionCnt}','${advertisementCnt}'); return false;">재전송</button>
+							</td>
+							<td class="listTd">
+								<c:choose>
+									<c:when test="${mjonMsgSentVO.listType == 'groupList'}">
+										<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>
+									</c:when>
+									<c:otherwise>
+										<c:choose>
+											<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>
+									</c:otherwise>
+								</c:choose>
+							</td>
+							<td class="listTd">
+								<p><c:out value="${resultAllSentList.callFromComma}"/></p>
+							</td>
+						<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
+							<td class="listTd">
+								<p><c:out value="${resultAllSentList.msgGroupCnt}"/></p>
+							</td>
+						</c:if>
+							<!-- 발송 성공/실패 listType에 따른 전송건별(groupList), 개인별 리스트 처리-->
+							<c:set var="succ" value="0"/> <!-- 정상수신-->
+							<c:set var="fail" value="0"/> <!-- 수신실패-->
+							<c:set var="wait" value="0"/> <!-- 결과대기-->
+							<c:set var="succPrice" value="0"/> <!-- 정상수신 가격-->
+							<c:set var="failPrice" value="0"/> <!-- 수신실패 가격-->
+							<c:set var="waitPrice" value="0"/> <!-- 결과대기 가격-->
+							<c:set var="msgResultSts" value=""/><!-- 결과상태 확인 -->
+							<c:forEach var="resultMsgSFList" items="${resultMsgSucFailList}" varStatus="status">
+								<c:choose>
+									<c:when test="${mjonMsgSentVO.listType == 'groupList'}">
+										<c:if test="${resultAllSentList.msgGroupId == resultMsgSFList.msgGroupId}">
+											<c:if test="${resultMsgSFList.msgResultSts == 'S'}">
+												<c:set var="succ" value="${resultMsgSFList.msgResultCnt}"/>
+												<c:set var="succPrice" value="${resultMsgSFList.eachPrice * succ}"/>
+											</c:if>
+											<c:if test="${resultMsgSFList.msgResultSts == 'F'}">
+												<c:set var="fail" value="${resultMsgSFList.msgResultCnt}"/>
+												<c:set var="failPrice" value="${resultMsgSFList.eachPrice * fail}"/>
+											</c:if>
+											<c:if test="${resultMsgSFList.msgResultSts == 'W'}">
+												<c:set var="wait" value="${resultMsgSFList.msgResultCnt}"/>
+												<c:set var="waitPrice" value="${resultMsgSFList.eachPrice * wait}"/>
+											</c:if>
+										</c:if>
+									</c:when>
+									<c:otherwise>
+										<c:if test="${resultAllSentList.msgGroupId == resultMsgSFList.msgGroupId && resultAllSentList.msgSeq == resultMsgSFList.msgSeq}">
+											<c:set var="msgResultSts" value="${resultMsgSFList.msgResultSts}"/>
+											<c:if test="${resultMsgSFList.msgResultSts == 'S'}">
+												<c:set var="succ" value="${resultMsgSFList.msgResultCnt}"/>
+												<c:set var="succPrice" value="${resultMsgSFList.eachPrice * succ}"/>
+											</c:if>
+											<c:if test="${resultMsgSFList.msgResultSts == 'F'}">
+												<c:set var="fail" value="${resultMsgSFList.msgResultCnt}"/>
+												<c:set var="failPrice" value="${resultMsgSFList.eachPrice * fail}"/>
+											</c:if>
+											<c:if test="${resultMsgSFList.msgResultSts == 'W'}">
+												<c:set var="wait" value="${resultMsgSFList.msgResultCnt}"/>
+												<c:set var="waitPrice" value="${resultMsgSFList.eachPrice * wait}"/>
+											</c:if>
+										</c:if>
+									</c:otherwise>
+								</c:choose>
+							</c:forEach>
+							<td class="listSucc">
+								<p class="fwRg c_002c9a">정상수신</p>
+							</td>
+							<td class="listSucc">
+								<c:choose>
+									<c:when test="${mjonMsgSentVO.listType == 'groupList' && succ > 0}">
+										<p class="fwRg c_002c9a" onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'S'); return false;" style="cursor:pointer;"><fmt:formatNumber value="${succ}" pattern="#,###.#"/></p>	
+									</c:when>
+									<c:otherwise>
+										<p class="fwRg c_002c9a"><fmt:formatNumber value="${succ}" pattern="#,###.#"/></p>
+									</c:otherwise>
+								</c:choose>
+							</td>
+							<!-- 과금/비과금 -->
+							<td class="listSucc">
+								<p class="fwRg c_002c9a">
+									<c:choose>
+										<c:when test="${succPrice > 0}">
+											<fmt:formatNumber value="${succPrice}" pattern="#,###.#"/>
+										</c:when>
+										<c:otherwise>
+											0
+										</c:otherwise>
+									</c:choose>
+								</p>
+							</td>
+							
+							<c:if test="${mjonMsgSentVO.listType != 'groupList'}">
+								<c:if test="${msgResultSts == 'S'}">
+									<td>
+										<p class="fwRg c_002c9a">정상수신</p>
+									</td>
+									<!-- 과금/비과금 -->
+									<td>
+										<p class="fwRg c_002c9a">
+											<c:choose>
+												<c:when test="${succPrice > 0}">
+													<fmt:formatNumber value="${succPrice}" pattern="#,###.#"/>
+												</c:when>
+												<c:otherwise>
+													0
+												</c:otherwise>
+											</c:choose>
+										</p>
+									</td>
+								</c:if>
+								<c:if test="${msgResultSts == 'F'}">
+									<td>
+										<p class="fwRg c_e40000">수신오류</p>
+									</td>
+									<!-- 과금/비과금 -->
+									<td>
+										<p class="fwRg c_e40000">
+											<c:choose>
+												<c:when test="${failPrice > 0}">
+													<fmt:formatNumber value="${failPrice}" pattern="#,###.#"/>
+												</c:when>
+												<c:otherwise>
+													0
+												</c:otherwise>
+											</c:choose>
+										</p>
+									</td>
+								</c:if>
+								<c:if test="${msgResultSts == 'W'}">
+									<td>
+										<p class="fwRg c_e40000">결과대기</p>
+									</td>
+									<!-- 과금/비과금 -->
+									<td>
+										<p class="fwRg c_e40000">
+											<c:choose>
+												<c:when test="${waitPrice > 0}">
+													<fmt:formatNumber value="${waitPrice}" pattern="#,###.#"/>
+												</c:when>
+												<c:otherwise>
+													0
+												</c:otherwise>
+											</c:choose>
+										</p>
+									</td>
+								</c:if>
+							</c:if>
+						</tr>
+						<tr class="listTr">
+							<td>
+								<p class="c_222">실패/대기</p>
+							</td>
+							<td>
+								<c:choose>
+									<c:when test="${mjonMsgSentVO.listType == 'groupList' && (fail+wait) > 0}">
+										<p class="c_222" onclick="javascript:fnMsgSFDetailList('${resultAllSentList.msgGroupId}', 'F'); return false;" style="cursor:pointer;">
+											<fmt:formatNumber value="${fail}" pattern="#,###"/> / <fmt:formatNumber value="${wait}" pattern="#,###"/>
+										</p>
+									</c:when>
+									<c:otherwise>
+										<p class="c_222">
+											<fmt:formatNumber value="${fail}" pattern="#,###"/> / <fmt:formatNumber value="${wait}" pattern="#,###"/>
+										</p>
+									</c:otherwise>
+								</c:choose>
+							</td>
+							<td>
+								<p class="c_222">
+									<c:choose>
+										<c:when test="${(failPrice+waitPrice) > 0}">
+											<fmt:formatNumber value="${(failPrice+waitPrice)}" pattern="#,###.#"/>
+										</c:when>
+										<c:otherwise>
+											0
+										</c:otherwise>
+									</c:choose>
+								</p>
+							</td>
+						</tr>
+					</c:forEach>
+					</c:when>
+					<c:otherwise>
+					<tr>
+						<c:if test="${mjonMsgSentVO.listType eq 'groupList'}">
+							<td colspan="11">발송 내역이 없습니다.</td>
+						</c:if>
+						<c:if test="${mjonMsgSentVO.listType ne 'groupList'}">
+							<td colspan="9">발송 내역이 없습니다.</td>
+						</c:if>
+					</tr>
+					</c:otherwise>
+				</c:choose>
+			</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('${mjonMsgSentVO.listType}'); return false;"><i class="remove_img"></i>주소록에서 번호 삭제</button>
+            <button type="button" class="btnType btnType15" onClick="javascript:fnAddBlockNo('${mjonMsgSentVO.listType}'); return false;"></i>수신거부번호 등록</button>
+		</div>
+		<div class="table_btn_right">
+			<button type="button" class="excel_btn btnType" onClick="javascript:fnExcelDownLoad('all','${mjonMsgSentVO.tabType}'); return false;"><i class="downroad"></i>엑셀 다운로드</button>
+			<button type="button" class="print_btn btnType" onClick="javascript:fnShowPrintPopup('all','${mjonMsgSentVO.tabType}'); return false;"><i class="print_img"></i>발송결과 출력하기</button>
+		</div>
+	</div>
+	<c:if test="${!empty resultAllSentList}">
+	   <ul class="pagination">
+	       <ui:pagination paginationInfo = "${paginationInfo}"  type="imageWeb" jsFunction="linkPage" />
+	   </ul>
+	</c:if>
 
src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentDetailView.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/web/msgsent/MsgSentDetailView.jsp
@@ -0,0 +1,1024 @@
+<%@ 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" %>
+<%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%>
+<%@ taglib prefix="fnc" uri="/WEB-INF/tld/functions.tld"%>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>  
+<%@ page import="itn.com.cmm.LoginVO" %>
+<% pageContext.setAttribute("newLineChar", "\n"); %>
+
+
+
+<style>
+/* Tabulator Placeholder 기본 스타일 유지 */
+.tabulator-placeholder {
+	font-size: 22px !important; /* 기존 폰트 크기 유지 */
+	color: #e2d6d6 !important; /* 기존 색상 유지 */
+	font-weight: normal !important; /* 기본 폰트 두께 유지 */
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	height: 100%;
+}
+
+</style>
+
+<script type="text/javascript">
+
+var currentSearchKeyword = ""; // 검색어 저장
+var currentTabFilter = "전체"; // 현재 선택된 탭 (기본값: 전체)
+
+var $tbDtailList = null; //에러 팝업 영역
+$(document).ready(function(){
+
+	// 탭별 하위 버튼 활성화
+	fn_rowBtnSH('전체');
+	// 주소록 그룹 불러오기
+	getAddrGroupList();
+	
+	//Tabulator AJAX Data Loading
+	$tbDtailList = new Tabulator("#detailPopup", {
+		height: "255px",
+		width: "20%",
+		// layout: "fitDataStretch", // 데이터가 너비에 맞게 늘어나도록 설정
+		layout: "fitColumns", // fitDataStretch 대신 fitColumns 사용
+		autoColumns: false,
+		headerHozAlign: "center",
+		validationMode: "highlight",
+		clipboard: false,
+		clipboardCopySelector: "table",
+		clipboardPasteAction: "insert", // insert, update, replace
+		placeholder:"데이터를 불러오고 있습니다...", 
+		columns: [
+			{
+				title: "휴대폰",
+				field: "phone",
+				hozAlign: "center",
+				headerHozAlign: "center",
+				widthGrow: 1
+			},
+			{
+				title: "상세결과",
+				field: "result",
+				hozAlign: "center",
+				headerHozAlign: "center",
+				widthGrow: 1
+			}
+		]
+	});
+	
+	fn_getDetailList();
+	
+
+	
+	$('#goPageBtn').click(function(){
+		$("#goList").submit();
+	});
+	
+	
+	
+	// 탭 버튼 클릭 이벤트
+	$(".tabType3 .tab button").on("click", function () {
+	
+		// 모든 탭의 active 클래스 제거
+		$(".tabType3 .tab").removeClass("active");
+	
+		// 클릭한 버튼의 부모 요소(li)에 active 클래스 추가
+		$(this).parent().addClass("active");
+	
+		// 기존 버튼들의 title 속성 초기화
+		$(".tabType3 .tab button").removeAttr("title");
+	
+		// 선택된 버튼의 title 속성을 "선택됨"으로 변경
+		$(this).attr("title", "선택됨");
+	
+		// 검색어 초기화
+		$("#searchInput").val("");
+	
+		// 필터 적용 (검색 필터 없이 탭 기준으로만 적용)
+		fn_applyFilters();
+	});
+	
+	// 검색 버튼 클릭 시 실행
+	$("#searchBtn").on("click", function () {
+	    fn_search();
+	});
+
+	// 실시간 검색 및 Enter 키 이벤트 처리
+	$("#searchInput").on("keyup", function (event) {
+		let keyword = $(this).val().trim();
+	
+		if (keyword.length > 2) {
+			fn_applyFilters({ field: "phone", type: "like", value: keyword });
+		} else {
+			fn_applyFilters(null);
+		}
+	
+		// Enter 키 입력 시 검색 실행
+		if (event.key === "Enter") {
+			fn_search();
+		}
+	});
+	
+	
+	
+	$('.listClose').on("click", function (){
+		tooltipInit();
+	});
+	
+	$('.grpClose').on("click", function (){
+		$('#grpNm').val('')
+	});
+	
+
+	$(document).on('change', '#addrGrpIdInfo', function() {
+		if ($("#addrGrpIdInfo option:selected").val() != "NEW") {
+			$("#grpNm").val(""); //	새그룹명 Clear;
+		}
+	});
+	
+});
+
+//검색 실행 함수
+function fn_search() {
+	let keyword = $("#searchInput").val().trim();
+	
+	if (keyword.length < 3) {
+		alert("검색어를 3자 이상 입력해주세요.");
+		return;
+	}
+	
+	fn_applyFilters({ field: "phone", type: "like", value: keyword });
+}
+
+/**
+ * @Discription : 튤팁 닫을 때 팝업 초기화
+ */
+function tooltipInit(){
+
+	$tbDtailList.clearFilter();
+	$("#searchInput").val('');
+	$("#initTab").click();
+}
+
+/** 
+ * @Discription : 상세결과 팝업 내용 가져오는 로직
+ */
+function fn_getDetailList(){
+	
+	var params = {
+			"msgGroupId" : $('#msgGroupId').val()
+		}
+		
+		$.ajax({
+			type: "POST",
+			url: "/web/mjon/msgsent/findByMsgDetailListAjax.do",
+			data: params,
+			dataType:'json',
+			async: true,
+			success: function (returnData) {
+				console.log('returnData : ', returnData);
+				if(returnData.status == 'OK'){
+					fn_setData(returnData.object);
+					
+				}
+			},
+			error: function (e) { alert("오류가 발생하였습니다."); console.log("ERROR : ", e); }
+		});
+}
+
+
+/** 
+ * @Description: 데이터 설정
+ */
+function fn_setData(data){
+// 	console.log('data : ', data);
+// 	$tbDtailList.clearData();
+
+	const resultData = [];  // 오류 데이터를 저장할 배열
+
+	data.forEach((row, index) => {
+
+		resultData.push({ 
+			// addrNm: row.addrNm, // 폰번호
+			phone: row.callTo, // 폰번호
+			result: row.statusTxt // 결과 메시지 추가
+		});
+	});
+
+
+	// 오류 및 중복 데이터를 한 번에 추가
+	$tbDtailList.setData(resultData);
+	
+	
+};
+
+
+
+/** 
+ * @Discription : 필터 적용
+ */
+function fn_applyFilters(newFilter) {
+	// 현재 적용된 모든 필터 가져오기
+	let filters = [];
+	
+	// 현재 선택된 탭 값 가져오기
+	let selectedTab = $(".tabType3 .tab.active button").text().trim();
+	
+	// 탭 필터 적용 (탭이 "전체"가 아닐 경우)
+	if (selectedTab !== "전체") {
+	    filters.push({ field: "result", type: "like", value: selectedTab });
+	}
+	
+	// 검색어가 입력된 경우 검색 필터 추가
+	if (newFilter && newFilter.value) {
+	    filters.push(newFilter);
+	}
+	
+	// 필터 적용
+	$tbDtailList.setFilter(filters);
+	
+	// Placeholder 업데이트
+	fn_setPlaceholder("검색 결과가 없습니다.");
+	
+	// 툽팁 하위 버튼 삭제
+	fn_rowBtnSH(selectedTab);
+}
+
+
+
+
+/**
+ * @Description: 타블레이서 설명 수정 
+ */
+function fn_setPlaceholder(msg){
+
+	// 검색 후 데이터가 있는지 확인 후 placeholder 변경
+	setTimeout(() => {
+		let filteredRows = $tbDtailList.getRows('active').length; // 필터링된 행 개수 가져오기
+		if (filteredRows === 0) {
+			// 기존 데이터 유지하면서 빈 데이터 추가하여 placeholder 변경
+			$(".tabulator-placeholder").text(msg); // placeholder 메시지 변경
+		} 
+	}, 300); // 필터 적용 후 반영되도록 약간의 딜레이 추가
+}
+
+
+/**
+ * @Description: 필터링된 데이터만 다운로드
+ */
+ function fn_downloadFilteredExcel() {
+		// 현재 날짜 및 시간 가져오기 (YYYYMMDD_HHMMSS 형식)
+		let now = new Date();
+		let timestamp = now.getFullYear() +
+			("0" + (now.getMonth() + 1)).slice(-2) +
+			("0" + now.getDate()).slice(-2) + "_" +
+			("0" + now.getHours()).slice(-2) +
+			("0" + now.getMinutes()).slice(-2) +
+			("0" + now.getSeconds()).slice(-2);
+		
+		// 파일명 생성
+		let fileName = "filtered_data_" + timestamp + ".xlsx";
+
+		// 필터링된 데이터 가져오기
+		let filteredData = getFilteredDataByTab();
+
+		if (filteredData.length === 0) {
+			alert("다운로드할 데이터가 없습니다.");
+			return;
+		}
+
+// 		console.log("엑셀 다운로드 - 필터링된 데이터:", filteredData);
+
+		
+		
+		// 컬럼명(타이틀) 설정 (배열 형태로 변환)
+		let headers = [["휴대폰", "상세결과"]];
+
+		console.log(filteredData); // 데이터 확인
+		console.log(filteredData[0]); // 첫 번째 데이터 확인 (객체 키값 체크)
+
+		
+		// 필터링된 데이터 배열로 변환
+		let formattedData = filteredData.map(item => [item.phone, item.result]);
+
+
+
+		// 타이틀 행 추가
+		formattedData.unshift(headers[0]);
+
+		// 엑셀 생성
+		let workbook = XLSX.utils.book_new();
+		let worksheet = XLSX.utils.aoa_to_sheet(formattedData); // `aoa_to_sheet` 사용
+
+		XLSX.utils.book_append_sheet(workbook, worksheet, "Filtered Data");
+
+		// 엑셀 파일 다운로드
+		XLSX.writeFile(workbook, fileName);
+	}
+	
+/**
+ * @ 예약 취소
+ */
+function fnReservCancel(msgGroupId){
+	
+	var form = document.resCancelForm;
+	var loginVO = '${LoginVO}';
+	
+	form.msgGroupId.value = msgGroupId;
+	
+	if(loginVO == "" || loginVO == null){
+		
+		alert("로그인 후 이용이 가능합니다.");
+		return false;
+		
+	}
+	console.log('msgGroupId : ', msgGroupId);
+	var data = new FormData(form);
+	url = "/web/mjon/reservmsg/deleteReservMsgCancelDataAjax.do";
+	
+	if(confirm("정말 예약을 취소하시겠습니까?")){
+		
+		$.ajax({
+			type: "POST",
+			url: url,
+			data: data,
+			dataType:'json',
+			async: true,
+			processData: false,
+			contentType: false,
+			cache: false,
+			success: function (returnData, status) {
+				if(status == 'success'){ // status 확인 필요한가. 석세스 안뜨면 에러 가지 않나
+					if("fail"==returnData.result){
+						alert(returnData.message);
+						return false;
+					}
+				
+					alert("예약 발송이 정상적으로 취소 되었습니다.");
+					
+					location.reload(true);
+					
+				} else if(status== 'fail'){
+					alert(returnData.message);
+				}
+			},
+	        error: function (e) { 
+	        	alert("예약 취소에 실패하였습니다."); console.log("ERROR : ", e); 
+	        },
+			beforeSend : function(xmlHttpRequest) {
+	        	//로딩창 show
+	        	$('.loading_layer').addClass('active');				
+			},	        	        
+	        complete : function(xhr, textStatus) {
+	        	//로딩창 hide
+	        	$('.loading_layer').removeClass('active');
+			}
+	    });
+		
+	}
+	
+}
+
+/**
+ * @문자 재전송
+ */
+function fnMjMsgReSendAll(msgGroupId) {
+	// 치환 여부 체크
+	var replaceYn = fn_getReplaceChk();
+	// 문자 종류 (일반:N, 광고:A, 선거:C, 관리자:S)
+	var msgKind = $('#msgKind').val();
+	
+	var form = document.reSendAllForm;
+	form.msgResendAllFlag.value = "Y";
+	form.msgResendAllGroupId.value = msgGroupId;
+
+	// 치환문자 포함 여부에 따른 분기
+	var msg = "";
+	if (replaceYn) {
+		msg = "문자발송 화면으로 이동합니다.\n특정문구는 변환되지 않은 상태([*이름*],[*1*] 등)로 표기됩니다.\n문자내용, 받는 사람 목록 확인 후 발송해 주세요";
+// 		form.msgResendAllReplaceYn.value = "Y";
+	} else {
+		var title = (msgKind == 'C') ? "선거문자발송" : "문자발송";
+		msg = title + " 화면으로 이동합니다.\n문자내용, 받는 사람 목록 확인 후 발송해주세요.";
+	}
+	
+	if (!confirm(msg)) {
+		return;
+	}
+
+	// msgKind에 따른 action 설정
+	form.action = getMsgActionUrl(msgKind);
+	if (msgKind === 'A') {
+		form.msgResendAllAdvertiseYn.value = "Y"; // 광고문자 설정
+	}
+	
+	form.submit();
+}
+
+function fn_getReplaceChk(){
+	// 체크할 패턴 목록
+	var patterns = [/\[\*이름\*\]/, /\[\*1\*\]/, /\[\*2\*\]/, /\[\*3\*\]/, /\[\*4\*\]/];
+
+	// 대상 요소의 텍스트 가져오기
+	var text = $("#smsTxt").text();
+
+	// 패턴이 포함되어 있는지 확인
+	var found = patterns.some(function(pattern) {
+		return pattern.test(text);
+	});
+	
+	return found;
+}
+
+/**
+ * msgKind 값에 따른 action URL 반환
+ */
+function getMsgActionUrl(msgKind) {
+	switch (msgKind) {
+		case 'C':
+			return "/web/mjon/msgcampain/selectMsgDataView.do";
+		case 'A':
+			return "/web/mjon/msgdata/excel/selectMsgExcelDataView.do";
+		default:
+			return "/web/mjon/msgdata/selectMsgDataView.do";
+	}
+}
+
+function fn_rowBtnSH(tabText){
+	var $addReg = $('#addReg');
+	var $addRemove = $('#addRemove');
+	// addReg 주소록 등록
+	// addRemove 주소록 삭제
+	if(tabText == '전체'
+		|| tabText == '성공'){
+		$addReg.show();
+		$addRemove.hide();
+	}else if(tabText == '대기'){
+		$addReg.hide();
+		$addRemove.hide();
+	}else if(tabText == '실패' ){
+		$addReg.hide();
+		$addRemove.show();
+	}
+}
+
+
+function fnAddAddrNo(){
+	
+	
+	let url = "/web/mjon/addr/insertByAddrGrpDataAndAddrDataAjax.do";
+	
+
+	console.log($("#addrGrpIdInfo option:selected").val());
+	console.log($("#grpNm").val());
+	if ($("#addrGrpIdInfo option:selected").val() == "NEW" 
+				&& $("#grpNm").val() == "") {
+		alert("저장할 그룹을 선택하거나 새 그룹명을 입력해주세요.");
+		return false;		
+	}
+
+    // 필터링된 데이터 가져오기 (탭 필터 적용)
+    let filteredData = getFilteredDataByTab();
+
+	console.log('filteredData : ', filteredData)
+	
+    // phone 필드 데이터만 추출
+    let addrPhones = filteredData.map(row => row.phone);
+// 	console.log('addrPhones : ', addrPhones)
+
+	if(addrPhones.length < 1){
+		alert('해당 탭에 데이터가 없습니다.');
+		return false;
+	}
+	
+	// 주소록 그룹명 가져오기
+	let addrGrpNm = $('#grpNm').val();
+	let addrGrpId = $("#addrGrpIdInfo option:selected").val();
+	
+	// 데이터 객체 생성
+	let data = {
+		addrPhones : addrPhones
+		, addrGrpNm : addrGrpNm
+		, addrGrpId : addrGrpId
+	};
+
+	if(!confirm("연락처 정보를 주소록에 등록 하시겠습니까?")){
+		return false;
+	}
+	
+
+	$.ajax({
+		type: "POST",
+		url: url,
+		data: JSON.stringify(data),
+		dataType: "json",
+		contentType: "application/json",
+		async: false,
+		processData: false,
+		success: function(data) {
+			
+			if(data.status == 'BAD_REQUEST'){
+				alert(data.message);
+				return false;
+			}
+			
+
+			// 성공 메세지
+			alert(data.message);
+			// 그룹등록 팝업 닫기
+			$('.grpClose').click();
+			
+		},
+		error: function(error) {
+			alert("오류가 발생하였습니다.")
+			console.error("에러 발생:", error);
+		}
+	});
+}
+
+function fnDelAddrNo(){
+	
+	
+	let url = "/web/mjon/addr/deleteAddrNoDataAjax.do";
+	
+
+    // 필터링된 데이터 가져오기 (탭 필터 적용)
+    let filteredData = getFilteredDataByTab();
+
+    // phone 필드 데이터만 추출
+    let addrPhones = filteredData.map(row => row.phone);
+	console.log('addrPhones : ', addrPhones)
+
+	if(addrPhones.length < 1){
+		alert('주소록에 살제할 연락처가 없습니다.');
+		return false;
+	}
+	
+	// 데이터 객체 생성
+	let data = {
+		addrPhones: addrPhones
+	};
+	
+	let selectedTab = $(".tabType3 .tab.active button").text().trim();
+	if(!confirm("발송"+selectedTab+" 번호를 주소록에서 삭제하시겠습니까?\n(모든 주소록 그룹에서 삭제)")){
+		return false;
+	}
+	
+	$.ajax({
+		type: "POST",
+		url: url,
+		data: JSON.stringify(data),
+		dataType: "json",
+		contentType: "application/json",
+		async: false,
+		processData: false,
+		success: function(data) {
+			
+			if(data.status == 'BAD_REQUEST'){
+				alert(data.message);
+				return false;
+			}
+			
+
+			// 성공 메세지
+			alert(data.message);
+			
+		},
+		error: function(error) {
+			alert("오류가 발생하였습니다.")
+			console.error("에러 발생:", error);
+		}
+	});
+}
+/**
+ * @description 현재 선택된 탭(`result` 필터) 기준으로 데이터를 필터링
+ * @returns {Array} 필터링된 데이터 리스트
+ */
+function getFilteredDataByTab() {
+	// 현재 적용된 모든 필터 가져오기
+	let filters = $tbDtailList.getFilters();
+	
+	// 현재 모든 데이터 가져오기 (전체 데이터에서 필터 적용)
+	let allData = $tbDtailList.getData();
+	
+	// 현재 적용된 필터에서 "result" 필터만 찾기
+	let tabFilter = filters.find(filter => filter.field === "result");
+	
+	// 탭 필터 적용하여 데이터 필터링 (수신번호 필터는 무시)
+	return allData.filter(row => tabFilter ? row.result.includes(tabFilter.value) : true);
+}
+
+ 
+
+//주소록 그룹정보 불러오기
+function getAddrGroupList() {
+  $.ajax({
+      type : "POST",
+      async : false,
+      url : "/web/mjon/addr/addrGroupListAjax.do",
+      data : {},
+      dataType:'json',
+      success : function(data) {
+			//alert(JSON.stringify(data.addrGroupList));
+
+			// Show Html
+			getAddrGroupListShow(data.addrGroupList);
+      },
+      error : function(xhr, status, error) {
+          alert(error);
+          return false;
+      }
+  });	    	
+}
+	
+//Show Html
+function getAddrGroupListShow(jsonList) {
+	var sHtml = "";
+	sHtml += "<option value='NEW'>그룹추가</option>";
+	sHtml += "<option value='0'>그룹미지정</option>";
+	sHtml += "<option value='bookmark'>자주보내는 번호</option>";
+	for (var j = 0; j < jsonList.length; j++) {
+		sHtml += "	<option value='" + $.trim(jsonList[j].addrGrpId) + "' />" + $.trim(jsonList[j].addrGrpNm) + "</option>";
+	}
+	    	
+	$("#addrGrpIdInfo").html(sHtml);
+}
+ 
+</script>
+<div class="inner">
+	<!-- js 참고용 hidden -->
+	<input id="msgGroupId" type="hidden" value="${result.msgGroupId}"/>
+	<input id="msgKind" type="hidden" value="${result.msgKind}"/> <!-- 문자종류(일반:N, 광고:A, 선거:C, 관리자:S) -->
+	
+	<!-- send top -->
+	<div class="send_top">
+		<!-- 결제관리 - 요금 사용내역 -->
+		<div class="rev_admin_cont serv_content current">
+			<div class="heading">
+				<h2>발송결과 상세</h2>						
+				<button type="button" class="button junk" data-tooltip="popupJunk" style="right:0;">통신사 스팸규격안내</button>
+			</div>
+
+			<!-- 발송결과 상세 및 미리보기-->
+			<div class="send_general">
+				<!-- 발송결과 상세 정보 -->
+				<div class="resultcont_left">
+							<!--발송정보-->
+							<div class="res_info">
+								<div class="res_info_in">
+									<div class="res_info_top clearfix">
+										<p>발송정보</p>
+										<p><button type="button" class="btnType btnType3"onClick="javascript:fnMjMsgReSendAll('${result.msgGroupId}'); return false;">재전송</button></p>
+									</div>
+									<div class="res_info_btm">
+										<dl>
+											<dt>발송일시</dt>
+											<dd>
+												${result.reqDate}
+											</dd>
+										</dl>
+										<c:if test="${result.reserveYn eq 'Y' }">
+										<dl><!-- 예약 시 -->
+											<dt>등록일시</dt>
+											<dd>${result.regDate }</dd>
+										</dl>
+										</c:if>
+										<c:if test="${result.subjectChkYn eq 'Y'}">
+											<dl>
+												<dt>제목</dt>
+												<dd>${result.subject }</dd>
+											</dl>
+										</c:if>
+										<dl>
+											<dt>형태</dt>
+											<dd>
+												${result.msgType == '4' 
+														? '단문' 
+														: (result.fileCnt == '0' 
+																	? '장문' 
+																	: '그림')}
+											</dd>
+										</dl>
+										<dl>
+											<dt>발송건수</dt>
+											<dd><span class="c_222"><fmt:formatNumber value="${result.msgGroupCnt}" type="number" groupingUsed="true" /></span>건</dd>
+										</dl>
+										<dl>
+											<dt>발신번호</dt>
+<%-- 											<dd>${result.callFrom }</dd> --%>
+											<dd>${fnc:formatPhone(result.callFrom) }</dd>
+										</dl>
+										<dl>
+											<dt>진행상황
+											<!--  예약인 경우 --> 
+											<c:if test="${result.reserveYn eq 'Y'}">
+													<div class="icon_wrap">
+														<div class="re">예약</div>
+													<!-- 예약일때만 분할이 있음 -->
+													<c:if test="${result.divideYN eq 'Y'}">
+														<div class="di_info">
+															<button class="di">분할</button>
+															<div class="di_hover_layer">
+																<strong>${result.divideText }</strong>
+<!-- 																<strong>100,000건</strong>씩 <strong>35분</strong> 간격 -->
+															</div>
+														</div>
+													</c:if>
+													</div>
+											</c:if>
+											<!--//  예약인 경우 --> 
+											</dt>
+											<dd>
+											
+											<c:choose>
+												<c:when test="${result.statusCd eq '04' }">
+													예약취소(<c:out value="${result.canceldate }" />)
+												</c:when>
+												<c:when test="${result.statusCd ne '03' }">
+													<ec:code codeId="ITN057" code="${result.statusCd }" />
+												</c:when>
+												<c:otherwise>
+													<p><button class="btnType btnType20" onClick="javascript:fnReservCancel('${result.msgGroupId}'); return false;">예약취소</button></p>
+												</c:otherwise>
+											</c:choose>
+							
+								<!--  -->
+<!-- 												<button class="btnType btnType20">예약취소</button> -->
+											</dd>
+											<!--<dd>예약취소 2024-07-16 15:07</dd>--><!-- 예역취소 후 버튼 대신 취소 일시 노출 -->											
+										</dl>
+									</div>
+									<div class="res_info_btm">
+										<dl>
+											<dt class="btm_charge">발송요금</dt>
+											<dd>
+												<span class="stcharge">
+												<c:choose>
+													<c:when test="${result.totPrice eq '-' }">
+														0
+													</c:when>
+													<c:otherwise>
+														<fmt:formatNumber value="${result.totPrice }" type="number" groupingUsed="true" minFractionDigits="0" maxFractionDigits="1" />
+													</c:otherwise>
+												</c:choose>
+												</span>원
+											</dd>											
+											<!--<dd><span class="stcharge">-</span>원</dd>--><!-- 예역취소 후 금액은 하이픈 처리--> 
+										</dl>
+									</div>
+								</div>                                
+							</div>
+							 <!--// 발송정보-->
+							<!--상세결과-->
+							<div class="res_info">
+								<div class="res_info_in">
+									<div class="res_info_top clearfix" style="padding:0 0 10px 0;">
+										<p>상세결과</p>
+										<p></p>
+									</div>
+									<div class="res_num">
+										<div class="res_info_btm1">
+											<dl>
+												<dt>전체건수</dt>
+												<dd><a href="#" data-tooltip="rev_popup04"><span class="c_222_g"><fmt:formatNumber value="${result.msgGroupCnt}" type="number" groupingUsed="true" /></span>건</a></dd>
+											</dl>
+										</div>
+										<div class="res_info_btm1">
+											<dl>
+												<dt>성공건수</dt>
+												<dd><span class="c_002c9a_g"><fmt:formatNumber value="${result.resultSValue}" type="number" groupingUsed="true" /></span>건(${result.successPct})</dd>
+											</dl>
+										</div>
+									</div>
+									<div class="res_num">	
+										<div class="res_info_btm1">
+											<dl>
+												<dt>대기건수</dt>
+												<dd><span class="c_666_g"><fmt:formatNumber value="${result.resultWValue}" type="number" groupingUsed="true" /></span>건(${result.waitingPct})</dd>
+											</dl>
+										</div>
+										<div class="res_info_btm1">
+											<dl>
+												<dt>실패건수</dt>
+												<dd><span class="c_e40000_g"><fmt:formatNumber value="${result.resultFValue}" type="number" groupingUsed="true" /></span>건(${result.failedPct})</dd>
+											</dl>
+										</div>
+									</div>
+									<p class="table_bottom_txt">* 전체건수를 클릭하면 받는 사람 상세정보를 확인하실 수 있습니다.</p>
+								</div>                                
+							</div>
+							 <!--// 발송결과-->	
+
+				</div>
+				<!--// 발송결과 상세 정보 -->
+
+				<!-- 발송결과 미리보기 -->
+				<div class="resultcont_right">
+					<div class="phone">
+						<div class="phoneIn">
+							<div>
+								<p class="prev_p"><img src="/publish/images/search.png">문자내용</p>
+								<div class="text_length2 clearfix" style="display:none;">
+									<span class="msg_com msg_short">단문</span>
+									<div>
+										<span>글자크기</span>
+										<button type="button"><img src="/publish/images/content/font_plus.png"></button>
+										<button type="button"><img src="/publish/images/content/font_minus.png"></button>
+									</div>
+								</div>
+								<div class="text_length2 clearfix" style="display:none;">
+									<span class="msg_com msg_long">장문</span>
+									<div>
+										<span>글자크기</span>
+										<button type="button"><img src="/publish/images/content/font_plus.png"></button>
+										<button type="button"><img src="/publish/images/content/font_minus.png"></button>
+									</div>
+								</div>
+								<div class="text_length2 clearfix">
+									<span class="msg_com ${result.msgType == '4' 
+																? 'msg_short' 
+																: (result.fileCnt == '0' 
+																		? 'msg_long' 
+																		: 'msg_photo')}">
+										${result.msgType == '4' 
+												? 'SMS' 
+												: (result.fileCnt == '0' 
+															? 'LMS' 
+															: 'MMS')}
+									</span>
+								
+<!-- 									<span class="msg_com msg_photo">포토</span> -->
+									<!-- <ul class="photo_msg_num">
+										<li onclick="imgClick(0);"><a href="#none">1</a></ li>
+										<li onclick="imgClick(1);"><a href="#none">2</a></ li>
+										<li onclick="imgClick(2);"><a href="#none">3</a></ li>
+									</ul> -->
+									<!-- <div>
+										<span>글자크기</span>
+										<button type="button"><img src="/publish/images/content/font_plus.png"></button>
+										<button type="button"><img src="/publish/images/content/font_minus.png"></button>
+									</div> -->
+								</div>
+								<!-- 텍스트 미리보기 -->
+								<div class="text_preview">
+									<div class="preiew_img">
+										<c:forEach var="fileInfo" items="${result.fileInfos}">
+											<div class="img_box">
+													<img src="<c:url value='/cmm/fms/getImage2.do'/>?atchFileId=<c:out value="${fileInfo.atchFileId}"/>&fileSn=<c:out value="${fileInfo.fileSn}"/>" alt="발송된 그림문자 미리보기" style="width: 100%">
+											</div>
+										</c:forEach>
+									</div>
+									<div class="preview_auto">
+										<c:if test="${result.msgKind eq 'A' }" >
+											<p class="ad_tit">(광고)</p>
+										</c:if>
+										<p class="none_txt" id="smsTxt">
+											${fn:replace(result.smsTxt, newLineChar, "<br/>")}
+										</p>
+										<p class="realtime"></p>
+										<c:if test="${result.msgKind eq 'A' }" >
+											<p class="deny_receipt">무료 거부 080-0000-0000</p>
+										</c:if>
+									</div>
+								</div>
+								<!-- //텍스트 미리보기 -->
+							</div>
+						</div>
+						<p class="addText">※ 단말기 설정에 따라 다르게 보일 수 있습니다<p>
+					</div>
+				</div>
+				<!--// 발송결과 미리보기 -->
+			</div>			
+			<!--// 발송결과 상세 및 미리보기-->
+			<!-- 목록-->
+			<div class="btn_list_type1">
+				<button class="btnType btnType17" id="goPageBtn">목록</button>
+			</div>
+			<!--// 목록-->
+
+		</div>
+	</div>
+	<!--// send top -->
+</div>
+
+
+
+	<!-- 발송대상리스트 팝업 -->
+	<div class="tooltip-wrap">
+		<div class="popup-com ad_layer rev_popup04" tabindex="0" data-tooltip-con="rev_popup04" data-focus="rev_popup04" data-focus-prev="rev_popup04-close" style="width:530px;">
+			<div class="popup_heading">
+				<p>발송대상 리스트</p>
+				<button type="button" class="tooltip-close listClose" data-focus="rev_popup04-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+			</div>
+			<div class="layer_in">
+
+<!-- 				<div class="gorup_join_cont" style="margin:-15px 0 0 0;"> -->
+<!-- 					<div class="group_input"> -->
+<!-- 						<div class="input_left">발신번호</div> -->
+<%-- 						<div class="input_right type1"><c:out value="${result.callFrom }" /></div> --%>
+<!-- 					</div> -->
+<!-- 				</div> -->
+
+				<div class="popup_search_type2">							
+					<label for="" class="label">검색종류 선택</label>
+					<div class="title">수신번호</div>
+					<label for="" class="label">검색어입력</label>
+					<input type="text" class="send_text" id="searchInput" placeholder="3자 이상 입력하세요." onfocus="this.placeholder=''" onblur="this.placeholder='3자 이상 입력하세요.'">
+					<button type="button" id="searchBtn" class="btnType btnType2" style="width:63px; margin:0;">검색</button>
+				</div>
+
+				<div class="list_tab_wrap2 type4">
+					<ul class="tabType3" id="tabType" name="tabType">
+						<li class="tab active"><button type="button" id="initTab" title="선택됨">전체</button></li>
+						<li class="tab"><button type="button">대기</button></li>
+						<li class="tab"><button type="button">성공</button></li>
+						<li class="tab"><button type="button">실패</button></li>
+					</ul>
+				</div>	
+				
+				<div class="tb_wrap" id="detailPopup" style="min-height:200px;">
+						<!-- 타블레이터 영역 -->
+				</div>	
+				
+				<div class="table_btn clearfix">
+					<div class="table_btn_left">
+						<button type="button" onclick="fn_downloadFilteredExcel()" class="excel_btn btnType"><i class="downroad"></i>엑셀 다운로드</button>
+						<button type="button" id="addReg" data-tooltip="rev_popup02" class="btnType btnType14"><i class="add_img"></i>주소록 등록</button>
+						<button type="button" onclick="fnDelAddrNo()" id="addRemove" class="btnType btnType15"><i class="remove_img"></i>주소록에서 번호 삭제</button>
+					</div>
+				</div>
+			</div>
+			<div class="popup_btn_wrap2" style="margin: -40px auto 30px auto;">
+				<button type="button" class="tooltip-close listClose" data-focus="adr_popup01-close"  data-focus-next="popup02">닫기</button>                      
+			</div>
+
+		</div>
+	</div>
+	<!-- //발송대상 리스트 안내 팝업 -->
+	
+	<!-- 주소록에 등록 팝업 -->
+	<div class="tooltip-wrap">
+		<div class="popup-com adr_layer rev_popup02" tabindex="0" data-tooltip-con="rev_popup02" data-focus="rev_popup02" data-focus-prev="rev_popup02-close" style="width: 510px;">
+			<div class="popup_heading">
+				<p>주소록에 등록</p>
+				<button type="button" class="tooltip-close grpClose" data-focus="rev_popup02-close"><img src="/publish/images/content/layerPopup_close.png" alt="팝업 닫기"></button>
+			</div>
+			<div class="layer_in">				
+				<table class="layer_tType1 style1">
+					<caption>주소록 그룹선택 표</caption>
+					<colgroup>
+						<col style="width: 80px">
+						<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="grpNm" placeholder="새 그룹명을 입력해주세요." maxlength="24" onfocus="this.placeholder=''" onblur="this.placeholder='새 그룹명을 입력해주세요.'" class="inputLight">
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				<div class="popup_btn_wrap2">
+					<button type="button" onclick="fnAddAddrNo()">등록</button>
+					<button type="button" class="tooltip-close grpClose" data-focus="rev_popup02-close" data-focus-next="rev_popup02">닫기</button>
+				</div>				
+			</div>
+		</div>
+	</div>
+	<!--// 주소록에 등록 팝업 -->
+	
+	<!-- 이전 리스트 상태(검색조건, 페이징) 그대로 가기 위한 form -->
+	<form id="goList" name="goList" method="post" action="/web/mjon/msgsent/selectMsgSentView.do">
+		<input type="hidden" name="pageIndex" value="<c:out value="${searchVO.pageIndex}" />" />
+		<input type="hidden" name="searchSortCnd" value="<c:out value='${searchVO.searchSortCnd }' />" />
+		<input type="hidden" name="searchSortOrd" value="<c:out value='${searchVO.searchSortOrd }' />" />
+		<input type="hidden" name="searchCondition01" value="<c:out value='${searchVO.searchCondition01 }' />" />
+		<input type="hidden" name="searchCondition02" value="<c:out value='${searchVO.searchCondition02 }' />" />
+		<input type="hidden" name="searchStartDate" value="<c:out value='${searchVO.searchStartDate }' />" />
+		<input type="hidden" name="searchEndDate" value="<c:out value='${searchVO.searchEndDate }' />" />
+		<input type="hidden" name="searchCondition" value="<c:out value='${searchVO.searchCondition }' />" />
+		<input type="hidden" name="searchKeyword" value="<c:out value='${searchVO.searchKeyword }' />" />
+		<input type="hidden" name="pageUnit" value="<c:out value='${searchVO.pageUnit }' />" />
+	</form>
+	
+	<!-- 예약 취소 -->
+	<form id="resCancelForm" name="resCancelForm" method="post">
+		<input type="hidden" id="msgGroupId" name="msgGroupId" value=""/>
+	</form>	
+
+	<!-- 재발송 form -->
+	<form name="reSendAllForm" method="post">
+		<input type="hidden" name="msgResendAllFlag" value="N"/>
+		<input type="hidden" name="msgResendAllGroupId" value=""/>
+		<input type="hidden" name="msgResendAllAdvertiseYn" value="N"/>
+		<input type="hidden" name="msgResendAllReplaceYn" value="N"/>		
+	</form>
+
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
@@ -15,7 +15,12 @@
 $(document).ready(function(){
 	
 	//초기 전체 리스트 페이지 보여주기
-	linkPage(1);
+	linkPage($('#searchForm #pageIndex').val());
+	
+	
+	fn_activateTab($('#searchForm #searchCondition01').val())
+	fn_setActiveTab($('#searchForm #searchCondition02').val())
+	
 	
 	var date = new Date() ;
 	//이전달 첫날/마지막날 조회
@@ -28,12 +33,14 @@
 		lastfuledday = lastfulstday + "/"+ new Date(date.getFullYear(), date.getMonth(), 0).getDate()+"" ;
 		lastfulstday += "/01" ;
 	}
+	console.log('lastfulstday: ', lastfulstday);
 	
 	//당월 첫날/마지막날 조회
 	thisfulstlday = date.getFullYear() + "/" ;
 	thisfulstlday += date.getMonth()+1 < 10  ? "0"+ (date.getMonth()+1) : date.getMonth()+1+"" ;
 	thisfuledtlday = thisfulstlday + "/"+ new Date(date.getFullYear(), date.getMonth()+1, 0).getDate()+"";
 	thisfulstlday += "/01" ;
+	console.log('thisfulstlday: ', thisfulstlday);
 	
 	//3개월 이전 날짜 구해오기
 	
@@ -55,6 +62,19 @@
 	$(document).on('click', '.sort', function (){
 		listSortOrd(this);
 	});
+	
+	
+	//  탭 :: 전체 , 즉시, 예약
+	$(document).on('click', '.sendKindBtn', function (){
+
+		// 클릭된 버튼의 data-info 값을 전달하여 함수 호출
+		fn_activateTab($(this).data('info'));
+		
+		linkPage(1);
+	});
+	
+	
+	
 
 	//목록 정렬 항목 클릭
 	function listSortOrd(obj){
@@ -87,7 +107,8 @@
 		
 	});
 	
-	$(document).on('change','#pageUnit', function(){
+	$(document).on('change','#pageUnitS', function(){
+		setPageUnit($(this).val()); 
 		
 		linkPage(1);
 		
@@ -97,8 +118,23 @@
 	
 });
 
+function setPageUnit(val){
+	$('#pageUnit').val(val); 
+}
 
-	
+
+//탭 활성화 처리 함수
+function fn_activateTab(tabInfo) {
+	// 1. data-info 값을 가진 버튼 요소 찾기
+	var $button = $('.sendKindBtn[data-info="' + tabInfo + '"]');
+
+	// 2. 해당 버튼이 속한 탭 활성화 처리
+	$button.closest('ul').find('.tab').removeClass('active');
+	$button.closest('.tab').addClass('active');
+
+	// 3. hidden input 요소에 값 설정
+	$('#searchCondition01').val(tabInfo);
+}
 
 
 //캘린더에 날짜 입력해 주기
@@ -107,13 +143,13 @@
 }
 
 
-//검색 버튼 실행
+//페이지 이동 실행
 function linkPage(pageNo){
 	
 	var form = document.searchForm;
-	var stateType = form.stateType.value;
 	form.pageIndex.value = pageNo;
-	
+	console.log('form : ', form);
+
 	var sendData =  $(document.searchForm).serializeArray();
 	$(".msgSentAllLoad").html('<div class="list_info"><table class="tType4"><tbody><tr><td colspan="12">LOADING...</td></tr></tbody></table></div>');
 	$(".msgSentAllLoad").load("/web/mjon/msgsent/selectMsgSentListViewAjax.do", sendData ,function(response, status, xhr){
@@ -137,120 +173,73 @@
 		}
 	});
 	
-	if(msgId.length > 0){
+	console.log('msgId : ', msgId);
+	
+	if(msgId.length < 1){
+		alert("삭제할 문자를 선택해 주세요.");
+		return false;
+	}
 		
 		//22.04.25 구글 독스 alert 기준으로 이지우가 수정
 		/* if(confirm("선택한 발송문자를 삭제하시겠습니까? 삭제된 문자는 복구가 불가능 합니다.")) */
-		if(confirm("선택한 목록을 삭제하시겠습니까?")){
+		if(confirm("선택한 목록을 삭제하시겠습니까?\n삭제한 목록은 복구가 불가합니다.")){
 			
 			document.searchForm.msgGroupIdList.value = msgId;
 			var sendData =  $(document.searchForm).serializeArray();
 			
 			$(".msgSentAllLoad").load("/web/mjon/msgsent/deleteMsgSentDataAjax.do", sendData ,function(response, status, xhr){
 			});
-			
-// 			var form = document.searchForm;
-// 			form.action="/web/mjon/msgsent/selectMsgSentView.do";
-// 			form.submit();
+
+			alert("삭제되었습니다.");
+			var form = document.searchForm;
+			form.action="/web/mjon/msgsent/selectMsgSentView.do";
+			form.submit();
 		}
-		
-	}else{
-		
-		alert("삭제할 문자를 선택해 주세요.");
-		return false;
-		
-	}
-	
-}
-
-//상세보기 버튼 실행
-function fnRevDetailPop(msgGroupId, msgId, fileCnt){
-	document.resPopForm.msgGroupId.value = msgGroupId;
-	document.resPopForm.msgId.value = msgId;
-	var sendData =  $(document.resPopForm).serializeArray();
-	
-	var form = document.searchForm;
-	if (form.listType.value == "privateList") {
-		$("#msgSentDetailPopLoad").load("/web/mjon/msgsent/selectMsgSentDetailData2Ajax.do", sendData ,function(response, status, xhr){
-		});
-	}
-	else {
-		$("#msgSentDetailPopLoad").load("/web/mjon/msgsent/selectMsgSentDetailDataAjax.do", sendData ,function(response, status, xhr){
-		});		
-	}
-	
-}
-
-function fnListLoad(pageType, tabNum){
-	
-	var form = document.searchForm;
-	var $tab = $(".table_tab_wrap li").eq(tabNum); 	//
-	$tab.addClass("active");
-	$tab.find("button").attr("title", "선택됨");
-	$tab.siblings("li.tab").removeClass("active");
-	$tab.siblings("li.btn_tab").removeClass("active");
-	$tab.siblings("li.tab").find("button").removeAttr("title");
-	
-	if(pageType == 'all'){
-		
-		form.stateType.value = "all";
-		$(".tab_depth1").show();
-		
-	}else if(pageType == 'ready'){
-		
-		form.stateType.value = "ready";
-		$(".tab_depth1").show();
-		
-	}else if(pageType == 'complete'){
-		
-		form.stateType.value = "complete";
-		$(".tab_depth1").show();
-		
-	}else if(pageType == 'fail'){
-		form.listType.value = "privateList";
-		form.stateType.value = "fail";
-		$(".tab_depth1").hide();
-		
-	}
-	
-	/* if(pageType == 'fail'){//발송실패의 경우 모두 개인별 건수를 보여준다.
-		
-		form.listType.value = 'privateList';
-		
-	} */
-	
-	linkPage(1);
 	
 }
 
 // 전체/단문/장문/그림 탭 선택 처리
-function fnTabLoad(tabType, tabNum){
+function fnTabLoad(tabType){
+	
+	//즉시, 예약 탭은 전체로 바꿔야함
+	fn_activateTab('');
+	setPageUnit('10');
 	
 	var form = document.searchForm;
-	
-	form.tabType.value = tabType;
-	
-	//해당 탭의 전체 리스트 내역으로 불러오기
-	fnListLoad('all', '0');
-	var n=tabNum+1;
-	
-	//탭 선택 CSS 처리 
-	var $tab = $(".list_tab_wrap2 li:nth-child("+n+")"); 
-	var $tabPrev = $(".list_tab_wrap2 li:nth-child("+n+")").prev("li")
-	$tab.addClass("active");
-	$tab.find("button").attr("title", "선택됨");
-	$tab.siblings("li.tab").removeClass("active");
-	$tab.siblings("li.tab").find("button").removeAttr("title");
 
-	$tab.siblings("li:not(li:last-child)").find("button").css("border-right","1px solid #e5e5e5");
-	$tabPrev.find("button").css("border-right","0");
+	// 탭 선택 CSS 처리
+	fn_setActiveTab(tabType);
 	
+	linkPage(1);
 }
 
+//fnTabLoad 함수에 대한 탭 선택 CSS 처리 함수
+function fn_setActiveTab(tabType) {
+	var $tabs = $(".list_tab_wrap2 li"); // 전체 탭 리스트
+	$tabs.removeClass("active").find("button").removeAttr("title"); // 모든 탭 초기화
+
+	// tabType에 해당하는 탭 찾기
+	$tabs.each(function() {
+		var buttonText = $(this).find("button").text();
+		if ((tabType === '' && buttonText === "전체") ||
+			(tabType === 'S' && buttonText === "단문(SMS)") ||
+			(tabType === 'L' && buttonText === "장문(LMS)") ||
+			(tabType === 'M' && buttonText === "그림(MMS)")) {
+			$(this).addClass("active").find("button").attr("title", "선택됨");
+		}
+	});
+	
+	$('#searchCondition02').val(tabType);
+}
+
+
 function fnSearch(pageNo){
-	/* if(!fn_G_cmndataValueChk("startDate", "endDate", 3)){
+	/* if(!fn_G_cmndataValueChk("searchStartDate", "searchEndDate", 3)){
 		return;
 	}; */
+
+	fn_activateTab('')
+	fn_setActiveTab('')
 	
 	console.log('fnSearch')
 	var form = document.searchForm;
@@ -274,27 +263,8 @@
 function fnExcelDownLoad(pageType, tabType){
 	
 	var form = document.searchForm;
-	var loginVO = '${LoginVO}';
-	
-	form.stateType.value = pageType;
-	form.tabType.value = tabType;
-	
-	if(loginVO == "" || loginVO == null){
-		alert("로그인 후 이용이 가능합니다.");
-		return false;
-	}
 	
 	// 기간검색 유효성 검사
-	if ($("#startDate").val() == "" || $("#endDate").val() == "") {
-		alert("기간 설정을 먼저해주세요. 최근 3개월까지만 다운로드 가능합니다.")
-		return false; 
-	}
-	else {
-		if ($("#startDate").val() < prevMonth(3)) {
-			alert("최근 3개월까지만 다운로드 가능합니다.")
- 			return false; 			
-		}
-	}
 	
 	if(confirm("엑셀 다운로드를 하시겠습니까?")){
 		
@@ -305,21 +275,6 @@
 	
 }
 
-$(document).on('click', '.msgGgoupList', function(){
-	
-	var form = document.searchForm;
-	form.listType.value = "groupList";
-	linkPage(1);
-	
-});
-
-$(document).on('click', '.msgPrivateList', function(){
-	
-	var form = document.searchForm;
-	form.listType.value = "privateList";
-	linkPage(1);
-	
-});
 
 
 function fnDeleteAddrNo(listType){
@@ -537,7 +492,7 @@
 }
 
 
-/* 사용내역서 클릭 시 내역서 새창 팝업 오픈  */
+/* 사용내역서 클릭 시 내역서 새창 팝업 오픈  
 function fnShowPrintPopup(tabType, type) { 
 	//만들려는 팝업의 크기
 	var popup_wid = '840';
@@ -553,7 +508,7 @@
 	$("#searchForm").attr({"action":"/web/mjon/msgsent/printMsgSentDataAjax.do", "method":"post"}).submit();
 	
 }
-
+*/
 function addrGroupDuplCnt() {
 	document.searchForm.addrGrpNm.value = $('#grpNm').val();
 	
@@ -744,9 +699,10 @@
 }
 
 //발송결과 - 대기/성공/실패
-function subContent(p_content_no){	
+function subContent(){	
 	
-	var sendData =  $(document.listForm).serializeArray();
+	var sendData =  $(document.searchForm).serializeArray();
+	console.log('sendData :: ', sendData);
 	var v_html_pre	=	'<table>'
 			+	'<caption>구분, 충전금액, 사용금액, 잔액 등 정보를 제공하는 표</caption>'
 			+	'<colgroup>'
@@ -891,60 +847,51 @@
 					</div>
 				</div>--%>
 				<form id="searchForm" name="searchForm" method="post">
-					<input type="hidden" id="pageIndex" name="pageIndex" value="1"/>
+<!-- 					<input type="hidden" id="pageIndex" name="pageIndex" value="1"/> -->
+					<input type="hidden" id="pageIndex" name="pageIndex" value="<c:out value="${searchVO.pageIndex}" />" />
+					<input type="hidden" id="pageUnit" name="pageUnit" value="<c:out value="${searchVO.pageUnit}" />" />
 					<input type="hidden" id="msgGroupIdList" name="msgGroupIdList" value=""/>
+					<input type="hidden" id="msgGroupId" name="msgGroupId" value=""/>
 					<input type="hidden" name="searchSortCnd" value="<c:out value="${searchVO.searchSortCnd}" />" />
 					<input type="hidden" name="searchSortOrd" value="<c:out value="${searchVO.searchSortOrd}" />" />
 					<input type="hidden" id="tabType" name="tabType" value="all"/><!-- 탭 종류 -->
 					<input type="hidden" id="stateType" name="stateType" value="all"/><!-- 발송상태 종류 -->
 					<input type="hidden" id="listType" name="listType" value="groupList"/><!-- 리스트 종류 -->
 					<input type="hidden" id="addrGrpNm" name="addrGrpNm" value=""/><!-- 주소록 그룹 이름 -->
-					<input type="hidden" id="mberId" name="mberId" value="${LoginVO.id}"/><!-- 주소록 그룹 이름 -->
+					<input type="hidden" id="mberId" name="mberId" value="${LoginVO.id}"/>
+					<input type="hidden" id="searchCondition01" name="searchCondition01" value="${searchVO.searchCondition01}"/>
+					<input type="hidden" id="searchCondition02" name="searchCondition02" value="${searchVO.searchCondition02}"/>
 				
 				
 					<div class="rev_content" id="tab5_1">
-						<!-- 페이지 로딩 속도를 위해서 ajax 로딩처리 -->
-						<div class="rev_admin" id ="revAdmin">
+					
+						<!-- 발송결과 개선 : 문구추가 -->
+						<div class="titBox_result">
+							<p>- 최대 3개월간의 발송내역만 확인하실 수 있습니다.</p>
+							<p>- 전송내역이 필요한 경우 기간 내에 다운로드하여 주시기 바랍니다.</p>
+							<p>- 단문문자는 최대 24시간, 장문 및 그림문자는 최대 72시간까지 결과값이 수신되지 않은 경우 실패(비과금) 처리됩니다.</p>
 						</div>
+						<!--// 발송결과 개선 : 문구추가 -->
 						
 						<div class="excel_middle">
 							<div class="select_btnWrap clearfix">
 								<div class="btn_left">
 									<span class="cal_label">기간선택</span>
 									<div class="calendar_wrap">
-										<input type="text" class="startDate inp calendar" title="검색 시작일" id="startDate" name="startDate" value="<c:out value='${mjonMsgSentVO.startDate}'/>" data-datecontrol="true">
+										<input type="text" class="searchStartDate inp calendar" title="검색 시작일" id="searchStartDate" name="searchStartDate" value="<c:out value='${mjonMsgSentVO.searchStartDate}'/>" data-datecontrol="true">
 										<span class="dateEtc">~</span>
-										<input type="text" class="endDate inp calendar" title="검색 종료일" id="endDate" name="endDate" value="<c:out value='${mjonMsgSentVO.endDate}'/>" data-datecontrol="true">
+										<input type="text" class="searchEndDate inp calendar" title="검색 종료일" id="searchEndDate" name="searchEndDate" value="<c:out value='${mjonMsgSentVO.searchEndDate}'/>" data-datecontrol="true">
 									</div>
-									<!-- <button type="button">전월</button>
-									<button type="button">당월</button> -->
-									<button type="button" onclick="setCalVal(lastfulstday,'startDate');setCalVal( lastfuledday,'endDate'); return false;"  class="btnType btnType19">전월</button>
-									<button type="button" onclick="setCalVal(thisfulstlday,'startDate');setCalVal( thisfuledtlday,'endDate'); return false;"  class="btnType btnType19">당월</button>
-									<!-- <button type="button">3개월</button> -->
-									<button type="button" onclick="fn_G_getPrevMonth('startDate', 3);fn_G_getCurrDate('endDate'); return false;"  class="btnType btnType19">3개월</button>
+									<button type="button" onclick="setCalVal(lastfulstday,'searchStartDate');setCalVal( lastfuledday,'searchEndDate'); return false;"  class="btnType btnType19">전월</button>
+									<button type="button" onclick="setCalVal(thisfulstlday,'searchStartDate');setCalVal( thisfuledtlday,'searchEndDate'); return false;"  class="btnType btnType19">당월</button>
+									<button type="button" onclick="fn_G_getPrevMonth('searchStartDate', 3);fn_G_getCurrDate('searchEndDate'); return false;"  class="btnType btnType19">3개월</button>
 									<button type="button" class="btnType6" onClick="javascript:fnSearch(1); return false;">조회</button>
 								</div>
 								<div class="btn_right">
-									<%-- <label for="searchMsgType" class="label">문자형태 선택 == ${mjonMsgSentVO.searchMsgType}</label>
-									<select name="searchMsgType" id="searchMsgType" class="selType2">
-										<option value="">전체</option>
-										<option value="S" <c:if test="${mjonMsgSentVO.searchMsgType == 'S'}">selected</c:if> >단문</option>
-										<option value="L" <c:if test="${mjonMsgSentVO.searchMsgType == 'L'}">selected</c:if> >장문</option>
-										<option value="M" <c:if test="${mjonMsgSentVO.searchMsgType == 'M'}">selected</c:if> >그림</option>
-									</select> --%>
-									
-									<c:if test="${appMgmt }">
-									<label for="searchCondition_01" class="label">발신방식 == ${mjonMsgSentVO.searchCondition}</label>
-										<select name="searchCondition_01" id="searchCondition_01" class="selType2 select_all_btn">
-											<option value="" <c:if test="${empty mjonMsgSentVO.searchCondition_01 }">selected</c:if> >발송방식 전체</option>
-											<option value="H" <c:if test="${mjonMsgSentVO.searchCondition_01 == 'H'}">selected</c:if> >WEB</option>
-											<option value="A" <c:if test="${mjonMsgSentVO.searchCondition_01 == 'A'}">selected</c:if> >API</option>
-										</select>
-									</c:if>
-									<label for="searchCondition" class="label">발신번호 선택 == ${mjonMsgSentVO.searchCondition}</label>
+									<label for="searchCondition" class="label">검색 조건: ${mjonMsgSentVO.searchCondition == '2' ? '발신번호' : '문자내용'}</label>
 									<select name="searchCondition" id="searchCondition" class="selType2 select_btn">
 										<option value="2" <c:if test="${mjonMsgSentVO.searchCondition == '2'}">selected</c:if> >발신번호</option>
-										<option value="3" <c:if test="${mjonMsgSentVO.searchCondition == '3'}">selected</c:if> >수신번호</option>
+										<option value="3" <c:if test="${mjonMsgSentVO.searchCondition == '3'}">selected</c:if> >문자내용</option>
 									</select>
 									<div class="search">
 										<label for="id" class="label"></label>
@@ -954,32 +901,72 @@
 								</div>
 							</div>
 						</div>
+						<!-- 페이지 로딩 속도를 위해서 ajax 로딩처리 -->
+						<div class="rev_admin" id ="revAdmin">
+						</div>
 						<div class="list_tab_wrap2 type4">
 							<!-- tab button -->
 							<ul class="list_tab">
-								<li class="tab active"><button type="button" onclick="fnTabLoad('',0); return false;">전체</button></li>
-								<li class="tab"><button type="button" onclick="fnTabLoad('S',1); return false;">단문(SMS)</button></li>
-								<li class="tab"><button type="button" onclick="fnTabLoad('L',2); return false;">장문(LMS)</button></li>
-								<li class="tab"><button type="button" onclick="fnTabLoad('M',3); return false;">그림(MMS)</button></li>
+								<li class="tab active"><button type="button" onclick="fnTabLoad(''); return false;">전체</button></li>
+								<li class="tab"><button type="button" onclick="fnTabLoad('S'); return false;">단문(SMS)</button></li>
+								<li class="tab"><button type="button" onclick="fnTabLoad('L'); return false;">장문(LMS)</button></li>
+								<li class="tab"><button type="button" onclick="fnTabLoad('M'); return false;">그림(MMS)</button></li>
 							</ul><!--// tab button -->
 						</div>
 						<!-- 예약관리 > 전체 -->
-						<div class="price_history_cont current" id="listTab_2">
+						<div class="price_history_cont current price_wrap" id="listTab_2">
 							<!-- tab button -->
 							<div class="table_tab_wrap">
-								<ul>
+								<!--<ul>
 									<li class="tab active">
 									<button type="button" onclick="fnListLoad('all','0'); return false;">전체</button></li> 
 									<li class="tab"><button type="button" onclick="fnListLoad('ready','1'); return false;">결과대기</button></li>
 									<li class="tab"><button type="button" onclick="fnListLoad('complete','2'); return false;">정상수신</button></li>
 									<li class="tab"><button type="button" onclick="fnListLoad('fail','3'); return false;">수신오류</button></li>
-								</ul><!--// tab button -->
-								<div class="tab_depth1">
+								</ul>// tab button -->
+								
+								
+								<!-- tab button -->
+								<ul>
+										<li class="tab ${empty searchVO.searchCondition_01 ? 'active' : ''}">
+											<button type="button" class="sendKindBtn" data-info="">전체</button>
+										</li>
+										<li class="tab ${searchVO.searchCondition_01 == '0' ? 'active' : ''}">
+											<button type="button" class="sendKindBtn" data-info="N">즉시</button>
+										</li>
+										<li class="tab ${searchVO.searchCondition_01 == '1' ? 'active' : ''}">
+											<button type="button" class="sendKindBtn" data-info="Y">예약</button>
+										</li>
+								</ul>
+								<!--// tab button -->
+								
+								
+								<!-- <div class="tab_depth1">
 									<a href="#none" class="on msgGgoupList">받는사람(전송건별)</a>
 									<a href="#none" style="display: none;"></a>
 									<a href="#none" class="msgPrivateList">받는사람(개인별)</a>
 									<div class="on_active">받는사람(전송건별)</div>
+								</div> -->
+								
+								<!-- 발송화면 개선 : 발송결과 추가-->
+								<div class="tab_btnbox">
+									<button type="button" class="btnType btnType14 check_validity">발송결과<i class="qmMark"></i></button>
+									<div class="info_hover_cont send_hover_cont price_hover">
+										<dl>
+											<dt class="c_222">[<span>대기</span>]</dt>
+											<dd>
+												발송은 성공하였으며, 수신자측 통신사로부터 수신여부를 확인중인 상태 <br>
+												<span>※ 예약문자의 경우 실발송 전까지는 “대기”로 표시</span>
+											</dd>
+											<dt class="c_002c9a">[<span>성공</span>]</dt>
+											<dd>발송 및 수신이 완료된 상태</dd>
+											<dt class="c_e40000">[<span>실패</span>]</dt>
+											<dd class="last">결번, 일시정지, 전화번호 오류 등의 사유로 발송이
+												불가한 상태</dd>
+										</dl>
+									</div>
 								</div>
+								<!--// 발송화면 개선 : 발송결과 추가-->
 							</div>
 							<!-- 발송관리 리스트 -->
 							<div class="table_cont current msgSentAllLoad" id="tableCont_1">
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
@@ -25,14 +25,14 @@
 
 </script>
 
-<div class="rev_admin_in">
+							<div class="rev_admin_in">
 								<div class="rev_admin_top clearfix">
 									<p>전체</p>
-									<c:set var="allTotal" value="${H_allSentCntVO.totCnt + A_allSentCntVO.totCnt }" />
+									<c:set var="allTotal" value="${H_allSentCntVO.totCnt}" />
 									<p><span><fmt:formatNumber value="${allTotal }" pattern="#,###"/></span> 건</p>
 								</div>
-								<div class="rev_admin_btm admin_btm">
-									<P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_allSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P>
+								<div class="rev_admin_btm">
+<%-- 									<P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_allSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P> --%>
 									<dl>
 										<dt>대기</dt>
 										<dd><span class="c_002c9a"><fmt:formatNumber value="${H_allSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
@@ -46,32 +46,15 @@
 										<dd><span class="c_e40000"><fmt:formatNumber value="${H_allSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
 									</dl>
 								</div>
-								<c:if test="${appMgmt }">
-									<div class="rev_admin_btm admin_btm admin_btm_api">
-										<P class="title_top">API<span class="title_num"><fmt:formatNumber value="${A_allSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P>
-										<dl>
-											<dt>대기</dt>
-											<dd><span class="c_002c9a"><fmt:formatNumber value="${A_allSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
-										</dl>
-										<dl>
-											<dt>성공</dt>
-											<dd><span class="c_002c9a"><fmt:formatNumber value="${A_allSentCntVO.succCnt}" pattern="#,###"/></span>건</dd>
-										</dl>
-										<dl>
-											<dt>실패</dt>
-											<dd><span class="c_e40000"><fmt:formatNumber value="${A_allSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
-										</dl>
-									</div>	
-								</c:if>
 							</div>
 							<div class="rev_admin_in">
 								<div class="rev_admin_top clearfix">
 									<p>단문(SMS)</p>
-									<c:set var="smsTotal" value="${H_smsSentCntVO.totCnt + A_smsSentCntVO.totCnt }" />
+									<c:set var="smsTotal" value="${H_smsSentCntVO.totCnt }" />
 									<p><span><fmt:formatNumber value="${smsTotal }" pattern="#,###"/></span> 건</p>
 								</div>
-								<div class="rev_admin_btm admin_btm">
-									<P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_smsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P>
+								<div class="rev_admin_btm">
+<%-- 									<P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_smsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P> --%>
 									<dl>
 										<dt>대기</dt>
 										<dd><span class="c_002c9a"><fmt:formatNumber value="${H_smsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
@@ -85,32 +68,15 @@
 										<dd><span class="c_e40000"><fmt:formatNumber value="${H_smsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
 									</dl>
 								</div>
-								<c:if test="${appMgmt }">
-									<div class="rev_admin_btm admin_btm admin_btm_api">
-										<P class="title_top">API<span class="title_num"><fmt:formatNumber value="${A_smsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P>
-										<dl>
-											<dt>대기</dt>
-											<dd><span class="c_002c9a"><fmt:formatNumber value="${A_smsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
-										</dl>
-										<dl>
-											<dt>성공</dt>
-											<dd><span class="c_002c9a"><fmt:formatNumber value="${A_smsSentCntVO.succCnt}" pattern="#,###"/></span>건</dd>
-										</dl>
-										<dl>
-											<dt>실패</dt>
-											<dd><span class="c_e40000"><fmt:formatNumber value="${A_smsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
-										</dl>
-									</div>	
-								</c:if>
 							</div>
 							<div class="rev_admin_in">
 								<div class="rev_admin_top clearfix">
 									<p>장문(LMS)</p>
-									<c:set var="lmsTotal" value="${H_lmsSentCntVO.totCnt + A_lmsSentCntVO.totCnt }" />
+									<c:set var="lmsTotal" value="${H_lmsSentCntVO.totCnt }" />
 									<p><span><fmt:formatNumber value="${lmsTotal }" pattern="#,###"/></span> 건</p>
 								</div>
-								<div class="rev_admin_btm admin_btm">
-									<P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_lmsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P>
+								<div class="rev_admin_btm">
+<%-- 									<P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_lmsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P> --%>
 									<dl>
 										<dt>대기</dt>
 										<dd><span class="c_002c9a"><fmt:formatNumber value="${H_lmsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
@@ -124,32 +90,15 @@
 										<dd><span class="c_e40000"><fmt:formatNumber value="${H_lmsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
 									</dl>
 								</div>
-								<c:if test="${appMgmt }">
-									<div class="rev_admin_btm admin_btm admin_btm_api">
-										<P class="title_top">API<span class="title_num"><fmt:formatNumber value="${A_lmsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P>
-										<dl>
-											<dt>대기</dt>
-											<dd><span class="c_002c9a"><fmt:formatNumber value="${A_lmsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
-										</dl>
-										<dl>
-											<dt>성공</dt>
-											<dd><span class="c_002c9a"><fmt:formatNumber value="${A_lmsSentCntVO.succCnt}" pattern="#,###"/></span>건</dd>
-										</dl>
-										<dl>
-											<dt>실패</dt>
-											<dd><span class="c_e40000"><fmt:formatNumber value="${A_lmsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
-										</dl>
-									</div>	
-								</c:if>
 							</div>
 							<div class="rev_admin_in">
 								<div class="rev_admin_top clearfix">
 									<p>그림(MMS)</p>
-									<c:set var="mmsTotal" value="${H_mmsSentCntVO.totCnt + A_mmsSentCntVO.totCnt }" />
+									<c:set var="mmsTotal" value="${H_mmsSentCntVO.totCnt }" />
 									<p><span><fmt:formatNumber value="${mmsTotal }" pattern="#,###"/></span> 건</p>
 								</div>
-								<div class="rev_admin_btm admin_btm">
-									<P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_mmsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P>
+								<div class="rev_admin_btm">
+<%-- 									<P class="title_top">WEB<span class="title_num"><fmt:formatNumber value="${H_mmsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P> --%>
 									<dl>
 										<dt>대기</dt>
 										<dd><span class="c_002c9a"><fmt:formatNumber value="${H_mmsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
@@ -163,21 +112,4 @@
 										<dd><span class="c_e40000"><fmt:formatNumber value="${H_mmsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
 									</dl>
 								</div>
-								<c:if test="${appMgmt }">
-									<div class="rev_admin_btm admin_btm admin_btm_api">
-										<P class="title_top">API<span class="title_num"><fmt:formatNumber value="${A_mmsSentCntVO.totCnt}" pattern="#,###"/><span>건</span></span></P>
-										<dl>
-											<dt>대기</dt>
-											<dd><span class="c_002c9a"><fmt:formatNumber value="${A_mmsSentCntVO.waitCnt}" pattern="#,###"/></span>건</dd>
-										</dl>
-										<dl>
-											<dt>성공</dt>
-											<dd><span class="c_002c9a"><fmt:formatNumber value="${A_mmsSentCntVO.succCnt}" pattern="#,###"/></span>건</dd>
-										</dl>
-										<dl>
-											<dt>실패</dt>
-											<dd><span class="c_e40000"><fmt:formatNumber value="${A_mmsSentCntVO.failCnt}" pattern="#,###"/></span>건</dd>
-										</dl>
-									</div>	
-								</c:if>
 							</div>
(No newline at end of file)
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
@@ -4,6 +4,8 @@
 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
 <%@ taglib prefix="ec" uri="/WEB-INF/tld/ecnet_tld.tld"%>
 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
+<%@ taglib prefix="fnc" uri="/WEB-INF/tld/functions.tld"%>
+
 
 <script src="https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
 <script language=javascript>
@@ -845,8 +847,9 @@
 												</td>
 												<td>
 													<c:choose>
-														<c:when test="${not empty resultSentMsg.regdate}">
-															<fmt:formatDate value="${resultSentMsg.regdate}" pattern="yyyy-MM-dd HH:mm:ss"/>
+														<c:when test="${not empty resultSentMsg.regDate}">
+<%-- 															<fmt:formatDate value="${resultSentMsg.regDate}" pattern="yyyy-MM-dd HH:mm:ss"/> --%>
+															${fnc:setStrToDataFormatter(resultSentMsg.regDate, 'yyyy-MM-dd HH:mm:ss') }
 														</c:when>
 														<c:otherwise>
 															-
 
src/main/webapp/WEB-INF/tld/functions.tld (added)
+++ src/main/webapp/WEB-INF/tld/functions.tld
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
+	version="2.1">
+
+    <display-name>Custom Functions</display-name>
+	<tlib-version>1.0</tlib-version>
+	<short-name>custom-funcs</short-name>
+
+	<!-- PhoneFormatUtil 클래스의 함수 -->
+	<function>
+		<name>formatPhone</name> <!-- JSP에서 호출할 함수명 -->
+		<function-class>itn.com.cmm.util.StringUtil2</function-class> <!-- 해당 함수를 포함하는 Java 클래스 -->
+		<function-signature>java.lang.String formatPhone(java.lang.String)</function-signature> <!-- 함수의 반환 타입 및 매개변수 타입 (메서드 시그니처) -->
+	</function>
+	
+	<function>
+		<name>setStrToDataFormatter</name>
+		<function-class>itn.com.cmm.util.DateUtils</function-class>
+		<function-signature>java.lang.String setStrToDataFormatter(java.lang.String, java.lang.String)</function-signature>
+	</function> 
+	
+	<!-- 예시) function 추가 - StringUtil 클래스의 함수 -->
+	<!-- 
+	<function>
+		<name>toUpper</name>
+		<function-class>com.example.utils.StringUtil</function-class>
+		<function-signature>java.lang.String toUpperCase(java.lang.String)</function-signature>
+	</function> 
+	-->
+
+</taglib>
src/main/webapp/js/web/msgdata/msgDataView.js
--- src/main/webapp/js/web/msgdata/msgDataView.js
+++ src/main/webapp/js/web/msgdata/msgDataView.js
@@ -13,6 +13,7 @@
 
 // 문자 그룹정보 => 재전송용
 function getMjMsgGroupInfoByResend() {
+	console.log('재전송 시 싱행되는 function');
 	$.ajax({
 		type: "POST",
 		url: "/web/mjon/msgdata/selectMjMsgGroupInfoByResendAjax.do",
@@ -33,6 +34,7 @@
 				
 				var smsTxt = msgData.smsTxt;
 				var subject = msgData.subject;
+				var subjectChkYn = msgData.subjectChkYn;
 				var fileId = "";
 				var filePath = "";
 				var len = fileData.length;
@@ -56,11 +58,13 @@
 				console.log('msgData : ', msgData);
 				console.log('msgData : ', msgData);
 				// 문자제목
-				if (msgData.subject != null && msgData.subject != "") {
-					$('.msg_title').addClass('active');
-					$("input:radio[name='title_status']:radio[value='Y']").prop('checked', true); // 선택하기
-					$('.textbox').show();
-					$("#mmsSubject").val(subject);	
+				if (subject != null && subject != "") {
+					if(subjectChkYn == 'Y'){
+						$('.msg_title').addClass('active');
+						$("input:radio[name='subjectChkYn']:radio[value='Y']").prop('checked', true); // 선택하기
+						$('.textbox').show();
+						$("#mmsSubject").val(subject);	
+					}
 				}
 				
 				// 문자내용
@@ -1255,7 +1259,7 @@
 	 });
 	
 	 // 빈 값 제거
-	 removeEmptyValues(formData);
+	removeEmptyValues(formData);
 
 	// 선택된 데이터 추가
 	formData["mjonMsgSendVOList"] = $selectedData;
@@ -1280,10 +1284,8 @@
 		dataType: 'json',
 		success: function (data) {
 			
-			console.log('data : ', data);
-			
 			var status = data.status;
-			if("OK" == status){
+			if("OK" == status){ // 성공
 				
 				var smsCnt = Number(data.object.resultSts);
 				var blockCnt = Number(data.object.resultBlockSts);
@@ -1309,19 +1311,19 @@
 				}
 				
 				
-			}else if("BAD_REQUEST" == status){
+			}else if("BAD_REQUEST" == status){ // 오류
 
 				alert(data.message);
 				return false;
 					
-			}else if("UNAUTHORIZED" == status){
+			}else if("UNAUTHORIZED" == status){ // 정지 회원 처리
 				
 				alert(data.message);
 				//문자발송 URL Move
 				goMsgUrlMove();
 				return false;
 				
-			}else if("NO_CONTENT" == status){
+			}else if("NO_CONTENT" == status){ // 발송로직에서 이미지 처리 오류 시 처리
 				
 				$('.pop_msg_fails').css({'display':'block','opacity':'1','left':'50%','top':'50%','transform':'translate(-50%,-50%)'});
 				$('.pop_msg_fails .msg_text').html(returnData.message);
@@ -1363,7 +1365,7 @@
 		
 	}
 
-	if (form.title_status.value === 'N') {
+	if (form.subjectChkYn.value === 'N') {
 		form.mmsSubject.value = "";
 	} else if (getSpacialStringChk(form.mmsSubject.value)) {
 		alert("문자 제목에는 치환문자(엑셀 내 *이름*, *1*, *2*, *3*, *4* 등)를 사용하실 수 없습니다.");
@@ -1371,7 +1373,7 @@
 	}
 
 	//문자제목에 이모지가 있는지 체크
-	var titleStatusYn = $("input[name='title_status']:checked").val();
+	var titleStatusYn = $("input[name='subjectChkYn']:checked").val();
 	if(titleStatusYn == 'Y') {
 		if(!emojiCheck(form.mmsSubject.value)) return false;
 	}
@@ -1710,15 +1712,15 @@
 
 function msgResultLink(){
 	var reserYn = $("input[name=reserYn]:checked").val(); // 예약 발송 여부 확인
-	if(reserYn == 'Y'){
+	/*if(reserYn == 'Y'){
 		
 		location.href="/web/mjon/reservmsg/selectReservMsgView.do";
 		
-	}else{
+	}else{*/
 		
 		location.href="/web/mjon/msgsent/selectMsgSentView.do";
 		
-	}
+	/*}*/
 	
 }
 
Add a comment
List