myname 2024-08-21
2024-08-21 14:59 주소록 관리 성능 향상을 위한 쿼리 변경
@2d8ef11cabcd8211a8c484fb0b781a12deb80cf0
src/main/java/itn/let/mjo/addr/service/AddrService.java
--- src/main/java/itn/let/mjo/addr/service/AddrService.java
+++ src/main/java/itn/let/mjo/addr/service/AddrService.java
@@ -22,6 +22,8 @@
 
 	List<AddrVO> selectAddrList(AddrVO addrVO) throws Exception;
 	
+	int selectAddrListCount(AddrVO addrVO) throws Exception;
+	
 	List<AddrVO> selectAddrNewList(AddrVO addrVO) throws Exception;
 	
 	AddrVO selectAddrDetail(AddrVO addrVO) throws Exception;
src/main/java/itn/let/mjo/addr/service/impl/AddrDAO.java
--- src/main/java/itn/let/mjo/addr/service/impl/AddrDAO.java
+++ src/main/java/itn/let/mjo/addr/service/impl/AddrDAO.java
@@ -35,6 +35,10 @@
 		return (List<AddrVO>) list("AddrDAO.selectAddrList", addrVO);
 	}
 	
+	public int selectAddrListCount(AddrVO addrVO) throws Exception{
+		return (int)select("AddrDAO.selectAddrListCount", addrVO);
+	}
+	
 	/**
 	 * 주소록 목록(속도개선)
 	 * @param addrVO
src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java
--- src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java
+++ src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java
@@ -74,6 +74,11 @@
 		return addrDAO.selectAddrList(addrVO);
 	}
 	
+	@Override
+	public int selectAddrListCount(AddrVO addrVO) throws Exception {
+		return addrDAO.selectAddrListCount(addrVO);
+	}
+	
 	public List<AddrVO> selectAddrNewList(AddrVO addrVO) throws Exception {
 		return addrDAO.selectAddrNewList(addrVO);
 	}	
@@ -402,7 +407,7 @@
 		if(addrListVO.size() > MAX_SINGLE_ENTRY_CNT) {
 			return new StatusResponse(
 					HttpStatus.BAD_REQUEST
-					, "주소록은 한번에 10만개까지만 등록이 가능합니다."
+					, "주소록은 한번에 100만개까지만 등록이 가능합니다."
 					, LocalDateTime.now()
 					);
 			
@@ -418,7 +423,7 @@
 		if(sumAddrCnt > MAX_ADDR_CNT) {
 			return new StatusResponse(
 							HttpStatus.BAD_REQUEST
-							, "주소록은 총 50만개까지만 등록이 가능합니다."
+							, "주소록은 총 1000만개까지만 등록이 가능합니다."
 							, LocalDateTime.now()
 							);
 					
src/main/java/itn/let/mjo/addr/web/AddrController.java
--- src/main/java/itn/let/mjo/addr/web/AddrController.java
+++ src/main/java/itn/let/mjo/addr/web/AddrController.java
@@ -364,7 +364,9 @@
 		
 		if(userId != "") {
 			addrVO.setMberId(userId);
-		} 
+		} else {
+			return "/web/addr/AddrListAjax";
+		}
 		
 		if(addrVO.getPageUnit() != 10) {
 			addrVO.setPageUnit(addrVO.getPageUnit());
src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/mjo/addr/Addr_SQL_Mysql.xml
@@ -8,7 +8,10 @@
 	<!-- 주소록 목록 조회 -->
 	<select id="AddrDAO.selectAddrList" parameterClass="addrVO" resultClass="addrVO">
 		/*	AddrDAO.selectAddrList	*/
-		SELECT
+		SELECT		
+		/*
+			1 			AS totCnt
+			*/			
 			COUNT(1) OVER() 			AS totCnt
 			,A.ADDR_ID					AS addrId
 			,A.ADDR_GRP_ID				AS addrGrpId
@@ -56,9 +59,19 @@
 			</iterate>
 		</isNotEmpty>		
 		
-		<isNotEmpty property="addrGrpId">
-			AND A.ADDR_GRP_ID = #addrGrpId#
-		</isNotEmpty>
+		AND      A.ADDR_GRP_ID in (
+							        select addr_grp_id
+									from mj_addr_grp	
+									where 1=1
+										<isNotEmpty property="mberId">
+											AND MBER_ID = #mberId#
+										</isNotEmpty>
+										<isNotEmpty property="addrGrpId">
+											AND ADDR_GRP_ID = #addrGrpId#
+										</isNotEmpty>			
+		        )		
+		
+
 		<isNotEmpty property="searchKeyword">
 	 		<isEqual property="searchCondition" compareValue="">
 	 			AND ( A.ADDR_PHONE_NO LIKE CONCAT ('%', #searchKeyword#,'%')
@@ -145,6 +158,121 @@
 		</isNotEmpty>
 		LIMIT #recordCountPerPage# OFFSET #firstIndex#
 	</select>
+		
+	<!-- 주소록 목록 조회 -->
+	<select id="AddrDAO.selectAddrListCount" parameterClass="addrVO" resultClass="int">
+		/*	AddrDAO.selectAddrListCount	*/
+		SELECT			
+			COUNT(1)  			AS totCnt			
+		FROM
+			MJ_ADDR A
+		LEFT OUTER JOIN 
+			MJ_ADDR_TRANS_HIST C
+		ON
+			A.ADDR_GRP_ID = C.ADDR_GRP_ID
+		WHERE 1=1
+		<isNotEmpty property="mberId">
+			AND A.MBER_ID = #mberId#
+		</isNotEmpty>		
+		
+		AND	(C.RECV_STATUS = 'Y' OR C.RECV_STATUS IS NULL)
+		
+		<isNotEmpty property="addrIdList">
+			<iterate prepend="AND A.ADDR_ID IN " open="(" close=")" conjunction="," property="addrIdList">
+				#addrIdList[]#
+			</iterate>
+		</isNotEmpty>		
+		
+		AND      A.ADDR_GRP_ID in (
+							        select addr_grp_id
+									from mj_addr_grp	
+									where 1=1
+										<isNotEmpty property="mberId">
+											AND MBER_ID = #mberId#
+										</isNotEmpty>
+										<isNotEmpty property="addrGrpId">
+											AND ADDR_GRP_ID = #addrGrpId#
+										</isNotEmpty>			
+		        )		
+		
+		<isNotEmpty property="searchKeyword">
+	 		<isEqual property="searchCondition" compareValue="">
+	 			AND ( A.ADDR_PHONE_NO LIKE CONCAT ('%', #searchKeyword#,'%')
+	 				OR A.ADDR_NM LIKE CONCAT ('%', #searchKeyword#,'%')
+	 				)
+	 		</isEqual>
+			<isEqual property="searchCondition" compareValue="1">
+				AND A.ADDR_PHONE_NO LIKE CONCAT ('%', #searchKeyword#,'%')
+			</isEqual>
+			<isEqual property="searchCondition" compareValue="2">
+				AND A.ADDR_NM LIKE CONCAT ('%', #searchKeyword#,'%')
+			</isEqual>
+			<isEqual property="searchCondition" compareValue="3">
+				AND A.MBER_ID LIKE CONCAT ('%', #searchKeyword#,'%')
+			</isEqual>			
+	 	</isNotEmpty>
+	 	<isNotEmpty property="searchAddrGrpId">
+	 		<isEqual property="searchAddrGrpId" compareValue="bookmark">
+	 		AND A.BOOKMARK = 'Y'
+	 		</isEqual>
+	 		<isNotEqual property="searchAddrGrpId" compareValue="bookmark">
+	 			<isEqual property="searchAddrGrpId" compareValue="noGrp">
+	 				AND A.ADDR_GRP_ID = '0' AND A.BOOKMARK = 'N'
+	 			</isEqual>
+	 			<isNotEqual property="searchAddrGrpId" compareValue="noGrp">
+	 				AND A.ADDR_GRP_ID = #searchAddrGrpId#
+ 				</isNotEqual>
+	 		</isNotEqual>
+	 	</isNotEmpty>
+		<isEqual property="startKeyword" compareValue="1">
+			AND (A.ADDR_NM RLIKE '^(ㄱ|ㄲ)' OR (A.ADDR_NM <![CDATA[>=]]> '가' AND A.ADDR_NM <![CDATA[<]]> '나')) 
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="2">
+			AND (A.ADDR_NM RLIKE '^(ㄴ)' OR (A.ADDR_NM <![CDATA[>=]]> '나' AND A.ADDR_NM <![CDATA[<]]> '다')) 
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="3">
+			AND (A.ADDR_NM RLIKE '^(ㄷ|ㄸ)' OR (A.ADDR_NM <![CDATA[>=]]> '다' AND A.ADDR_NM <![CDATA[<]]> '라'))
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="4">
+			AND (A.ADDR_NM RLIKE '^(ㄹ)' OR (A.ADDR_NM <![CDATA[>=]]> '라' AND A.ADDR_NM <![CDATA[<]]> '마'))
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="5">
+			AND (A.ADDR_NM RLIKE '^(ㅁ)' OR (A.ADDR_NM <![CDATA[>=]]> '마' AND A.ADDR_NM <![CDATA[<]]> '바'))
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="6">
+			AND (A.ADDR_NM RLIKE '^(ㅂ|ㅃ)' OR (A.ADDR_NM <![CDATA[>=]]> '바' AND A.ADDR_NM <![CDATA[<]]> '사')) 
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="7">
+			AND (A.ADDR_NM RLIKE '^(ㅅ|ㅆ)' OR (A.ADDR_NM <![CDATA[>=]]> '사' AND A.ADDR_NM <![CDATA[<]]> '아'))
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="8">
+			AND (A.ADDR_NM RLIKE '^(ㅇ)' OR (A.ADDR_NM <![CDATA[>=]]> '아' AND A.ADDR_NM <![CDATA[<]]> '자'))
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="9">
+			AND (A.ADDR_NM RLIKE '^(ㅈ|ㅉ)' OR (A.ADDR_NM <![CDATA[>=]]> '자' AND A.ADDR_NM <![CDATA[<]]> '차'))
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="10">
+			AND (A.ADDR_NM RLIKE '^(ㅊ)' OR (A.ADDR_NM <![CDATA[>=]]> '차' AND A.ADDR_NM <![CDATA[<]]> '카'))
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="11">
+			AND (A.ADDR_NM RLIKE '^(ㅋ)' OR (A.ADDR_NM <![CDATA[>=]]> '카' AND A.ADDR_NM <![CDATA[<]]> '타'))
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="12">
+			AND (A.ADDR_NM RLIKE '^(ㅌ)' OR (A.ADDR_NM <![CDATA[>=]]> '타' AND A.ADDR_NM <![CDATA[<]]> '파'))
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="13">
+			AND (A.ADDR_NM RLIKE '^(ㅍ)' OR (A.ADDR_NM <![CDATA[>=]]> '파' AND A.ADDR_NM <![CDATA[<]]> '하'))
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="14">
+			AND (A.ADDR_NM RLIKE '^(ㅎ)' OR (A.ADDR_NM <![CDATA[>=]]> '하' AND A.ADDR_NM <![CDATA[<=]]> '힣'))
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="a">
+	 		AND (A.ADDR_NM <![CDATA[>=]]> 'a' AND A.ADDR_NM <![CDATA[<=]]> 'z')
+		</isEqual>
+		<isEqual property="startKeyword" compareValue="0">
+			AND (A.ADDR_NM <![CDATA[>=]]> '0' AND A.ADDR_NM <![CDATA[<=]]>'9')
+		</isEqual>		
+	</select>	
 	
 	<!-- 주소록 목록 조회(속도개선) -->
 	<select id="AddrDAO.selectAddrNewList" parameterClass="addrVO" resultClass="addrVO">
Add a comment
List