Category Archives: useful tools

sequence parameter query convert to named parameter query

어떤 미친쿼리같은 경우 물음표 파라미터를 몇십에서 백개정도로 사용하는 쿼리가 있는데, 쿼리를 분석하기에 무지 힘들어서 물음표쿼리를 named쿼리로 변경해주는 jsp페이지를 만들었다.

기본소스는 “까먹지말자!(이글루스)”  권남님 블로그님에게서 가져왔으며
http://egloos.zum.com/kwon37xi/v/1897209
사용상 편의 때문에 나한테 맞게 조금 수정했다.

쿼리합치기

JoinQuery.jsp
———————————————————————————————————

<!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("&", "&amp;");
    temp = temp.replaceAll("<", "&lt;");
    temp = temp.replaceAll(">", "&gt;");
    temp = temp.replaceAll("\"", "&quot;");
    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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;== 쿼리 합치기 ==</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>

———————————————————————————————————