이호영 이호영 2024-12-09
팩스 주소록 진행중
@ed05ea4648797602e4c9961fae11356f50194a4b
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
@@ -4688,8 +4688,19 @@
 	// 보유 금액이 충분한지 확인하는 메서드
 	private boolean isCashSufficient(MjonMsgVO mjonMsgVO) throws Exception {
 		String userMoney = priceAndPoint.getBefCash(mjonMsgVO.getUserId());
+		// 쉼표 제거
+		userMoney = userMoney.replace(",", "");
+		
+		String totalPrice = mjonMsgVO.getTotPrice();
+		// 쉼표 제거
+		totalPrice = totalPrice.replace(",", "");
+		
 		BigDecimal befCash = new BigDecimal(userMoney).setScale(2, RoundingMode.HALF_EVEN);
-		BigDecimal totMsgPrice = new BigDecimal(mjonMsgVO.getTotPrice()).setScale(2, RoundingMode.HALF_EVEN);
+		BigDecimal totMsgPrice = new BigDecimal(totalPrice).setScale(2, RoundingMode.HALF_EVEN);
+
+//		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;
 	}
src/main/resources/egovframework/sqlmap/let/fax/addr/Fax_AddrGroup_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/fax/addr/Fax_AddrGroup_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/fax/addr/Fax_AddrGroup_SQL_Mysql.xml
@@ -9,7 +9,7 @@
 		SELECT
 			COUNT(1) OVER() 					AS	totCnt
 			,A.ADDR_GRP_ID 						AS	addrGrpId
-			,A.MBER_ID 							AS	mberId
+			,A.MBER_ID 							AS	 mberId
 			,A.ADDR_GRP_NM 						AS	addrGrpNm
 			,DATE_FORMAT(A.FRST_REGIST_PNTTM, '%Y-%m-%d %T' )				AS	frstRegistPnttm
 			,A.DELETE_YN						AS	deleteYn
@@ -26,6 +26,7 @@
 		<isNotEmpty property="mberId">
 			AND A.MBER_ID = #mberId#
 		</isNotEmpty>
+			AND A.DELETE_YN  = 'N'
 		<isNotEmpty property="searchKeyword">
 	 		<isEqual property="searchCondition" compareValue="">
 	 			AND ( A.MBER_ID LIKE CONCAT ('%', #searchKeyword#,'%')
src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp
--- src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp
+++ src/main/webapp/WEB-INF/jsp/web/addr/AddrList.jsp
@@ -293,35 +293,11 @@
 
 //저장
 function SetAddrMassSave(){
-
-
-	
-	
-	
-	
-	
-	
 	
 	var $objTabul = fn_utils_getTabulator();
 	var tabulNm = fn_utils_getTabulatorNm();
 	var tabluC = '.'+tabulNm
 
-	/* console.log('$objTabul : ', $objTabul.getData());
-	if(tabulNm  == 'tableSelf'){
-		console.log('????');
-		
-		var allRows = $objTabul.getData(); // 테이블의 모든 데이터를 가져옴
-
-		// addrPhoneNo 값이 있는 행만 필터링
-		var rowsWithPhoneNumbers = allRows.filter(function(row) {
-			return row.addrPhoneNo && row.addrPhoneNo.trim() !== ''; // 값이 존재하고 공백이 아닌 경우
-		});
-		$objTabul = rowsWithPhoneNumbers;
-		console.log('rowsWithPhoneNumbers : ', rowsWithPhoneNumbers);
-		console.log('$objTabul : ', $objTabul.getData());
-		return false;
-	} */
-	
 	if($objTabul.getData().length < 1){
 		alert("한 개 이상의 연락처를 입력하세요");
 		return false;
@@ -385,64 +361,6 @@
 
 	}
 }
-/* 
-// 주소록 등록 old
-function setSenderList_old(){
-
-	// tab에 해당하는 타블레이터 가져오기
-
-	var tabulNm = fn_utils_getTabulatorNm();
-	var tabluC = '.'+tabulNm
-	  
-    var $objTabul = fn_utils_getTabulator();
-    var dataToSend = $objTabul.getData();
-    var addrGrpIdInfo = $(tabluC+" #addrGrpIdInfo option:selected").val();
-    var addrGrpNmInfo = $(tabluC+" #addrGrpNm").val();
-
-	var updateData = dataToSend.map(row => {
-	    row.addrGrpId = addrGrpIdInfo;
-	    row.addrGrpNm = addrGrpNmInfo;
-	    return row;
-	});
-	
-	console.log('updateData : ', updateData);
-	$.ajax({
-	    type: "POST",
-	    url: "/web/mjon/addr/addrMassInsertByTempAjax_advc.do",
-	    data: JSON.stringify(updateData),
-	    dataType: 'json',
-	    contentType: 'application/json',
-	    async: true,
-	    success: function (data) {
-	    	console.log('data : ', data);
-	    	
-
-			if (data.status == 'OK') {  
-				alert(data.message);
-				// 데이터 비우기
-				SetClear($objTabul);		
-				setAddrMassClose();
-				var selectMassVal = $("#addrGrpIdInfo option:selected").val();
-			} 
-			else {
-				alert("오류 알림 :  :: "+data.message);
-			}
-		},
-		error: function (e) { 
-			alert("저장에 실패하였습니다."); 
-			alert("ERROR : " + JSON.stringify(e)); 
-		},
-		beforeSend : function(xmlHttpRequest) {
-			//로딩창 show
-			$('.loading_layer').addClass('active');				
-		},	        	        
-		complete : function(xhr, textStatus) {
-			//로딩창 hide
-			$('.loading_layer').removeClass('active');
-		}
-	});
-}
- */
 
 function setSenderList_advc(){
 
src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforClipboard.jsp
--- src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforClipboard.jsp
+++ src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforClipboard.jsp
@@ -22,117 +22,12 @@
 	$("#funcAddrGroupSelect").load("/web/addr/selectAddrGroupAjax.do", function(response, status, xhr){});
 }
 
-
-function insertAddrGroupAjax() {
-	var form = document.addrGrpInsertForm;
-	if(form.addrGrpNm.value == "") {
-		alert("주소록 그룹명을 입력해주세요.");
-		return;
-	}
-	if(!confirm("주소록 그룹을 추가하시겠습니까?")) {
-		return;
-	}
-	var data = new FormData(form);
-	
-	$.ajax({
-		cache : false,
-		url : "<c:url value='/web/addr/insertAddrGroupAjax.do' />", 
-		type : 'POST', 
-		data : data,
-		dataType:'json',
-		processData: false,
-		contentType: false,
-		success : function(returnData, status){
-			if(status == "success") {
-				if("fail"==returnData.result){
-					alert(returnData.message);
-					return;
-				} else if("dupl"==returnData.result) {
-					alert("중복된 그룹명입니다.");
-					return;
-				}
-				alert("등록되었습니다.");
-				listAddrGrp();
-				addrGroupLoadAjax();
-				
-			}else{ alert("ERROR!");return;} 
-		},
-		error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
-	});
-	
-}
-
-function insertAddrAjax() {
-	var selectVal = $("#addrRegistSelect option:selected").val();
-	//alert(selectVal);
-	
-	var form = document.addrInsertForm;
-	/*
-	//필수값 아니어서 뺐음
-	if(form.addrNm.value == "") {
-		alert("주소록 이름을 입력하세요");
-		return;
-	}
-	*/
-	if(form.addrPhoneNo.value == "") {
-		alert("주소록 번호를 입력하세요");
-		return;
-	}
-	//if(!confirm("주소록을 추가하시겠습니까?")) {
-	//	return;
-	//}
-	
-	if(!checkHpNum(form.addrPhoneNo.value)){//휴대폰 유효성 검사
-		if(!checkNorPhoneNum(form.addrPhoneNo.value)){//일반전화 유효성 검사
-			
-			alert("잘못된 휴대폰번호 또는 일반전화 번호 입니다.");
-			return false;
-			
-		}
-		
-	}
-	
-	var data = new FormData(form);
-
-	$.ajax({
-		cache : false,
-		url : "<c:url value='/web/mjon/addr/insertAddrAjax.do' />", 
-		type : 'POST', 
-		data : data,
-		dataType:'json',
-		processData: false,
-		contentType: false,
-		success : function(returnData, status){
-			if(status == "success") {
-				if("fail"==returnData.result){
-					alert(returnData.message);
-					return;
-				} else if("dupl"==returnData.result){
-					alert("해당 그룹에 중복된 번호가 있습니다.");
-					return;
-				}
-				//alert("저장 되었습니다.");
-				
-				listAddrGrp();
-				addrGroupLoadAjax();
-				addrLoadAjax();
-				
-				// 주소록그룹 콤보박스 유지
-				setTimeout(setSelectSetting, 500, selectVal);			
-				
-			}else{ alert("ERROR!");return;} 
-		},
-		error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
-	});
-	
-}
-
 // 주소록그룹 콤보박스 유지
 function setSelectSetting(selectVal) {
 	$("#addrRegistSelect").val(selectVal).prop("selected", true);	
 }
 	
-function linkPage(pageNo){
+/* function linkPage(pageNo){
 	if ($('#searchKeywordAddr').val() != "" && $('#searchKeywordAddr').val() != null && $('#searchKeywordAddr').val() != undefined) {
 		// 문자전송 검색용
 		$("#msgStartKeyword").val("");
@@ -149,7 +44,7 @@
 	$("#adr1_right").load("/web/mjon/addr/selectAddrAjax.do", sendData, function(response, status, xhr){tableAllChk();});
 	addrGroupLoadAjax();
 }
-
+ */
 
 
 //#############################################################################################
src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp
--- src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp
+++ src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp
@@ -22,45 +22,6 @@
 }
 
 
-function insertAddrGroupAjax() {
-	var form = document.addrGrpInsertForm;
-	if(form.addrGrpNm.value == "") {
-		alert("주소록 그룹명을 입력해주세요.");
-		return;
-	}
-	if(!confirm("주소록 그룹을 추가하시겠습니까?")) {
-		return;
-	}
-	var data = new FormData(form);
-	
-	$.ajax({
-		cache : false,
-		url : "<c:url value='/web/addr/insertAddrGroupAjax.do' />", 
-		type : 'POST', 
-		data : data,
-		dataType:'json',
-		processData: false,
-		contentType: false,
-		success : function(returnData, status){
-			if(status == "success") {
-				if("fail"==returnData.result){
-					alert(returnData.message);
-					return;
-				} else if("dupl"==returnData.result) {
-					alert("중복된 그룹명입니다.");
-					return;
-				}
-				alert("등록되었습니다.");
-				listAddrGrp();
-				addrGroupLoadAjax();
-				
-			}else{ alert("ERROR!");return;} 
-		},
-		error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
-	});
-	
-}
-
 
 // 주소록그룹 콤보박스 유지
 function setSelectSetting(selectVal) {
@@ -140,10 +101,6 @@
             updateTableField(selectedField, newValue);
         }
     });
-
-
-	
-	
 	
 });
 
@@ -282,14 +239,10 @@
 		{title: "F", field: "F", hozAlign: "center", headerHozAlign: "center", width: 125, validator: ["maxLength:100", "string"]},
 		{title: "G", field: "G", hozAlign: "center", headerHozAlign: "center", width: 125, validator: ["maxLength:100", "string"]}
 	]);
-
-	console.log(' :: $tableExcel.setData(tableData) :: ');
 	$tableExcel.setData(tableData).then(() => {
 		// rowTotCnt 업데이트
 		document.getElementById("rowTotCnt").innerText = tableData.length;
 	});
-
-	console.log(' :: fn_loadRemoveActive :: ');
 	fn_loadRemoveActive();
 }
     
@@ -297,37 +250,6 @@
 //#############################################################################################
 //등록
 //#############################################################################################
-
-
-
-// 주소록 그룹 중복체크
-function getAddrGroupDuplCheckAjax() {
-	var isReturn = true;
-	
-	$.ajax({
-		url : "<c:url value='/web/addr/getAddrGroupDuplCheckAjax.do' />", 
-		type : 'POST', 
-		data : {"addrGrpNm" : $("#addrGrpNm").val()},
-		dataType:'json',
-		async: false,			// 동기
-		success : function(data, status){
-			if(data.isSuccess == true) {
-				if(data.isDupl == true) {
-					//alert("중복된 그룹명입니다.");
-					isReturn = false;
-				}
-			} 
-			else {
-				//alert("Message : " + msg);
-			}			
-		},
-		error: function (e) {
-			//alert("주소록 중복체크에 실패했습니다.");
-		}
-	});
-	
-	return isReturn;	
-}
 
 
 //#############################################################################################
@@ -353,33 +275,6 @@
 
 
 
-//중복 연락처 => 저장시
-// 해당 그룹
-/* function GetAddrMassSaveDupli() {
-	var sHtml = "";
-	sHtml += "<div class='' style='overflow-x:auto; height:350px;'>";
-	sHtml += "<table class='tType4'>";
-	sHtml += "		<colgroup>";
-	sHtml += "			<col style='width:auto' />";
-	sHtml += "		</colgroup>";
-	sHtml += "		<thead>";
-	sHtml += "			<tr>";
-// 	sHtml += "				<th>중복 휴대폰번호 (" + numberWithCommas(addrMassDupliSaveList.length) + "개)</th>";
-	sHtml += "				<th>중복 휴대폰번호 (10개)</th>";
-	sHtml += "			</tr>";
-	sHtml += "		</thead>";
-	sHtml += "		<tbody>";
-	for (var i = 0; i < addrMassDupliSaveList.length; i++) {
-		sHtml += "		<tr>";
-		sHtml += "			<td>" + addrMassDupliSaveList[i].addrPhoneNo + "</td>";
-		sHtml += "		</tr>";
-	}
-	sHtml += "		</tbody>";
-	sHtml += "	</table>";
-	sHtml += "	</div>";
-	
-	$("#addrMassSaveDupli_layer").html(sHtml);
-} */
 
 </script>
 
@@ -435,13 +330,7 @@
 							/ 오류 <span class="c_002c9a fwBold" id="rowErrorCnt">0</span>건 
 							<button type="button" class="btn_list_detail" data-tooltip="adr_popup14"><img src="/publish/images/search.png"></button>
 						</p>
-<!--                          <p>총 <span class="c_e40000">171</span>건 / 중복 <span class="c_002c9a">9</span>건 / 오류 <span class="c_002c9a">9</span>건 <button type="button" class="btn_list_detail"><img src="/publish/images/search.png"></button></p> -->
 							&nbsp; 
-<!-- 							<button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" onclick="GetAddrMassDupli()" id="btnAddrMassDupli">중복번호</button> -->
-<!-- 							<button type="button" class="btnType btnType6" data-tooltip="addrMassDupli_layer" id="tableExcelDupliBtn">중복번호</button> -->
-<!-- 							&nbsp; -->
-<!-- 							<button type="button" class="btnType btnType6" data-tooltip="addrMassSaveDupli_layer" onclick="GetAddrMassSaveDupli()" id="btnAddrMassSaveDupli">중복번호</button> -->
-<!-- 						<button type="button" class="btnType btnType6 addCallToF">번호추가</button> -->
 					</div>
 					
 					
src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp
--- src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrList.jsp
@@ -7,8 +7,10 @@
 
 <script type="text/javascript" src="<c:url value='/publish/js/content.js'/>"></script>
 <script type="text/javascript" src="https://oss.sheetjs.com/sheetjs/xlsx.full.min.js"></script>
-<script type="text/javascript" src="<c:url value='/js/user/fax/addr/faxTabulator.js'/>?v=20241031"></script>
-<script type="text/javascript" src="<c:url value='/js/user/fax/addr/faxEvent.js'/>?v=20241031"></script>
+<%-- <script type="text/javascript" src="<c:url value='/js/user/fax/addr/faxTabulator.js'/>?v=20241031"></script> --%>
+<script type="text/javascript" src="<c:url value='/js/user/fax/addr/init.js'/>?v=20241031"></script>
+<%-- <script type="text/javascript" src="<c:url value='/js/user/fax/addr/faxEvent.js'/>?v=20241031"></script> --%>
+<script type="text/javascript" src="<c:url value='/js/user/fax/addr/event.js'/>?v=20241031"></script>
 <script type="text/javascript" src="<c:url value='/js/web/addr/cmn.js?date=202409021440'/>"></script>
 <script type="text/javascript" src="<c:url value='/js/web/addr/utils.js'/>?v=20240919"></script>
 
@@ -166,229 +168,6 @@
 	if(type == "addrMob") 		location.href="/web/mjon/addr/addrMobGuide.do";
 	if(type == "addrApply") 	location.href="/web/mjon/addragency/selectAddrAgencyList.do";
 }
-
-
-
-//#############################################################################################
-//Tabulator
-//#############################################################################################
-var tableR = null; //우측 주소록 불러오기 Tabulator 변수
-
-/* 파일등록 */
-var _fileIdx = 0;
-var _fileForm2 = new Array();
-var fileExt = ""; // 첨부파일 확장자
-var excelAddr = []; //엑셀 불러오기에서 내용 저장하는 배열 변수
-
-$(document).ready(function(){
-	//Tabulator AJAX Data Loading
-
-	//tableR.setData(tabledata);
-
-	//받는사람 번호 버튼 클릭시 Tabulator에 데이터 넣어주기
-	$('.addCallToF').click(function(){ 
-		var recTableData = tableR.getRows();		 // 받는사람 리스트의 전체 목록을 저장
-		var tableData = [];
-
-		//빈 Row 한줄을 상단에 먼저 추가해준다.
-		tableData.push({phone: ""});
-		
-		//기존 받는사람 리스트를 배열에 미리 담아둔다.
-		if(recTableData.length > 0){
-			for(var j=0; j < recTableData.length; j++){
-				tableData.push({name: recTableData[j].getData().name, phone: removeDash(recTableData[j].getData().phone.trim()), memo: recTableData[j].getData().memo});
-			}
-		}
-		
-		//연락처 추가해 주기
-		//addPhoneInfo(tabledata);
-		
-		tableR.setData(tableData);
-		
-		//전체 데이터 갯수 구하기
-	    totRows = tableR.getRows().length;
-	    updateTotCnt(totRows);
-	});
-
-	//받는사람 오류번호 삭제 처리해주기
-	$('.chkVali_del').click(function(){
-		//기존 연락처 모두 불러오기
-	    var data = tableR.getRows();
-	    var tableData = [];
-	    var totLen = tableR.getRows().length;
-	    var errCnt = 0;
-	    
-	    if(totLen > 0){
-	    	if(confirm("올바르지 않은 연락처 정보를 삭제 하시겠습니까?")){
-	    		for(var i=0; i < totLen; i++){
-	            	var phone = data[i].getData().phone;
-	            	var valiCheck = checkFaxNum(phone);
-	            	if(valiCheck){//팩스 번호인 것만 저장해 준다.
-	            		tableData.push({name: data[i].getData().name.trim(), phone: data[i].getData().phone.trim(), memo:data[i].getData().memo});
-	            	}else{
-	            		errCnt++;
-	            	}
-	            }
-	            
-	            var removeDuplData = dupliPhoneData(tableData);
-	        	
-	            tableR.setData(removeDuplData);
-	            
-	            //총 받는사람 수 계산
-	            totRows = tableR.getRows().length;
-	            updateTotCnt(totRows);
-	            
-	          	if(errCnt > 0){
-	          		alert(errCnt + " 건의 연락처를 삭제하였습니다.");
-	          		return false;
-	          	}else{
-	          		alert("오류가 있는 연락처가 없습니다.");
-	          	}
-	    	}
-	    }else{
-	    	alert("연락처 정보를 입력해 주세요.");
-	    	return false;
-	    }
-	});
-
-
-	// 오류검사 항목 중복제거
-	function SetTableErrorDupliCheck(sVal) {
-		var isDuplicate = false;
-		if (tableErrorCheckData.length == 0) {
-			tableErrorCheckData.push(sVal);
-		}
-		else {
-			for (var i = 0; i < tableErrorCheckData.length; i++)
-			{
-				if (tableErrorCheckData[i] == sVal) {
-					isDuplicate = true;
-				}
-			}
-			
-			if (isDuplicate) {
-				return;
-			}
-			else {
-				tableErrorCheckData.push(sVal);
-			}
-		}
-	}	
-	
-	
-	// 오류검사 항목 중복제거
-	function SetTableErrorDupliCheck(sVal) {
-		var isDuplicate = false;
-		if (tableErrorCheckData.length == 0) {
-			tableErrorCheckData.push(sVal);
-		}
-		else {
-			for (var i = 0; i < tableErrorCheckData.length; i++)
-			{
-				if (tableErrorCheckData[i] == sVal) {
-					isDuplicate = true;
-				}
-			}
-			
-			if (isDuplicate) {
-				return;
-			}
-			else {
-				tableErrorCheckData.push(sVal);
-			}
-		}
-	}	
-	
-	$('.check_validity').click(function(){
-		tableErrorCheckData.length = 0;	// 오류 번호 배열 초기화
-		
-		var data = tableR.getRows();
-		var invalid = tableR.getInvalidCells();		//오류 데이터 체크
-		var dataLen = tableR.getRows().length;		//연락처 데이터 갯수
-		var totLen = invalid.length;				//오류 데이터 갯수
-		var errMsg = "";							//최종 alert에 표시할 메시지 저장 변수
-		
-		if(dataLen > 0) { //연락처 정보가 있으면 수행
-			if(totLen > 0) { //내용에 오류가 있으면 수행
-				//오류 데이터 값 저장
-				for(var i=0; i < totLen; i++) {
-					var cellValue = invalid[i].getValue();
-					SetTableErrorDupliCheck(cellValue);
-				}
-				
-				for(var i=0; i < dataLen; i++){
-					// 팩스번호 체크
-		        	var phone = data[i].getData().phone;
-		        	var valiCheck = checkFaxNum(phone);
-		        	if(!valiCheck){
-		        		SetTableErrorDupliCheck(phone);
-		        	}
-				}
-			}
-			else {
-				for(var i=0; i < dataLen; i++){
-					// 팩스번호 체크
-		        	var phone = data[i].getData().phone;
-		        	var valiCheck = checkFaxNum(phone);
-		        	if(!valiCheck){
-		        		SetTableErrorDupliCheck(phone);
-		        	}
-				}				
-			}
-		}
-		else {
-			alert("연락처를 입력해 주세요.");
-			return false;
-		}
-		
-		if (tableErrorCheckData.length > 0) {
-			for (var i = 0; i < tableErrorCheckData.length; i++)
-			{
-				errMsg += tableErrorCheckData[i];
-				if ((tableErrorCheckData.length - 1) > i) {
-					errMsg += ", ";
-				}
-			}			
-    		alert(errMsg + "의 내용에 오류가 있습니다.");			
-		}
-		else {
-			alert("오류 데이터가 없습니다.");			
-		}
-		
-		return false;		
-	});
-	
-
-	$('.addExcelDw').click(function(){
-		var data = tableR.getRows();
-		if(data.length > 0){
-			tableR.download("xlsx", "recieveAddr.xlsx", {sheetName:"recieveAddr"});
-		}else{
-			alert("입력된 연락처 정보가 없습니다.");
-			return false;
-		}
-	});
-
-	//받는사람 중복 삭제
-	$('.duple_del').click(function(){
-		//기존 연락처 모두 불러오기
-	    var data = tableR.getRows();
-	    var tableData = [];
-	    var dpCnt = 0;
-	    var totLen = tableR.getRows().length;
-	    
-	    for(var i=0; i < totLen; i++){
-	    	tableData.push({name: data[i].getData().name.trim(), phone: data[i].getData().phone.trim()});
-	    }
-	    
-	    var removeDuplData = dupliPhoneData(tableData);
-	    tableR.setData(removeDuplData);
-	    
-	    //총 받는사람 수 계산
-	    totRows = tableR.getRows().length;
-	    updateTotCnt(totRows);
-	});	
-});
 
 
 //전체 데이터 갯수 구하는 함수
@@ -681,6 +460,7 @@
 
 // 주소록 그룹 중복체크
 function getAddrGroupDuplCheckAjax(addrGrpNm) {
+	console.log('addrGrpNm : ', addrGrpNm);
 	var isReturn = true;
 	
 	$.ajax({
@@ -714,13 +494,7 @@
 	var $objTabul = fn_utils_getTabulator();
 	var tabulNm = fn_utils_getTabulatorNm();
 	var tabluC = '.'+tabulNm
-	
-	var loginVO = '${LoginVO}';
-	if(loginVO == "" || loginVO == null){
-		alert("로그인 후 이용이 가능합니다.");
-		return false;
-	}
-	
+
 	if($objTabul.getData().length < 1){
 		alert("한 개 이상의 연락처를 입력하세요");
 		return false;
@@ -728,6 +502,13 @@
 	
 	if($objTabul.getData().length > 300000){
 		alert("30만개 까지 등록 가능합니다.");
+		return false;
+	}
+
+	
+	var loginVO = '${LoginVO}';
+	if(fn_utils_isEmpty(loginVO)){
+		alert("로그인 후 이용이 가능합니다.");
 		return false;
 	}
 	
@@ -758,16 +539,13 @@
 		console.log('addrGrpNm : ', addrGrpNm);
 		
 		//주소록 중복체크
-		if (getAddrGroupDuplCheckAjax() == false) {
+		if (getAddrGroupDuplCheckAjax(addrGrpNm) == false) {
 			alert("중복된 그룹명입니다. 새 그룹명을 입력해주세요.");
 			return false;			
 		}
 	}	
 	
 	//수신번호 리스트 체크하기
-	var phoneList = [];
-	var nameList = [];
-	var memoList = [];
 	var confirmMsg = "저장하시겠습니까?\n이름 20byte, 메모 250byte 초과 글자는 절사됩니다.";
 	if (confirm(confirmMsg)) {
 		//로딩창 show
src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforClipboard.jsp
--- src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforClipboard.jsp
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforClipboard.jsp
@@ -23,110 +23,6 @@
 }
 
 
-function insertAddrGroupAjax() {
-	var form = document.addrGrpInsertForm;
-	if(form.addrGrpNm.value == "") {
-		alert("주소록 그룹명을 입력해주세요.");
-		return;
-	}
-	if(!confirm("주소록 그룹을 추가하시겠습니까?")) {
-		return;
-	}
-	var data = new FormData(form);
-	
-	$.ajax({
-		cache : false,
-		url : "<c:url value='/web/addr/insertAddrGroupAjax.do' />", 
-		type : 'POST', 
-		data : data,
-		dataType:'json',
-		processData: false,
-		contentType: false,
-		success : function(returnData, status){
-			if(status == "success") {
-				if("fail"==returnData.result){
-					alert(returnData.message);
-					return;
-				} else if("dupl"==returnData.result) {
-					alert("중복된 그룹명입니다.");
-					return;
-				}
-				alert("등록되었습니다.");
-				listAddrGrp();
-				addrGroupLoadAjax();
-				
-			}else{ alert("ERROR!");return;} 
-		},
-		error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
-	});
-	
-}
-
-function insertAddrAjax() {
-	var selectVal = $("#addrRegistSelect option:selected").val();
-	//alert(selectVal);
-	
-	var form = document.addrInsertForm;
-	/*
-	//필수값 아니어서 뺐음
-	if(form.addrNm.value == "") {
-		alert("주소록 이름을 입력하세요");
-		return;
-	}
-	*/
-	if(form.addrPhoneNo.value == "") {
-		alert("주소록 번호를 입력하세요");
-		return;
-	}
-	//if(!confirm("주소록을 추가하시겠습니까?")) {
-	//	return;
-	//}
-	
-	if(!checkHpNum(form.addrPhoneNo.value)){//휴대폰 유효성 검사
-		if(!checkNorPhoneNum(form.addrPhoneNo.value)){//일반전화 유효성 검사
-			
-			alert("잘못된 휴대폰번호 또는 일반전화 번호 입니다.");
-			return false;
-			
-		}
-		
-	}
-	
-	var data = new FormData(form);
-
-	$.ajax({
-		cache : false,
-		url : "<c:url value='/web/mjon/addr/insertAddrAjax.do' />", 
-		type : 'POST', 
-		data : data,
-		dataType:'json',
-		processData: false,
-		contentType: false,
-		success : function(returnData, status){
-			if(status == "success") {
-				if("fail"==returnData.result){
-					alert(returnData.message);
-					return;
-				} else if("dupl"==returnData.result){
-					alert("해당 그룹에 중복된 번호가 있습니다.");
-					return;
-				}
-				//alert("저장 되었습니다.");
-				
-				listAddrGrp();
-				addrGroupLoadAjax();
-				addrLoadAjax();
-				
-				// 주소록그룹 콤보박스 유지
-				setTimeout(setSelectSetting, 500, selectVal);			
-				
-			}else{ alert("ERROR!");return;} 
-		},
-		error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
-	});
-	
-}
-
 // 주소록그룹 콤보박스 유지
 function setSelectSetting(selectVal) {
 	$("#addrRegistSelect").val(selectVal).prop("selected", true);	
@@ -312,7 +208,8 @@
 	            return false;
 	        }
 	        
-	        let keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
+// 	        let keys = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
+	        let keys = ['A', 'B', 'C'];
 	        let data = {};
 	        splitData.forEach((item, index) => {
 	            data[keys[index]] = item.trim() || ""; // 빈 문자열로 기본값 설정
@@ -324,8 +221,11 @@
 	    console.log('Tabulator data before getData:', $tableClip.getData());
 // 	    $tableClip.clearData();
 		$tableClip.setData([{
-		    A: "", B: "", C: "", D: "", E: "", F: "", G: ""
+		    A: "", B: "", C: ""
 		}]); // 초기 데이터로 복원
+// 		$tableClip.setData([{
+// 		    A: "", B: "", C: "", D: "", E: "", F: "", G: ""
+// 		}]); // 초기 데이터로 복원
 	    $tableClip.setData(realPhone);
 	    var totRows = $tableClip.getDataCount(); 
 	    updateTotCnt(totRows);
@@ -454,99 +354,34 @@
                     <div class="adr_excel" style="margin-top: 13px; overflow-x: auto;">
                         <!-- thead -->
                         <div class="adr_hd select_adr_hd" data-group="tableClip">
-							<div style="width: 80px;"></div>
-							<div style="width: 125px;">
+							<div style="width:80px;"></div>
+							<div style="width:240px;">
 								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
-									<option value="addrPhoneNo">휴대폰</option>
-									<option value="addrInfo1">[*1*]</option>
-									<option value="addrInfo2">[*2*]</option>
-									<option value="addrInfo3">[*3*]</option>
-									<option value="addrInfo4">[*4*]</option>
+									<option value="addrPhoneNo">팩스번호</option>
 									<option value="addrComment">메모</option>
 								</select>
 							</div>
-							<div style="width: 125px;">
+							<div style="width:240px;">
 								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
-									<option value="addrPhoneNo">휴대폰</option>
-									<option value="addrInfo1">[*1*]</option>
-									<option value="addrInfo2">[*2*]</option>
-									<option value="addrInfo3">[*3*]</option>
-									<option value="addrInfo4">[*4*]</option>
+									<option value="addrPhoneNo">팩스번호</option>
 									<option value="addrComment">메모</option>
 								</select>
 							</div>
-							<div style="width: 125px;">
+							<div style="width:240px;">
 								<label for="" class="label"></label>
 								<select class="field-selector">
 									<option value="">선택하기</option>
 									<option value="addrNm">이름</option>
-									<option value="addrPhoneNo">휴대폰</option>
-									<option value="addrInfo1">[*1*]</option>
-									<option value="addrInfo2">[*2*]</option>
-									<option value="addrInfo3">[*3*]</option>
-									<option value="addrInfo4">[*4*]</option>
+									<option value="addrPhoneNo">팩스번호</option>
 									<option value="addrComment">메모</option>
 								</select>
 							</div>
-							<div style="width: 125px;">
-								<label for="" class="label"></label>
-								<select class="field-selector">
-									<option value="">선택하기</option>
-									<option value="addrNm">이름</option>
-									<option value="addrPhoneNo">휴대폰</option>
-									<option value="addrInfo1">[*1*]</option>
-									<option value="addrInfo2">[*2*]</option>
-									<option value="addrInfo3">[*3*]</option>
-									<option value="addrInfo4">[*4*]</option>
-									<option value="addrComment">메모</option>
-								</select>
-							</div>
-							<div style="width: 125px;">
-								<label for="" class="label"></label>
-								<select class="field-selector">
-									<option value="">선택하기</option>
-									<option value="addrNm">이름</option>
-									<option value="addrPhoneNo">휴대폰</option>
-									<option value="addrInfo1">[*1*]</option>
-									<option value="addrInfo2">[*2*]</option>
-									<option value="addrInfo3">[*3*]</option>
-									<option value="addrInfo4">[*4*]</option>
-									<option value="addrComment">메모</option>
-								</select>
-							</div>
-							<div style="width: 125px;">
-								<label for="" class="label"></label>
-								<select class="field-selector">
-									<option value="">선택하기</option>
-									<option value="addrNm">이름</option>
-									<option value="addrPhoneNo">휴대폰</option>
-									<option value="addrInfo1">[*1*]</option>
-									<option value="addrInfo2">[*2*]</option>
-									<option value="addrInfo3">[*3*]</option>
-									<option value="addrInfo4">[*4*]</option>
-									<option value="addrComment">메모</option>
-								</select>
-							</div>
-							<div style="width: 125px;">
-								<label for="" class="label"></label>
-								<select class="field-selector">
-									<option value="">선택하기</option>
-									<option value="addrNm">이름</option>
-									<option value="addrPhoneNo">휴대폰</option>
-									<option value="addrInfo1">[*1*]</option>
-									<option value="addrInfo2">[*2*]</option>
-									<option value="addrInfo3">[*3*]</option>
-									<option value="addrInfo4">[*4*]</option>
-									<option value="addrComment">메모</option>
-								</select>
-							</div>
-                        </div>
                      </div>					
 					
 					<div class="drag_drop_wrap callList_box" id="tabulator_clip">
src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp
--- src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp
+++ src/main/webapp/WEB-INF/jsp/web/fax/addr/include/FaxAddrListforExcel.jsp
@@ -16,45 +16,6 @@
 }
 
 
-function insertAddrGroupAjax() {
-	var form = document.addrGrpInsertForm;
-	if(form.addrGrpNm.value == "") {
-		alert("주소록 그룹명을 입력해주세요.");
-		return;
-	}
-	
-	if(!confirm("주소록 그룹을 추가하시겠습니까?")) {
-		return;
-	}
-	var data = new FormData(form);
-	
-	$.ajax({
-		cache : false,
-		url : "<c:url value='/web/addr/insertAddrGroupAjax.do' />", 
-		type : 'POST', 
-		data : data,
-		dataType:'json',
-		processData: false,
-		contentType: false,
-		success : function(returnData, status){
-			if(status == "success") {
-				if("fail"==returnData.result){
-					alert(returnData.message);
-					return;
-				} else if("dupl"==returnData.result) {
-					alert("중복된 그룹명입니다.");
-					return;
-				}
-				alert("등록되었습니다.");
-				listAddrGrp();
-				addrGroupLoadAjax();
-				
-			}else{ alert("ERROR!");return;} 
-		},
-		error: function (e) { alert("저장에 실패하였습니다."); console.log("ERROR : ", e); }
-	});
-}
-
 
 // 주소록그룹 콤보박스 유지
 function setSelectSetting(selectVal) {
@@ -252,7 +213,6 @@
 		document.getElementById("rowTotCnt").innerText = tableData.length;
 	});
 
-	console.log(' :: fn_loadRemoveActive :: ');
 	fn_loadRemoveActive();
 }
     
@@ -261,34 +221,6 @@
 //등록
 //#############################################################################################
 
-// 주소록 그룹 중복체크
-function getAddrGroupDuplCheckAjax() {
-	var isReturn = true;
-	
-	$.ajax({
-		url : "<c:url value='/web/addr/getAddrGroupDuplCheckAjax.do' />", 
-		type : 'POST', 
-		data : {"addrGrpNm" : $("#addrGrpNm").val()},
-		dataType:'json',
-		async: false,			// 동기
-		success : function(data, status){
-			if(data.isSuccess == true) {
-				if(data.isDupl == true) {
-					//alert("중복된 그룹명입니다.");
-					isReturn = false;
-				}
-			} 
-			else {
-				//alert("Message : " + msg);
-			}			
-		},
-		error: function (e) {
-			//alert("주소록 중복체크에 실패했습니다.");
-		}
-	});
-	
-	return isReturn;	
-}
 
 
 //#############################################################################################
src/main/webapp/js/user/fax/addr/event.js (Renamed from src/main/webapp/js/user/fax/addr/faxEvent.js)
--- src/main/webapp/js/user/fax/addr/faxEvent.js
+++ src/main/webapp/js/user/fax/addr/event.js
@@ -358,10 +358,10 @@
 
 	// 초기 필드(A, B, C, D 등)를 위한 열 설정
 	var columns = [
-		{formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
+		{formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, width:50, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
 			cell.getRow().toggleSelect();
 		}},
-		{formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:40}
+		{formatter:"rownum", align:"center", title:"No", hozAlign:"center", headerHozAlign:"center", width:100}
 	];
 
 	// 기본 필드로 열 구성
@@ -372,7 +372,7 @@
 			hozAlign: "center",
 			headerHozAlign: "center",
 			editor: false, // 편집 비활성화
-			width: 240,
+			width: 260,
 			validator: ["maxLength:100", "string"]
 		});
 	});
 
src/main/webapp/js/user/fax/addr/init.js (added)
+++ src/main/webapp/js/user/fax/addr/init.js
@@ -0,0 +1,209 @@
+
+
+var tableErrorData = [];
+var tableErrorCheckData = [];
+var addrMassDupliSaveList = null;
+
+var gArrRestartIndex = 0;	//배열 재시작카운드
+var gNameList = [];			//치환문자 이름
+var gPhoneList = [];		//받는사람
+var gMemoList = [];			//메모
+
+var $tableExcel = null;		//엑셀입력 탭
+var $tableClip = null;		//붙여넣기 탭
+var $tableSelf = null;		//직접입력 탭
+var $tableError = null;		//에러 팝업 영역
+
+
+$(document).ready(function(){
+
+	//excel 파일 불러오기 tabulator 
+	$tableExcel = new Tabulator("#tabulator_excel", {
+		height:"255px",
+		width:"100%",
+	    layout:"fitColumns",
+	    autoColumns:false,
+	    headerHozAlign:"center", 
+	    validationMode:"highlight",
+	    clipboard:false,
+	    clipboardCopySelector:"table",
+	    clipboardPasteAction:"insert", // insert, update, replace
+	    placeholder:"Excel 파일을 업로드 해주세요.", //fit columns to width of table (optional)
+	 	columns:[ //Define Table Columns
+	 		{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", width:50, headerSort:false, cellClick:function(e, cell){
+	 	        cell.getRow().toggleSelect();
+		 	}}
+	 		,{formatter:"rownum", hozAlign:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:100}
+		 	,{title:"A", field:"A", hozAlign:"center", headerHozAlign: "center", width:260, validator:["maxLength:100", "string"]}
+		 	,{title:"B", field:"B", hozAlign:"center", headerHozAlign: "center", width:260, validator:["maxLength:100", "string"]}
+		 	,{title:"C", field:"C", hozAlign:"center", headerHozAlign: "center", width:260, validator:["maxLength:100", "string"]}
+	 	],
+	 	validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 
+	        var valid = cell.isValid();
+	 		if(!valid){
+	 			alert("양식에 맞지 않는 정보가 입력되었습니다.");
+	 			
+	 			//해당 셀 데이터 삭제
+	 			cell.setValue("");
+	 		}
+	 		return value % parameters.phone;
+	    },
+	});
+	
+
+
+	$tableClip = new Tabulator("#tabulator_clip", {
+		height:"255px",
+		width:"100%",
+		layout:"fitColumns",
+		editor:true,
+		headerHozAlign:"center",
+		validationMode:"highlight",
+	    placeholder:"복사(Ctrl+C)한 내용을 여기에 붙여넣기(Ctrl+V) 해주세요.", //fit columns to width of table (optional)
+//		clipboard:true, // 클립보드 기능 활성화
+	    clipboardPasteAction:"update", // insert, update, replace
+	    columns: [
+            {formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", width:50, headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
+                cell.getRow().toggleSelect();
+            }},
+            {formatter:"rownum", hozAlign:"center" ,title:"No", hozAlign:"center", headerHozAlign:"center", width:100}
+		 	,{title:"A", field:"A", hozAlign:"center", headerHozAlign: "center", width:260, validator:["maxLength:100", "string"]}
+			,{title:"B", field:"B", hozAlign:"center", headerHozAlign: "center", width:260, validator:["maxLength:100", "string"]}
+			,{title:"C", field:"C", hozAlign:"center", headerHozAlign: "center", width:260, validator:["maxLength:100", "string"]}
+			/*,{title:"D", field:"D", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]}
+			,{title:"E", field:"E", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]}
+			,{title:"F", field:"F", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]}
+			,{title:"G", field:"G", hozAlign:"center", headerHozAlign: "center", width:125, validator:["maxLength:100", "string"]}*/
+		],
+		validationFailed: function(cell, value, parameters) {
+		    var valid = cell.isValid();
+		    if (!valid) {
+		        alert("양식에 맞지 않는 정보가 입력되었습니다.");
+		        cell.setValue(""); // 해당 셀 데이터 삭제
+		    }
+		    return false; // 유효하지 않은 경우 false 반환
+		},
+	});
+
+
+
+	//Tabulator AJAX Data Loading
+	$tableError = new Tabulator("#tabulator_error", {
+		height:"255px",
+		width:"100%",
+	    layout:"fitColumns",
+	    autoColumns:false,
+	    headerHozAlign:"center", 
+	    validationMode:"highlight",
+	    clipboard:false,
+	    clipboardCopySelector:"table",
+	    clipboardPasteAction:"insert", // insert, update, replace
+	    placeholder:"등록 팝업에서 팩스번호를 선택 후 확인해주세요.", //fit columns to width of table (optional)
+	 	columns:[ //Define Table Columns
+		 	{title:"이름", field:"name", hozAlign:"center", headerHozAlign: "center", width:125},
+		 	{title:"팩스번호", field:"phone", hozAlign:"center", headerHozAlign: "center", width:158},
+		 	{title:"미등록 결과", field:"result", hozAlign:"center", headerHozAlign: "center", width:125}
+	 	]
+	});
+	
+	// 타뷸레이터 width값 변경 시 위에 select width 값 변경
+	var titleArray = ["A","B","C","D","E","F","G"];
+
+	$tableExcel.on("columnWidth",function(column){
+		var titleIndex = titleArray.indexOf(column._column.definition.title);
+		titleIndex += 1;
+		if(titleIndex != 0){
+			$('.tableExcel .select_adr_hd>div').eq(titleIndex).css('width', column._column.width);
+		}else{
+			$('.tableExcel .select_adr_hd>div').eq(0).css('width', column._column.width + 40);
+		}
+	});
+
+	$tableExcel.on("scrollHorizontal",function(left){
+	      $(".tableExcel .adr_excel").scrollLeft(left);
+	})
+
+	$(".tableExcel .adr_excel").on("scroll",function(){
+		$(".tableExcel .tabulator-tableholder").scrollLeft($(this).scrollLeft());
+	});
+
+
+
+	$tableClip.on("columnWidth",function(column){
+		var titleIndex = titleArray.indexOf(column._column.definition.title);
+		titleIndex += 1;
+		if(titleIndex != 0){
+			$('.tableClip .select_adr_hd>div').eq(titleIndex).css('width', column._column.width);
+		}else{
+			$('.tableClip .select_adr_hd>div').eq(0).css('width', column._column.width + 40);
+		}
+	});
+
+	$tableClip.on("scrollHorizontal",function(left){
+	      $(".tableClip .adr_excel").scrollLeft(left);
+	})
+
+	$(".tableClip .adr_excel").on("scroll",function(){
+		$(".tableClip .tabulator-tableholder").scrollLeft($(this).scrollLeft());
+	});
+	
+
+}); 
+
+
+
+function fn_selfmakeTable(){
+	
+	var tableData = [];
+	for (var i = 0; i < 1000; i++) {
+		tableData.push({addrNm: "", addrPhoneNo: "", addrInfo1: "", addrInfo2: "", addrInfo3: "", addrInfo4: "", addrComment: ""});
+	}
+
+	// 테이블 초기화
+	$tableSelf = new Tabulator("#tabulator_self", {
+		height: "255px",
+		width: "100%",
+		layout: "fitColumns",
+		clipboardPasteAction: "update",
+		keybindings: {
+			"navRight": "tab", // Tab 키를 누르면 오른쪽 셀로 이동
+			"navLeft": "shift+tab",
+			"editNext": false // Tab 키를 누를 때 편집 모드를 종료하지 않도록 설정
+		},
+		data: tableData,
+		columns: [
+			{formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerHozAlign: "center", headerSort: false, cellClick: function(e, cell) {
+				cell.getRow().toggleSelect();
+			}},
+			{formatter:"rownum", hozAlign:"center" ,title:"No", headerHozAlign:"center", width:40},
+			{title:"이름", field:"addrNm", hozAlign:"center", headerHozAlign: "center", width:119, validator:["maxLength:100"], editor:"input"},
+			{title:"휴대폰", field:"addrPhoneNo", hozAlign:"center", headerHozAlign: "center", width:119, validator:["maxLength:100"], editor:"input"
+				, cellEdited:function(cell){
+					var currentValue = cell.getValue();
+					console.log('cell.getValue() : ', currentValue);
+
+					// 현재 값이 null 또는 undefined가 아니고, 값이 변경된 경우에만 처리
+					if (currentValue !== null 
+							&& currentValue !== ''
+							) {
+						var newValue = fn_selfUpdataCount(currentValue);
+
+						// 값이 실제로 변경된 경우에만 setValue 호출
+						if (currentValue !== newValue) {
+							cell.setValue(newValue);
+						}
+					}
+				}
+			},
+			{title:"[*1*]", field:"addrInfo1", hozAlign:"center", headerHozAlign: "center", width:119, validator:["maxLength:100"], editor:"input"},
+			{title:"[*2*]", field:"addrInfo2", hozAlign:"center", headerHozAlign: "center", width:119, validator:["maxLength:100"], editor:"input"},
+			{title:"[*3*]", field:"addrInfo3", hozAlign:"center", headerHozAlign: "center", width:119, validator:["maxLength:100"], editor:"input"},
+			{title:"[*4*]", field:"addrInfo4", hozAlign:"center", headerHozAlign: "center", width:119, validator:["maxLength:100"], editor:"input"},
+			{title:"메모", field:"addrComment", hozAlign:"center", headerHozAlign: "center", width:119, validator:["maxLength:100"], editor:"input"}
+		],
+		navigation: true // 키보드 탐색 활성화
+	});
+}
+
+
+
Add a comment
List