Programing

쿼리 파라미터(SQL Parameter) 정리 툴

c10106 2017. 10. 30. 10:31
반응형

수정 DB (Oracle, MSSQL, MySQL 등)를 활용 한 웹 프로젝트를 진행하다 보면,

이클립스 콘솔에 찍힌 log4j의 쿼리 로그를 해 봐야하는 경우가 있습니다.


물론 쿼리의 값에 실제 값을 매핑해서 로그에 찍히도록하는 방법도 있긴하지만,

모든 쿼리마다 이런 일이 많으면 퍼포먼스에도 영향을주지 않겠습니까? 로그가 쌓이면서 서버 부하의 원인이 되곤 하죠.


그렇다고 쿼리의 경우가 한 두개면 모를까 10 개 이상 매핑해야하는 경우 일 일히 수가 너무 번거 롭죠.


그래서 저는 허접하게 javascript를 이용한 쿼리 셋팅 툴 (?)을 만들어서 활용 중입니다.


몇년 전에 만든 거라 많이 허접하지만 문제없이 잘 쓰고 부끄럽지만서도 다른 분들께 공유하고자합니다.


사용 방법은 매우 간단합니다.




<사용 방법>


1. 아랫 줄에 첨부 한 sqlParam.html을 익스플로러 나 크롬과 같은 브라우저를 통해 전송 다.



2 .. 아래 그림과 같이 이클립스의 쿼리 관련 로그 내용을 적게 통째로 복사를합니다.




3. sqlParam.html에서 왼쪽 왼쪽 ① 번 칸에 복사 한 쿼리 로그를 덮어 넣기하신 후, ② 번 변환 버튼을 클릭합니다.

   그럼 ③ 번 너의 칸에 매핑 된 쿼리 결과를 확인할 수 있습니다.

   결과를 복사해서 DB 조회 툴에 다시 가져 오기 확인 하셔도,

   아무래도 1 줄로 출력 된 쿼리 로그이다 보니 분석하기 힘들다고 생각 되실

   화면 하단 부에 iframe으로 호출하고있는 www.dpriver.com/pp/sqlformat.htm 쿼리 정리 툴을 이용하기 쉽습니다.

   ④ 번 칸에 결과 쿼리를 붙여 넣기 하시고 ⑤ 번 "Format SQL"버튼을 클릭하면 ⑥ 번 칸에 정리 된 쿼리를 출력합니다.

   




혹시 첨부 한 html 파일을 다운로드받지 못하시는 분들은 아래 펼쳐서 복사해서 html 신뢰로 저장해서 쓰시면됩니다.

<! DOCTYPE HTML PUBLIC "-// W3C // DTD HTML 4.0 Transitional // EN">
<html>
<헤드>
<title> 쿼리 변환 </ title>
</ head>
<script src = "jquery-1.10.2.min.js"> </ script>
<스크립트>
function start () {

	var qStart = $ ( "# qStart"). val (); // 쿼리 시작을 알리는 키워드
	var pStart = $ ( "# pStart"). val (); // 방송 시작을 알리는 키워드
	var oriSql = $ ( "# oriSql"). val (); // 변환 대상 쿼리

	if (qStart == ""|| pStart == ""|| oriSql == "") {
		alert ( "필수 누락!");
		반환;
	}

	var q = oriSql.indexOf (qStart); // 변환 대상 쿼리에서 쿼리 시작 indexOf 취득
	var p = oriSql.indexOf (pStart); // 변환 대상 쿼리에서 시작 indexOf 취득
	var n = oriSql.indexOf ( "\ n"); // 변환 대상 쿼리에서 개행 indexOf 취득
	var k = oriSql.indexOf ( "\?"); // 변환 대상 쿼리에서 key indexOf 취득

	if (q <0 || p <0 || n <0) {
		alert ( "쿼리 안에 \" "+ qStart +"\ "or \" "+ pStart +"\ "값 or 개행 or? (Key) 미 존재!");
		반환;
	}

	var sql = oriSql.substring (q + qStart.length, n); // 쿼리
	var param = oriSql.substring (p + pStart.length, oriSql.length); //
	param = $ .trim (param);
	param = param.substring (0, 1) == "["? param.substring (1, param.length) : param;
	param = param.substring (param.length-1, param.length) == "]"? param.substring (0, param.length-1) : param;
	var params = param.split ( ",");

    var keyArray = sql.match (/ \? / g);

	if (keyArray.length! = params.length) {
		alert ( "변환 대상?의 갯수와 대상 갯수 불일치!");
		반환;
	}

	var i = 0;
	var para = "";
	var pArray;

	while (sql.indexOf ( "\?")! = -1) {
		para = 매개 변수 [i ++];
		if (para == null || para == undefined) {
			단절;
		}
		if (para.indexOf ( "(")> -1) {
			pArray = para.split ( "(");
			para = pArray [0] .replace (/ (^ \ s *) | (\ s * $) / gi, "");
			if (pArray [1] .indexOf ( "Integer") <0) {
				para = " '"+ para + "'";
			}
		} else {
			if (! (para == "null"|| $ .isNumeric (para))) {
				para = " '"+ para + "'";
			}
		}
		sql = sql.replace ( "\?", para);
	}

	if (sql.indexOf ( "/ *")> 0) {
		sql = sql.replace (sql.substring (sql.indexOf ( "/ *"), sql.indexOf ( "* /") + 2), "");
	}

	$ ( "# resSql"). val (sql);

	$ ( "# frame"). find ( "inputsql"). val (sql);
}
</ script>
<본체>
쿼리 시작 키워드 : <input type = "text"id = "qStart"name = "qStart"value = "Executing Statement :"> </br>
생산 시작 키워드 : <input type = "text"id = "pStart"name = "pStart"value = "Parameters :"> </br>
<table style = "width : 60 %; border-collapse : collapse; border-spacing : 0">
<tr>
<td width = "49 %"> <textarea id = "oriSql"name = "oriSql"style = "width : 100 %; height : 200px;"> </ textarea> </ td>
<td width = "2 %"> <button type = "button"onclick = "start ();" style = "cursor : pointer"> 변환 >> </ button> </ td>
<td width = "49 %"> <textarea id = "resSql"name = "resSql"style = "width : 100 %; height : 200px;"> </ textarea> </ td>
</ tr>
</ table>
<iframe id = "frame"src = "http://www.dpriver.com/pp/sqlformat.htm"style = "width : 100 %; height : 800px;"> </ iframe>
</ body>
</ html>

참고로 log4j 나 DB pool 소스에 따라 쿼리 로그의 서두가 "Executing Statement :"일 수도 있고 "Preparing Statement :"일 수도되면 html의 text 란 찾아 직접 수정 사용합니다.


그럼 ... 정말 허접하니 ... 원하시는대로 튜닝해서 사용 감사하겠습니다.

반응형