이호영 이호영 2024-10-11
발송 진행중
@8dd8e23af1c3dbc17be9d83da50124b500f01262
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
@@ -1,13 +1,19 @@
 package itn.com.cmm.util;
 
 import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Objects;
+import java.util.stream.Stream;
 
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 
 import itn.let.mail.service.StatusResponse;
 import itn.let.mjo.msg.service.MjonMsgVO;
 import itn.let.mjo.msgdata.service.ReplacementListsVO;
+import itn.let.module.base.PriceAndPoint;
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -24,7 +30,6 @@
  * 
  * 
  */
-@Slf4j
 public final class MsgSendUtils {
 
 	
@@ -103,51 +108,29 @@
 	* @return 
 	*/
 	public static float determinePriceByMsgType(MjonMsgVO mjonMsgVO, float shortPrice, float longPrice, 
-	                                      float picturePrice, float picture2Price, float picture3Price) {
-	    float price = 0;
-	    String msgType = mjonMsgVO.getMsgType();
-
-	    if ("4".equals(msgType)) {
-	        price = shortPrice;
-	    } else if ("6".equals(msgType)) {
-	        // 파일 첨부 여부에 따라 장문 단가 설정
-	        if (mjonMsgVO.getFileName3() != null) {
-	            price = picture3Price;
-	        } else if (mjonMsgVO.getFileName2() != null) {
-	            price = picture2Price;
-	        } else if (mjonMsgVO.getFileName1() != null) {
-	            price = picturePrice;
-	        } else {
-	            price = longPrice;
-	        }
-	    }
-	    return price;
+									float picturePrice, float picture2Price, float picture3Price) {
+		float price = 0;
+		String msgType = mjonMsgVO.getMsgType();
+	
+		if ("4".equals(msgType)) {
+			price = shortPrice;
+		} else if ("6".equals(msgType)) {
+			// 파일 첨부 여부에 따라 장문 단가 설정
+			if (mjonMsgVO.getFileName3() != null) {
+				price = picture3Price;
+			} else if (mjonMsgVO.getFileName2() != null) {
+				price = picture2Price;
+			} else if (mjonMsgVO.getFileName1() != null) {
+				price = picturePrice;
+			} else {
+				price = longPrice;
+			}
+		}
+		return price;
 	}
 
 	public static boolean isReplacementRequired(MjonMsgVO mjonMsgVO) {
-	    return "Y".equals(mjonMsgVO.getTxtReplYn());
-	}
-
-	public static boolean isReplacementDataValid(MjonMsgVO mjonMsgVO) {
-		String[] nameList = mjonMsgVO.getNameList();
-		String[] rep1 = mjonMsgVO.getRep1List();
-		String[] rep2 = mjonMsgVO.getRep2List();
-		String[] rep3 = mjonMsgVO.getRep3List();
-		String[] rep4 = mjonMsgVO.getRep4List();
-
-
-		
-		// 치환 문자 리스트가 유효한지 확인
-		return !(isEmpty(nameList) 
-				&& isEmpty(rep1) 
-				&& isEmpty(rep2) 
-				&& isEmpty(rep3) 
-				&& isEmpty(rep4));
-	}
-
-	// 배열이 비어있는지 확인하는 메서드
-	public static boolean isEmpty(String[] array) {
-		return array == null || array.length == 0;
+		return "Y".equals(mjonMsgVO.getTxtReplYn());
 	}
 
 	public static ReplacementListsVO createReplacementLists(MjonMsgVO mjonMsgVO) throws UnsupportedEncodingException {
@@ -168,98 +151,89 @@
 	 * @return
 	 * @throws UnsupportedEncodingException 
 	 */
-	public static void populateReplacementLists(MjonMsgVO mjonMsgVO, ReplacementListsVO lists, StatusResponse statusResponse){
+	public static Boolean populateReplacementLists(MjonMsgVO mjonMsgVO, ReplacementListsVO lists, StatusResponse statusResponse){
 		
 		
-	    String[] nameList = mjonMsgVO.getNameList();
-	    String[] phone = mjonMsgVO.getCallToList();
-	    String[] rep1 = mjonMsgVO.getRep1List();
-	    String[] rep2 = mjonMsgVO.getRep2List();
-	    String[] rep3 = mjonMsgVO.getRep3List();
-	    String[] rep4 = mjonMsgVO.getRep4List();
-	    String smsTxt = mjonMsgVO.getSmsTxt();
-	    int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt());
-
-        // 이름 치환
+		String[] nameList = mjonMsgVO.getNameList();
+		String[] phone = mjonMsgVO.getCallToList();
+		String[] rep1 = mjonMsgVO.getRep1List();
+		String[] rep2 = mjonMsgVO.getRep2List();
+		String[] rep3 = mjonMsgVO.getRep3List();
+		String[] rep4 = mjonMsgVO.getRep4List();
+		String smsTxt = mjonMsgVO.getSmsTxt();
+		int fileCount = Integer.parseInt(mjonMsgVO.getFileCnt());
+		
+		// 이름 치환
 		int shortCnt = 0;
 		int longCnt = 0;
 		int imgCnt = 0;
-	    for (int i = 0; i < phone.length; i++) {
-	    	
-	        smsTxt = smsTxt.replaceAll(String.valueOf((char) 13), "");
-	        if (smsTxt.contains("[*이름*]")) {
-	            if (nameList.length > i && StringUtil.isNotEmpty(nameList[i])) {
-	                smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", StringUtil.getString(nameList[i].replaceAll("§", ",")));
-	            } else {
-	                smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", "");
-	            }
-	        }
+		
+		
+		for (int i = 0; i < phone.length; i++) {
+			
+			smsTxt = smsTxt.replaceAll(String.valueOf((char) 13), "");
+			
 
-	        // 문자 1 치환
-	        if (smsTxt.contains("[*1*]")) {
-	            if (rep1.length > i && StringUtil.isNotEmpty(rep1[i])) {
-	                smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", StringUtil.getString(rep1[i].replaceAll("§", ",")));
-	            } else {
-	                smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", "");
-	            }
-	        }
-
-	        // 문자 2 치환
-	        if (smsTxt.contains("[*2*]")) {
-	            if (rep2.length > i && StringUtil.isNotEmpty(rep2[i])) {
-	                smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", StringUtil.getString(rep2[i].replaceAll("§", ",")));
-	            } else {
-	                smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", "");
-	            }
-	        }
-
-	        // 문자 3 치환
-	        if (smsTxt.contains("[*3*]")) {
-	            if (rep3.length > i && StringUtil.isNotEmpty(rep3[i])) {
-	                smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", StringUtil.getString(rep3[i].replaceAll("§", ",")));
-	            } else {
-	                smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", "");
-	            }
-	        } 
-
-	        // 문자 4 치환
-	        if (smsTxt.contains("[*4*]")) {
-	            if (rep4.length > i && StringUtil.isNotEmpty(rep4[i])) {
-	                smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", StringUtil.getString(rep4[i].replaceAll("§", ",")));
-	            } else {
-	                smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", "");
-	            }
-	        }
+			// 이름 및 치환 문자 처리
+			smsTxt = replacePlaceholder(smsTxt, "[*이름*]", nameList, i);
+			smsTxt = replacePlaceholder(smsTxt, "[*1*]", rep1, i);
+			smsTxt = replacePlaceholder(smsTxt, "[*2*]", rep2, i);
+			smsTxt = replacePlaceholder(smsTxt, "[*3*]", rep3, i);
+			smsTxt = replacePlaceholder(smsTxt, "[*4*]", rep4, i);
+			
 
 			try {
 				int bytes = getSmsTxtBytes(smsTxt);
-	        
 				if(bytes < 2000) {
 					if(fileCount > 0) {
-					    populateImgLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i);
-					    imgCnt++;
-					    
+						populateImgLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i);
+						imgCnt++;
+						
 					}else if(bytes > 90) {//장문문자 리스트 만들기
-					    populateLongLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i);
-					    longCnt++;
-	    			} else {//단문문자 리스트 만들기
-	    			    populateShortLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i);
-	    			    shortCnt++;
-	    			}
+						populateLongLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i);
+						longCnt++;
+					} else {//단문문자 리스트 만들기
+						populateShortLists(lists, nameList, phone, rep1, rep2, rep3, rep4, smsTxt, i);
+						shortCnt++;
+					}
 				}else {
 					statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다.");
+					return false;
 				}
 				
 			} catch (UnsupportedEncodingException e) {
-				statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 중 오류가 발생하였습니다.");
+				statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "문자 치환 중 오류가 발생하였습니다.");
 				e.printStackTrace();
+				return false;
 			}
-	    }
-	    
+		}
+		
 		lists.setShortCnt(shortCnt);
 		lists.setLongCnt(longCnt);
 		lists.setImgCnt(imgCnt);
+		
+		return true;
 
+	}
+	
+	/**
+	 * 특정 플레이스홀더를 리스트에서 가져온 값으로 치환합니다.
+	 * 
+	 * @param smsTxt		문자 내용
+	 * @param placeholder	치환할 플레이스홀더 (예: [*이름*])
+	 * @param list			치환할 데이터 리스트
+	 * @param index			현재 인덱스
+	 * @return 치환된 문자 내용
+	 */
+	private static String replacePlaceholder(String smsTxt, String placeholder, String[] list, int index) {
+		if (smsTxt.contains(placeholder)) {
+			if (list.length > index && StringUtil.isNotEmpty(list[index])) {
+				smsTxt = smsTxt.replaceAll(placeholder, StringUtil.getString(list[index].replaceAll("§", ",")));
+			} else {
+				smsTxt = smsTxt.replaceAll(placeholder, "");
+			}
+		}
+		return smsTxt;
 	}
 
 	private static void populateShortLists(ReplacementListsVO lists, String[] nameList, String[] phone, String[] rep1,
@@ -410,17 +384,38 @@
 	    }
 	}
 	
+	
+
+	private static void statusResponseSet (StatusResponse statusResponse, HttpStatus httpStatus, String msg ) {
+		statusResponse.setStatus(httpStatus);
+		statusResponse.setMessage(msg);
+		
+	}
+
+	public static StatusResponse validateFilesForMessageSending(int fileCount, MjonMsgVO mjonMsgVO) {
+		if (fileCount > 0) {
+			boolean allFilesAreNull = Stream
+					.of(mjonMsgVO.getFileName1(), mjonMsgVO.getFileName2(), mjonMsgVO.getFileName3())
+					.allMatch(Objects::isNull);
+
+			if (allFilesAreNull) {
+				return new StatusResponse(HttpStatus.NO_CONTENT, "문자 메세지 이미지 추가에 오류가 발생하여 문자 발송이 취소 되었습니다.");
+			}
+		}
+		return null; // 유효성 검사를 통과한 경우
+	}
+
 
 	/** 
-	 * @methodName	: checkReplacementDataValidity 
+	 * @methodName	: validateReplacementData 
 	 * @author		: 이호영
 	 * @date		: 2024.09.25
 	 * @description	: 치환문자가 사용될 때 데이터가 올바른지 확인하는 메서드
 	 * @param mjonMsgVO
-	 * @param modelAndView
+	 * @param statusResponse
 	 * @return boolean
 	 */
-	public static boolean checkReplacementDataValidity(MjonMsgVO mjonMsgVO, StatusResponse statusResponse) {
+	public static boolean validateReplacementData(MjonMsgVO mjonMsgVO, StatusResponse statusResponse) {
 		String[] nameList = mjonMsgVO.getNameList();
 		String[] phone = mjonMsgVO.getCallToList();
 		String[] rep1 = mjonMsgVO.getRep1List();
@@ -428,9 +423,19 @@
 		String[] rep3 = mjonMsgVO.getRep3List();
 		String[] rep4 = mjonMsgVO.getRep4List();
 
+		// 치환 문자 리스트가 모두 비어있는지 확인
+		if (isEmpty(nameList) 
+			&& isEmpty(rep1) 
+			&& isEmpty(rep2) 
+			&& isEmpty(rep3) 
+			&& isEmpty(rep4)) {
+			statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "특정문구 일괄변환 치환문자 데이터가 없습니다.");
+			return false;
+		}
+
+		// 치환 문자 필드 개수와 전화번호 개수가 일치하는지 확인
 		boolean isRepCountOk = true;
 
-		// 치환 문자 전체 필수 체크
 		if (mjonMsgVO.getSmsTxt().contains("[*이름*]") && nameList.length != phone.length) {
 			isRepCountOk = false;
 		}
@@ -447,21 +452,18 @@
 			isRepCountOk = false;
 		}
 
-		// 검증 결과가 false인 경우 에러 메시지 반환
+		// 필드 개수가 일치하지 않는 경우 에러 메시지 반환
 		if (!isRepCountOk) {
-
-			statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "특정문구 일괄변환 치환문자 데이터가 없습니다.");
+			statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "특정문구 일괄변환 치환문자 데이터가 일치하지 않습니다.");
 			return false;
 		}
 
-		return true;
+		return true; // 모든 유효성 검사를 통과한 경우
 	}
 	
-
-	private static void statusResponseSet (StatusResponse statusResponse, HttpStatus httpStatus, String msg ) {
-		statusResponse.setStatus(httpStatus);
-		statusResponse.setMessage(msg);
-		
+	// 배열이 비어있는지 확인하는 메서드
+	public static boolean isEmpty(String[] array) {
+		return array == null || array.length == 0;
 	}
 
 	
src/main/java/itn/let/mjo/msg/service/impl/MjonMsgServiceImpl.java
--- src/main/java/itn/let/mjo/msg/service/impl/MjonMsgServiceImpl.java
+++ src/main/java/itn/let/mjo/msg/service/impl/MjonMsgServiceImpl.java
@@ -1057,7 +1057,7 @@
 	public List<MjonMsgStatVO> selectAgentSmsCountStatList(MjonMsgStatVO mjonMsgStatVO) throws Exception {
 		
 		List<MjonMsgStatVO> list = mjonMsgDAO.selectAgentSmsCountStatList(mjonMsgStatVO);
-		
+		System.out.println("??????++++++++++++++++++++++++");
 		return list;
 	}
 
src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java
--- src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java
+++ src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java
@@ -184,6 +184,7 @@
 	public List<MjonMsgVO> selectPayUserSumFaxList(MjonMsgVO mjonMsgVO) throws Exception;
 
 	public StatusResponse sendMsgData_advc(MjonMsgVO mjonMsgVO, HttpServletRequest request) throws Exception;
+
 	
 	
 }
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
@@ -1,7 +1,9 @@
 package itn.let.mjo.msgdata.service.impl;
 
+import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -10,12 +12,12 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Stream;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.web.servlet.ModelAndView;
@@ -53,12 +55,12 @@
 import itn.let.mjo.pay.service.MjonPayVO;
 import itn.let.mjo.pay.service.impl.MjonPayDAO;
 import itn.let.mjo.spammsg.service.MjonSpamMsgService;
+import itn.let.module.base.PriceAndPoint;
 import itn.let.sym.site.service.JoinSettingVO;
 import itn.let.sym.site.service.impl.SiteManagerDAO;
 import itn.let.uat.uia.web.SendLogVO;
 import itn.let.uss.umt.service.EgovUserManageService;
 import itn.let.uss.umt.service.MberManageVO;
-import itn.let.uss.umt.service.UserManageVO;
 import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
@@ -122,804 +124,1548 @@
     private MjonSpamMsgService mjonSpamMsgService;
 
 
-    public List<MjonMsgDataVO> selectCcmCmmCodeList() throws Exception{
+    @Autowired
+    private PriceAndPoint priceAndPoint;
+	
 
-        return mjonMsgDataDAO.selectCcmCmmCodeList();
-    }
+	public List<MjonMsgDataVO> selectCcmCmmCodeList() throws Exception {
 
-    public MjonMsgReturnVO insertMsgDataInfo(MjonMsgVO mjonMsgVO) throws Exception{
+		return mjonMsgDataDAO.selectCcmCmmCodeList();
+	}
+	public MjonMsgReturnVO insertMsgDataInfo_advc(MjonMsgVO mjonMsgVO) throws Exception {
 
-        MjonMsgReturnVO returnVO = new MjonMsgReturnVO();
+		MjonMsgReturnVO returnVO = new MjonMsgReturnVO();
 
-        try {
+		try {
+			String msgType = mjonMsgVO.getMsgType();
+			String agentCode = mjonMsgVO.getAgentCode();
+			// 장문 전송
+			String contSeq = "";
 
-        // 문자 전송 그룹아이디 생성
-        //mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId());
+			// 최종 입력 수 저장 변수
+			int resultCnt = 0;
+			int limitCnt = 1000;
+			int blockCnt = 0;
 
-        // 문자 아이디 생성
-        //mjonMsgVO.setMsgId(idgenMsgId.getNextStringId());
 
-        String msgType = mjonMsgVO.getMsgType();
-        String agentCode = mjonMsgVO.getAgentCode();
-        // 장문 전송
-        String contSeq = "";
+			int callToCnt = mjonMsgVO.getCallToList().length; // 전체 받는사람 건수
 
-        //float myPrice = 10000;
-        //float totPrice = Float.parseFloat(mjonMsgVO.getTotPrice());
-        // 최종 입력 수 저장 변수
-        int resultCnt = 0;
-        int limitCnt = 1000;
-        int blockCnt = 0;
+			mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt));
+			
 
-        // 총 보유 금액과 전송 합계 비교
+			// 사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
+			String befCash = mjonMsgVO.getBefCash();
 
-        /*if(myPrice < totPrice) { // 보유 금액보다 전송 합계가 적은 경우 리턴
+			// 수신거부 목록 불러오기
+			List<String> userBlockList = mjonMsgDAO.selectUserBlockList(mjonMsgVO);
 
-            return 0 ;
-        }*/
+			List<String> dupliBlockList = MJUtil.getDuplicateList(userBlockList);
+			int usrBlockCnt = dupliBlockList.size();
+			
 
-        int callToCnt = mjonMsgVO.getCallToList().length;	//전체 받는사람 건수
+			// 회원 전용 전송사 정보 불러오기
+			MberManageVO userInfo = mjonMsgDataDAO.selectMberManageInfo(mjonMsgVO.getUserId());
+			String hotlineAgentCode = userInfo.getHotlineAgentCode();
+			
 
-        mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt));
+			// 전용 전송사가 있는 경우 처리
+			if (!"00".equals(hotlineAgentCode)) {
+				MjonMsgAgentStsVO mjonMsgAgentStsVO = new MjonMsgAgentStsVO();
+				mjonMsgAgentStsVO.setAgentCode(hotlineAgentCode);
 
+				if ("6".equals(msgType)) {
+					int fCnt = Integer.parseInt(mjonMsgVO.getFileCnt());
+					if (fCnt > 0) {
+						mjonMsgAgentStsVO.setMsgType("P");
+					} else {
+						mjonMsgAgentStsVO.setMsgType("L");
+					}
+				} else {
+					mjonMsgAgentStsVO.setMsgType("S");
+				}
 
-        //그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리
-        /*if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력
+				List<MjonMsgAgentStsVO> hotlineMsgAgentList = mjonMsgAgentStsDAO.selectMsgAgentListByAgentCode(mjonMsgAgentStsVO);
+				String mberAgentConde = "";
+				String mberSendRate = "";
+				String mberRepAgent = "";
 
-            Date now = new Date();
+				for (MjonMsgAgentStsVO tmp : hotlineMsgAgentList) {
+					mberAgentConde = tmp.getAgentCode();
+					mberSendRate = tmp.getSendRate();
+					mberRepAgent = tmp.getRepAgent();
+					String useYn = tmp.getUseYn();
 
-            SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+					if ("N".equals(userInfo.getBlineCode())) {
+						// 회원 전용 전송사의 전송 비율이 0 이면 대표전송사로 전송되도록 셋팅함.
+						if ("0".equals(mberSendRate) || "N".equals(useYn)) {
+							hotlineAgentCode = mberRepAgent;
+						}
+					}
+				}
+			}
 
-            mjonMsgVO.setReqDate(sdFormat.format(now));
+			/**
+			 * Agent 추가시 셋팅하기 Agent 발송 비율 불러오기 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) 22.10.12
+			 * : 비즈뿌리오(04) 추가 23.04.10 : 제이제이(05) 추가 23.05.02 : 인비토 (07) 추가
+			 */
 
-        }*/
+			int iheartCnt = 0; // 아이하트 전송갯수
+			int hncCnt = 0; // 현대퓨처넷 전송갯수
+			int imoCnt = 0; // 아이엠오 전송갯수
+			int bizCnt = 0; // 비즈뿌리오 전송갯수
+			int jjCnt = 0; // 제이제이 전송갯수
+			int ivtCnt = 0; // 인비토 전송갯수
 
-        //사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
-        String befCash = mjonMsgVO.getBefCash();
+			// 전송사별 발송 리스트 조회
+			List<MjonMsgVO> sendRateList = mjonMsgDataDAO.selectSendAgentList(mjonMsgVO);
 
-        //VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴
-        if("".equals(befCash) || befCash == null) {
-            befCash = mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO);
-        }
+			if (callToCnt >= 10) {
+				// 전송사별 배분률 조회
+				int sendRateSize = sendRateList.size();
 
-        mjonMsgVO.setBefCash(befCash);
-        // 문자 전송 그룹 테이블에 정보 입력
-        //mjonMsgDAO.insertGroupMsgData(mjonMsgVO);
+				/**
+				 * Agent 추가시 셋팅하기
+				 *
+				 * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) 22.10.12 : 비즈뿌리오(04) 추가 23.04.10 :
+				 * 제이제이(05) 추가 23.05.02 : 인비토 (07) 추가
+				 */
+				for (MjonMsgVO sendRate : sendRateList) {
+					String sndAgentCode = sendRate.getAgentCode();
+					int sendCount = Math.round(callToCnt * Float.parseFloat(sendRate.getSendRate()));
+					switch (sndAgentCode) {
+						case "01":
+							iheartCnt = sendCount;
+							break;
+						case "02":
+							hncCnt = sendCount;
+							break;
+						case "03":
+							imoCnt = sendCount;
+							break;
+						case "04":
+							bizCnt = sendCount;
+							break;
+						case "05":
+							jjCnt = sendCount;
+							break;
+						case "07":
+							ivtCnt = sendCount;
+							break;
+					}
+				}
+			}
 
-        //수신거부 목록 불러오기
-        List<String> userBlockList = mjonMsgDAO.selectUserBlockList(mjonMsgVO);
+			/**
+			 * 한번에 서버가 보낼수 있는 문자건수를 체크 해서 넘으면 분할해서 디비 입렵해 준다. 발송 건수가 천 건이 넘어가면, 백건씩 끊어서 발송
+			 * 하도록 한다.
+			 */
 
-        List<String> dupliBlockList = MJUtil.getDuplicateList(userBlockList);
-        int usrBlockCnt = dupliBlockList.size();
+			if (callToCnt >= 10000) {
+				limitCnt = 1000;
+			}
 
-        //회원 전용 전송사 정보 불러오기
-        MberManageVO userInfo = mjonMsgDataDAO.selectMberManageInfo(mjonMsgVO.getUserId());
-        String hotlineAgentCode = userInfo.getHotlineAgentCode();
+			
+			
+			
 
-        //야간스미싱 알림여부 정보(관리자 알림관리 상태 정보를 모두 불러옴) 불러오기 20240722 우영두 추가
-        JoinSettingVO joinSettingVO = siteManagerDAO.selectAdminNotiDetail();
-        String holiSmishingNoti = joinSettingVO.getHoliSmishingNoti();
+			// 수신자 리스트 처리
+			List<MjonMsgVO> msgDataInfo = new ArrayList<MjonMsgVO>();
 
-        //스팸,스미싱이어도 딜레이없이 문자 전송을 처리할지 선택 상태값 변수
-        boolean spamSmishingPassStatus = false;	//야간스미싱 알림여부가 활성화인 경우 false, 비활성화인경우 true 값을 가지도록 한다.
+			int cnt = 1;
+			int totCnt = 1;
 
-        //스팸, 스미싱 상태인 경우에만 true 처리
-        //야간스미싱알리 여부가 활성화 인경우 무조건 문자를 즉시 보내도록 한다.
-        //스미싱 알림 일정에 등록된 날짜와 시간에 포함되면 30분 딜레이 없이 발송 처리하도록 함.
-        if(holiSmishingNoti.equals("Y")) {
+			// 분할문자 시간에 간격시간 더해주기
+			String dividDay = null;
+			Calendar cal = Calendar.getInstance();
 
-            MsgAlarmSetVO msgAlarmSetVO = new MsgAlarmSetVO();
+			// 예약시간 변환
+			SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 
-            msgAlarmSetVO.setUseYn("Y");
-            msgAlarmSetVO.setFirstIndex(0);
+			int turmMin = 0;
+			int totalCallCnt = 0;
+			int divideCnt = 0;
+			int count = 1; // 분할 카운트
+			String delayTime = "";// 30분 지연시간
+			String spamStatus = mjonMsgVO.getSpamStatus();// 스팸 문구 유무
+			String smishingYn = mjonMsgVO.getSmishingYn();// 스미싱 의심 유무
+			String delayYn = "N"; // 문자발송 30분 지연 처리 유무
 
-            List<MsgAlarmSetVO> resultAlarmList = msgHolidayDAO.selectAlarmSettingList(msgAlarmSetVO);
+			if (StringUtils.isEmpty(spamStatus)) 
+			{
+				spamStatus = "N";
+			}
 
-            Calendar calendar = Calendar.getInstance();
-            int year = calendar.get(Calendar.YEAR);
+			if (StringUtils.isEmpty(smishingYn)) 
+			{
+				smishingYn = "N";
+			}
 
-            MsgHolidayVO msgHolidayVO = new MsgHolidayVO();
-            msgHolidayVO.setFirstIndex(0);
-            msgHolidayVO.setRecordCountPerPage(100);
-            msgHolidayVO.setSearchHoliYear(Integer.toString(year));
+			
+			
+			
+			
 
-            List<MsgHolidayVO> resultHolidayList = msgHolidayDAO.selectMsgHolidayList(msgHolidayVO);
 
-            MjonHolidayApi mjonHolidayApi = new MjonHolidayApi();
+			// 사용자 시스템 단가에 스미싱노티 컬럼이 있음
+			JoinSettingVO joinSettingVO = siteManagerDAO.selectAdminNotiDetail();
+			// 야간 스미싱 알림여부 정보 불러오기
+			String holiSmishingNoti = joinSettingVO.getHoliSmishingNoti();
 
-            boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList, resultHolidayList);
+			// 스미싱 알림 여부 처리
+			boolean spamSmishingPassStatus = false;
 
-            spamSmishingPassStatus = smishingAlarmPassSts;
-        }else {
+			// 스팸, 스미싱 상태인 경우에만 true 처리
+			// 야간스미싱알리 여부가 활성화 인경우 무조건 문자를 즉시 보내도록 한다.
+			// 스미싱 알림 일정에 등록된 날짜와 시간에 포함되면 30분 딜레이 없이 발송 처리하도록 함.
+			if ("Y".equals(holiSmishingNoti)) {
 
-            spamSmishingPassStatus = true;
+				MsgAlarmSetVO msgAlarmSetVO = new MsgAlarmSetVO();
 
-        }
+				msgAlarmSetVO.setUseYn("Y");
+				msgAlarmSetVO.setFirstIndex(0);
 
-        //전용 전송사가 지정되어 있으면 실행
-        if(!hotlineAgentCode.equals("00")) {
+				List<MsgAlarmSetVO> resultAlarmList = msgHolidayDAO.selectAlarmSettingList(msgAlarmSetVO);
 
-            MjonMsgAgentStsVO mjonMsgAgentStsVO = new MjonMsgAgentStsVO();
-            mjonMsgAgentStsVO.setAgentCode(hotlineAgentCode);
+				Calendar calendar = Calendar.getInstance();
+				int year = calendar.get(Calendar.YEAR);
 
-            //문자 타입 셋팅
-            if(msgType.equals("6")) {
-                int fCnt = Integer.parseInt(mjonMsgVO.getFileCnt());
-                if(fCnt > 0) {
+				MsgHolidayVO msgHolidayVO = new MsgHolidayVO();
+				msgHolidayVO.setFirstIndex(0);
+				msgHolidayVO.setRecordCountPerPage(100);
+				msgHolidayVO.setSearchHoliYear(Integer.toString(year));
 
-                    mjonMsgAgentStsVO.setMsgType("P");
+				List<MsgHolidayVO> resultHolidayList = msgHolidayDAO.selectMsgHolidayList(msgHolidayVO);
 
-                }else {
-                    mjonMsgAgentStsVO.setMsgType("L");
-                }
+				MjonHolidayApi mjonHolidayApi = new MjonHolidayApi();
 
-            }else {
-                mjonMsgAgentStsVO.setMsgType("S");
-            }
+				boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList,
+						resultHolidayList);
 
-            List<MjonMsgAgentStsVO> hotlineMsgAgentList = mjonMsgAgentStsDAO.selectMsgAgentListByAgentCode(mjonMsgAgentStsVO);
+				spamSmishingPassStatus = smishingAlarmPassSts;
+			} else {
 
-            String mberAgentConde = "";
-            String mberSendRate = "";
-            String mberRepAgent = "";
+				spamSmishingPassStatus = true;
 
-            for(MjonMsgAgentStsVO tmp : hotlineMsgAgentList) {
+			}
+			
+			
+			// 야간 스미싱 알림여부가 활성화 이고 예외시간에 포함되는 경우 스팸, 스미싱, 딜레이 값을 모두 N 으로 처리
+			if (spamSmishingPassStatus) {
 
-                mberAgentConde = tmp.getAgentCode();
-                mberSendRate = tmp.getSendRate();
-                mberRepAgent = tmp.getRepAgent();
-                String useYn = tmp.getUseYn();
+				spamStatus = "N";
+				smishingYn = "N";
+				delayYn = "N";
 
-                if(userInfo.getBlineCode().equals("N")) {
-                    //회원 전용 전송사의 전송 비율이 0 이면 대표전송사로 전송되도록 셋팅함.
-                    if(mberSendRate.equals("0") || useYn.equals("N")) {
+			}
 
-                        hotlineAgentCode = mberRepAgent;
+			if (!mjonMsgVO.getReserveYn().equals("N")) {// 예약문자인 경우 시간 셋팅
 
-                    }
-                }
+				Date toDate = transFormat.parse(mjonMsgVO.getReqDate());
+				cal.setTime(toDate); // 예약 시간 캘린터 변수에 입력
 
-            }
+				// String 타입 시간 Int로 변환
+				turmMin = Integer.parseInt(mjonMsgVO.getDivideTime()); // 분할발송 시간 간격
+				dividDay = transFormat.format(cal.getTime());
 
-        }
+				totalCallCnt = mjonMsgVO.getCallToList().length; // 수신자 전체 갯수
+				divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt()); // 분할 발송 갯수
 
+				if (spamStatus.equals("Y") || smishingYn.equals("Y")) {
 
-        /**
-         * Agent 추가시 셋팅하기
-         * Agent 발송 비율 불러오기
-         * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03)
-         * 22.10.12 : 비즈뿌리오(04) 추가
-         * 23.04.10 : 제이제이(05) 추가
-         * 23.05.02 : 인비토 (07) 추가
-         * */
+					mjonMsgVO.setDelayYn("Y");// 일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임, 원래는 스팸이면 Y로
+												// 넣어줘야한다.
+
+				} else {
+
+					mjonMsgVO.setDelayYn("N");// 일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임
+				}
+
+			} else {// 즉시발송의 경우 현재 시간으로 입력해 준다.
+
+				Date now = new Date();
+				if (spamStatus.equals("Y") || smishingYn.equals("Y")) {// 스팸 문자가 포함되었거나, 스미싱 의심 회원의 경우 문자발송 시간을 30분 딜레이
+																		// 시킨다.
+
+					String nowDate = transFormat.format(now);
+					Date toDate = transFormat.parse(nowDate);
+					System.out.println("++++++++++++++++++++ origin reqDate ::: " + toDate);
+					cal.setTime(toDate);
+
+					cal.add(Calendar.MINUTE, 30);
+					delayTime = transFormat.format(cal.getTime());
+					mjonMsgVO.setReqDate(delayTime);
+					System.out.println("++++++++++++++++++++ delay reqDate ::: " + mjonMsgVO.getReqDate());
+					delayYn = "Y";
+					mjonMsgVO.setDelayYn(delayYn);// 문자 발송 30분 지연 코드 셋팅
+
+				} else {// 정상적인 문자인 경우 즉시발송 처리해준다.
+
+					mjonMsgVO.setReqDate(transFormat.format(now));
+					mjonMsgVO.setDelayYn(delayYn);// 문자 발송 30분 지연 디폴트 값 셋팅(N)
+
+				}
+
+			}
+
+			String[] nameList = mjonMsgVO.getNameList(); // 치환 이름 리스트
+			String[] phoneList = mjonMsgVO.getCallToList(); // 받는사람 연락처 리스트
+			String[] rep1 = mjonMsgVO.getRep1List(); // 치환 문자1 리스트
+			String[] rep2 = mjonMsgVO.getRep2List(); // 치환 문자2 리스트
+			String[] rep3 = mjonMsgVO.getRep3List(); // 치환 문자3 리스트
+			String[] rep4 = mjonMsgVO.getRep4List(); // 치환 문자4 리스트
+
+			// Controller에서 전달 받은 분할 시간 정보 리스트
+			List<String> dividDayList = mjonMsgVO.getDividDay();
+
+			String frstDelayTime = mjonMsgVO.getReqDate();
+			// 문자발송 리스트 생성 시작
+			for (int i = 0; i < callToCnt; i++) {
+
+				Boolean blockSts = false;
+				for (int j = 0; j < usrBlockCnt; j++) {
+
+					if (phoneList[i].equals(dupliBlockList.get(j).toString())) {
+
+						blockCnt++; // 수신 차단 카운드를 해준다.
+						blockSts = true;
+
+					}
+
+				}
+
+				if (!blockSts) { // 수신거부가 아니면 추가
+
+					MjonMsgVO tempVO = new MjonMsgVO();
+
+					/**
+					 * Agent 추가시 셋팅하기
+					 *
+					 * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) 22.10.12 : 비즈뿌리오(04) 추가 23.04.10 :
+					 * 제이제이(05) 추가 23.05.02 : 인비토 (07) 추가 23.05.09 : 회원 전용 전송사 정보가 있으면 모든 문자를 전용
+					 * 전송사로 발송처리함.
+					 */
+
+					if (hotlineAgentCode.equals("00")) {// 전용 전송사가 사용 안함인 경우 분배 및 대표 전송사로 설정
+
+						if (iheartCnt > 0) {
+							agentCode = "01";
+							tempVO.setAgentCode(agentCode);
+							iheartCnt--;
+						} else if (hncCnt > 0) {
+							agentCode = "02";
+							tempVO.setAgentCode(agentCode);
+							hncCnt--;
+						} else if (imoCnt > 0) {
+							agentCode = "03";
+							tempVO.setAgentCode(agentCode);
+							imoCnt--;
+						} else if (bizCnt > 0) {
+							agentCode = "04";
+							tempVO.setAgentCode(agentCode);
+							bizCnt--;
+						} else if (jjCnt > 0) {
+							agentCode = "05";
+							tempVO.setAgentCode(agentCode);
+							jjCnt--;
+						} else if (ivtCnt > 0) {
+							agentCode = "07";
+							tempVO.setAgentCode(agentCode);
+							ivtCnt--;
+						} else {// 전송사 Agent 대표 전송사로 지정한다.
+
+							agentCode = sendRateList.get(0).getRepAgent();
+							tempVO.setAgentCode(agentCode);
+						}
+
+					} else {// 전용 전송사가 지정되어 있는 경우 전용 전송사로 지정
+
+						agentCode = hotlineAgentCode;
+						tempVO.setAgentCode(hotlineAgentCode);
+					}
+					// Agent 셋팅 끝
+
+					tempVO.setMsgId(idgenMsgId.getNextStringId());
+					tempVO.setUserId(mjonMsgVO.getUserId());
+					tempVO.setCallTo(phoneList[i]);
+					tempVO.setCallFrom(mjonMsgVO.getCallFrom());
+					tempVO.setMsgType(mjonMsgVO.getMsgType());
+					tempVO.setMsgGroupId(mjonMsgVO.getMsgGroupId());
+					tempVO.setMsgCnt(mjonMsgVO.getMsgCnt());
+
+					// 아이엠오 전송사 문자 타입 설정해 주기
+					if (agentCode.equals("03")) {
+
+						// 단순 장문 문자는 neoType : 2, 그림 포함 : 4
+						if (mjonMsgVO.getFileCnt().equals("0")) { // 단순 장문 문자
+
+							mjonMsgVO.setNeoType("2");
+
+						} else { // 그림포함 문자인경우
+
+							mjonMsgVO.setNeoType("4");
+
+						}
+
+					}
+
+					// 문자내용 내용 - 치환 처리
+					String smsTxt = mjonMsgVO.getSmsTxt(); // 발송 문자 내용
+
+					// 일괄변환문자 리스트에서 콤마(,)를 특수문자(§)로 변환해서 넘겨받기 때문에 치환 처리를 해준도록 한다.
+					smsTxt = smsTxt.replaceAll(String.valueOf((char) 13), "");
+					if (smsTxt.indexOf("[*이름*]") > -1) {
+						if (nameList.length > i && StringUtil.isNotEmpty(nameList[i])) {
+							smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]",
+									StringUtil.getString(nameList[i].replaceAll("§", ",")));
+						} else {
+							smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", "");
+						}
+					}
+
+					if (smsTxt.indexOf("[*1*]") > -1) {
+						if (rep1.length > i && StringUtil.isNotEmpty(rep1[i])) {
+							smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]",
+									StringUtil.getString(rep1[i].replaceAll("§", ",")));
+						} else {
+							smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", "");
+						}
+					}
+
+					if (smsTxt.indexOf("[*2*]") > -1) {
+						if (rep2.length > i && StringUtil.isNotEmpty(rep2[i])) {
+							smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]",
+									StringUtil.getString(rep2[i].replaceAll("§", ",")));
+						} else {
+							smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", "");
+						}
+					}
+
+					if (smsTxt.indexOf("[*3*]") > -1) {
+						if (rep3.length > i && StringUtil.isNotEmpty(rep3[i])) {
+							smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]",
+									StringUtil.getString(rep3[i].replaceAll("§", ",")));
+						} else {
+							smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", "");
+						}
+					}
+
+					if (smsTxt.indexOf("[*4*]") > -1) {
+						if (rep4.length > i && StringUtil.isNotEmpty(rep4[i])) {
+							smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]",
+									StringUtil.getString(rep4[i].replaceAll("§", ",")));
+						} else {
+							smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", "");
+						}
+					}
+
+					tempVO.setSmsTxt(smsTxt);
+
+					// 즉시 / 예약 전송 처리
+					if (mjonMsgVO.getReserveYn().equals("N")) {// 즉시 전송의 경우 현재 시간을 입력
+
+						if (spamStatus.equals("Y") || smishingYn.equals("Y")) {// 스팸문자가 있거나, 스미싱 의심 회원의 경우 30분 지연시간을 입력해
+																				// 준다.
+
+							tempVO.setReqDate(mjonMsgVO.getReqDate());// 상단에서 스팸문구가 있는겨우 30분 딜레이시간을 입력해 두었기 때문에 같은 데이터를
+																		// 입력함.
+
+						} else {// 일반 문자인 경우 현재시간을 입력해 준다.
+
+							Date now = new Date();
+							SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+							tempVO.setReqDate(sdFormat.format(now));
+
+						}
+
+					} else { // 예약 발송의 경우 예약 시간을 입력
+
+						// 분할 발송을 체크 한 경우
+						if (mjonMsgVO.getDivideChk() != null) {
+
+							// 스팸문구 혹은 스미싱 의심 회원의 경우 30분 딜레이 처리해준다.
+							// 20230630 우영두 추가
+							if (spamStatus.equals("Y") || smishingYn.equals("Y")) {
+
+								Date delayDate = transFormat.parse(dividDayList.get(i));
+
+								cal.setTime(delayDate);
+								cal.add(Calendar.MINUTE, 30);
+								delayTime = transFormat.format(cal.getTime());
+
+								tempVO.setReqDate(delayTime); // 분할 문자 예약 시간 입력해주기
+
+							} else {
+
+								tempVO.setReqDate(dividDayList.get(i)); // 분할 문자 예약 시간 입력해주기
+
+							}
+
+						} else {// 일반 예약 발송의 경우
+
+							if (spamStatus.equals("Y") || smishingYn.equals("Y")) {// 스팸문구 혹은 스미싱 의심 회원의 경우 30분 딜레이
+																					// 처리해준다.
+
+								Date delayDate = transFormat.parse(mjonMsgVO.getReqDate());
+
+								cal.setTime(delayDate);
+								cal.add(Calendar.MINUTE, 30);
+								delayTime = transFormat.format(cal.getTime());
+
+								tempVO.setReqDate(delayTime);
+
+							} else {
+
+								tempVO.setReqDate(mjonMsgVO.getReqDate());
+
+							}
+
+						}
+
+						// 딜레이 처리되었을 수 있어서 임시 데이터의 발송 시간을 업데이트 해준다.
+						// 분할 발송일 경우 Loop을 돌기 때문에 마지막 시간이 reqDate에 들어가기 때문에 첫번째 데이터에서만 시간을 입력해 준다.
+						// mj_group_data 테이블의 reqdate 컬럼 값으로 셋팅 된다.
+						if (i == 0) {
+							frstDelayTime = tempVO.getReqDate();
+						}
+					}
+
+					if (!msgType.equals("4")) { // 장문 혹은 그림문자일 경우 추가
+
+						/**
+						 * 장문 / 그림문자 일 경우 제목 처리 만약 제목을 입력하지 않았을 경우 문자 내용의 텍스트 일부를 제목으로 사용 내용 텍스트가 없는 경우는
+						 * 어쩔수 없는 것으로 간주하여 Null로 처리한다.
+						 *
+						 */
+						String contents = tempVO.getSmsTxt(); // 문자 내용
+						if (StringUtil.isEmpty(mjonMsgVO.getMmsSubject()) || mjonMsgVO.getMmsSubject() == null) {// 제목
+																													// 입력이
+																													// 없는
+																													// 경우
+
+							if (StringUtil.isNotEmpty(contents) && contents != null) {// 문자내용이 있는 경우 처리
+
+								String[] split = contents.split("\n");
+
+								if (split.length > 0) {
+
+									String subject = "";
+									String msgKind = mjonMsgVO.getMsgKind();// 문자 타입(일반, 광고, 선거문자)
+
+									// 선거문자인 경우 첫 글내용이 "(선거운동정보)"로 되어있어서 그 다음줄의 내용을 제목으로 사용
+									/*
+									 * if(subject.equals("(선거운동정보)")) { subject = split[1].trim(); }
+									 */
+
+									if (msgKind.equals("C")) {
+										if (split.length > 1) {
+											subject = split[1].trim();
+										} else {
+											subject = split[0].substring(0, 20);
+										}
+									} else {
+										subject = split[0].trim();
+									}
+
+									// 제목 글자수 20글자로 제한.
+									/*
+									 * if(subject.length() > 20) { subject = subject.substring(0,20); }
+									 * tempVO.setMmsSubject(subject); mjonMsgVO.setMmsSubject(subject);
+									 */
+
+								}
+
+							}
+
+						} else {// 제목 입력이 있는 경우 입력한 제목으로 셋팅
+							tempVO.setMmsSubject(mjonMsgVO.getMmsSubject());
+						}
+
+						tempVO.setFileCnt(mjonMsgVO.getFileCnt());
+						tempVO.setFileName1(mjonMsgVO.getFileName1());
+						tempVO.setFileName2(mjonMsgVO.getFileName2());
+						tempVO.setFileName3(mjonMsgVO.getFileName3());
+						tempVO.setNeoType(mjonMsgVO.getNeoType());
+						tempVO.setContSeq(mjonMsgVO.getContSeq());
+
+					}
+
+					// 아이하트 전송사의 LMS(장문) / MMS(그림문자) 전송시 컨텐츠 번호 받아오기 먼저 처리
+					if (agentCode.equals("01") && msgType.equals("6")) {
+
+						// 아이하트 MMS Contents 테이블에 입력 후 컨텐츠 아이디 받아오기
+
+						// 이미지가 있는경우 file_type, file_Cnt 값 셋팅
+						int fileCnt = Integer.parseInt(mjonMsgVO.getFileCnt());
+						String contents = mjonMsgVO.getSmsTxt();
+
+						if (fileCnt > 0) {
+							tempVO.setFileType1("IMG"); // 아이하트 그림문자 전송시 파일종류 이미지로 셋팅
+
+							// 그림문자일 경우 이미지 갯수 + 1을 해줘야한다. (+1은 컨텐츠 내용을 의미한다.)
+							if (StringUtil.isNotEmpty(contents)) {
+								fileCnt = fileCnt + 1;
+							}
+							tempVO.setFileCnt(Integer.toString(fileCnt));
+
+						} else {
+							tempVO.setFileCnt("1");
+						}
+
+						contSeq = mjonMsgDataDAO.insertIHeartMmsMsgContentsInfo(tempVO);
+						mjonMsgVO.setContSeq(contSeq);
+						tempVO.setSmsTxt(smsTxt);
+						tempVO.setContSeq(contSeq);
+
+					}
+
+					// 문자 내용 추가해 주기
+					msgDataInfo.add(tempVO);
+
+				} // 수신거부 처리로직 끝
+
+				int instCnt = 0;
+				// 지금까지 루프 돌아간 것이 전체 수신자 갯수와 같으면 추가가 완료된 것으로 판단 되어 전송 해줌
+				if (totCnt == callToCnt) {
+
+					if (msgDataInfo.size() > 0) {
+
+						// 데이터 디비 입력해주기
+						instCnt = mjonMsgDataDAO.insertMsgDataInfo(msgDataInfo, msgType, agentCode);
+
+					}
+
+					// 총 디비 입력 건수 저장하기
+					resultCnt = resultCnt + instCnt;
+
+				} else {
+
+					// 특정 건수 이상일 경우 분할해서 디비에 넣어준다.
+					if (cnt == limitCnt) {
+
+						if (msgDataInfo.size() > 0) {
+
+							// 분할 최대건수가 되면 디비에 입력하기
+							instCnt = mjonMsgDataDAO.insertMsgDataInfo(msgDataInfo, msgType, agentCode);
+
+						}
+
+						// 총 디비 입력 건수 저장하기
+						resultCnt = resultCnt + instCnt;
+						cnt = 0;
+
+						// List 초기화 하기
+						msgDataInfo.clear();
+
+					}
+
+				}
+
+				cnt++;
+				totCnt++;
+
+			}
+
+			/*
+			 * 각 처리 건별로 캐시 차감 및 그룹 데이터 정보 업데이트 1. 디비에 입력한 건수만큼 캐시 차감 및 회원 캐시 정보 업데이트 2.
+			 * 그룹데이터에 처리 건수 업데이트(총 발송건수 합산 정보 업데이트)
+			 *
+			 */
+
+			// 문자 발송 캐시 차감 해주기
+			MjonPayVO mjonPayVO = new MjonPayVO();
+
+			/*
+			 * if(resultCnt > 0 && blockCnt > 0) {
+			 * 
+			 * Float blockPrice = Float.parseFloat(mjonMsgVO.getEachPrice()) * blockCnt;
+			 * Float resultTotPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); Float
+			 * endPrice = resultTotPrice - blockPrice;
+			 * 
+			 * mjonMsgVO.setTotPrice(Float.toString(endPrice));
+			 * 
+			 * //수신거부가 있는 경우 총 건수에서 수신거부 건수를 차감 후 그룹 테이블에 업데이트 해준다. int groupCnt =
+			 * resultCnt; mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt));
+			 * 
+			 * //mjonMsgDAO.updateGroupMsgData(mjonMsgVO);
+			 * 
+			 * }
+			 */
+
+			// 1건 이상 발송이 있는 경우만 캐쉬를 차감 시킨다.
+			if (resultCnt > 0) {
+
+				int totSendCnt = mjonMsgVO.getTotalCallCnt();
+				Float eachPrice = Float.parseFloat(mjonMsgVO.getEachPrice());
+				Float totPrice = eachPrice * resultCnt;
+				String strTotPrice = String.format("%.1f", totPrice);
+
+				mjonMsgVO.setTotPrice(strTotPrice);// 현재 합산 금액 셋팅
+				mjonPayVO.setCashId(idgenMjonCashId.getNextStringId());
+				mjonPayVO.setUserId(mjonMsgVO.getUserId());
+				mjonPayVO.setCash(-Float.parseFloat(strTotPrice));
+				mjonPayVO.setFrstRegisterId(mjonMsgVO.getUserId());
+				mjonPayVO.setMemo("SMS 문자 총 " + totSendCnt + "건 중 " + resultCnt + "건 발송");
+				mjonPayVO.setMsgGroupId(mjonMsgVO.getMsgGroupId());
+
+				mjonPayService.insertCash(mjonPayVO); // 캐시차감
+				mjonPayService.updateMemberCash(mjonPayVO); // 회원정보 업데이트
+			}
+
+			// 문자 발송 테이블에 입력 데이터가 있는 경우 그룹 테이블에도 입력 해 준다.
+			if (resultCnt > 0) {
+
+				// 문자 전송 그룹 테이블에 정보 입력
+				int groupCnt = resultCnt;
+				mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt));
+				// mjonMsgService.insertGroupMsgData(mjonMsgVO);
+				int msgGroupDataCnt = mjonMsgDAO.selectMsgGroupDataCntByGroupId(mjonMsgVO);
+
+				// 메세지 그룹 데이터가 없으면 추가 해주고 있으면 총메세지 건수를 합산해준다.
+				if (msgGroupDataCnt < 1) {
+					mjonMsgVO.setAgentCode(agentCode);// 전송사 코드 번호를 셋팅해 준다.
+
+					// 지연 유무 코드가 Null 인경우 체크
+					String tmpDelayYn = mjonMsgVO.getDelayYn();
+					if (tmpDelayYn == null) {
+						mjonMsgVO.setDelayYn("N");
+					}
+
+					// 예약 문자이고 30분 지연이 된 문자의 Mj_msg_group_data 테이블의 req_date 시간을 첫번째 문자의 지연된 시간으로
+					// 셋팅해준다.
+					if (mjonMsgVO.getReserveYn().equals("Y") && (spamStatus.equals("Y") || smishingYn.equals("Y"))) {
+
+						mjonMsgVO.setReqDate(frstDelayTime);
+
+					}
+					mjonMsgDAO.insertGroupMsgData(mjonMsgVO);
+
+					try {
+
+						// 야간 스미싱 알림이 활성화이고 알림 예외 일정에 포함되고 스팸 또는 스미싱 의심 상태일 경우 문자정보 별도 저장처리 - 20240821
+						// 우영두 추가
+						if (holiSmishingNoti.equals("Y") && spamSmishingPassStatus
+								&& (mjonMsgVO.getSpamStatus().equals("Y") || mjonMsgVO.getSmishingYn().equals("Y"))) {
+							mjonMsgDAO.insertSpamPassMsgData(mjonMsgVO);
+						}
+
+					} catch (Exception e) {
+						System.out.println(
+								"++++++++++++++++++++++++++++++ spamSmishingPassStatus 문자전송 야간 스미싱 알림 데이터 입력 오류 발생 !!!!");
+					}
+
+				} else {
+					mjonMsgDAO.updateMsgGroupDataForTotCntSum(mjonMsgVO);
+				}
+
+				// 이벤트 회원 남은 캐시 업데이트
+				fnUpdateEventRemainCash(mjonPayVO);
+
+			}
+
+			// 성공
+			returnVO.setSendMsgCnt(Integer.toString(resultCnt)); // 발송 건수 저장
+			returnVO.setSendMsgBlockCnt(Integer.toString(blockCnt)); // 수신차단 건수 저장
+			returnVO.setAgentCode(agentCode);
+
+
+			
+		}catch (Exception e) {
+			// 실패
+			returnVO.setSendMsgCnt(Integer.toString(0)); // 발송 건수 저장
+			returnVO.setSendMsgBlockCnt(Integer.toString(0)); // 수신차단 건수 저장
+			returnVO.setAgentCode("01");
+
+			System.out.println("=========================================================================");
+			System.out.println("+++++++++++++++++++++++++++++ 문자발송 ==> insertMsgDataInfo ERROR !!! : " + e);
+			System.out.println("=========================================================================");
+			return returnVO;
+		}
+		return returnVO;
+	}
+
+
+	public MjonMsgReturnVO insertMsgDataInfo(MjonMsgVO mjonMsgVO) throws Exception {
+		
+		MjonMsgReturnVO returnVO = new MjonMsgReturnVO();
+
+		try {
+			String msgType = mjonMsgVO.getMsgType();
+			String agentCode = mjonMsgVO.getAgentCode();
+			// 장문 전송
+			String contSeq = "";
+
+			// 최종 입력 수 저장 변수
+			int resultCnt = 0;
+			int limitCnt = 1000;
+			int blockCnt = 0;
+
+
+			int callToCnt = mjonMsgVO.getCallToList().length; // 전체 받는사람 건수
+
+			mjonMsgVO.setMsgGroupCnt(Integer.toString(callToCnt));
+
+			// 그룹 테이블에 입력할 발송 시간 및 예약 발송 시간 처리
+			/*
+			 * if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력
+			 * 
+			 * Date now = new Date();
+			 * 
+			 * SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+			 * 
+			 * mjonMsgVO.setReqDate(sdFormat.format(now));
+			 * 
+			 * }
+			 */
+
+			// 사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
+			String befCash = mjonMsgVO.getBefCash();
+
+			// VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴
+			if ("".equals(befCash) || befCash == null) {
+				befCash = mjonMsgDataDAO.selectBeforeCashData(mjonMsgVO);
+			}
+
+			mjonMsgVO.setBefCash(befCash);
+			// 문자 전송 그룹 테이블에 정보 입력
+			// mjonMsgDAO.insertGroupMsgData(mjonMsgVO);
+
+			// 수신거부 목록 불러오기
+			List<String> userBlockList = mjonMsgDAO.selectUserBlockList(mjonMsgVO);
+
+			List<String> dupliBlockList = MJUtil.getDuplicateList(userBlockList);
+			int usrBlockCnt = dupliBlockList.size();
+
+			// 회원 전용 전송사 정보 불러오기
+			MberManageVO userInfo = mjonMsgDataDAO.selectMberManageInfo(mjonMsgVO.getUserId());
+			String hotlineAgentCode = userInfo.getHotlineAgentCode();
+
+			// 야간스미싱 알림여부 정보(관리자 알림관리 상태 정보를 모두 불러옴) 불러오기 20240722 우영두 추가
+			JoinSettingVO joinSettingVO = siteManagerDAO.selectAdminNotiDetail();
+			String holiSmishingNoti = joinSettingVO.getHoliSmishingNoti();
+
+			// 스팸,스미싱이어도 딜레이없이 문자 전송을 처리할지 선택 상태값 변수
+			boolean spamSmishingPassStatus = false; // 야간스미싱 알림여부가 활성화인 경우 false, 비활성화인경우 true 값을 가지도록 한다.
+
+			// 스팸, 스미싱 상태인 경우에만 true 처리
+			// 야간스미싱알리 여부가 활성화 인경우 무조건 문자를 즉시 보내도록 한다.
+			// 스미싱 알림 일정에 등록된 날짜와 시간에 포함되면 30분 딜레이 없이 발송 처리하도록 함.
+			if (holiSmishingNoti.equals("Y")) {
+
+				MsgAlarmSetVO msgAlarmSetVO = new MsgAlarmSetVO();
+
+				msgAlarmSetVO.setUseYn("Y");
+				msgAlarmSetVO.setFirstIndex(0);
+
+				List<MsgAlarmSetVO> resultAlarmList = msgHolidayDAO.selectAlarmSettingList(msgAlarmSetVO);
+
+				Calendar calendar = Calendar.getInstance();
+				int year = calendar.get(Calendar.YEAR);
+
+				MsgHolidayVO msgHolidayVO = new MsgHolidayVO();
+				msgHolidayVO.setFirstIndex(0);
+				msgHolidayVO.setRecordCountPerPage(100);
+				msgHolidayVO.setSearchHoliYear(Integer.toString(year));
+
+				List<MsgHolidayVO> resultHolidayList = msgHolidayDAO.selectMsgHolidayList(msgHolidayVO);
+
+				MjonHolidayApi mjonHolidayApi = new MjonHolidayApi();
+
+				boolean smishingAlarmPassSts = mjonHolidayApi.getHolidaySmishingPassStatus(resultAlarmList,
+						resultHolidayList);
+
+				spamSmishingPassStatus = smishingAlarmPassSts;
+			} else {
+
+				spamSmishingPassStatus = true;
+
+			}
+
+			// 전용 전송사가 지정되어 있으면 실행
+			if (!hotlineAgentCode.equals("00")) {
+
+				MjonMsgAgentStsVO mjonMsgAgentStsVO = new MjonMsgAgentStsVO();
+				mjonMsgAgentStsVO.setAgentCode(hotlineAgentCode);
+
+				// 문자 타입 셋팅
+				if (msgType.equals("6")) {
+					int fCnt = Integer.parseInt(mjonMsgVO.getFileCnt());
+					if (fCnt > 0) {
+
+						mjonMsgAgentStsVO.setMsgType("P");
+
+					} else {
+						mjonMsgAgentStsVO.setMsgType("L");
+					}
+
+				} else {
+					mjonMsgAgentStsVO.setMsgType("S");
+				}
+
+				List<MjonMsgAgentStsVO> hotlineMsgAgentList = mjonMsgAgentStsDAO
+						.selectMsgAgentListByAgentCode(mjonMsgAgentStsVO);
 
-        int iheartCnt = 0;	//아이하트 전송갯수
-        int hncCnt = 0;		//현대퓨처넷 전송갯수
-        int imoCnt = 0;		//아이엠오 전송갯수
-        int bizCnt = 0;		//비즈뿌리오 전송갯수
-        int jjCnt = 0;		//제이제이 전송갯수
-        int ivtCnt = 0; 	//인비토 전송갯수
+				String mberAgentConde = "";
+				String mberSendRate = "";
+				String mberRepAgent = "";
 
-        // 전송사별 발송 리스트 조회
-        List<MjonMsgVO> sendRateList = mjonMsgDataDAO.selectSendAgentList(mjonMsgVO);
+				for (MjonMsgAgentStsVO tmp : hotlineMsgAgentList) {
 
-        if(callToCnt >= 10) {
-            // 전송사별 배분률 조회
-            int sendRateSize = sendRateList.size();
+					mberAgentConde = tmp.getAgentCode();
+					mberSendRate = tmp.getSendRate();
+					mberRepAgent = tmp.getRepAgent();
+					String useYn = tmp.getUseYn();
 
-            /**
-             * Agent 추가시 셋팅하기
-             *
-             * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03)
-             * 22.10.12 : 비즈뿌리오(04) 추가
-             * 23.04.10 : 제이제이(05) 추가
-             * 23.05.02 : 인비토 (07) 추가
-             * */
+					if (userInfo.getBlineCode().equals("N")) {
+						// 회원 전용 전송사의 전송 비율이 0 이면 대표전송사로 전송되도록 셋팅함.
+						if (mberSendRate.equals("0") || useYn.equals("N")) {
 
-            for(int i=0; i< sendRateSize; i++) {
+							hotlineAgentCode = mberRepAgent;
 
-                String sndAgentCode = sendRateList.get(i).getAgentCode();
+						}
+					}
 
-                if(sndAgentCode.equals("01")) {//아이하트 전송비율
+				}
 
-                    iheartCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate()));
+			}
 
-                }else if(sndAgentCode.equals("02")) {//현대퓨처넷 전송비율
+			/**
+			 * Agent 추가시 셋팅하기 Agent 발송 비율 불러오기 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) 22.10.12
+			 * : 비즈뿌리오(04) 추가 23.04.10 : 제이제이(05) 추가 23.05.02 : 인비토 (07) 추가
+			 */
 
-                    hncCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate()));
+			int iheartCnt = 0; // 아이하트 전송갯수
+			int hncCnt = 0; // 현대퓨처넷 전송갯수
+			int imoCnt = 0; // 아이엠오 전송갯수
+			int bizCnt = 0; // 비즈뿌리오 전송갯수
+			int jjCnt = 0; // 제이제이 전송갯수
+			int ivtCnt = 0; // 인비토 전송갯수
 
-                }else if(sndAgentCode.equals("03")) {//아이엠오 전송비율
+			// 전송사별 발송 리스트 조회
+			List<MjonMsgVO> sendRateList = mjonMsgDataDAO.selectSendAgentList(mjonMsgVO);
 
-                    imoCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate()));
+			if (callToCnt >= 10) {
+				// 전송사별 배분률 조회
+				int sendRateSize = sendRateList.size();
 
-                }else if(sndAgentCode.equals("04")) {//비즈뿌리오 전송비율
+				/**
+				 * Agent 추가시 셋팅하기
+				 *
+				 * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) 22.10.12 : 비즈뿌리오(04) 추가 23.04.10 :
+				 * 제이제이(05) 추가 23.05.02 : 인비토 (07) 추가
+				 */
 
-                    bizCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate()));
+				for (int i = 0; i < sendRateSize; i++) {
 
-                }else if(sndAgentCode.equals("05")) {//제이제이 전송비율
+					String sndAgentCode = sendRateList.get(i).getAgentCode();
 
-                    jjCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate()));
+					if (sndAgentCode.equals("01")) {// 아이하트 전송비율
 
-                }else if(sndAgentCode.equals("07")) {//인비토 전송비율
+						iheartCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate()));
 
-                    ivtCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate()));
+					} else if (sndAgentCode.equals("02")) {// 현대퓨처넷 전송비율
 
-                }
+						hncCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate()));
 
-            }
-        }
+					} else if (sndAgentCode.equals("03")) {// 아이엠오 전송비율
 
-        /**
-         * 한번에 서버가 보낼수 있는 문자건수를 체크 해서 넘으면 분할해서 디비 입렵해 준다.
-         * 발송 건수가 천 건이 넘어가면, 백건씩 끊어서 발송 하도록 한다.
-         * */
+						imoCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate()));
 
-        if(callToCnt >= 10000) {
+					} else if (sndAgentCode.equals("04")) {// 비즈뿌리오 전송비율
 
-            limitCnt = 1000;
+						bizCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate()));
 
-        }
+					} else if (sndAgentCode.equals("05")) {// 제이제이 전송비율
 
-        //수신자 리스트 처리
-        List<MjonMsgVO> msgDataInfo = new ArrayList<MjonMsgVO>();
+						jjCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate()));
 
-        int cnt = 1;
-        int totCnt = 1;
+					} else if (sndAgentCode.equals("07")) {// 인비토 전송비율
 
-        //분할문자 시간에 간격시간 더해주기
-        String dividDay = null;
-        Calendar cal = Calendar.getInstance();
+						ivtCnt = Math.round(callToCnt * Float.parseFloat(sendRateList.get(i).getSendRate()));
 
-        //예약시간 변환
-        SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+					}
 
-        int turmMin = 0;
-        int totalCallCnt = 0;
-        int divideCnt = 0;
-        int count = 1;		//분할 카운트
-        String delayTime ="";//30분 지연시간
-        String spamStatus = mjonMsgVO.getSpamStatus();//스팸 문구 유무
-        String smishingYn = mjonMsgVO.getSmishingYn();//스미싱 의심 유무
-        String delayYn = "N";	//문자발송 30분 지연 처리 유무
+				}
+			}
 
-        if(spamStatus == null || spamStatus.equals("")) {
+			/**
+			 * 한번에 서버가 보낼수 있는 문자건수를 체크 해서 넘으면 분할해서 디비 입렵해 준다. 발송 건수가 천 건이 넘어가면, 백건씩 끊어서 발송
+			 * 하도록 한다.
+			 */
 
-            spamStatus = "N";
+			if (callToCnt >= 10000) {
 
-        }
+				limitCnt = 1000;
 
-        if(smishingYn == null || smishingYn.equals("")) {
+			}
 
-            smishingYn = "N";
+			// 수신자 리스트 처리
+			List<MjonMsgVO> msgDataInfo = new ArrayList<MjonMsgVO>();
 
-        }
+			int cnt = 1;
+			int totCnt = 1;
 
-        //야간 스미싱 알림여부가 활성화 이고 예외시간에 포함되는 경우 스팸, 스미싱, 딜레이 값을 모두 N 으로 처리
-        if(spamSmishingPassStatus) {
+			// 분할문자 시간에 간격시간 더해주기
+			String dividDay = null;
+			Calendar cal = Calendar.getInstance();
 
-            spamStatus = "N";
-            smishingYn = "N";
-            delayYn = "N";
+			// 예약시간 변환
+			SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 
-        }
+			int turmMin = 0;
+			int totalCallCnt = 0;
+			int divideCnt = 0;
+			int count = 1; // 분할 카운트
+			String delayTime = "";// 30분 지연시간
+			String spamStatus = mjonMsgVO.getSpamStatus();// 스팸 문구 유무
+			String smishingYn = mjonMsgVO.getSmishingYn();// 스미싱 의심 유무
+			String delayYn = "N"; // 문자발송 30분 지연 처리 유무
 
+			if (spamStatus == null || spamStatus.equals("")) {
 
-        if(!mjonMsgVO.getReserveYn().equals("N")) {//예약문자인 경우 시간 셋팅
+				spamStatus = "N";
 
-            Date toDate = transFormat.parse(mjonMsgVO.getReqDate());
-            cal.setTime(toDate); 										//예약 시간 캘린터 변수에 입력
+			}
 
-            //String 타입 시간 Int로 변환
-            turmMin = Integer.parseInt(mjonMsgVO.getDivideTime()); //분할발송 시간 간격
-            dividDay = transFormat.format(cal.getTime());
+			if (smishingYn == null || smishingYn.equals("")) {
 
-            totalCallCnt = mjonMsgVO.getCallToList().length; // 수신자 전체 갯수
-            divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt()); //분할 발송 갯수
+				smishingYn = "N";
 
-            if(spamStatus.equals("Y") || smishingYn.equals("Y")) {
+			}
 
-                mjonMsgVO.setDelayYn("Y");//일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임, 원래는 스팸이면 Y로 넣어줘야한다.
+			// 야간 스미싱 알림여부가 활성화 이고 예외시간에 포함되는 경우 스팸, 스미싱, 딜레이 값을 모두 N 으로 처리
+			if (spamSmishingPassStatus) {
 
-            }else {
+				spamStatus = "N";
+				smishingYn = "N";
+				delayYn = "N";
 
-                mjonMsgVO.setDelayYn("N");//일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임
-            }
+			}
 
-        }else {//즉시발송의 경우 현재 시간으로 입력해 준다.
+			if (!mjonMsgVO.getReserveYn().equals("N")) {// 예약문자인 경우 시간 셋팅
 
-            Date now = new Date();
-            if(spamStatus.equals("Y") || smishingYn.equals("Y")) {//스팸 문자가 포함되었거나, 스미싱 의심 회원의 경우 문자발송 시간을 30분 딜레이 시킨다.
+				Date toDate = transFormat.parse(mjonMsgVO.getReqDate());
+				cal.setTime(toDate); // 예약 시간 캘린터 변수에 입력
 
-                String nowDate = transFormat.format(now);
-                Date toDate = transFormat.parse(nowDate);
-                System.out.println("++++++++++++++++++++ origin reqDate ::: "+toDate);
-                cal.setTime(toDate);
+				// String 타입 시간 Int로 변환
+				turmMin = Integer.parseInt(mjonMsgVO.getDivideTime()); // 분할발송 시간 간격
+				dividDay = transFormat.format(cal.getTime());
 
-                cal.add(Calendar.MINUTE, 30);
-                delayTime = transFormat.format(cal.getTime());
-                mjonMsgVO.setReqDate(delayTime);
-                System.out.println("++++++++++++++++++++ delay reqDate ::: "+mjonMsgVO.getReqDate());
-                delayYn = "Y";
-                mjonMsgVO.setDelayYn(delayYn);//문자 발송 30분 지연 코드 셋팅
+				totalCallCnt = mjonMsgVO.getCallToList().length; // 수신자 전체 갯수
+				divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt()); // 분할 발송 갯수
 
-            }else {//정상적인 문자인 경우 즉시발송 처리해준다.
+				if (spamStatus.equals("Y") || smishingYn.equals("Y")) {
 
-                mjonMsgVO.setReqDate(transFormat.format(now));
-                mjonMsgVO.setDelayYn(delayYn);//문자 발송 30분 지연 디폴트 값 셋팅(N)
+					mjonMsgVO.setDelayYn("Y");// 일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임, 원래는 스팸이면 Y로
+												// 넣어줘야한다.
 
-            }
+				} else {
 
-        }
+					mjonMsgVO.setDelayYn("N");// 일단 값만 등록해준다. 이거 안해주면 NULL 값으로 들어간다. 차후에 변경하도록 할 예정임
+				}
 
+			} else {// 즉시발송의 경우 현재 시간으로 입력해 준다.
 
-        String[] nameList = mjonMsgVO.getNameList();	//치환 이름 리스트
-        String[] phoneList = mjonMsgVO.getCallToList();	//받는사람 연락처 리스트
-        String[] rep1 = mjonMsgVO.getRep1List();		//치환 문자1 리스트
-        String[] rep2 = mjonMsgVO.getRep2List();		//치환 문자2 리스트
-        String[] rep3 = mjonMsgVO.getRep3List();		//치환 문자3 리스트
-        String[] rep4 = mjonMsgVO.getRep4List();		//치환 문자4 리스트
+				Date now = new Date();
+				if (spamStatus.equals("Y") || smishingYn.equals("Y")) {// 스팸 문자가 포함되었거나, 스미싱 의심 회원의 경우 문자발송 시간을 30분 딜레이
+																		// 시킨다.
 
-        //Controller에서 전달 받은 분할 시간 정보 리스트
-        List<String> dividDayList = mjonMsgVO.getDividDay();
+					String nowDate = transFormat.format(now);
+					Date toDate = transFormat.parse(nowDate);
+					System.out.println("++++++++++++++++++++ origin reqDate ::: " + toDate);
+					cal.setTime(toDate);
 
-        String frstDelayTime = mjonMsgVO.getReqDate();
-        //문자발송 리스트 생성 시작
-        for(int i = 0; i < callToCnt; i++) {
+					cal.add(Calendar.MINUTE, 30);
+					delayTime = transFormat.format(cal.getTime());
+					mjonMsgVO.setReqDate(delayTime);
+					System.out.println("++++++++++++++++++++ delay reqDate ::: " + mjonMsgVO.getReqDate());
+					delayYn = "Y";
+					mjonMsgVO.setDelayYn(delayYn);// 문자 발송 30분 지연 코드 셋팅
 
-            Boolean blockSts = false;
-            for(int j = 0; j < usrBlockCnt; j++) {
+				} else {// 정상적인 문자인 경우 즉시발송 처리해준다.
 
-                if(phoneList[i].equals(dupliBlockList.get(j).toString())) {
+					mjonMsgVO.setReqDate(transFormat.format(now));
+					mjonMsgVO.setDelayYn(delayYn);// 문자 발송 30분 지연 디폴트 값 셋팅(N)
 
-                    blockCnt++; //수신 차단 카운드를 해준다.
-                    blockSts = true;
+				}
 
-                }
+			}
 
-            }
+			String[] nameList = mjonMsgVO.getNameList(); // 치환 이름 리스트
+			String[] phoneList = mjonMsgVO.getCallToList(); // 받는사람 연락처 리스트
+			String[] rep1 = mjonMsgVO.getRep1List(); // 치환 문자1 리스트
+			String[] rep2 = mjonMsgVO.getRep2List(); // 치환 문자2 리스트
+			String[] rep3 = mjonMsgVO.getRep3List(); // 치환 문자3 리스트
+			String[] rep4 = mjonMsgVO.getRep4List(); // 치환 문자4 리스트
 
-            if(!blockSts) { //수신거부가 아니면 추가
+			// Controller에서 전달 받은 분할 시간 정보 리스트
+			List<String> dividDayList = mjonMsgVO.getDividDay();
 
-                MjonMsgVO tempVO = new MjonMsgVO();
+			String frstDelayTime = mjonMsgVO.getReqDate();
+			// 문자발송 리스트 생성 시작
+			for (int i = 0; i < callToCnt; i++) {
 
-                /**
-                 * Agent 추가시 셋팅하기
-                 *
-                 * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03)
-                 * 22.10.12 : 비즈뿌리오(04) 추가
-                 * 23.04.10 : 제이제이(05) 추가
-                 * 23.05.02 : 인비토 (07) 추가
-                 * 23.05.09 : 회원 전용 전송사 정보가 있으면 모든 문자를 전용 전송사로 발송처리함.
-                 * */
+				Boolean blockSts = false;
+				for (int j = 0; j < usrBlockCnt; j++) {
 
-                if(hotlineAgentCode.equals("00")) {//전용 전송사가 사용 안함인 경우 분배 및 대표 전송사로 설정
+					if (phoneList[i].equals(dupliBlockList.get(j).toString())) {
 
-                    if(iheartCnt > 0) {
-                        agentCode = "01";
-                        tempVO.setAgentCode(agentCode);
-                        iheartCnt--;
-                    }else if(hncCnt > 0) {
-                        agentCode = "02";
-                        tempVO.setAgentCode(agentCode);
-                        hncCnt--;
-                    }else if(imoCnt > 0) {
-                        agentCode = "03";
-                        tempVO.setAgentCode(agentCode);
-                        imoCnt--;
-                    }else if(bizCnt > 0) {
-                        agentCode = "04";
-                        tempVO.setAgentCode(agentCode);
-                        bizCnt--;
-                    }else if(jjCnt > 0) {
-                        agentCode = "05";
-                        tempVO.setAgentCode(agentCode);
-                        jjCnt--;
-                    }else if(ivtCnt > 0) {
-                        agentCode = "07";
-                        tempVO.setAgentCode(agentCode);
-                        ivtCnt--;
-                    }else {//전송사 Agent 대표 전송사로 지정한다.
+						blockCnt++; // 수신 차단 카운드를 해준다.
+						blockSts = true;
 
-                        agentCode = sendRateList.get(0).getRepAgent();
-                        tempVO.setAgentCode(agentCode);
-                    }
+					}
 
-                }else {//전용 전송사가 지정되어 있는 경우 전용 전송사로 지정
+				}
 
-                    agentCode = hotlineAgentCode;
-                    tempVO.setAgentCode(hotlineAgentCode);
-                }
-                //Agent 셋팅 끝
+				if (!blockSts) { // 수신거부가 아니면 추가
 
-                tempVO.setMsgId(idgenMsgId.getNextStringId());
-                tempVO.setUserId(mjonMsgVO.getUserId());
-                tempVO.setCallTo(phoneList[i]);
-                tempVO.setCallFrom(mjonMsgVO.getCallFrom());
-                tempVO.setMsgType(mjonMsgVO.getMsgType());
-                tempVO.setMsgGroupId(mjonMsgVO.getMsgGroupId());
-                tempVO.setMsgCnt(mjonMsgVO.getMsgCnt());
+					MjonMsgVO tempVO = new MjonMsgVO();
 
-                //아이엠오 전송사 문자 타입 설정해 주기
-                if(agentCode.equals("03")) {
+					/**
+					 * Agent 추가시 셋팅하기
+					 *
+					 * 최초 : 아이하트(01), 현대 퓨쳐넷(02), 아이앰오(03) 22.10.12 : 비즈뿌리오(04) 추가 23.04.10 :
+					 * 제이제이(05) 추가 23.05.02 : 인비토 (07) 추가 23.05.09 : 회원 전용 전송사 정보가 있으면 모든 문자를 전용
+					 * 전송사로 발송처리함.
+					 */
 
-                    // 단순 장문 문자는 neoType : 2, 그림 포함 : 4
-                    if(mjonMsgVO.getFileCnt().equals("0")) { // 단순 장문 문자
+					if (hotlineAgentCode.equals("00")) {// 전용 전송사가 사용 안함인 경우 분배 및 대표 전송사로 설정
 
-                        mjonMsgVO.setNeoType("2");
+						if (iheartCnt > 0) {
+							agentCode = "01";
+							tempVO.setAgentCode(agentCode);
+							iheartCnt--;
+						} else if (hncCnt > 0) {
+							agentCode = "02";
+							tempVO.setAgentCode(agentCode);
+							hncCnt--;
+						} else if (imoCnt > 0) {
+							agentCode = "03";
+							tempVO.setAgentCode(agentCode);
+							imoCnt--;
+						} else if (bizCnt > 0) {
+							agentCode = "04";
+							tempVO.setAgentCode(agentCode);
+							bizCnt--;
+						} else if (jjCnt > 0) {
+							agentCode = "05";
+							tempVO.setAgentCode(agentCode);
+							jjCnt--;
+						} else if (ivtCnt > 0) {
+							agentCode = "07";
+							tempVO.setAgentCode(agentCode);
+							ivtCnt--;
+						} else {// 전송사 Agent 대표 전송사로 지정한다.
 
-                    }else{ // 그림포함 문자인경우
+							agentCode = sendRateList.get(0).getRepAgent();
+							tempVO.setAgentCode(agentCode);
+						}
 
-                        mjonMsgVO.setNeoType("4");
+					} else {// 전용 전송사가 지정되어 있는 경우 전용 전송사로 지정
 
-                    }
+						agentCode = hotlineAgentCode;
+						tempVO.setAgentCode(hotlineAgentCode);
+					}
+					// Agent 셋팅 끝
 
-                }
+					tempVO.setMsgId(idgenMsgId.getNextStringId());
+					tempVO.setUserId(mjonMsgVO.getUserId());
+					tempVO.setCallTo(phoneList[i]);
+					tempVO.setCallFrom(mjonMsgVO.getCallFrom());
+					tempVO.setMsgType(mjonMsgVO.getMsgType());
+					tempVO.setMsgGroupId(mjonMsgVO.getMsgGroupId());
+					tempVO.setMsgCnt(mjonMsgVO.getMsgCnt());
 
-                //문자내용 내용 - 치환 처리
-                String smsTxt = mjonMsgVO.getSmsTxt();		//발송 문자 내용
+					// 아이엠오 전송사 문자 타입 설정해 주기
+					if (agentCode.equals("03")) {
 
-                //일괄변환문자 리스트에서 콤마(,)를 특수문자(§)로 변환해서 넘겨받기 때문에 치환 처리를 해준도록 한다.
-                smsTxt = smsTxt.replaceAll(String.valueOf((char)13), "");
-                 if (smsTxt.indexOf("[*이름*]") > -1) {
-                     if(nameList.length > i && StringUtil.isNotEmpty(nameList[i])) {
-                         smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", StringUtil.getString(nameList[i].replaceAll("§", ",")));
-                     }else {
-                         smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", "");
-                     }
-                 }
+						// 단순 장문 문자는 neoType : 2, 그림 포함 : 4
+						if (mjonMsgVO.getFileCnt().equals("0")) { // 단순 장문 문자
 
-                if (smsTxt.indexOf("[*1*]") > -1) {
-                    if(rep1.length > i && StringUtil.isNotEmpty(rep1[i])) {
-                        smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", StringUtil.getString(rep1[i].replaceAll("§", ",")));
-                    }else {
-                        smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", "");
-                    }
-                }
+							mjonMsgVO.setNeoType("2");
 
-                if (smsTxt.indexOf("[*2*]") > -1) {
-                    if(rep2.length > i && StringUtil.isNotEmpty(rep2[i])) {
-                        smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", StringUtil.getString(rep2[i].replaceAll("§", ",")));
-                    }else {
-                        smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", "");
-                    }
-                }
+						} else { // 그림포함 문자인경우
 
-                if (smsTxt.indexOf("[*3*]") > -1) {
-                    if(rep3.length > i && StringUtil.isNotEmpty(rep3[i])) {
-                        smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", StringUtil.getString(rep3[i].replaceAll("§", ",")));
-                    }else {
-                        smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", "");
-                    }
-                }
+							mjonMsgVO.setNeoType("4");
 
-                if (smsTxt.indexOf("[*4*]") > -1) {
-                    if(rep4.length > i && StringUtil.isNotEmpty(rep4[i])) {
-                        smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", StringUtil.getString(rep4[i].replaceAll("§", ",")));
-                    }else {
-                        smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", "");
-                    }
-                }
+						}
 
-                tempVO.setSmsTxt(smsTxt);
+					}
 
-                //즉시 / 예약 전송 처리
-                if(mjonMsgVO.getReserveYn().equals("N")) {//즉시 전송의 경우 현재 시간을 입력
+					// 문자내용 내용 - 치환 처리
+					String smsTxt = mjonMsgVO.getSmsTxt(); // 발송 문자 내용
 
-                    if(spamStatus.equals("Y") || smishingYn.equals("Y")) {//스팸문자가 있거나, 스미싱 의심 회원의 경우 30분 지연시간을 입력해 준다.
+					// 일괄변환문자 리스트에서 콤마(,)를 특수문자(§)로 변환해서 넘겨받기 때문에 치환 처리를 해준도록 한다.
+					smsTxt = smsTxt.replaceAll(String.valueOf((char) 13), "");
+					if (smsTxt.indexOf("[*이름*]") > -1) {
+						if (nameList.length > i && StringUtil.isNotEmpty(nameList[i])) {
+							smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]",
+									StringUtil.getString(nameList[i].replaceAll("§", ",")));
+						} else {
+							smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", "");
+						}
+					}
 
-                        tempVO.setReqDate(mjonMsgVO.getReqDate());//상단에서 스팸문구가 있는겨우 30분 딜레이시간을 입력해 두었기 때문에 같은 데이터를 입력함.
+					if (smsTxt.indexOf("[*1*]") > -1) {
+						if (rep1.length > i && StringUtil.isNotEmpty(rep1[i])) {
+							smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]",
+									StringUtil.getString(rep1[i].replaceAll("§", ",")));
+						} else {
+							smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", "");
+						}
+					}
 
+					if (smsTxt.indexOf("[*2*]") > -1) {
+						if (rep2.length > i && StringUtil.isNotEmpty(rep2[i])) {
+							smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]",
+									StringUtil.getString(rep2[i].replaceAll("§", ",")));
+						} else {
+							smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", "");
+						}
+					}
 
-                    }else {//일반 문자인 경우 현재시간을 입력해 준다.
+					if (smsTxt.indexOf("[*3*]") > -1) {
+						if (rep3.length > i && StringUtil.isNotEmpty(rep3[i])) {
+							smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]",
+									StringUtil.getString(rep3[i].replaceAll("§", ",")));
+						} else {
+							smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", "");
+						}
+					}
 
-                        Date now = new Date();
-                        SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
-                        tempVO.setReqDate(sdFormat.format(now));
+					if (smsTxt.indexOf("[*4*]") > -1) {
+						if (rep4.length > i && StringUtil.isNotEmpty(rep4[i])) {
+							smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]",
+									StringUtil.getString(rep4[i].replaceAll("§", ",")));
+						} else {
+							smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", "");
+						}
+					}
 
-                    }
+					tempVO.setSmsTxt(smsTxt);
 
-                }else { // 예약 발송의 경우 예약 시간을 입력
+					// 즉시 / 예약 전송 처리
+					if (mjonMsgVO.getReserveYn().equals("N")) {// 즉시 전송의 경우 현재 시간을 입력
 
-                    //분할 발송을 체크 한 경우
-                    if(mjonMsgVO.getDivideChk() != null) {
+						if (spamStatus.equals("Y") || smishingYn.equals("Y")) {// 스팸문자가 있거나, 스미싱 의심 회원의 경우 30분 지연시간을 입력해
+																				// 준다.
 
-                        //스팸문구 혹은 스미싱 의심 회원의 경우 30분 딜레이 처리해준다.
-                        //20230630 우영두 추가
-                        if(spamStatus.equals("Y") || smishingYn.equals("Y")) {
+							tempVO.setReqDate(mjonMsgVO.getReqDate());// 상단에서 스팸문구가 있는겨우 30분 딜레이시간을 입력해 두었기 때문에 같은 데이터를
+																		// 입력함.
 
-                            Date delayDate = transFormat.parse(dividDayList.get(i));
+						} else {// 일반 문자인 경우 현재시간을 입력해 준다.
 
-                            cal.setTime(delayDate);
-                            cal.add(Calendar.MINUTE, 30);
-                            delayTime = transFormat.format(cal.getTime());
+							Date now = new Date();
+							SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+							tempVO.setReqDate(sdFormat.format(now));
 
-                            tempVO.setReqDate(delayTime); //분할 문자 예약 시간 입력해주기
+						}
 
-                        }else {
+					} else { // 예약 발송의 경우 예약 시간을 입력
 
-                            tempVO.setReqDate(dividDayList.get(i)); //분할 문자 예약 시간 입력해주기
+						// 분할 발송을 체크 한 경우
+						if (mjonMsgVO.getDivideChk() != null) {
 
-                        }
+							// 스팸문구 혹은 스미싱 의심 회원의 경우 30분 딜레이 처리해준다.
+							// 20230630 우영두 추가
+							if (spamStatus.equals("Y") || smishingYn.equals("Y")) {
 
+								Date delayDate = transFormat.parse(dividDayList.get(i));
 
-                    }else {//일반 예약 발송의 경우
+								cal.setTime(delayDate);
+								cal.add(Calendar.MINUTE, 30);
+								delayTime = transFormat.format(cal.getTime());
 
-                        if(spamStatus.equals("Y") || smishingYn.equals("Y")) {//스팸문구 혹은 스미싱 의심 회원의 경우 30분 딜레이 처리해준다.
+								tempVO.setReqDate(delayTime); // 분할 문자 예약 시간 입력해주기
 
-                            Date delayDate = transFormat.parse(mjonMsgVO.getReqDate());
+							} else {
 
-                            cal.setTime(delayDate);
-                            cal.add(Calendar.MINUTE, 30);
-                            delayTime = transFormat.format(cal.getTime());
+								tempVO.setReqDate(dividDayList.get(i)); // 분할 문자 예약 시간 입력해주기
 
-                            tempVO.setReqDate(delayTime);
+							}
 
-                        }else {
+						} else {// 일반 예약 발송의 경우
 
-                            tempVO.setReqDate(mjonMsgVO.getReqDate());
+							if (spamStatus.equals("Y") || smishingYn.equals("Y")) {// 스팸문구 혹은 스미싱 의심 회원의 경우 30분 딜레이
+																					// 처리해준다.
 
-                        }
+								Date delayDate = transFormat.parse(mjonMsgVO.getReqDate());
 
-                    }
+								cal.setTime(delayDate);
+								cal.add(Calendar.MINUTE, 30);
+								delayTime = transFormat.format(cal.getTime());
 
-                    //딜레이 처리되었을 수 있어서 임시 데이터의 발송 시간을 업데이트 해준다.
-                    //분할 발송일 경우 Loop을 돌기 때문에 마지막 시간이 reqDate에 들어가기 때문에 첫번째 데이터에서만 시간을 입력해 준다.
-                    //mj_group_data 테이블의 reqdate 컬럼 값으로 셋팅 된다.
-                    if(i==0) {
-                        frstDelayTime = tempVO.getReqDate();
-                    }
-                }
+								tempVO.setReqDate(delayTime);
 
-                if(!msgType.equals("4")) { // 장문 혹은 그림문자일 경우 추가
+							} else {
 
-                    /**
-                     * 장문 / 그림문자 일 경우 제목 처리
-                     * 만약 제목을 입력하지 않았을 경우 문자 내용의 텍스트 일부를 제목으로 사용
-                     * 내용 텍스트가 없는 경우는 어쩔수 없는 것으로 간주하여 Null로 처리한다.
-                     *
-                     * */
-                    String contents = tempVO.getSmsTxt();	//문자 내용
-                    if(StringUtil.isEmpty(mjonMsgVO.getMmsSubject()) || mjonMsgVO.getMmsSubject() == null) {// 제목 입력이 없는 경우
+								tempVO.setReqDate(mjonMsgVO.getReqDate());
 
-                        if(StringUtil.isNotEmpty(contents) && contents != null) {//문자내용이 있는 경우 처리
+							}
 
-                            String[] split = contents.split("\n");
+						}
 
-                            if(split.length > 0) {
+						// 딜레이 처리되었을 수 있어서 임시 데이터의 발송 시간을 업데이트 해준다.
+						// 분할 발송일 경우 Loop을 돌기 때문에 마지막 시간이 reqDate에 들어가기 때문에 첫번째 데이터에서만 시간을 입력해 준다.
+						// mj_group_data 테이블의 reqdate 컬럼 값으로 셋팅 된다.
+						if (i == 0) {
+							frstDelayTime = tempVO.getReqDate();
+						}
+					}
 
-                                String subject = "";
-                                String msgKind = mjonMsgVO.getMsgKind();//문자 타입(일반, 광고, 선거문자)
+					if (!msgType.equals("4")) { // 장문 혹은 그림문자일 경우 추가
 
-                                //선거문자인 경우 첫 글내용이 "(선거운동정보)"로 되어있어서 그 다음줄의 내용을 제목으로 사용
-                                /*if(subject.equals("(선거운동정보)")) {
-                                    subject = split[1].trim();
-                                }*/
+						/**
+						 * 장문 / 그림문자 일 경우 제목 처리 만약 제목을 입력하지 않았을 경우 문자 내용의 텍스트 일부를 제목으로 사용 내용 텍스트가 없는 경우는
+						 * 어쩔수 없는 것으로 간주하여 Null로 처리한다.
+						 *
+						 */
+						String contents = tempVO.getSmsTxt(); // 문자 내용
+						if (StringUtil.isEmpty(mjonMsgVO.getMmsSubject()) || mjonMsgVO.getMmsSubject() == null) {// 제목
+																													// 입력이
+																													// 없는
+																													// 경우
 
-                                if(msgKind.equals("C")) {
-                                    if(split.length > 1) {
-                                        subject = split[1].trim();
-                                    }else {
-                                        subject = split[0].substring(0,20);
-                                    }
-                                }else {
-                                    subject = split[0].trim();
-                                }
+							if (StringUtil.isNotEmpty(contents) && contents != null) {// 문자내용이 있는 경우 처리
 
-                                //제목 글자수 20글자로 제한.
-                                /*if(subject.length() > 20) {
-                                    subject = subject.substring(0,20);
-                                }
-                                tempVO.setMmsSubject(subject);
-                                mjonMsgVO.setMmsSubject(subject);
-                                */
+								String[] split = contents.split("\n");
 
-                            }
+								if (split.length > 0) {
 
-                        }
+									String subject = "";
+									String msgKind = mjonMsgVO.getMsgKind();// 문자 타입(일반, 광고, 선거문자)
 
-                    }else {// 제목 입력이 있는 경우 입력한 제목으로 셋팅
-                        tempVO.setMmsSubject(mjonMsgVO.getMmsSubject());
-                    }
+									// 선거문자인 경우 첫 글내용이 "(선거운동정보)"로 되어있어서 그 다음줄의 내용을 제목으로 사용
+									/*
+									 * if(subject.equals("(선거운동정보)")) { subject = split[1].trim(); }
+									 */
 
-                    tempVO.setFileCnt(mjonMsgVO.getFileCnt());
-                    tempVO.setFileName1(mjonMsgVO.getFileName1());
-                    tempVO.setFileName2(mjonMsgVO.getFileName2());
-                    tempVO.setFileName3(mjonMsgVO.getFileName3());
-                    tempVO.setNeoType(mjonMsgVO.getNeoType());
-                    tempVO.setContSeq(mjonMsgVO.getContSeq());
+									if (msgKind.equals("C")) {
+										if (split.length > 1) {
+											subject = split[1].trim();
+										} else {
+											subject = split[0].substring(0, 20);
+										}
+									} else {
+										subject = split[0].trim();
+									}
 
-                }
+									// 제목 글자수 20글자로 제한.
+									/*
+									 * if(subject.length() > 20) { subject = subject.substring(0,20); }
+									 * tempVO.setMmsSubject(subject); mjonMsgVO.setMmsSubject(subject);
+									 */
 
-                //아이하트 전송사의 LMS(장문) / MMS(그림문자) 전송시 컨텐츠 번호 받아오기 먼저 처리
-                if(agentCode.equals("01") && msgType.equals("6")) {
+								}
 
-                    // 아이하트 MMS Contents 테이블에 입력 후 컨텐츠 아이디 받아오기
+							}
 
-                    //이미지가 있는경우 file_type, file_Cnt 값 셋팅
-                    int fileCnt = Integer.parseInt(mjonMsgVO.getFileCnt());
-                    String contents = mjonMsgVO.getSmsTxt();
+						} else {// 제목 입력이 있는 경우 입력한 제목으로 셋팅
+							tempVO.setMmsSubject(mjonMsgVO.getMmsSubject());
+						}
 
-                    if(fileCnt > 0) {
-                        tempVO.setFileType1("IMG");	//아이하트 그림문자 전송시 파일종류 이미지로 셋팅
+						tempVO.setFileCnt(mjonMsgVO.getFileCnt());
+						tempVO.setFileName1(mjonMsgVO.getFileName1());
+						tempVO.setFileName2(mjonMsgVO.getFileName2());
+						tempVO.setFileName3(mjonMsgVO.getFileName3());
+						tempVO.setNeoType(mjonMsgVO.getNeoType());
+						tempVO.setContSeq(mjonMsgVO.getContSeq());
 
-                        //그림문자일 경우 이미지 갯수 + 1을 해줘야한다. (+1은 컨텐츠 내용을 의미한다.)
-                        if(StringUtil.isNotEmpty(contents)) {
-                            fileCnt = fileCnt + 1;
-                        }
-                        tempVO.setFileCnt(Integer.toString(fileCnt));
+					}
 
-                    }else {
-                        tempVO.setFileCnt("1");
-                    }
+					// 아이하트 전송사의 LMS(장문) / MMS(그림문자) 전송시 컨텐츠 번호 받아오기 먼저 처리
+					if (agentCode.equals("01") && msgType.equals("6")) {
 
-                     contSeq = mjonMsgDataDAO.insertIHeartMmsMsgContentsInfo(tempVO);
-                     mjonMsgVO.setContSeq(contSeq);
-                    tempVO.setSmsTxt(smsTxt);
-                    tempVO.setContSeq(contSeq);
+						// 아이하트 MMS Contents 테이블에 입력 후 컨텐츠 아이디 받아오기
 
-                }
+						// 이미지가 있는경우 file_type, file_Cnt 값 셋팅
+						int fileCnt = Integer.parseInt(mjonMsgVO.getFileCnt());
+						String contents = mjonMsgVO.getSmsTxt();
 
-                //문자 내용 추가해 주기
-                msgDataInfo.add(tempVO);
+						if (fileCnt > 0) {
+							tempVO.setFileType1("IMG"); // 아이하트 그림문자 전송시 파일종류 이미지로 셋팅
 
-            }//수신거부 처리로직 끝
+							// 그림문자일 경우 이미지 갯수 + 1을 해줘야한다. (+1은 컨텐츠 내용을 의미한다.)
+							if (StringUtil.isNotEmpty(contents)) {
+								fileCnt = fileCnt + 1;
+							}
+							tempVO.setFileCnt(Integer.toString(fileCnt));
 
-            int instCnt = 0;
-            //지금까지 루프 돌아간 것이 전체 수신자 갯수와 같으면 추가가 완료된 것으로 판단 되어 전송 해줌
-            if(totCnt == callToCnt) {
+						} else {
+							tempVO.setFileCnt("1");
+						}
 
-                if(msgDataInfo.size() > 0) {
+						contSeq = mjonMsgDataDAO.insertIHeartMmsMsgContentsInfo(tempVO);
+						mjonMsgVO.setContSeq(contSeq);
+						tempVO.setSmsTxt(smsTxt);
+						tempVO.setContSeq(contSeq);
 
-                    //데이터 디비 입력해주기
-                    instCnt = mjonMsgDataDAO.insertMsgDataInfo(msgDataInfo, msgType, agentCode);
+					}
 
-                }
+					// 문자 내용 추가해 주기
+					msgDataInfo.add(tempVO);
 
-                //총 디비 입력 건수 저장하기
-                resultCnt = resultCnt + instCnt;
+				} // 수신거부 처리로직 끝
 
-            }else {
+				int instCnt = 0;
+				// 지금까지 루프 돌아간 것이 전체 수신자 갯수와 같으면 추가가 완료된 것으로 판단 되어 전송 해줌
+				if (totCnt == callToCnt) {
 
-                //특정 건수 이상일 경우 분할해서 디비에 넣어준다.
-                if(cnt == limitCnt) {
+					if (msgDataInfo.size() > 0) {
 
-                    if(msgDataInfo.size() > 0) {
+						// 데이터 디비 입력해주기
+						instCnt = mjonMsgDataDAO.insertMsgDataInfo(msgDataInfo, msgType, agentCode);
 
-                        //분할 최대건수가 되면 디비에 입력하기
-                        instCnt = mjonMsgDataDAO.insertMsgDataInfo(msgDataInfo, msgType, agentCode);
+					}
 
-                    }
+					// 총 디비 입력 건수 저장하기
+					resultCnt = resultCnt + instCnt;
 
-                    //총 디비 입력 건수 저장하기
-                    resultCnt = resultCnt + instCnt;
-                    cnt = 0;
+				} else {
 
-                    //List 초기화 하기
-                    msgDataInfo.clear();
+					// 특정 건수 이상일 경우 분할해서 디비에 넣어준다.
+					if (cnt == limitCnt) {
 
-                }
+						if (msgDataInfo.size() > 0) {
 
-            }
+							// 분할 최대건수가 되면 디비에 입력하기
+							instCnt = mjonMsgDataDAO.insertMsgDataInfo(msgDataInfo, msgType, agentCode);
 
-            cnt++;
-            totCnt++;
+						}
 
-        }
+						// 총 디비 입력 건수 저장하기
+						resultCnt = resultCnt + instCnt;
+						cnt = 0;
 
-        /*
-         * 각 처리 건별로 캐시 차감 및 그룹 데이터 정보 업데이트
-         * 1. 디비에 입력한 건수만큼 캐시 차감 및 회원 캐시 정보 업데이트
-         * 2. 그룹데이터에 처리 건수 업데이트(총 발송건수 합산 정보 업데이트)
-         *
-         * */
+						// List 초기화 하기
+						msgDataInfo.clear();
 
-        //문자 발송 캐시 차감 해주기
-        MjonPayVO mjonPayVO = new MjonPayVO();
+					}
 
-        /*if(resultCnt > 0 && blockCnt > 0) {
+				}
 
-            Float blockPrice = Float.parseFloat(mjonMsgVO.getEachPrice()) * blockCnt;
-            Float resultTotPrice = Float.parseFloat(mjonMsgVO.getTotPrice());
-            Float endPrice = resultTotPrice - blockPrice;
+				cnt++;
+				totCnt++;
 
-            mjonMsgVO.setTotPrice(Float.toString(endPrice));
+			}
 
-            //수신거부가 있는 경우 총 건수에서 수신거부 건수를 차감 후 그룹 테이블에 업데이트 해준다.
-            int groupCnt = resultCnt;
-            mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt));
+			/*
+			 * 각 처리 건별로 캐시 차감 및 그룹 데이터 정보 업데이트 1. 디비에 입력한 건수만큼 캐시 차감 및 회원 캐시 정보 업데이트 2.
+			 * 그룹데이터에 처리 건수 업데이트(총 발송건수 합산 정보 업데이트)
+			 *
+			 */
 
-            //mjonMsgDAO.updateGroupMsgData(mjonMsgVO);
+			// 문자 발송 캐시 차감 해주기
+			MjonPayVO mjonPayVO = new MjonPayVO();
 
-        }*/
+			/*
+			 * if(resultCnt > 0 && blockCnt > 0) {
+			 * 
+			 * Float blockPrice = Float.parseFloat(mjonMsgVO.getEachPrice()) * blockCnt;
+			 * Float resultTotPrice = Float.parseFloat(mjonMsgVO.getTotPrice()); Float
+			 * endPrice = resultTotPrice - blockPrice;
+			 * 
+			 * mjonMsgVO.setTotPrice(Float.toString(endPrice));
+			 * 
+			 * //수신거부가 있는 경우 총 건수에서 수신거부 건수를 차감 후 그룹 테이블에 업데이트 해준다. int groupCnt =
+			 * resultCnt; mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt));
+			 * 
+			 * //mjonMsgDAO.updateGroupMsgData(mjonMsgVO);
+			 * 
+			 * }
+			 */
 
-        //1건 이상 발송이 있는 경우만 캐쉬를 차감 시킨다.
-        if(resultCnt > 0) {
+			// 1건 이상 발송이 있는 경우만 캐쉬를 차감 시킨다.
+			if (resultCnt > 0) {
 
-            int totSendCnt = mjonMsgVO.getTotalCallCnt();
-            Float eachPrice = Float.parseFloat(mjonMsgVO.getEachPrice());
-            Float totPrice = eachPrice * resultCnt;
-            String strTotPrice = String.format("%.1f", totPrice);
+				int totSendCnt = mjonMsgVO.getTotalCallCnt();
+				Float eachPrice = Float.parseFloat(mjonMsgVO.getEachPrice());
+				Float totPrice = eachPrice * resultCnt;
+				String strTotPrice = String.format("%.1f", totPrice);
 
-            mjonMsgVO.setTotPrice(strTotPrice);//현재 합산 금액 셋팅
-            mjonPayVO.setCashId(idgenMjonCashId.getNextStringId());
-            mjonPayVO.setUserId(mjonMsgVO.getUserId());
-            mjonPayVO.setCash(-Float.parseFloat(strTotPrice));
-            mjonPayVO.setFrstRegisterId(mjonMsgVO.getUserId());
-            mjonPayVO.setMemo("SMS 문자 총 "+totSendCnt+"건 중 " + resultCnt + "건 발송");
-            mjonPayVO.setMsgGroupId(mjonMsgVO.getMsgGroupId());
+				mjonMsgVO.setTotPrice(strTotPrice);// 현재 합산 금액 셋팅
+				mjonPayVO.setCashId(idgenMjonCashId.getNextStringId());
+				mjonPayVO.setUserId(mjonMsgVO.getUserId());
+				mjonPayVO.setCash(-Float.parseFloat(strTotPrice));
+				mjonPayVO.setFrstRegisterId(mjonMsgVO.getUserId());
+				mjonPayVO.setMemo("SMS 문자 총 " + totSendCnt + "건 중 " + resultCnt + "건 발송");
+				mjonPayVO.setMsgGroupId(mjonMsgVO.getMsgGroupId());
 
-            mjonPayService.insertCash(mjonPayVO); //캐시차감
-            mjonPayService.updateMemberCash(mjonPayVO); //회원정보 업데이트
-        }
+				mjonPayService.insertCash(mjonPayVO); // 캐시차감
+				mjonPayService.updateMemberCash(mjonPayVO); // 회원정보 업데이트
+			}
 
-        //문자 발송 테이블에 입력 데이터가 있는 경우 그룹 테이블에도 입력 해 준다.
-        if(resultCnt > 0) {
+			// 문자 발송 테이블에 입력 데이터가 있는 경우 그룹 테이블에도 입력 해 준다.
+			if (resultCnt > 0) {
 
-            // 문자 전송 그룹 테이블에 정보 입력
-            int groupCnt = resultCnt;
-            mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt));
-            //mjonMsgService.insertGroupMsgData(mjonMsgVO);
-            int msgGroupDataCnt = mjonMsgDAO.selectMsgGroupDataCntByGroupId(mjonMsgVO);
+				// 문자 전송 그룹 테이블에 정보 입력
+				int groupCnt = resultCnt;
+				mjonMsgVO.setMsgGroupCnt(Integer.toString(groupCnt));
+				// mjonMsgService.insertGroupMsgData(mjonMsgVO);
+				int msgGroupDataCnt = mjonMsgDAO.selectMsgGroupDataCntByGroupId(mjonMsgVO);
 
-            //메세지 그룹 데이터가 없으면 추가 해주고 있으면 총메세지 건수를 합산해준다.
-            if(msgGroupDataCnt < 1) {
-                mjonMsgVO.setAgentCode(agentCode);//전송사 코드 번호를 셋팅해 준다.
+				// 메세지 그룹 데이터가 없으면 추가 해주고 있으면 총메세지 건수를 합산해준다.
+				if (msgGroupDataCnt < 1) {
+					mjonMsgVO.setAgentCode(agentCode);// 전송사 코드 번호를 셋팅해 준다.
 
-                //지연 유무 코드가 Null 인경우 체크
-                String tmpDelayYn = mjonMsgVO.getDelayYn();
-                if(tmpDelayYn == null) {
-                    mjonMsgVO.setDelayYn("N");
-                }
+					// 지연 유무 코드가 Null 인경우 체크
+					String tmpDelayYn = mjonMsgVO.getDelayYn();
+					if (tmpDelayYn == null) {
+						mjonMsgVO.setDelayYn("N");
+					}
 
-                //예약 문자이고 30분 지연이 된 문자의 Mj_msg_group_data 테이블의 req_date 시간을 첫번째 문자의 지연된 시간으로 셋팅해준다.
-                if(mjonMsgVO.getReserveYn().equals("Y") && (spamStatus.equals("Y") || smishingYn.equals("Y"))) {
+					// 예약 문자이고 30분 지연이 된 문자의 Mj_msg_group_data 테이블의 req_date 시간을 첫번째 문자의 지연된 시간으로
+					// 셋팅해준다.
+					if (mjonMsgVO.getReserveYn().equals("Y") && (spamStatus.equals("Y") || smishingYn.equals("Y"))) {
 
-                    mjonMsgVO.setReqDate(frstDelayTime);
+						mjonMsgVO.setReqDate(frstDelayTime);
 
-                }
-                mjonMsgDAO.insertGroupMsgData(mjonMsgVO);
+					}
+					mjonMsgDAO.insertGroupMsgData(mjonMsgVO);
 
-                try {
+					try {
 
-                    //야간 스미싱 알림이 활성화이고 알림 예외 일정에 포함되고 스팸 또는 스미싱 의심 상태일 경우 문자정보 별도 저장처리 - 20240821 우영두 추가
-                    if(holiSmishingNoti.equals("Y") && spamSmishingPassStatus && (mjonMsgVO.getSpamStatus().equals("Y") || mjonMsgVO.getSmishingYn().equals("Y"))) {
-                        mjonMsgDAO.insertSpamPassMsgData(mjonMsgVO);
-                    }
+						// 야간 스미싱 알림이 활성화이고 알림 예외 일정에 포함되고 스팸 또는 스미싱 의심 상태일 경우 문자정보 별도 저장처리 - 20240821
+						// 우영두 추가
+						if (holiSmishingNoti.equals("Y") && spamSmishingPassStatus
+								&& (mjonMsgVO.getSpamStatus().equals("Y") || mjonMsgVO.getSmishingYn().equals("Y"))) {
+							mjonMsgDAO.insertSpamPassMsgData(mjonMsgVO);
+						}
 
-                } catch (Exception e) {
-                    System.out.println("++++++++++++++++++++++++++++++ spamSmishingPassStatus 문자전송 야간 스미싱 알림 데이터 입력 오류 발생 !!!!");
-                }
+					} catch (Exception e) {
+						System.out.println(
+								"++++++++++++++++++++++++++++++ spamSmishingPassStatus 문자전송 야간 스미싱 알림 데이터 입력 오류 발생 !!!!");
+					}
 
-            }else {
-                mjonMsgDAO.updateMsgGroupDataForTotCntSum(mjonMsgVO);
-            }
+				} else {
+					mjonMsgDAO.updateMsgGroupDataForTotCntSum(mjonMsgVO);
+				}
 
-            //이벤트 회원 남은 캐시 업데이트
-            fnUpdateEventRemainCash(mjonPayVO);
+				// 이벤트 회원 남은 캐시 업데이트
+				fnUpdateEventRemainCash(mjonPayVO);
 
-        }
+			}
 
-        // 성공
-        returnVO.setSendMsgCnt(Integer.toString(resultCnt)); //발송 건수 저장
-        returnVO.setSendMsgBlockCnt(Integer.toString(blockCnt)); //수신차단 건수 저장
-        returnVO.setAgentCode(agentCode);
+			// 성공
+			returnVO.setSendMsgCnt(Integer.toString(resultCnt)); // 발송 건수 저장
+			returnVO.setSendMsgBlockCnt(Integer.toString(blockCnt)); // 수신차단 건수 저장
+			returnVO.setAgentCode(agentCode);
 
-        } catch (Exception e) {
-            // 실패
-            returnVO.setSendMsgCnt(Integer.toString(0)); //발송 건수 저장
-            returnVO.setSendMsgBlockCnt(Integer.toString(0)); //수신차단 건수 저장
-            returnVO.setAgentCode("01");
+		} catch (Exception e) {
+			// 실패
+			returnVO.setSendMsgCnt(Integer.toString(0)); // 발송 건수 저장
+			returnVO.setSendMsgBlockCnt(Integer.toString(0)); // 수신차단 건수 저장
+			returnVO.setAgentCode("01");
 
-            System.out.println("=========================================================================");
-            System.out.println("+++++++++++++++++++++++++++++ 문자발송 ==> insertMsgDataInfo ERROR !!! : " + e);
-            System.out.println("=========================================================================");
-            return returnVO;
+			System.out.println("=========================================================================");
+			System.out.println("+++++++++++++++++++++++++++++ 문자발송 ==> insertMsgDataInfo ERROR !!! : " + e);
+			System.out.println("=========================================================================");
+			return returnVO;
 
-        }
+		}
 
-        return returnVO;
+		return returnVO;
 
-    }
+	}
 
     //이벤트 회원 캐시 변경 함수
     public void fnUpdateEventRemainCash(MjonPayVO mjonPayVO) throws Exception{
@@ -3241,13 +3987,10 @@
     @Override
     public StatusResponse sendMsgData_advc(MjonMsgVO mjonMsgVO, HttpServletRequest request) throws Exception {
 
-		String resultSts = "0";
-		String resultBlockSts = "0";
-		String userId = "";
 		
 		
 		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
-		userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
 		
 		if(userId.equals("")) {
 			return new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용이 가능합니다.");
@@ -3314,13 +4057,12 @@
 				for(int i=0; i<path.length; i++) {
 				
 					if("Y".equals(templateYn[i])) {
-					    //템플릿 사용누계 증가
-					    letterDAO.updateTemplateUseCount(fileId[i]);
+						//템플릿 사용누계 증가
+						letterDAO.updateTemplateUseCount(fileId[i]);
 					}
 					
 					String imgFilePath = mjonMsgDAO.selectPhotoImgFileRealPath(fileId[i]);
-					
-					// 아이하트, 현대퓨쳐넷 두 중계사는 이미지 경로는 풀패스 경로로 넘겨주면 됨
+
 					switch (i) {
 						case 0:
 							mjonMsgVO.setFileName1(imgFilePath);
@@ -3347,21 +4089,9 @@
 
 		// 파일 갯수는 있는데 파일 경로가 없는 경우 문자발송이 안되도록 튕겨내도록 함 - 20220520 우영두
 		// 리펙토링 20240930 이호영
-		if(fileCount > 0) {
-			
-			//if(mjonMsgVO.getFileName1() == null && mjonMsgVO.getFileName2() == null && mjonMsgVO.getFileName3() == null) {
-
-			boolean allFilesAreNull = Stream.of(
-				mjonMsgVO.getFileName1(),
-				mjonMsgVO.getFileName2(),
-				mjonMsgVO.getFileName3()
-				).allMatch(Objects::isNull);
-			
-			if (allFilesAreNull) {
-				return new StatusResponse(HttpStatus.NO_CONTENT
-					, "문자 메세지 이미지 추가에 오류가 발생하여 문자 발송이 취소 되었습니다."
-					);
-			}
+		StatusResponse returnStatusResponse = MsgSendUtils.validateFilesForMessageSending(fileCount, mjonMsgVO);
+		if (returnStatusResponse != null) {
+			return returnStatusResponse;
 		}
 
 
@@ -3380,8 +4110,6 @@
 		//1.시스템 기본 단가 정보 불러오기
 		JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
 		
-		// 등급제 단가 추출 => 시스템 단가에 적용
-//		sysJoinSetVO = mberGrdService.selectMberGrdDefaultInfo(sysJoinSetVO, userId);
 		
 		//2.사용자 개인 단가 정보 불러오기
 		MberManageVO mberManageVO = mjonMsgDataDAO.selectMberManageInfo(userId);
@@ -3428,9 +4156,6 @@
 		// 토탈금액 "," 리플레이스 처리
 		mjonMsgVO.setTotPrice(mjonMsgVO.getTotPrice().replaceAll(",", ""));
 		
-		float tmpOrgEachPrice = Float.parseFloat(mjonMsgVO.getEachPrice());
-		float tmpOrgTotPrice = Float.parseFloat(mjonMsgVO.getTotPrice());
-		
 		// 각 문자 종류별 단가 설정
 		float tmpEachPrice = MsgSendUtils.determinePriceByMsgType(mjonMsgVO, shortPrice, longPrice, picturePrice, picture2Price, picture3Price);
 		mjonMsgVO.setEachPrice(Float.toString(tmpEachPrice));
@@ -3438,23 +4163,8 @@
 		// 수신자 총 수 * 단가를 통해 총 결제 금액 계산
 		int tmpTotCallCnt = mjonMsgVO.getCallToList().length;
 		float tmpTotPrice = tmpTotCallCnt * tmpEachPrice;
+		mjonMsgVO.setTotPrice(Float.toString(tmpTotPrice));
 		
-		// 화면에서 넘어온 파라미터 개별 단가와 컨트롤러에서 계산한 단가를 비교하여 맞지 않으면 컨트롤러 계산 단가 입력
-		if (tmpOrgEachPrice != tmpEachPrice) {
-		    mjonMsgVO.setEachPrice(Float.toString(tmpEachPrice));
-		    log.info("화면 : tmpOrgEachPrice ::: [{}]", tmpOrgEachPrice);
-		    log.info("컨트롤러 : tmpEachPrice ::: [{}]", tmpEachPrice);
-		} else {
-		    log.info("tmpOrgEachPrice ::: [{}]", tmpOrgEachPrice);
-		}
-		
-		if (tmpOrgTotPrice != tmpTotPrice) {
-		    mjonMsgVO.setTotPrice(Float.toString(tmpTotPrice));
-		    log.info("화면 : tmpOrgTotPrice ::: [{}]", tmpOrgTotPrice);
-		    log.info("컨트롤러 : tmpTotPrice ::: [{}]", tmpTotPrice);
-		} else {
-		    log.info("tmpOrgTotPrice ::: [{}]", tmpOrgTotPrice);
-		}
 		
 		
 		////////////////////////////////////////////////
@@ -3463,23 +4173,18 @@
 		StatusResponse statusResponse = new StatusResponse();
 		if (MsgSendUtils.isReplacementRequired(mjonMsgVO)) {
 			
-			if (!MsgSendUtils.isReplacementDataValid(mjonMsgVO)) {
-				return new StatusResponse(HttpStatus.BAD_REQUEST, "특정문구 일괄변환 치환문자 데이터가 없습니다.");
+			if (!MsgSendUtils.validateReplacementData(mjonMsgVO, statusResponse)) {
+				//특정문구 일괄변환 치환문자 데이터가 없습니다.
+				return statusResponse;  // 유효성 검사 실패 시 처리
 			}
-			
-			
-			if (!MsgSendUtils.checkReplacementDataValidity(mjonMsgVO, statusResponse)) {
-				return statusResponse;
-			}
-			
+
 			
 			
 			// 치환 문자 리스트 생성
 			ReplacementListsVO intiLists = MsgSendUtils.createReplacementLists(mjonMsgVO);
-			MsgSendUtils.populateReplacementLists(mjonMsgVO ,intiLists, statusResponse);
-			 // 에러가 발생했는지 상태를 확인
-			if (statusResponse.getStatus() == HttpStatus.BAD_REQUEST) {
-				// 에러 메시지 처리
+			if(!MsgSendUtils.populateReplacementLists(mjonMsgVO ,intiLists, statusResponse)) {;
+				//문자 치환 후 전송 문자 길이를 초과하였습니다.
+				//문자 치환 중 오류가 발생하였습니다.
 				return statusResponse;
 			}
 			
@@ -3496,755 +4201,312 @@
 	
 	
 	// 그림 문자 발송 처리 메서드
-	private StatusResponse processMessageSending(MjonMsgVO mjonMsgVO, ReplacementListsVO lists, StatusResponse statusResponse) {
+	private StatusResponse processMessageSending(MjonMsgVO mjonMsgVO, ReplacementListsVO lists, StatusResponse statusResponse) throws Exception {
 
-    	Map<String, String> resultMap = new HashMap<String, String>();
-        // 단문 문자 발송
-        if (lists.getShortCnt() > 0) {
-        	 resultMap = sendShortMessages(mjonMsgVO, lists, statusResponse);
-        }
-
-        // 장문 문자 발송
-        if (lists.getLongCnt() > 0) {
-        	resultMap = sendLongMessages(mjonMsgVO, lists, statusResponse);
-        }
-
-        // 그림 문자 발송
-        if (lists.getImgCnt() > 0) {
-        	resultMap = sendImageMessages(mjonMsgVO, lists, statusResponse);
-        }
+		Map<String, String> resultMap = sendMessages(mjonMsgVO, lists);
         
         if(!resultMap.isEmpty()) {
 
-    		String returnMessage = "";
-    		String returnStatus = "";
-    		String resultBlockSts = "0";
-			if(!resultMap.get("result").contains("fail")) {
+			if(resultMap.get("result").contains("fail")) {
     			
-				//발송건수 계산
-				int sendCnt = Integer.parseInt(resultMap.get("resultSts"));
-    			String resultSts = Integer.toString(sendCnt);
-    			
-    			//수신거부 건수 계산
-    			int sendBlockCnt = Integer.parseInt(resultMap.get("resultBlockSts"));
-    			resultBlockSts = Integer.toString(sendBlockCnt);
-    			
-    			returnMessage = resultMap.get("message");
-    			returnStatus = resultMap.get("result");
-    			
-			}else {
-    			returnMessage = resultMap.get("message");
-    			returnStatus = resultMap.get("result");
-    			
-    			statusResponse.setMessage(returnMessage);
+    			statusResponse.setMessage(resultMap.get("message"));
     			statusResponse.setObject(resultMap);
-				
+    			statusResponse.setStatus(HttpStatus.BAD_REQUEST);
 				return statusResponse;
+    			
     		}
 			
 		}
-
-        Map<String, String> returnMap = new HashMap<String, String>();
-		returnMap.put("msgType", mjonMsgVO.getMsgType());
-		returnMap.put("msgGroupId", mjonMsgVO.getMsgGroupId());
 		
 
-		statusResponse.setObject(returnMap);
+		statusResponse.setObject(resultMap);
+		statusResponse.setStatus(HttpStatus.OK);
+		statusResponse.setMessage("문자 전송이 완료되었습니다.");
 
-        return statusResponse;
-    }
+		return statusResponse;
+	}
 
 
+	private Map<String, String> fncSendMsgRtnMap(MjonMsgVO mjonMsgVO) throws Exception {
+		Map<String, String> returnMap = new HashMap<String, String>();
 
-    // TODO : 모듈화 미진행
-    private Map<String, String> fncSendMsgRtnMap(MjonMsgVO mjonMsgVO) {
-    	
-    	Map<String, String> returnMap = new HashMap<String, String>();
-		//String resultSts = "0";			//발송결과 건수
-		//String resultBlockSts = "0";	//수신거부 등록번호로 발송을 안한 건수
-		
 		int resultSts = 0;			//발송결과 건수
 		int resultBlockSts = 0;	//수신거부 등록번호로 발송을 안한 건수
-		
-		try {
-		
-			//현재 고객의 보유 캐시가 문자 발송이 가능한 금액인지 체크
-	    	String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
-	    	String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO);
-	    	mjonMsgVO.setBefPoint(userPoint); //현재 보유 포인트 정보 저장
-	    	String totPrice = mjonMsgVO.getTotPrice();
-	    	
-	    	BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
-	    	BigDecimal totMsgPrice = new BigDecimal(totPrice).setScale(2, RoundingMode.HALF_EVEN);
-	    	
-	    	
-	    	//현재 보유 금액이 발송 문자 총 금액보다 클 경우만 문자 발송
-	    	//BigDecimal 비교 연산
-	    	// befCash(현재 보유금액) 값이 totMsgPrice(문자전송 금액) 보다 많으면 문자 전송
-	    	if(befCash.compareTo(totMsgPrice) != -1) { // -1 : befCash < totMsgPrice, 0 : befCash = totMsgPrice, 1 : befCash > totMsgPrice,
-	    		
-	    		//문자 발송 처리
-	    		//MjonMsgReturnVO returnVO = new MjonMsgReturnVO();
-	    		//현재 보유 캐쉬금액 셋팅
-	    		mjonMsgVO.setBefCash(befCash.toString());
-	    		
-	    		//문자 전송 그룹아이디 생성
-	    		mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId());
-	    		
-	    		String[] tempPhoneList = new String[200];				//임시 수신번호 리스트 저장용 배열
-	    		String[] tempNameList = new String[200];				//임시 이름 리스트 저장용 배열
-	    		String[] tempRep1List = new String[200];				//임시 치환문자1 리스트 저장용 배열
-	    		String[] tempRep2List = new String[200];				//임시 치환문자1 리스트 저장용 배열
-	    		String[] tempRep3List = new String[200];				//임시 치환문자1 리스트 저장용 배열
-	    		String[] tempRep4List = new String[200];				//임시 치환문자1 리스트 저장용 배열
-	    		
-	    		String[] phoneList = mjonMsgVO.getCallToList();
-	    		String[] nameList = mjonMsgVO.getNameList();
-	    		String[] rep1List = mjonMsgVO.getRep1List();
-	    		String[] rep2List = mjonMsgVO.getRep2List();
-	    		String[] rep3List = mjonMsgVO.getRep3List();
-	    		String[] rep4List = mjonMsgVO.getRep4List();
-	    		
-	    		
-	    		int callToListCnt = mjonMsgVO.getCallToList().length;
-	    		mjonMsgVO.setTotalCallCnt(callToListCnt);
-	    		
-	    		/** 예약 문자인 경우 시간 및 분할 시간 셋팅 해주기 */
-	    		//분할문자 시간에 간격시간 더해주기
-	        	String dividDay = null;
-	        	Calendar cal = Calendar.getInstance();
-	        	
-	        	//예약시간 변환
-	        	SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
-	        	
-	    		int turmMin = 0;
-	    		int totalCallCnt = 0; // 수신자 전체 갯수
-	    		int divideCnt = 0;
-	    		int count = 1;		//분할 카운트
-	    		
-	    		
-	    		if(!mjonMsgVO.getReserveYn().equals("N")) {//예약문자인 경우 시간 셋팅
-	    			
-	    	    	Date toDate = transFormat.parse(mjonMsgVO.getReqDate());
-	    	    	cal.setTime(toDate); 										//예약 시간 캘린터 변수에 입력
-	    	    	
-	    	    	//String 타입 시간 Int로 변환
-	    	    	turmMin = Integer.parseInt(mjonMsgVO.getDivideTime()); //분할발송 시간 간격
-	    	    	dividDay = transFormat.format(cal.getTime());
-	    	    	
-	    	    	totalCallCnt = mjonMsgVO.getCallToList().length; // 수신자 전체 갯수
-	    	    	divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt()); //분할 발송 갯수
-	    			
-	    		}
-	    		
-	    		//분할 예약 시간 저장 리스트 생성
-	    		List<String> dividDayList = new ArrayList<String>();
-	    		
-	    		//서비스 단으로 특정 문자 건수 이상으로 한번에 보내지 않기 위해서 처리함
-	    		if(callToListCnt > 200) {
-	    			
-	    			int sendCnt = 0;
-	    			for(int i=0; i< callToListCnt; i++) {
-	    				
-	    				//분할 발송을 체크 한 경우
-						if(mjonMsgVO.getDivideChk() != null) {
-							
-							if(count > divideCnt) {
-		            			
-		            			count = 1;
-		            			
-		            			//분할 시간 간격을 증가시켜 준다.
-		            			cal.add(Calendar.MINUTE, turmMin);
-		            			dividDay = transFormat.format(cal.getTime());
-		                    	
-		            			dividDayList.add(dividDay);
-		            			//tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기
-		                		count++;
-		                		
-		            		}else {
-		            			
-		            			dividDayList.add(dividDay);
-		            			//tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기
-		            			count++;
-		            			
-		            		}
-							
-						}
-	    				
-	    				if((i < callToListCnt -1) && sendCnt == 199) {
-	    					
-	    					//sendCnt 4번째 값을 추가해준다.
-	    					tempPhoneList[sendCnt] = phoneList[i];
-	    					tempNameList[sendCnt] = nameList[i];
-	    					tempRep1List[sendCnt] = rep1List[i];
-	    					tempRep2List[sendCnt] = rep2List[i];
-	    					tempRep3List[sendCnt] = rep3List[i];
-	    					tempRep4List[sendCnt] = rep4List[i];
-	    					
-	    					List<String> arrPhoneList = new ArrayList<String>();
-	    					List<String> arrNameList = new ArrayList<String>();
-	    					List<String> arrRep1List = new ArrayList<String>();
-	    					List<String> arrRep2List = new ArrayList<String>();
-	    					List<String> arrRep3List = new ArrayList<String>();
-	    					List<String> arrRep4List = new ArrayList<String>();
-	    					
-	    					for(String temp : tempPhoneList) {
-	    						
-	    						if(temp != null) {
-	    							
-	    							arrPhoneList.add(temp);
-	    							
-	    						}
-	    						
-	    					}
-	    					
-	    					for(String tmpName : tempNameList) {
-	    						
-	    						if(tmpName != null) {
-	    							
-	    							arrNameList.add(tmpName);
-	    							
-	    						}
-	    						
-	    					}
-	    					
-	    					for(String tmpRep1 : tempRep1List) {
-	    						
-	    						if(tmpRep1 != null) {
-	    							
-	    							arrRep1List.add(tmpRep1);
-	    							
-	    						}
-	    						
-	    					}
-	    					
-	    					for(String tmpRep2 : tempRep2List) {
-	    						
-	    						if(tmpRep2 != null) {
-	    							
-	    							arrRep2List.add(tmpRep2);
-	    							
-	    						}
-	    						
-	    					}
-	    					
-	    					for(String tmpRep3 : tempRep3List) {
-	    						
-	    						if(tmpRep3 != null) {
-	    							
-	    							arrRep3List.add(tmpRep3);
-	    							
-	    						}
-	    						
-	    					}
-	    					
-	    					for(String tmpRep4 : tempRep4List) {
-	    						
-	    						if(tmpRep4 != null) {
-	    							
-	    							arrRep4List.add(tmpRep4);
-	    							
-	    						}
-	    						
-	    					}
-	    					
-	    					String[] sendPhoneList = new String[arrPhoneList.size()];
-	    					String[] sendNameList = new String[arrNameList.size()];
-	    					String[] sendRep1List = new String[arrRep1List.size()];
-	    					String[] sendRep2List = new String[arrRep2List.size()];
-	    					String[] sendRep3List = new String[arrRep3List.size()];
-	    					String[] sendRep4List = new String[arrRep4List.size()];
-	    					
-	    					for(int j=0; j< arrPhoneList.size(); j++) {
-	    						
-	    						sendPhoneList[j] = arrPhoneList.get(j);
-	    						
-	    					}
-	    					
-	    					for(int k=0; k< arrNameList.size(); k++) {
-	    						
-	    						sendNameList[k] = arrNameList.get(k);
-	    						
-	    					}
-	    					
-	    					for(int k=0; k< arrRep1List.size(); k++) {
-	    						
-	    						sendRep1List[k] = arrRep1List.get(k);
-	    						
-	    					}
-	    					
-	    					for(int k=0; k< arrRep2List.size(); k++) {
-	    						
-	    						sendRep2List[k] = arrRep2List.get(k);
-	    						
-	    					}
-	    					
-	    					for(int k=0; k< arrRep3List.size(); k++) {
-	    						
-	    						sendRep3List[k] = arrRep3List.get(k);
-	    						
-	    					}
-	    					
-	    					for(int k=0; k< arrRep4List.size(); k++) {
-	    						
-	    						sendRep4List[k] = arrRep4List.get(k);
-	    						
-	    					}
-	    					
-	    					mjonMsgVO.setCallToList(sendPhoneList);
-	    					mjonMsgVO.setNameList(sendNameList);
-	    					mjonMsgVO.setRep1List(sendRep1List);
-	    					mjonMsgVO.setRep2List(sendRep2List);
-	    					mjonMsgVO.setRep3List(sendRep3List);
-	    					mjonMsgVO.setRep4List(sendRep4List);
-	    					sendCnt = 0;
-	    					
-	    					mjonMsgVO.setDividDay(dividDayList);
-	    					MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO);
-	    					mjonMsgVO.setAgentCode(returnVO.getAgentCode());
-	    		    		resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt());
-	    		    		resultBlockSts = resultBlockSts + Integer.parseInt(returnVO.getSendMsgBlockCnt());
-	    		    		
-	    		    		//발송 처리후 배열 초기화
-	    		    		Arrays.fill(tempPhoneList, null);
-	    		    		dividDayList.clear();
-	    		    		
-	    					
-	    				}else if((i == callToListCnt -1) && sendCnt < 200){//200개의 마지막일 경우 처리
-	    					
-	    					//마지막 리스트의 수신번호를 추가해 준다.
-	    					tempPhoneList[sendCnt] = phoneList[i];
-	    					tempNameList[sendCnt] = nameList[i];
-	    					tempRep1List[sendCnt] = rep1List[i];
-	    					tempRep2List[sendCnt] = rep2List[i];
-	    					tempRep3List[sendCnt] = rep3List[i];
-	    					tempRep4List[sendCnt] = rep4List[i];
-	    					
-	    					List<String> arrPhoneList2 = new ArrayList<String>();
-	    					List<String> arrNameList2 = new ArrayList<String>();
-	    					List<String> arrRep1List2 = new ArrayList<String>();
-	    					List<String> arrRep2List2 = new ArrayList<String>();
-	    					List<String> arrRep3List2 = new ArrayList<String>();
-	    					List<String> arrRep4List2 = new ArrayList<String>();
-	    					
-	    					for(String temp : tempPhoneList) {
-	    						
-	    						if(temp != null) {
-	    							
-	    							arrPhoneList2.add(temp);
-	    							
-	    						}
-	    						
-	    					}
-	    					
-	    					for(String tmpName : tempNameList) {
-	    						
-	    						if(tmpName != null) {
-	    							
-	    							arrNameList2.add(tmpName);
-	    							
-	    						}
-	    						
-	    					}
-	    					
-	    					for(String tmpRep1 : tempRep1List) {
-	    						
-	    						if(tmpRep1 != null) {
-	    							
-	    							arrRep1List2.add(tmpRep1);
-	    							
-	    						}
-	    						
-	    					}
-	    					
-	    					for(String tmpRep2 : tempRep2List) {
-	    						
-	    						if(tmpRep2 != null) {
-	    							
-	    							arrRep2List2.add(tmpRep2);
-	    							
-	    						}
-	    						
-	    					}
-	    					
-	    					for(String tmpRep3 : tempRep3List) {
-	    						
-	    						if(tmpRep3 != null) {
-	    							
-	    							arrRep3List2.add(tmpRep3);
-	    							
-	    						}
-	    						
-	    					}
-	    					
-	    					for(String tmpRep4 : tempRep4List) {
-	    						
-	    						if(tmpRep4 != null) {
-	    							
-	    							arrRep4List2.add(tmpRep4);
-	    							
-	    						}
-	    						
-	    					}
-	    					
-	    					String[] sendPhoneList2 = new String[arrPhoneList2.size()];
-	    					String[] sendNameList2 = new String[arrNameList2.size()];
-	    					String[] sendRep1List2 = new String[arrRep1List2.size()];
-	    					String[] sendRep2List2 = new String[arrRep2List2.size()];
-	    					String[] sendRep3List2 = new String[arrRep3List2.size()];
-	    					String[] sendRep4List2 = new String[arrRep4List2.size()];
-	    					
-	    					for(int j=0; j< arrPhoneList2.size(); j++) {
-	    						
-	    						sendPhoneList2[j] = arrPhoneList2.get(j);
-	    						
-	    					}
-	    					
-	    					for(int j=0; j< arrNameList2.size(); j++) {
-	    						
-	    						sendNameList2[j] = arrNameList2.get(j);
-	    						
-	    					}
-	    					
-	    					for(int k=0; k< arrRep1List2.size(); k++) {
-	    						
-	    						sendRep1List2[k] = arrRep1List2.get(k);
-	    						
-	    					}
-	    					
-	    					for(int k=0; k< arrRep2List2.size(); k++) {
-	    						
-	    						sendRep2List2[k] = arrRep2List2.get(k);
-	    						
-	    					}
-	    					
-	    					for(int k=0; k< arrRep3List2.size(); k++) {
-	    						
-	    						sendRep3List2[k] = arrRep3List2.get(k);
-	    						
-	    					}
-	    					
-	    					for(int k=0; k< arrRep4List2.size(); k++) {
-	    						
-	    						sendRep4List2[k] = arrRep4List2.get(k);
-	    						
-	    					}
-	    					
-	    					mjonMsgVO.setCallToList(sendPhoneList2);
-	    					mjonMsgVO.setNameList(sendNameList2);
-	    					mjonMsgVO.setRep1List(sendRep1List2);
-	    					mjonMsgVO.setRep2List(sendRep2List2);
-	    					mjonMsgVO.setRep3List(sendRep3List2);
-	    					mjonMsgVO.setRep4List(sendRep4List2);
-	    					sendCnt = 0;
-	    					
-	    					mjonMsgVO.setDividDay(dividDayList);
-	    					MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO);
-	    					mjonMsgVO.setAgentCode(returnVO.getAgentCode());
-	    		    		resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt());
-	    		    		resultBlockSts = resultBlockSts + Integer.parseInt(returnVO.getSendMsgBlockCnt());
-	    		    		
-	    				}else {//198개가 될때까지 배열에 데이터를 쌓는다
-	    					
-	    					tempPhoneList[sendCnt] = phoneList[i];
-	    					
-	    					if(nameList.length > 0) {//이름 치환문자가 있는 경우
-	    						tempNameList[sendCnt] = nameList[i];
-	    					}
-	    					
-	    					if(rep1List.length > 0) {//치환1 문자가 있는 경우
-	    						tempRep1List[sendCnt] = rep1List[i];
-	    					}
-	    					
-	    					if(rep2List.length > 0) {//치환2 문자가 있는 경우
-	    						tempRep2List[sendCnt] = rep2List[i];
-	    					}
-	    					
-	    					if(rep3List.length > 0) {//치환3 문자가 있는 경우
-	    						tempRep3List[sendCnt] = rep3List[i];
-	    					}
-	    					
-	    					if(rep4List.length > 0) {//치환4 문자가 있는 경우
-	    						tempRep4List[sendCnt] = rep4List[i];
-	    					}
-	    					
-	    					sendCnt++;
-	    					
-	    				}
-	    				
-	    			}
-	    			
-	    		}else {
-	    				
-					//분할 발송을 체크 한 경우
-					if(mjonMsgVO.getDivideChk() != null) {
-						for(int i=0; i< callToListCnt; i++) {
-							if(count > divideCnt) {
-		            			
-		            			count = 1;
-		            			
-		            			//분할 시간 간격을 증가시켜 준다.
-		            			cal.add(Calendar.MINUTE, turmMin);
-		            			dividDay = transFormat.format(cal.getTime());
-		                    	
-		            			dividDayList.add(dividDay);
-		            			//tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기
-		                		count++;
-		                		
-		            		}else {
-		            			
-		            			dividDayList.add(dividDay);
-		            			//tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기
-		            			count++;
-		            			
-		            		}
-						
-						}
-	    				
-	    			}
-	    			
-					mjonMsgVO.setDividDay(dividDayList);
-	    			MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO);
-	    			mjonMsgVO.setAgentCode(returnVO.getAgentCode());
-		    		resultSts = Integer.parseInt(returnVO.getSendMsgCnt());
-		    		resultBlockSts = Integer.parseInt(returnVO.getSendMsgBlockCnt());
-	    			
-	    		}
-	    		
-	    		System.out.println("=========================================================================");
-	    		System.out.println("+++++++++++++++++++++++++++++++++++++++++++ resultSts ::: " + resultSts); 
-	    		System.out.println("=========================================================================");
-	    		
-	    		try {
-	    			
-	    			//스팸문구 포함된 문자 발송의 경우 스팸 문구 내용도 별도 저장함.
-		    		String spamStatus = mjonMsgVO.getSpamStatus();
-		    		
-		    		if(spamStatus == null) {
-		    			
-		    			spamStatus = "N";
-		    			mjonMsgVO.setSpamStatus("N");
-		    			
-		    		}
-		    		
-		    		if(spamStatus.equals("Y")) {
-		    			
-		    			int resultCnt = mjonSpamMsgService.insertSpamKeyWordMsgData(mjonMsgVO);
-		    			
-		    			System.out.println("+++++++++++++스팸문구 발송 내용 등록 +++++++++++++++++++++ "+resultCnt);
-		    			
-		    		}
-	    			
-				} catch (Exception e) {
-					System.out.println("=========================================================================");
-					System.out.println("+++++++++++++++++++++++++++++ fncSendMsgRtnMap()  MJ_MSG_GROUP && CASH INSER ERROR !!! : " + e.getMessage());
-					System.out.println("=========================================================================");
-				}
-	    		
-	    	}else {
-	    		
-	    		returnMap.put("message", "문자 발송에 필요한 보유 잔액이 부족 합니다.");
-	    		returnMap.put("result", "fail");
-//	    		returnMap.put("resultSts", "0");
-//	    		returnMap.put("resultBlockSts", "0");
-				
-				return returnMap;
-//	    		return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다.");
-	    		
-	    	}
-	    	
-	    	//문자 발송 후 남은 보유 캐시 정보 불러오기
-	    	String afterCash = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
-	    	returnMap.put("afterCash", afterCash);
-			returnMap.put("message", "문자 전송이 완료되었습니다.");
-			returnMap.put("result", "success");
-			returnMap.put("resultSts", Integer.toString(resultSts));
-			returnMap.put("resultBlockSts", Integer.toString(resultBlockSts));
-	    	
-		}catch(Exception e) {
 
-			log.error(e.getMessage(), e);
-			System.out.println("=========================================================================");
-			System.out.println("+++++++++++++++++++++++++++++ 기타 시스템 오류 : " + e.getMessage());
-			System.out.println("=========================================================================");
+		// advc 현재 보유 금액 확인
+		if (!isCashSufficient(mjonMsgVO)) {
+			returnMap.put("message", "문자 발송에 필요한 보유 잔액이 부족 합니다.");
 			returnMap.put("result", "fail");
-			returnMap.put("message", "기타 시스템 오류 : " + e.getMessage());
-	
+			return returnMap;
 		}
+
+		// 보유 금액 및 포인트 데이터를 반환받아 새 MjonMsgVO 생성
+		MjonMsgVO updatedMsgVO = setUserMoneyData(mjonMsgVO);
+		
+		
+		//문자 전송 그룹아이디 생성
+		updatedMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId());
+		
+		int callToListCnt = updatedMsgVO.getCallToList().length;
+		updatedMsgVO.setTotalCallCnt(callToListCnt);
+		
+
+		// 예약 문자 처리 후 새로운 MjonMsgVO 반환
+		updatedMsgVO = handleReserveMsg(updatedMsgVO);
+			
+		//분할 예약 시간 저장 리스트 생성
+		List<String> dividDayList = new ArrayList<String>();
+			
+		
+		mjonMsgVO.setDividDay(dividDayList);
+		MjonMsgReturnVO returnVO = insertMsgDataInfo_advc(updatedMsgVO);
+		resultSts = Integer.parseInt(returnVO.getSendMsgCnt());
+		resultBlockSts = Integer.parseInt(returnVO.getSendMsgBlockCnt());
+			
+		
+		System.out.println("=========================================================================");
+		System.out.println("+++++++++++++++++++++++++++++++++++++++++++ resultSts ::: " + resultSts); 
+		System.out.println("=========================================================================");
+
+		handleSpamMsg(updatedMsgVO);
+		
+		//문자 발송 후 남은 보유 캐시 정보 불러오기
+		String afterCash = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
+		returnMap.put("afterCash", afterCash);
+		returnMap.put("message", "문자 전송이 완료되었습니다.");
+		returnMap.put("result", "success");
+		returnMap.put("resultSts", Integer.toString(resultSts));
+		returnMap.put("resultBlockSts", Integer.toString(resultBlockSts));
+			
 		return returnMap;
 	}
 
-    // 단문 문자 발송 처리 메서드
-    private Map<String, String> sendShortMessages(MjonMsgVO shortMsgVO, ReplacementListsVO lists, StatusResponse statusResponse) {
+	private void handleSpamMsg(MjonMsgVO mjonMsgVO) {
+		try {
+			if ("Y".equals(mjonMsgVO.getSpamStatus())) {
+				int resultCnt = mjonSpamMsgService.insertSpamKeyWordMsgData(mjonMsgVO);
+				System.out.println("스팸 문구 발송 내용 등록: " + resultCnt);
+			}
+		} catch (Exception e) {
+			System.err.println("스팸 문구 처리 중 오류 발생: " + e.getMessage());
+		}
+	}
 
-    	log.info(" :: sendShortMessages :: ");
+	// 예약 문자인 경우 처리하는 메서드
+	private MjonMsgVO handleReserveMsg(MjonMsgVO mjonMsgVO) throws ParseException {
+		if (!mjonMsgVO.getReserveYn().equals("N")) {
+			Calendar cal = Calendar.getInstance();
+			SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+			
+			Date reserveDate = transFormat.parse(mjonMsgVO.getReqDate());
+			cal.setTime(reserveDate);  // 예약 시간 셋팅
+		
+			int turmMin = Integer.parseInt(mjonMsgVO.getDivideTime());  // 분할 시간 간격
+			int divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt());  // 분할 발송 갯수
+			
+			// 분할 발송 예약 시간 셋팅
+			List<String> dividDayList = setDivideSendTime(mjonMsgVO, cal, transFormat, turmMin, divideCnt);
+		
+			mjonMsgVO.setDividDay(dividDayList);
+		
+			return mjonMsgVO;
+		}
+	
+		return mjonMsgVO;
+	}
 
-    	shortMsgVO.setNameList(lists.getShortNameList());
-        shortMsgVO.setCallToList(lists.getShortPhone());
-        shortMsgVO.setRep1List(lists.getShortRep1());
-        shortMsgVO.setRep2List(lists.getShortRep2());
-        shortMsgVO.setRep3List(lists.getShortRep3());
-        shortMsgVO.setRep4List(lists.getShortRep4());
+	// 분할 발송 시간을 설정하여 리스트 반환
+	private List<String> setDivideSendTime(MjonMsgVO mjonMsgVO, Calendar cal, SimpleDateFormat transFormat, int turmMin, int divideCnt) {
+		List<String> dividDayList = new ArrayList<>();
+		String dividDay = transFormat.format(cal.getTime());
+	
+		int count = 1;
+		for (int i = 0; i < mjonMsgVO.getCallToList().length; i++) {
+			if (count > divideCnt) {
+				count = 1;
+				cal.add(Calendar.MINUTE, turmMin);  // 분할 시간 증가
+				dividDay = transFormat.format(cal.getTime());
+			}
+			dividDayList.add(dividDay);
+			count++;
+		}
+	
+		return dividDayList;
+	}
 
-        //개별단가 계산하기
-        String eachPrice = shortMsgVO.getpPrice();
+	// 보유 금액 및 포인트 셋팅
+	private MjonMsgVO setUserMoneyData(MjonMsgVO mjonMsgVO) throws Exception {
 
-        //api 서버에서 sPrice 값이 없는 경우가 있어서 오류 방지를위해서 추가
-        if(eachPrice == null) {
-            eachPrice = shortMsgVO.getEachPrice();
-        }
+//		String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
+//		String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO);
+		String userMoney = priceAndPoint.getBefCash(mjonMsgVO.getUserId());
+		String userPoint = priceAndPoint.getBefPoint(mjonMsgVO.getUserId());
+		
+		BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
+		
+		MjonMsgVO updatedMsgVO = new MjonMsgVO(); // 원본을 복사한 새로운 객체 생성
+		updatedMsgVO = mjonMsgVO;
+		updatedMsgVO.setBefPoint(userPoint);
+		updatedMsgVO.setBefCash(befCash.toString());
+		
+		return updatedMsgVO;
+		
+	}
 
-        /**
-         * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기.
-         * 그림문자의 경우 이로직을 타지 않지만 혹시 몰라서 추가해놓음
-         * 
-         * */
-        
-        // TODO : 기존 로직이라 리펙토링 예정 20240927 이호영
-        int fileCount = Integer.parseInt(shortMsgVO.getFileCnt());
-        if(fileCount > 2) {//그림 이미지가 3개
+	// 보유 금액이 충분한지 확인하는 메서드
+	private boolean isCashSufficient(MjonMsgVO mjonMsgVO) throws Exception {
+		String userMoney = priceAndPoint.getBefCash(mjonMsgVO.getUserId());
+		BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
+		BigDecimal totMsgPrice = new BigDecimal(mjonMsgVO.getTotPrice()).setScale(2, RoundingMode.HALF_EVEN);
+		
+		return befCash.compareTo(totMsgPrice) >= 0;
+	}
 
-            eachPrice = shortMsgVO.getP3Price();
+	/**
+	 * 범용 메시지 발송 처리 메서드
+	 * 
+	 * @param msgVO        발송할 메시지 VO
+	 * @param lists        치환 데이터 리스트
+	 * @param msgType      메시지 유형 (short, long, img)
+	 * @return 발송 결과
+	 * @throws Exception
+	 * 
+	 * 20241002 이호영
+	 * 치환 후 장문, 단문이 모두 있을 수 있기 때문에 아래 로직처럼 모든 if를 열어둠 
+	 */
+	private Map<String, String> sendMessages(MjonMsgVO msgVO, ReplacementListsVO lists) throws Exception {
 
-        }else if(fileCount > 1) {//그림 이미지가 2개
+		Map<String, String> resultMap = new HashMap<>();
+		int totalResultSts = 0;
+		int totalResultBlockSts = 0;
+		
+		Map<String, String> tempResult;
 
-            eachPrice = shortMsgVO.getP2Price();
+		// Short 메시지 발송
+		if (lists.getShortCnt() > 0) {
+			msgVO.setNameList(lists.getShortNameList());
+			msgVO.setCallToList(lists.getShortPhone());
+			msgVO.setRep1List(lists.getShortRep1());
+			msgVO.setRep2List(lists.getShortRep2());
+			msgVO.setRep3List(lists.getShortRep3());
+			msgVO.setRep4List(lists.getShortRep4());
 
-        }else if(fileCount == 1) {//그림 이미지가 1개
-            eachPrice = shortMsgVO.getpPrice();
+			log.info(" :: sendMessages - Type: short :: ");
+			tempResult = fncSendMsgRtnMap(msgVO);
+			
+			// 실패 여부 체크 후 즉시 반환
+			if (tempResult.get("result").contains("fail")) {
+				return tempResult;
+			}
 
-        }
+			// 결과 합산
+			totalResultSts += Integer.parseInt(tempResult.get("resultSts"));
+			totalResultBlockSts += Integer.parseInt(tempResult.get("resultBlockSts"));
 
-        shortMsgVO.setEachPrice(eachPrice);
+			resultMap.putAll(tempResult);
+		}
 
-        //문자 종류 선택
-        if(fileCount > 0) {//그림문자인 경우 문자타임 지정
-            shortMsgVO.setMsgType("6");
-        }else {
-            shortMsgVO.setMsgType("4");
-        }
+		// Long 메시지 발송
+		if (lists.getLongCnt() > 0) {
+			msgVO.setNameList(lists.getLongNameList());
+			msgVO.setCallToList(lists.getLongPhone());
+			msgVO.setRep1List(lists.getLongRep1());
+			msgVO.setRep2List(lists.getLongRep2());
+			msgVO.setRep3List(lists.getLongRep3());
+			msgVO.setRep4List(lists.getLongRep4());
 
-        //총금액 계산하기
-        Float sTotPrice = Float.parseFloat(shortMsgVO.getEachPrice()) * lists.getShortCnt();
-        shortMsgVO.setTotPrice(sTotPrice.toString());
+			log.info(" :: sendMessages - Type: long :: ");
+			tempResult = fncSendMsgRtnMap(msgVO);
 
-        //단문문자 발송 처리
-        Map<String, String> returnShortMap = fncSendMsgRtnMap(shortMsgVO);
-		return returnShortMap;
-    }
+			// 실패 여부 체크 후 즉시 반환
+			if (tempResult.get("result").contains("fail")) {
+				return tempResult;
+			}
+
+			// 결과 합산
+			totalResultSts += Integer.parseInt(tempResult.get("resultSts"));
+			totalResultBlockSts += Integer.parseInt(tempResult.get("resultBlockSts"));
+
+			resultMap.putAll(tempResult);
+		}
+
+		// Img 메시지 발송
+		if (lists.getImgCnt() > 0) {
+			msgVO.setNameList(lists.getImgNameList());
+			msgVO.setCallToList(lists.getImgPhone());
+			msgVO.setRep1List(lists.getImgRep1());
+			msgVO.setRep2List(lists.getImgRep2());
+			msgVO.setRep3List(lists.getImgRep3());
+			msgVO.setRep4List(lists.getImgRep4());
+
+			log.info(" :: sendMessages - Type: img :: ");
+			tempResult = fncSendMsgRtnMap(msgVO);
+
+			// 실패 여부 체크 후 즉시 반환
+			if (tempResult.get("result").contains("fail")) {
+				return tempResult;
+			}
+
+			// 결과 합산
+			totalResultSts += Integer.parseInt(tempResult.get("resultSts"));
+			totalResultBlockSts += Integer.parseInt(tempResult.get("resultBlockSts"));
+
+			resultMap.putAll(tempResult);
+		}
+
+		// 누적된 resultSts와 resultBlockSts를 최종적으로 resultMap에 저장
+		resultMap.put("resultSts", Integer.toString(totalResultSts));
+		resultMap.put("resultBlockSts", Integer.toString(totalResultBlockSts));
+
+		return resultMap;
+		
+/*	
+		String msgType = "";
+
+		if (lists.getShortCnt() > 0) {
+			msgType = "short";
+		} else if (lists.getLongCnt() > 0) {
+			msgType = "long";
+		} else if (lists.getImgCnt() > 0) {
+			msgType = "img";
+		}
+
+		log.info(" :: sendMessages - Type: {} :: ", msgType);
+
+		switch (msgType) {
+			case "short":
+				msgVO.setNameList(lists.getShortNameList());
+				msgVO.setCallToList(lists.getShortPhone());
+				msgVO.setRep1List(lists.getShortRep1());
+				msgVO.setRep2List(lists.getShortRep2());
+				msgVO.setRep3List(lists.getShortRep3());
+				msgVO.setRep4List(lists.getShortRep4());
+				break;
+
+			case "long":
+				msgVO.setNameList(lists.getLongNameList());
+				msgVO.setCallToList(lists.getLongPhone());
+				msgVO.setRep1List(lists.getLongRep1());
+				msgVO.setRep2List(lists.getLongRep2());
+				msgVO.setRep3List(lists.getLongRep3());
+				msgVO.setRep4List(lists.getLongRep4());
+				break;
+
+			case "img":
+				msgVO.setNameList(lists.getImgNameList());
+				msgVO.setCallToList(lists.getImgPhone());
+				msgVO.setRep1List(lists.getImgRep1());
+				msgVO.setRep2List(lists.getImgRep2());
+				msgVO.setRep3List(lists.getImgRep3());
+				msgVO.setRep4List(lists.getImgRep4());
+				break;
+		}
+	
+		return fncSendMsgRtnMap(msgVO);
+		
+		*/
+	}
     
-	// 장문 문자 발송 처리 메서드
-    private Map<String, String> sendLongMessages(MjonMsgVO longMsgVO, ReplacementListsVO lists, StatusResponse statusResponse) {
-    	//장문문자 전송 이름, 전화번호, 변환문자 입력해주기
-		
-		longMsgVO.setNameList(lists.getLongNameList());
-		longMsgVO.setCallToList(lists.getLongPhone());
-		longMsgVO.setRep1List(lists.getLongRep1());  
-		longMsgVO.setRep2List(lists.getLongRep2());  
-		longMsgVO.setRep3List(lists.getLongRep3());  
-		longMsgVO.setRep4List(lists.getLongRep4());  
-		
-		/**
-		 * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기.
-		 * 그림문자의 경우 이로직을 타지 않지만 혹시 몰라서 추가해놓음
-		 * */
-		
-		String eachPrice = longMsgVO.getmPrice();
-		
-		//api 서버에서 mPrice 값이 없는 경우가 있어서 오류 방지를위해서 추가
-		if(eachPrice == null) {
-			
-			eachPrice = longMsgVO.getEachPrice();
-			
-		}
-
-        /**
-         * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기.
-         * 그림문자의 경우 이로직을 타지 않지만 혹시 몰라서 추가해놓음
-         * TODO : 기존 로직이라 리펙토링 예정
-         * */
-
-        int fileCount = Integer.parseInt(longMsgVO.getFileCnt());
-		if(fileCount > 2) {//그림 이미지가 3개
-			
-			eachPrice = longMsgVO.getP3Price();
-			
-		}else if(fileCount > 1) {//그림 이미지가 2개
-			
-			eachPrice = longMsgVO.getP2Price();
-			
-		}else if(fileCount == 1) {//그림 이미지가 1개
-			eachPrice = longMsgVO.getpPrice();
-			
-		}
-		
-		longMsgVO.setEachPrice(eachPrice);
-		
-		//문자 종류 선택
-		longMsgVO.setMsgType("6");
-		
-		//총금액 계산하기
-		Float mTotPrice = Float.parseFloat(longMsgVO.getEachPrice()) *  lists.getLongCnt();
-		longMsgVO.setTotPrice(mTotPrice.toString());
-		
-		//장문문자 발송
-		Map<String, String> returnShortMap = fncSendMsgRtnMap(longMsgVO);
-        return returnShortMap;
-    }
-    // 그림 문자 발송 처리 메서드
-    private Map<String, String> sendImageMessages(MjonMsgVO imgMsgVO, ReplacementListsVO lists, StatusResponse statusResponse) {
-    	log.info(" :: sendImageMessages :: ");
-    	//그림문자 전송 이름, 전화번호, 변환문자 입력해주기
-		
-		imgMsgVO.setNameList(lists.getImgNameList());
-		imgMsgVO.setCallToList(lists.getImgPhone());
-		imgMsgVO.setRep1List(lists.getImgRep1());    
-		imgMsgVO.setRep2List(lists.getImgRep2());    
-		imgMsgVO.setRep3List(lists.getImgRep3());    
-		imgMsgVO.setRep4List(lists.getImgRep4());    
-		
-		//개별단가 계산하기
-		String eachPrice = imgMsgVO.getmPrice();
-		
-		//api 서버에서 pPrice 값이 없는 경우가 있어서 오류 방지를위해서 추가
-		if(eachPrice == null) {
-			
-			eachPrice = imgMsgVO.getEachPrice();
-			
-		}
-		
-		/**
-		 * 그림문자에 치환 내용이 포함되어 있는 경우 단가 계산하기.
-		 * 그림문자의 경우 이로직을 타지 않지만 혹시 몰라서 추가해놓음
-		 * */
-        int fileCount = Integer.parseInt(imgMsgVO.getFileCnt());
-		
-		if(fileCount > 2) {//그림 이미지가 3개
-			
-			eachPrice = imgMsgVO.getP3Price();
-			
-		}else if(fileCount > 1) {//그림 이미지가 2개
-			
-			eachPrice = imgMsgVO.getP2Price();
-			
-		}else if(fileCount == 1) {//그림 이미지가 1개
-			eachPrice = imgMsgVO.getpPrice();
-			
-		}
-		
-		imgMsgVO.setEachPrice(eachPrice);
-		
-		//문자 종류 선택 
-		imgMsgVO.setMsgType("6");
-		
-		//총금액 계산하기
-		Float sTotPrice = Float.parseFloat(imgMsgVO.getEachPrice()) * lists.getImgCnt();
-		imgMsgVO.setTotPrice(sTotPrice.toString());
-		
-		//그림문자 발송 처리
-		Map<String, String> returnShortMap = fncSendMsgRtnMap(imgMsgVO);
-        return returnShortMap;
-    }
 
     // 20240924 이호영
     // 이벤트 상태를 처리하는 메서드
@@ -4285,385 +4547,308 @@
 	/**
 	 * 문자발송시 치환문자가 없거나 그림문자일 경우 타는 로직
 	 * param : MjonMsgVO
-	 * return : ModelAndView
+	 * return : StatusResponse
 	 * @throws Exception 
 	 * 
 	 * */
 	public StatusResponse fncSendMsg(MjonMsgVO mjonMsgVO) throws Exception {
 		log.info(" :: fncSendMsg :: ");
 		
-		ModelAndView modelAndView = new ModelAndView(); 
-		modelAndView.setViewName("jsonView");
-		
 		int resultSts = 0;			//발송결과 건수
 		int resultBlockSts = 0;		//수신거부 등록번호로 발송을 안한 건수
+
+
+		// Step 1: 메시지 내용이 있는지 확인 후 msgType 정하기
+		String msgType = checkMessageContent(mjonMsgVO);
+		if (msgType == null) {
+			return new StatusResponse(HttpStatus.BAD_REQUEST, "입력 문자 내용을 확인할 수 없습니다. 문자 내용을 입력해 주세요.");
+		}
+		if ("INVALID".equals(msgType)) {
+			return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다.");
+		}
+		mjonMsgVO.setMsgType(msgType);
+
+
+		log.debug("Step 2: Checking balance availability.");
+		// Step 2: 발신자의 잔액 확인
+		if (!isCashSufficient(mjonMsgVO)) {
+			log.error("Insufficient balance for message sending.");
+			return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다.");
+		}
+
+		// 보유 포인트와 보유 캐시 정보를 VO에 설정
+		mjonMsgVO.setBefPoint(priceAndPoint.getBefPoint(mjonMsgVO.getUserId())); // 현재 보유 포인트 정보 저장
+		mjonMsgVO.setBefCash(priceAndPoint.getBefCash(mjonMsgVO.getUserId())); // 현재 보유 캐시 정보 저장
+
 		
-//		try {
-			
-			//문자열 길이 체크 해주기
-			String charset = "euc-kr";
-			String smsCont = mjonMsgVO.getSmsTxt().replace("\r\n", "\n");
-			int bytes = smsCont.getBytes(charset).length;	//발송 문자 길이
-			
-			if(mjonMsgVO.getFileName1() != null) {
-				mjonMsgVO.setMsgType("6");
-			}else {
-				if(bytes < 2000) {
-					if(bytes > 90) {// 90Byte 초과시 장문
-						mjonMsgVO.setMsgType("6");
-					}else {// 그외 단문
-						mjonMsgVO.setMsgType("4"); 
-					}
-					
-					if(bytes < 1) {//단문, 장문의 경우 문자 내용이 없는 경우 발송 안되도록 처리
-						
-						System.out.println("===================================fncSendMsg======================================");
-			    		System.out.println("+++++++++++++++++++++++++++++++++++++++++++ 입력 문자 내용이 없습니다. ::: ");
-			    		System.out.println("===================================fncSendMsg======================================");
-						
-//						modelAndView.addObject("message", "입력 문자 내용을 확인할 수 없습니다. 문자 내용을 입력해 주세요.");
-//						modelAndView.addObject("result", "fail");
-//						modelAndView.addObject("resultSts", "0");
-//						modelAndView.addObject("resultBlockSts", "0");
-						
-						return new StatusResponse(HttpStatus.BAD_REQUEST, "입력 문자 내용을 확인할 수 없습니다. 문자 내용을 입력해 주세요."); 
-						
-					}
+		mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId());
 
-				}else { //최대 문자길이 초과시
-					
-//					modelAndView.addObject("message", "문자 치환 후 전송 문자 길이를 초과하였습니다.");
-//					modelAndView.addObject("result", "fail");
-//					modelAndView.addObject("resultSts", "0");
-//					modelAndView.addObject("resultBlockSts", "0");
+		
+		log.debug("Step 3: Handling scheduled message.");
+		// Step 3: 예약 문자 처리
+		if (isScheduledMessage(mjonMsgVO)) {
+			handleScheduledMessage(mjonMsgVO);
+		}
 
-					return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 치환 후 전송 문자 길이를 초과하였습니다.");
-				}
+		log.debug("Step 4: Handling split message if required.");
+		// Step 4: 분할 발송이 필요한 경우 처리
+		if (isDivideMessage(mjonMsgVO)) {
+			handleDivideMessage(mjonMsgVO);
+		} else if (isSplitRequired(mjonMsgVO)) {
+			handleSplitMessage(mjonMsgVO);
+		} else {
+			// 일반 문자 발송 로직
+			sendMessage(mjonMsgVO);
+		}
+
+		log.info("Message sending process completed.");
+		return new StatusResponse(HttpStatus.OK, "문자 전송이 완료되었습니다.", getReturnMap(resultSts, resultBlockSts));
+	}
+
+
+
+	/**
+	 * @param mjonMsgVO
+	 * @return String 메시지 타입 반환 (유효하지 않은 경우 "INVALID" 반환, 내용이 없을 경우 null 반환)
+	 * @discription 메시지 내용을 확인하고 파일 첨부 여부 및 문자 길이에 따라 MMS 또는 SMS를 결정합니다.
+	 * @throws IllegalArgumentException 메시지 길이가 초과된 경우 예외 발생
+	 * @작성자 20241007 이호영
+	*/
+	private String checkMessageContent(MjonMsgVO mjonMsgVO) {
+		try {
+			// 문자 바이트 계산을 MsgSendUtils의 유틸리티 메서드를 사용하여 처리
+			int smsBytes = MsgSendUtils.getSmsTxtBytes(mjonMsgVO.getSmsTxt());
+	
+			// 메시지 내용이 없는 경우 null 반환
+			if (smsBytes < 1) {
+				return null;
 			}
-			
-			
-			//현재 고객의 보유 캐시가 문자 발송이 가능한 금액인지 체크
-	    	String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
-	    	String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO);
-	    	mjonMsgVO.setBefPoint(userPoint); //현재 보유 포인트 정보 저장
-	    	String totPrice = mjonMsgVO.getTotPrice();
-	    	
-	    	BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
-	    	BigDecimal totMsgPrice = new BigDecimal(totPrice).setScale(2, RoundingMode.HALF_EVEN);
-	    	
-	    	
-	    	// 현재 보유 금액이 발송 문자 총 금액보다 클 경우만 문자 발송
-	    	// BigDecimal 비교 연산
-	    	// befCash(현재 보유금액) 값이 totMsgPrice(문자전송 금액) 보다 많으면 문자 전송
-	    	if(befCash.compareTo(totMsgPrice) != -1) { // -1 : befCash < totMsgPrice, 0 : befCash = totMsgPrice, 1 : befCash > totMsgPrice,
-	    		
-	    		mjonMsgVO.setBefCash(userMoney);
-	    		// 문자 전송 그룹아이디 생성
-	        	mjonMsgVO.setMsgGroupId(idgenMjonMsgGroupId.getNextStringId());
-	        	
-	    		//문자 발송 처리
-	    		//MjonMsgReturnVO returnVO = new MjonMsgReturnVO();
-	    		String[] tempPhoneList = new String[200];				//임시 수신번호 리스트 저장용 배열
-	    		String[] phoneList = mjonMsgVO.getCallToList();
-	    		
-	    		int callToListCnt = mjonMsgVO.getCallToList().length;
-	    		mjonMsgVO.setTotalCallCnt(callToListCnt);
-	    		
-	    		/**
-	    		 * 예약 문자인 경우 시간 및 분할 시간 셋팅 해주기
-	    		 * 
-	    		 * 
-	    		 * */
 	
-	    		//분할문자 시간에 간격시간 더해주기
-	        	String dividDay = null;
-	        	Calendar cal = Calendar.getInstance();
-	        	
-	        	//예약시간 변환
-	        	SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
-	        	
-	    		int turmMin = 0;
-	    		int totalCallCnt = 0;
-	    		int divideCnt = 0;
-	    		int count = 1;		//분할 카운트
-	    		
-	    		
-	    		if(!mjonMsgVO.getReserveYn().equals("N")) {//예약문자인 경우 시간 셋팅
-	    			
-	    	    	Date toDate = transFormat.parse(mjonMsgVO.getReqDate());
-	    	    	cal.setTime(toDate); 										//예약 시간 캘린터 변수에 입력
-	    	    	
-	    	    	//String 타입 시간 Int로 변환
-	    	    	turmMin = Integer.parseInt(mjonMsgVO.getDivideTime()); //분할발송 시간 간격
-	    	    	dividDay = transFormat.format(cal.getTime());
-	    	    	
-	    	    	totalCallCnt = mjonMsgVO.getCallToList().length; // 수신자 전체 갯수
-	    	    	divideCnt = Integer.parseInt(mjonMsgVO.getDivideCnt()); //분할 발송 갯수
-	    			
-	    		}
-	    		
-	    		//분할 예약 시간 저장 리스트 생성
-	    		List<String> dividDayList = new ArrayList<String>();
-	    		
-	    		//서비스 단으로 특정 문자 건수 이상으로 한번에 보내지 않기 위해서 처리함
-	    		if(callToListCnt > 200) {
-	    			
-	    			int sendCnt = 0;
-	    			for(int i=0; i< callToListCnt; i++) {
-	    				
-	    				//분할 발송을 체크 한 경우
-						if(mjonMsgVO.getDivideChk() != null) {
-							
-							if(count > divideCnt) {
-		            			
-		            			count = 1;
-		            			
-		            			//분할 시간 간격을 증가시켜 준다.
-		            			cal.add(Calendar.MINUTE, turmMin);
-		            			dividDay = transFormat.format(cal.getTime());
-		                    	
-		            			dividDayList.add(dividDay);
-		            			//tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기
-		                		count++;
-		                		
-		            		}else {
-		            			
-		            			dividDayList.add(dividDay);
-		            			//tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기
-		            			count++;
-		            			
-		            		}
-							
-						}
-	    				
-	    				if((i < callToListCnt -1) && sendCnt == 199) {
-	    					
-	    					//sendCnt 4번째 값을 추가해준다.
-	    					tempPhoneList[sendCnt] = phoneList[i];
-	    					
-	    					List<String> arrPhoneList = new ArrayList<String>();
-	    					
-	    					for(String temp : tempPhoneList) {
-	    						
-	    						if(temp != null) {
-	    							
-	    							arrPhoneList.add(temp);
-	    							
-	    						}
-	    						
-	    					}
-	    					
-	    					
-	    					String[] sendPhoneList = new String[arrPhoneList.size()];
-	    					
-	    					for(int j=0; j< arrPhoneList.size(); j++) {
-	    						
-	    						sendPhoneList[j] = arrPhoneList.get(j);
-	    						
-	    					}
-	    					
-	    					
-	    					mjonMsgVO.setCallToList(sendPhoneList);
-	    					sendCnt = 0;
-	    					
-	    					mjonMsgVO.setDividDay(dividDayList);
-	    					MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO);
-	    					mjonMsgVO.setAgentCode(returnVO.getAgentCode());
-	    		    		resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt());
-	    		    		resultBlockSts = resultBlockSts + Integer.parseInt(returnVO.getSendMsgBlockCnt());
-	    		    		
-	    		    		//발송 처리후 배열 초기화
-	    		    		Arrays.fill(tempPhoneList, null);
-	    		    		dividDayList.clear();
-	    					
-	    				}else if((i == callToListCnt -1) && sendCnt < 200){
-	    					
-	    					//마지막 리스트의 수신번호를 추가해 준다.
-	    					tempPhoneList[sendCnt] = phoneList[i];
-	    					
-	    					List<String> arrPhoneList2 = new ArrayList<String>();
-	    					
-	    					for(String temp : tempPhoneList) {
-	    						
-	    						if(temp != null) {
-	    							
-	    							arrPhoneList2.add(temp);
-	    							
-	    						}
-	    						
-	    					}
-	    					
-	    					
-	    					String[] sendPhoneList2 = new String[arrPhoneList2.size()];
-	    					
-	    					for(int j=0; j< arrPhoneList2.size(); j++) {
-	    						
-	    						sendPhoneList2[j] = arrPhoneList2.get(j);
-	    						
-	    					}
-	    					
-	    					
-	    					mjonMsgVO.setCallToList(sendPhoneList2);
-	    					sendCnt = 0;
-	    					
-	    					mjonMsgVO.setDividDay(dividDayList);
-	    					MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO);
-	    					mjonMsgVO.setAgentCode(returnVO.getAgentCode());
-	    		    		resultSts = resultSts + Integer.parseInt(returnVO.getSendMsgCnt());
-	    		    		resultBlockSts = resultBlockSts + Integer.parseInt(returnVO.getSendMsgBlockCnt());
-	    					
-	    				}else {
-	    					
-	    					tempPhoneList[sendCnt] = phoneList[i];
-	    					sendCnt++;
-	    					
-	    				}
-	    				
-	    			}
-	    			
-	    		}else {
-	    			
-	    			//분할 발송을 체크 한 경우
-					if(mjonMsgVO.getDivideChk() != null) {
-						for(int i=0; i< callToListCnt; i++) {
-							if(count > divideCnt) {
-		            			
-		            			count = 1;
-		            			
-		            			//분할 시간 간격을 증가시켜 준다.
-		            			cal.add(Calendar.MINUTE, turmMin);
-		            			dividDay = transFormat.format(cal.getTime());
-		                    	
-		            			dividDayList.add(dividDay);
-		            			//tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기
-		                		count++;
-		                		
-		            		}else {
-		            			
-		            			dividDayList.add(dividDay);
-		            			//tempVO.setReqDate(dividDay); //분할 문자 예약 시간 입력해주기
-		            			count++;
-		            			
-		            		}
-						
-						}
-	    				
-	    			}
-	    			
-					mjonMsgVO.setDividDay(dividDayList);
-	    			MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO);
-	    			mjonMsgVO.setAgentCode(returnVO.getAgentCode());
-		    		resultSts = Integer.parseInt(returnVO.getSendMsgCnt());
-		    		resultBlockSts = Integer.parseInt(returnVO.getSendMsgBlockCnt());
-		    		System.out.println("======================================== totPrice ::: "+mjonMsgVO.getTotPrice());
-	    			
-	    		}
-	    		
-	    		System.out.println("=========================================================================");
-	    		System.out.println("+++++++++++++++++++++++++++++++++++++++++++ resultSts ::: " + resultSts);
-	    		System.out.println("+++++++++++++++++++++++++++++++++++++++++++ resultBlockSts ::: " + resultBlockSts);
-	    		System.out.println("=========================================================================");
-	    		
-	    		try {
-	    		
-		    		
-		    		//스팸문구 포함된 문자 발송의 경우 스팸 문구 내용도 별도 저장함.
-		    		String spamStatus = mjonMsgVO.getSpamStatus();
-		    		
-		    		if(spamStatus == null) {
-		    			
-		    			spamStatus = "N";
-		    			mjonMsgVO.setSpamStatus("N");
-		    			
-		    		}
-		    		
-		    		if(spamStatus.equals("Y")) {
-		    			
-		    			int resultCnt = mjonSpamMsgService.insertSpamKeyWordMsgData(mjonMsgVO);
-		    			
-		    			System.out.println("+++++++++++++스팸문구 발송 내용 등록 +++++++++++++++++++++ "+resultCnt);
-		    			
-		    		}
-					
-				} catch (Exception e) {
-					System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
-					System.out.println("====================================== fncSendMsg MJ_MSG_GROUP && CASH ERROR !!! ::: " + e.getMessage());
-					System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
-				}
-	    		
-	    	}else {
-	    		
-				return new StatusResponse(HttpStatus.BAD_REQUEST, "문자 발송에 필요한 보유 잔액이 부족 합니다.");
-	    		
-	    	}
-	    	
-	    	//문자 발송 후 남은 보유 캐시 정보 불러오기
-//	    	String afterCash = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
-//	    	modelAndView.addObject("afterCash", afterCash);
-	    	
-//		}catch(Exception e) {
-			
-//			log.error(e.getMessage(), e);
-			
-//			System.out.println("=========================================================================");
-//			System.out.println("++++++++++++++++++++++++++++++++++++++++++++기타 시스템 오류 : " + e.getMessage());
-//			System.out.println("=========================================================================");
-//			
-//			modelAndView.addObject("result", "fail");
-//			modelAndView.addObject("message", "기타 시스템 오류 : " + e.getMessage());
+			// 메시지 타입 결정 로직을 MsgSendUtils의 getMsgType 메서드를 사용하여 처리
+			String msgType = MsgSendUtils.getMsgType(mjonMsgVO, smsBytes);
+			if ("INVALID".equals(msgType)) {
+				return "INVALID";
+			}
 	
-//		}
-	
-		Map<String, Object> returnMap = new HashMap<String, Object>();
-		
-//		returnMap.put("msgType", mjonMsgVO.getMsgType());
-//		returnMap.put("msgGroupId", mjonMsgVO.getMsgGroupId());
-		returnMap.put("resultSts", resultSts);
-		returnMap.put("resultBlockSts", resultBlockSts);
-
-		
-		
-		return new StatusResponse(HttpStatus.OK, "문자 전송이 완료되었습니다.", returnMap);
+			return msgType;
+		} catch (UnsupportedEncodingException e) {
+			throw new IllegalArgumentException("문자 인코딩 중 오류가 발생하였습니다.", e);
+		}
 	}
 
 
 
 
+	/**
+	 * @param mjonMsgVO
+	 * @return boolean 값으로 예약 문자 여부 확인
+	 * @discription 예약 여부에 따라 추가적인 예약 처리가 필요한지 확인합니다.
+	 * @작성자 20241007 이호영
+	*/
+	private boolean isScheduledMessage(MjonMsgVO mjonMsgVO) {
+		log.debug("Checking if the message is scheduled.");
+		// 예약 문자 여부 확인 (reserveYn이 "N"이 아닌 경우)
+		boolean isScheduled = !"N".equals(mjonMsgVO.getReserveYn());
+		log.debug("Is scheduled: {}", isScheduled);
+		return isScheduled;
+	}
+
+	/**
+	 * @param mjonMsgVO
+	 * @discription 예약 문자의 경우 예약 시간을 처리하고 예약 전송에 필요한 데이터를 설정합니다.
+	 * @작성자 20241007 이호영
+	 */
+	private void handleScheduledMessage(MjonMsgVO mjonMsgVO) {
+		log.debug("Handling scheduled message.");
+		try {
+			// 예약 시간 설정 및 처리
+			SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+			Date toDate = transFormat.parse(mjonMsgVO.getReqDate());
+			Calendar cal = Calendar.getInstance();
+			cal.setTime(toDate);
+			String formattedDate = transFormat.format(cal.getTime());
+			mjonMsgVO.setReqDate(formattedDate);
+			log.debug("Scheduled message date set to: {}", formattedDate);
+		} catch (ParseException e) {
+			log.error("Error occurred while parsing the scheduled date.", e);
+			throw new IllegalArgumentException("예약 시간 설정 중 오류가 발생하였습니다.", e);
+		}
+	}
+
+	/**
+	 * @param mjonMsgVO
+	 * @return boolean 값으로 분할 발송 여부 확인 (DivideChk 기준)
+	 * @discription DivideChk 필드를 기반으로 메시지가 분할 발송되어야 하는지 여부를 확인합니다.
+	 * @작성자 20241007 이호영
+	*/
+	private boolean isDivideMessage(MjonMsgVO mjonMsgVO) {
+		log.debug("Checking if the message needs to be divided.");
+		boolean needsDivide = mjonMsgVO.getDivideChk() != null;
+		log.debug("Needs divide: {}", needsDivide);
+		return needsDivide;
+	}
+
+	/**
+	 * @param mjonMsgVO
+	 * @throws Exception 
+	 * @discription 메시지가 DivideChk 기준으로 분할 발송이 필요한 경우 처리합니다.
+	 * @작성자 20241007 이호영
+	*/
+	private void handleDivideMessage(MjonMsgVO mjonMsgVO) throws Exception {
+		log.debug("Handling divided message based on DivideChk.");
+	
+		// DivideChk 필드에 따라 메시지를 분할 발송하는 로직 구현
+		// 예: 예약 시간 간격을 설정하고 해당 간격에 따라 여러 메시지로 나누어 발송합니다.
+		String[] phoneList = mjonMsgVO.getCallToList();
+		int callToListCnt = phoneList.length;
+		mjonMsgVO.setTotalCallCnt(callToListCnt);
+		log.debug("Total call count set to: {}", callToListCnt);
+	
+		int batchSize = Integer.parseInt(mjonMsgVO.getDivideCnt()); // DivideChk에 설정된 배치 크기 사용
+		int batchCount = (int) Math.ceil((double) callToListCnt / batchSize);
+		Calendar cal = Calendar.getInstance();
+		SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+		List<String> dividDayList = new ArrayList<>();
+	
+		for (int batchIndex = 0; batchIndex < batchCount; batchIndex++) {
+			int startIdx = batchIndex * batchSize;
+			int endIdx = Math.min(startIdx + batchSize, callToListCnt);
+			String[] batchPhoneList = Arrays.copyOfRange(phoneList, startIdx, endIdx);
+	
+			// 분할 시간 설정
+			if (batchIndex > 0) {
+				cal.add(Calendar.MINUTE, Integer.parseInt(mjonMsgVO.getDivideTime()));
+			}
+			String dividDay = transFormat.format(cal.getTime());
+			dividDayList.add(dividDay);
+			mjonMsgVO.setDividDay(dividDayList);
+	
+			log.debug("Processing divided batch {} with {} recipients.", batchIndex + 1, batchPhoneList.length);
+			mjonMsgVO.setCallToList(batchPhoneList);
+			sendMessage(mjonMsgVO);
+		}
+	
+		log.debug("Divide message handling completed.");
+	}
+
+
+	/**
+	 * @param mjonMsgVO
+	 * @return boolean 값으로 분할 발송 여부 반환
+	 * @discription 메시지 발송 시 수신자 목록의 길이를 기준으로 분할 발송이 필요한지 판단합니다.
+	 * @작성자 20241007 이호영
+	*/
+	private boolean isSplitRequired(MjonMsgVO mjonMsgVO) {
+		log.debug("Determining if split is required based on recipient count.");
+		int recipientCount = mjonMsgVO.getCallToList().length;
+		boolean needsSplit = recipientCount > 200;
+		log.debug("Recipient count: {}, Needs split: {}", recipientCount, needsSplit);
+		return needsSplit;
+	}
 
 
 
+	/**
+	 * @param mjonMsgVO
+	 * @throws Exception 
+	 * @discription 메시지가 분할 발송이 필요한 경우 각 배치로 나누어 처리합니다.
+	 * @작성자 20241007 이호영
+	*/
+	private void handleSplitMessage(MjonMsgVO mjonMsgVO) throws Exception {
+		log.debug("Handling split message.");
+		String[] phoneList = mjonMsgVO.getCallToList();
+		int callToListCnt = phoneList.length;
+		mjonMsgVO.setTotalCallCnt(callToListCnt);
+		log.debug("Total call count set to: {}", callToListCnt);
+	
+		int batchSize = 200;
+		int batchCount = (int) Math.ceil((double) callToListCnt / batchSize);
+		Calendar cal = Calendar.getInstance();
+		SimpleDateFormat transFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+		List<String> dividDayList = new ArrayList<>();
+		String[] tempPhoneList = new String[batchSize];
+	
+		for (int batchIndex = 0; batchIndex < batchCount; batchIndex++) {
+			int startIdx = batchIndex * batchSize;
+			int endIdx = Math.min(startIdx + batchSize, callToListCnt);
+			String[] batchPhoneList = Arrays.copyOfRange(phoneList, startIdx, endIdx);
+			System.arraycopy(batchPhoneList, 0, tempPhoneList, 0, batchPhoneList.length);
+			
+			// 분할 시간 설정
+			if (batchIndex > 0) {
+				cal.add(Calendar.MINUTE, Integer.parseInt(mjonMsgVO.getDivideTime()));
+			}
+			String dividDay = transFormat.format(cal.getTime());
+			dividDayList.add(dividDay);
+			mjonMsgVO.setDividDay(dividDayList);
+	
+			log.debug("Processing batch {} with {} recipients.", batchIndex + 1, batchPhoneList.length);
+			if (this.isLastBatch(batchPhoneList.length, batchIndex, batchCount)) {
+				this.processLastBatch(mjonMsgVO, tempPhoneList, batchPhoneList.length, dividDayList, phoneList[endIdx - 1]);
+			} else {
+				sendMessage(mjonMsgVO);
+			}
+		}
+	}
 
 
 
+	/**
+	 * @param sendCnt
+	 * @param currentIndex
+	 * @param totalLength
+	 * @return boolean 값으로 마지막 배치 여부 확인
+	 * @discription 현재 처리 중인 배치가 마지막 배치인지 확인합니다.
+	 * @작성자 20241007 이호영
+	*/
+	private boolean isLastBatch(int sendCnt, int currentIndex, int totalLength) {
+		boolean isLast = sendCnt == 199 || currentIndex == totalLength - 1;
+		log.debug("Is last batch: {}", isLast);
+		// 처리할 마지막 배치인지 확인
+		return isLast;
+	}
 
 
+	/**
+	 * @param mjonMsgVO
+	 * @param tempPhoneList
+	 * @param sendCnt
+	 * @param dividDayList
+	 * @param currentPhone
+	 * @throws Exception 
+	 * @discription 마지막 배치를 처리하고 메시지를 발송합니다.
+	 * @작성자 20241007 이호영
+	*/
+	private void processLastBatch(MjonMsgVO mjonMsgVO, String[] tempPhoneList, int sendCnt, List<String> dividDayList, String currentPhone) throws Exception {
+		log.debug("Processing last batch and sending message.");
+		tempPhoneList[sendCnt] = currentPhone; // 현재 전화번호를 배치에 추가
+		mjonMsgVO.setCallToList(Arrays.copyOf(tempPhoneList, sendCnt + 1)); // 발송할 전화번호 목록 설정
+		mjonMsgVO.setDividDay(dividDayList); // 해당 배치의 예약 시간 설정
+		sendMessage(mjonMsgVO); // 메시지 배치 발송
+	}
 
+	/**
+	 * @param mjonMsgVO
+	 * @throws Exception 
+	 * @discription 메시지 발송 데이터를 삽입하고 결과를 로그로 기록합니다.
+	 * @작성자 20241007 이호영
+	*/
+	private void sendMessage(MjonMsgVO mjonMsgVO) throws Exception {
+		log.debug("Sending message.");
+		// 메시지 데이터를 삽입하고 반환 값을 가져옴
+		MjonMsgReturnVO returnVO = mjonMsgDataService.insertMsgDataInfo(mjonMsgVO);
+		mjonMsgVO.setAgentCode(returnVO.getAgentCode()); // VO에 에이전트 코드 설정
+		log.info("Message sent: {} messages, {} blocked", returnVO.getSendMsgCnt(), returnVO.getSendMsgBlockCnt());
+	}
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+	private Map<String, Object> getReturnMap(int resultSts, int resultBlockSts) {
+		log.debug("Generating return map with result status.");
+		Map<String, Object> returnMap = new HashMap<>();
+		returnMap.put("resultSts", resultSts);
+		returnMap.put("resultBlockSts", resultBlockSts);
+		log.debug("Return map generated: {}", returnMap);
+		return returnMap;
+	}
 
 
 }
src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-apikey.xml
--- src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-apikey.xml
+++ src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-apikey.xml
@@ -1,6 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
-    "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
+<!-- <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" -->
+<!--     "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> -->
+    <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
+    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
 <sqlMapConfig>
 	<sqlMap resource="egovframework/sqlmap/let/mjo/apikey/ApiKeyMng_SQL_Mysql.xml"/>	 <!-- api key list -->
 	<sqlMap resource="egovframework/sqlmap/let/mjo/apikey/ApiCallInfoMng_SQL_Mysql.xml"/>	 <!-- api call info -->
src/main/resources/egovframework/sqlmap/let/holiday/MsgHolidayData_SQL_mysql.xml
--- src/main/resources/egovframework/sqlmap/let/holiday/MsgHolidayData_SQL_mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/holiday/MsgHolidayData_SQL_mysql.xml
@@ -3,7 +3,9 @@
   =========     =======    =================================================
   2024.07.29    우영두 	
 -->
-<!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="Holiday">
 	<typeAlias  alias="msgHolidayVO" type="itn.let.mjo.msgholiday.service.MsgHolidayVO"/>
 	<typeAlias  alias="msgAlarmSetVO" type="itn.let.mjo.msgholiday.service.MsgAlarmSetVO"/>
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
@@ -2787,7 +2787,7 @@
 	*/
 	var data = $("#searchAddrGrpForm").serialize();	 
 
-	var url = "/web/mjon/msgdata/selectMsgAddrListAjax_advc.do";
+	var url = "/web/mjon/msgdata/selectMsgAddrListAjax.do";
 	
 	$.ajax({
         type: "POST",
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
@@ -1133,7 +1133,7 @@
 	//수신번호 리스트 체크하기
 	var numCnt = 0;
 	var nameList = [];		//치환문자 이름
-	var phoneNum = [];	//받는사람
+	var phoneNum = [];		//받는사람
 	var rep1List = [];		//치환문자1
 	var rep2List = [];		//치환문자2
 	var rep3List = [];		//치환문자3
Add a comment
List