어떤 미친쿼리같은 경우 물음표 파라미터를 몇십에서 백개정도로 사용하는 쿼리가 있는데, 쿼리를 분석하기에 무지 힘들어서 물음표쿼리를 named쿼리로 변경해주는 jsp페이지를 만들었다.
기본소스는 “까먹지말자!(이글루스)” 권남님 블로그님에게서 가져왔으며
http://egloos.zum.com/kwon37xi/v/1897209
사용상 편의 때문에 나한테 맞게 조금 수정했다.
JoinQuery.jsp
———————————————————————————————————
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*"%> <%! /** 파라미터 개수 */ public static final int NUMBER_OF_PARAMS = 200; /** 쿼리와 파라미터 합치기 */ public static String joinQuery(String query, String [] params, String [] isString) { int currentIndex = query.indexOf('?'); if (currentIndex < 0) { return query; } StringBuffer resultQuery = new StringBuffer(query.substring(0, currentIndex)); int countOfQuestionMark = getCountOfQuestionMark(query); System.out.println("물음표 개수 : " + countOfQuestionMark); for (int i = 0; i < countOfQuestionMark; i++) { if (params[i] == null) { resultQuery.append("NULL"); } else if (isChecked(isString, i)) { resultQuery.append(converToSqlString(params[i])); } else { resultQuery.append(params[i]); } if (i == countOfQuestionMark - 1) { resultQuery.append(query.substring(currentIndex + 1)); } else { int nextIndex = query.indexOf('?', currentIndex + 1); resultQuery.append(query.substring(currentIndex + 1, nextIndex)); currentIndex = nextIndex; } } return resultQuery.toString(); } /** 문자열로 지정된 것인가? */ public static boolean isChecked(String [] isString, int value) { if (isString == null) { return false; } String valueStr = String.valueOf(value); for (int i=0; i < isString.length; i++) { if (valueStr.equals(isString[i])) { return true; } } return false; } /** 문자열에 들어 있는 ' 를 ''로 바꾼다. */ public static String converToSqlString(String str) { return "'" + str.replaceAll("'", "''") + "'"; } /** 문자열에 포함된 ?의 개수 */ public static int getCountOfQuestionMark(String str) { int count = 0; int currentIndex = 0; String temp = str; while ((currentIndex = temp.indexOf("?", currentIndex)) > 0) { count++; currentIndex++; } return count; } /** HTML 특수문자 변환 */ public static String value(String str) { if (str == null) { return ""; } String temp = str; temp = temp.replaceAll("&", "&"); temp = temp.replaceAll("<", "<"); temp = temp.replaceAll(">", ">"); temp = temp.replaceAll("\"", """); return temp; } public static String value(String [] params, int index) { if (params == null) { return ""; } else if (index >= params.length) { return ""; } return value(params[index]); } %> <% request.setCharacterEncoding("UTF-8"); String query = request.getParameter("query"); String [] params = request.getParameterValues("params"); String [] isString = request.getParameterValues("isstring"); %> <html> <head> <title>쿼리와 파라미터 합치기</title> <style type="text/css"> html, body { margin:0; height:100%; } #wrapper { margin:0 auto; width:100%; height:100%; } #resultArea { height:300px; width:100%; background:red; } #leftArea { float:left; width:900px; min-height:100%; background:#FFD149; margin-left: 5px; } #rightArea { min-height:100%; background:#3EBAEB; border-left:3px solid #000; } </style> </head> <body> <script type="text/javascript"> function getParam(obj){ var parameters = document.getElementById("parameters"); var lines = parameters.value.split("\n"); var input_params = document.getElementsByName("params"); for(var i=0;i<lines.length;i++){ input_params[i].value = ":"+lines[i].trim(); } } </script> <div id="wrapper"> <div id="resultArea"> <h1> == 쿼리 합치기 ==</h1> <%if (query != null && query.trim().length() > 0) { %> <h2>쿼리 합친 결과</h2> <textarea rows="15" cols="120" style="font-size: 12px;"><%= joinQuery(query, params, isString) %></textarea> <hr /> <%} %> </div> <form action="JoinQuery.jsp" method="post"> <div id="leftArea"> <span>아래에 PreparedStatement 쿼리 문장을 넣으세요</span> <textarea name="query" rows="40" cols="120" style="font-size: 12px;"><%=value(query)%></textarea> </div> <div id="rightArea"><span>아래에 파라미터 목록을 넣으세요</span><input type="submit" value="합치기" /> <textarea id="parameters" rows="40" cols="30" style="font-size: 12px;" onchange="getParam()"></textarea> <div id="inputDiv" style="visibility: hidden;"> <%for (int i=0; i < NUMBER_OF_PARAMS; i++) { %> <input style="font-size: 12px;" name="isstring" type="checkbox" value="<%=i%>" <%=isChecked(isString, i) ? "checked" : "" %> /> 문자형? <input style="font-size: 12px;" name="params" type=text" width="120" size="120" value="<%=value(params, i)%>"/> <br /> <%} %> </div> </div> </form> </div> </body> </html> |
———————————————————————————————————