이호영 이호영 2024-08-28
문자전송 > 주소록 불러오기 건수 테스트
@83beeb1b7e5cf3bda722a658b24899a6b92deb08
src/main/java/itn/let/mjo/addr/service/AddrVO.java
--- src/main/java/itn/let/mjo/addr/service/AddrVO.java
+++ src/main/java/itn/let/mjo/addr/service/AddrVO.java
@@ -412,5 +412,39 @@
 	}
 
 
+
+    private int page = 1;  // 기본 값 설정
+    private int size = 10; // 기본 값 설정
+    private int offset; // 기본 값 설정
+
+
+    public int getPage() {
+        return page;
+    }
+
+    public void setPage(int page) {
+        if(page > 0) {
+            this.page = page;
+        }
+    }
+
+    public int getSize() {
+        return size;
+    }
+
+    public void setSize(int size) {
+        if(size > 0) {
+            this.size = size;
+        }
+    }
+
+    // OFFSET 계산 메서드 추가
+    public int getOffset() {
+        return (page - 1) * size;
+    }
+	public void setOffset(int offset) {
+		this.offset = offset;
+	}
+    
 	
 }
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
@@ -174,5 +174,7 @@
 	public String selectMsgUserLastIdgen(MjonMsgVO mjonMsgVO) throws Exception;
 
 	public List<AddrVO> selectMsgAddrListAjax_advc(AddrVO addrVO) throws Exception;
+
+	public int countByMsgAddrListAjax_advc(AddrVO addrVO) throws Exception;
 	
 }
src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataDAO.java
--- src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataDAO.java
+++ src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataDAO.java
@@ -355,5 +355,10 @@
 	public List<AddrVO> selectMsgAddrListAjax_advc(AddrVO addrVO) {
 		return (List<AddrVO>) list("mjonMsgDAO.selectMsgAddrListAjax_advc", addrVO);
 	}
+
+
+	public int countByMsgAddrListAjax_advc(AddrVO addrVO) {
+		return (int) select("mjonMsgDAO.countByMsgAddrListAjax_advc", addrVO);
+	}
 	
 }
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
@@ -3057,5 +3057,11 @@
 		return mjonMsgDataDAO.selectMsgAddrListAjax_advc(addrVO);
 	}
 	
+	@Override
+	public int countByMsgAddrListAjax_advc(AddrVO addrVO) throws Exception {
+		
+		return mjonMsgDataDAO.countByMsgAddrListAjax_advc(addrVO);
+	}
+	
 	
 }
src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java
--- src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java
+++ src/main/java/itn/let/mjo/msgdata/web/MjonMsgDataController.java
@@ -40,6 +40,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.ui.ModelMap;
@@ -1759,8 +1761,7 @@
 
 	        long startTime = System.currentTimeMillis(); // 시작 시간 측정
 	        
-//	    	List<AddrVO> resultAddrList = mjonMsgDataService.selectMsgAddrListAjax(addrVO);
-	    	List<AddrVO> resultAddrList = mjonMsgDataService.selectMsgAddrListAjax_advc(addrVO);
+	    	List<AddrVO> resultAddrList = mjonMsgDataService.selectMsgAddrListAjax(addrVO);
 
 	        long endTime = System.currentTimeMillis(); // 종료 시간 측정
 
@@ -1775,6 +1776,56 @@
 			return modelAndView;
 		}
 		
+		/**
+		 * 주소록 그룹 선택시 우측 주소록 리스트 화면 불러오기
+		 *
+		 * @param AddrGroupVO
+		 * @param AddrVO
+		 * @param sessionVO
+		 * @param model
+		 * @return
+		 * @throws Exception
+		 */
+		@RequestMapping(value= {"/web/mjon/msgdata/selectMsgAddrListAjax_advc.do"})
+		public ResponseEntity<?> selectMsgAddrListAjax_advc(@ModelAttribute("searchVO") AddrVO addrVO) {
+			
+		    Map<String, Object> response = new HashMap<>();
+		    
+		    try {
+		        // 로그인 권한 정보 확인
+		        LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated() ? (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser() : null;
+		        String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+
+		        if (userId.isEmpty()) {
+		            response.put("result", "loginFail");
+		            response.put("message", "로그인 후 이용이 가능합니다.");
+		            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(response);
+		        }
+
+		        addrVO.setMberId(userId);
+
+		        // OFFSET 계산
+		        int offset = (addrVO.getPage()) * addrVO.getSize();
+		        addrVO.setOffset(offset);
+		        // 데이터 조회
+		        List<AddrVO> resultAddrList = mjonMsgDataService.selectMsgAddrListAjax_advc(addrVO);
+		        int totalCount = mjonMsgDataService.countByMsgAddrListAjax_advc(addrVO); // 필터에 맞는 총 레코드 수 가져오기
+
+		        // 페이지네이션 계산
+		        int lastPage = (int) Math.ceil((double) totalCount / addrVO.getSize());
+
+		        // 응답 데이터 구성
+		        response.put("data", resultAddrList);
+		        response.put("last_page", lastPage); // 클라이언트가 사용할 수 있도록 last_page 포함
+		        response.put("total_count", totalCount); // 필요 시, 총 레코드 수 포함
+
+		    } catch (Exception e) {
+		        e.printStackTrace();
+		        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
+		    }
+	        return ResponseEntity.ok(response);  // resultAddrList만 반환
+		}
+		
 	/**
 	 * 최근 전송내역 리스트 화면 불러오기
 	 * 
src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml
--- src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml
@@ -3710,6 +3710,7 @@
 	
 	<!-- 등록 주소록 그룹 선택시 리스트 불러오기 -->
 	<select id="mjonMsgDAO.selectMsgAddrListAjax_advc" parameterClass="addrVO" resultClass="addrVO">
+		/* mjonMsgDAO.selectMsgAddrListAjax_advc */
 		
 		SELECT   A.ADDR_ID AS addrId,
 		         A.ADDR_GRP_ID AS addrGrpId,
@@ -3763,6 +3764,54 @@
 			</isEqual>
 		</isNotEmpty>
 		ORDER BY A.ADDR_NM ASC, A.LAST_UPDT_PNTTM DESC
+    LIMIT #size# OFFSET #offset#
+	
+	</select>
+	
+	<!-- 등록 주소록 그룹 선택시 리스트 불러오기 -->
+	<select id="mjonMsgDAO.countByMsgAddrListAjax_advc" parameterClass="addrVO" resultClass="int">
+		
+		SELECT
+			COUNT(A.ADDR_ID)
+		FROM     MJ_ADDR A
+		LEFT OUTER JOIN 
+			MJ_ADDR_GRP B
+		ON 
+			A.ADDR_GRP_ID = B.ADDR_GRP_ID
+		WHERE    A.MBER_ID = #mberId#
+		AND	(A.RECV_STATUS = 'Y' OR A.RECV_STATUS = 'S' OR A.RECV_STATUS IS NULL)
+		AND      A.DELETE_YN = 'N'
+		<isNotEmpty property="type">
+			<isEqual property="type" compareValue="none">
+				AND		A.ADDR_GRP_ID = '0' 
+				AND 	A.BOOKMARK = 'N'
+			</isEqual>
+			<isEqual property="type" compareValue="book">
+				AND		A.BOOKMARK = 'Y' 
+			</isEqual>
+			<isEqual property="type" compareValue="grp">
+				AND		A.ADDR_GRP_ID = #searchAddrGrpId#
+			</isEqual>
+		</isNotEmpty>
+		<isNotEmpty property="searchCondition">
+			<isEqual property="searchCondition" compareValue="0">
+				AND		
+				( 
+					A.ADDR_NM LIKE CONCAT('%', #searchKeyword#, '%') 
+					OR A.ADDR_PHONE_NO LIKE CONCAT('%', #searchKeyword#, '%')
+					OR B.ADDR_GRP_NM LIKE CONCAT('%', #searchKeyword#, '%') 
+				)
+			</isEqual>
+			<isEqual property="searchCondition" compareValue="1">
+				AND		B.ADDR_GRP_NM LIKE CONCAT('%', #searchKeyword#, '%')
+			</isEqual>
+			<isEqual property="searchCondition" compareValue="2">
+				AND		A.ADDR_NM LIKE CONCAT('%', #searchKeyword#, '%')
+			</isEqual>
+			<isEqual property="searchCondition" compareValue="3">
+				AND		A.ADDR_PHONE_NO LIKE CONCAT('%', #searchKeyword#, '%')
+			</isEqual>
+		</isNotEmpty>
 	
 	</select>
 	
src/main/webapp/WEB-INF/jsp/web/msgcampain/MsgDataSMLView.jsp
--- src/main/webapp/WEB-INF/jsp/web/msgcampain/MsgDataSMLView.jsp
+++ src/main/webapp/WEB-INF/jsp/web/msgcampain/MsgDataSMLView.jsp
This diff is too big to display.
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
@@ -87,50 +87,58 @@
 
 	});
 	
-	
-	//주소록 불러오기 팝업 내용
-	//Tabulator AJAX Data Loading
+	// Tabulator 초기화
 	tableAddr = new Tabulator(".callAddr_box", {
-		height:"255px",
-	    layout:"fitColumns",
-	    headerHozAlign:"center",
-	    validationMode:"highlight",
-	    placeholder:"주소록 그룹을 선택해 주세요.", //fit columns to width of table (optional)
-	    resizableColumns:false,
-	 	columns:[ //Define Table Columns
-	 		{formatter:"rowSelection", titleFormatter:"rowSelection",clipboard:false, hozAlign:"center", headerSort:false, cellClick:function(e, cell){
-	 	        cell.getRow().toggleSelect();
-		 		}
-		 	}, 
-		 	{title:"그룹명", hozAlign:"center", field:"addrGroupNm", editor:"input", width:100, validator:["required","minLength:2", "maxLength:40"]},
-		 	{title:"이름", hozAlign:"center", field:"addrName", editor:"input",  width:100, validator:["maxLength:12"]},
-		 	{title:"휴대폰번호", hozAlign:"center", field:"addrPhone", editor:"input", width:100, validator:["required","minLength:10", "maxLength:11"]},
-		 	{title:"[*1*]", hozAlign:"center", field:"addrRep1", editor:"input", width:84, validator:["maxLength:40"]},
-		 	{title:"[*2*]", hozAlign:"center", field:"addrRep2", editor:"input", width:84, validator:["maxLength:40"]},
-		 	{title:"[*3*]", hozAlign:"center", field:"addrRep3", editor:"input", width:84, validator:["maxLength:40"]},
-		 	{title:"[*4*]", hozAlign:"center", field:"addrRep4", editor:"input", width:84, validator:["maxLength:40"]},
-		 	
-	 	],
-	 	validationFailed:function(cell, value, parameters){ // 유효성 체크 함수 - 아직 잘 모르겠음 
-	 		var valid = cell.isValid();
-	 		var fieldNm = cell.getField();
-	 		if(!valid){
-	 			if(fieldNm == "addrName"){
-	 				alert("받는사람 이름은 최대 12글자까지만 입력 가능합니다.");
-	 			}else if(fieldNm == "addrPhone"){
-	 				alert("휴대폰번호는 하이픈(-)을 제외한 숫자만 정확히 입력해 주세요.");
-	 			}else if(fieldNm == "addrGroupNm"){
-	 				alert("그룹명을 정확히 입력해 주세요. 2 ~ 40글자 이내로 입력 가능합니다.");
-	 			}else{
-		 			alert("치환문자를 정확히 입력해 주세요. 100글자 이내로 입력 가능합니다.");
-	 			}
-	 			
-	 			//해당 셀 데이터 삭제
-	 			cell.setValue("");
-	 		}
-	 		return value % parameters.addrPhone;
+	    height: "255px",
+	    layout: "fitColumns",
+	    headerHozAlign: "center",
+	    validationMode: "highlight",
+	    placeholder: "주소록 그룹을 선택해 주세요.", 
+	    resizableColumns: false,
+		progressiveLoad:"scroll",
+// 	    progressiveLoadScrollMargin:300, //trigger next ajax load when scroll bar is 300px or less from the bottom of the table.
+	    ajaxURL: "/web/mjon/msgdata/selectMsgAddrListAjax_advc.do", // 데이터 URL 설정
+	    ajaxConfig: {
+	        method: "GET",
 	    },
-
+	    ajaxParams: { // Initial AJAX parameters
+	        size: 350000,  // Set initial page size
+	        type: "",  // Default value, can be updated later
+	        searchAddrGrpId: "",  // Default value, can be updated later
+	        searchKeyword: "",  // Default value, can be updated later
+	        searchCondition: ""  // Default value, can be updated later
+	    },
+	    columns: [
+	        {formatter: "rowSelection", titleFormatter: "rowSelection", clipboard: false, hozAlign: "center", headerSort: false, cellClick: function(e, cell) {
+	                cell.getRow().toggleSelect();
+	            }
+	        }, 
+	        {formatter: "rownum", align: "center", title: "No", hozAlign: "center", headerHozAlign: "center", width: 60},
+	        {title: "그룹명", hozAlign: "center", field: "addrGroupNm", editor: "input", width: 100, validator: ["required", "minLength:2", "maxLength:40"]},
+	        {title: "이름", hozAlign: "center", field: "addrName", editor: "input", width: 100, validator: ["maxLength:12"]},
+	        {title: "휴대폰번호", hozAlign: "center", field: "addrPhone", editor: "input", width: 100, validator: ["required", "minLength:10", "maxLength:11"]},
+	        {title: "[*1*]", hozAlign: "center", field: "addrRep1", editor: "input", width: 84, validator: ["maxLength:40"]},
+	        {title: "[*2*]", hozAlign: "center", field: "addrRep2", editor: "input", width: 84, validator: ["maxLength:40"]},
+	        {title: "[*3*]", hozAlign: "center", field: "addrRep3", editor: "input", width: 84, validator: ["maxLength:40"]},
+	        {title: "[*4*]", hozAlign: "center", field: "addrRep4", editor: "input", width: 84, validator: ["maxLength:40"]},
+	    ],
+	    validationFailed: function(cell, value, parameters) { 
+	        var valid = cell.isValid();
+	        var fieldNm = cell.getField();
+	        if (!valid) {
+	            if (fieldNm == "addrName") {
+	                alert("받는사람 이름은 최대 12글자까지만 입력 가능합니다.");
+	            } else if (fieldNm == "addrPhone") {
+	                alert("휴대폰번호는 하이픈(-)을 제외한 숫자만 정확히 입력해 주세요.");
+	            } else if (fieldNm == "addrGroupNm") {
+	                alert("그룹명을 정확히 입력해 주세요. 2 ~ 40글자 이내로 입력 가능합니다.");
+	            } else {
+	                alert("치환문자를 정확히 입력해 주세요. 100글자 이내로 입력 가능합니다.");
+	            }
+	            cell.setValue("");
+	        }
+	        return value % parameters.addrPhone;
+	    },
 	});
 	
 	
@@ -2850,42 +2858,38 @@
 	
 }
 
+
 //주소록 불러오기 팝업의 그룹 선택시 우측에 주소록 불러오기
-function fnSelectAddrList(type,addrGrpId,item){
-	
-	// 주소록 그룹 열림, 닫힘 폴더이미지 초기화
+function fnSelectAddrList(type, addrGrpId, item) {
+	// 폴더 이미지 초기화 및 설정
 	$(".adr_pop_list div p").each(function (index, item) {
 		$(item).find("img").attr("src", "/publish/images/content/close_folder2.png");
 		$(item).find("img").attr("alt", "폴더 닫힘");
 	});
-	
-	var form = document.searchAddrGrpForm;
-	form.type.value = type;
-	form.searchAddrGrpId.value = addrGrpId;
-	form.searchKeyword.value = "";
-	form.searchCondition.value = form.searchAddrCondition.value;
-	
-	//왼쪽 그룹리스트의 그룸명을 선택시 검색어를 초기화해준다.
-	form.searchAddrKeyword.value="";
-	
-	/*
-	$(item).toggleClass("open");
-	if ($(item).hasClass("open") === true) {
-		$(item).find("img").attr("src", "/publish/images/content/open_folder2.png");
-		$(item).find("img").attr("alt", "폴더 열림");
-	}
-	else {
-		$(item).find("img").attr("src", "/publish/images/content/close_folder2.png");
-		$(item).find("img").attr("alt", "폴더 닫힘");
-	}
-	*/
-	   
+
+//  var form = document.searchAddrGrpForm;
+//  form.type.value = type;
+//  form.searchAddrGrpId.value = addrGrpId;
+//  form.searchKeyword.value = "";
+//  form.searchCondition.value = form.searchAddrCondition.value;
+
+ // 왼쪽 그룹리스트의 그룹명을 선택 시 검색어를 초기화해준다.
+//  form.searchAddrKeyword.value = "";
+
 	$(item).find("img").attr("src", "/publish/images/content/open_folder2.png");
 	$(item).find("img").attr("alt", "폴더 열림");
-	
-	loadAddrList();
-	
+
+ // Tabulator의 ajaxParams 설정
+	tableAddr.setData("/web/mjon/msgdata/selectMsgAddrListAjax_advc.do", {
+		searchAddrGrpId: addrGrpId,
+		type: type,
+//      searchKeyword: form.searchAddrKeyword.value,
+//      searchCondition: form.searchCondition.value,
+		size: 350000,  // 페이지당 로드할 데이터 수
+	});
 }
+
+
 
 function fnAddrSearch(){
 	
@@ -2900,11 +2904,11 @@
 function loadAddrList(){
 
 	/*
-		serialize 를 사용할때는 processData, contentType 옵션 제가할것
+		serialize 를 사용할때는 processDa    ta, contentType 옵션 제가할것
 	*/
 	var data = $("#searchAddrGrpForm").serialize();	 
 
-	var url = "/web/mjon/msgdata/selectMsgAddrListAjax.do";
+	var url = "/web/mjon/msgdata/selectMsgAddrListAjax_advc.do";
 	
 	$.ajax({
         type: "POST",
@@ -2920,12 +2924,11 @@
 				if(returnData.result == "success"){
 					
 					var addrList = returnData.resultAddrList;
-					var tableData = [];
 					
 					if(addrList.length == 0){
 						
 						alert("주소록 정보가 없습니다.");
-						tableAddr.setData(tableData);
+// 	                    tableAddr.setData([]);
 						return false;
 					}
 					
@@ -2956,7 +2959,8 @@
 					
 					//우측 주소록 리스트 Tabulator에 입력해주기
 // 					tableAddr.setData(tableData);
-					tableAddr.setData(addrList);
+// 					tableAddr.setData(addrList);
+	                tableAddr.updateOrAddData(addrList); // 무한 스크롤을 위해 데이터를 업데이트
 					
 				}else{
 					
@@ -2969,8 +2973,10 @@
 				alert("주소록 불러오기에 실패하였습니다. !!");
 			}
 		},
-        error: function (e) { 
-        	alert("주소록 불러오기에 실패하였습니다."); console.log("ERROR : ", e); 
+        error: function (jqXHR, textStatus, errorThrown) { 
+            alert("주소록 불러오기에 실패하였습니다."); 
+            console.log("ERROR : ", jqXHR.status, textStatus, errorThrown); // 상태 코드, 상태 텍스트, 에러 메시지 출력
+            console.log("Response Text: ", jqXHR.responseText); // 서버 응답 텍스트 출력
         },
 		beforeSend : function(xmlHttpRequest) {
         	//로딩창 show
Add a comment
List