iBatis.NET 을 하다보면 sqlmap 을 정의하는것이 가장 중요한 작업중에 하나 입니다.
이때 sqlmap xml 에서 mapper 정의하고 파라메터 클래스 mapper 정의하고 result mapper 정의하고 ..
만일 vo 클래스 속성명이라도 고칠라고 하면 .. xml 뜯어서 mapper 정의 다시 고치고..
에러나면 찾기도 힘들것입니다.

별것 아니지만 간단하고 깔끔하게 sqlmap 을 정의할 수 있고 수정 공수도 줄일 수 있습니다.

1) resultMap 대신 resultClass를 사용합니다.

다음 예제를 참조

 <alias>
    <typeAlias alias="AttachFileVO" type="UBISC.DDF.Vo.AttachFileVO, AMOJEIND.DDF"/>
    <typeAlias alias="CommonCodeVO" type="UBISC.DDF.Vo.CommonCodeVO, AMOJEIND.DDF"/>
</alias>

<statement id="listCommonCode" resultClass="CommonCodeVO">
</statement>

2) 파라메터 클래스는 Dictionary 를 사용합니다.

파라메터 클래스를 모두 만들거나 ReusltMap 으로 정의한다면 참으로 비효율적일 것입니다.
결과에 비해 파라메터는 양도 많을 뿐더러 변화무쌍하기 때문이죠

 IDictionary<string,object> param = new Dictionary<string,object>();
param.Add("USER_ID", "honester");

Mapper.Instance().QueryForList<T>("listCommonCode", param);

"statement" 태그의   parameterClass 속성 값과 상관없이 Mapper는 파라메터에 따라 Generic 하게 처리됩니다.
즉, 만일 클래스를 정의했다 하더라고 dictiony 키값과 해당 vo 클래스의 속성명이 일치하면
쿼리에 그 값을 지정해 줄수 있습니다..
sqlmap 에 다음과 같이 정의되어 있더라도 무방합니다.

 <statement id="listCommonCode"  parameterClass="CommonCodeVO" resultClass="CommonCodeVO">
....
</statement>

3) 만일 리턴받는 VO 객체도 만들기 싫다면 resultClass 에 Dictionary를 사용합니다.

설마 "System.Collections.Generic.Dictionary"를 사용하지는 않겠죠?
다음을 참조

 <statement id="selectLoginUser" resultClass="System.Collections.Specialized.HybridDictionary">
....
</statement>

[출처] jQuery를 사용하여 ASP.NET AJAX Web Service 호출하기 예제|작성자 파로스

 

닷넷을 사용하면서 제일 불편하고 짜증나는 것 중에 하나가 쓸데없는 코드가 너무 많다는 것과 애매모호한 PostBack 이다.

jQuery를 사용하면서 그런 느낌은 더욱 심해졌다.

그래서 사용한 방식이 서버단 처리를 모두 제네릭 처리기로 하였는데 뭔가 다른 방법을 써 보고 싶었다.

MVC가 요즘 뜨는거 같아서 그거로 할까 알아봤지만 뷰가 완전히 독립된 것이 아닌 닷넷 코드 혼합이다.

내가 원하는 것은 닷넷 코드가 전혀 들어가지 않은 순수 html + javascript + css로만 구성된 뷰페이지를 구성하는 것이다.

그래서 나온 결론은 웹서비스!

하지만 웹서비스는 기본으로 XML을 지원한다.

JSON을 사용하는 방법을 찾아봤지만 희안하게 한글 자료가 별로 없다. (검색 능력이 떨어지는지 없을리가 없는데~)

암튼 힘들게 찾은 사이트 물론 영어다.

설명은 자세히 되어 있는거 같은데 해석이 안되니~ 다른 한글 자료 찾아보다가 마땅한게 없어서 그냥 영문 사이트 소스보면서 대충 이해했다.

생각했던 것 보다는 훨씬 간단했다.

웹서비스 사이트 하나 만들고 거기에 원하는 데이타 뿌려주면 된다.

초간단으로 만든 예제.

이번에도 걸그룹이다. 레인보우~

웹서비스에 Rainbow 클래스를 하나 만들고 GetMember 메소드를 통해서 그룹명과 멤버리스트를 json 형식으로 가져오는 것이다.

사용법만 알면 어려움이 없기 때문에 흐름만 알면 충분하다.

내용이 별로 없어서 이번에도 녹화.

설명글 10번 읽는것보다 작업 내용 한번 직접 보는게 빠르다.

닷넷 3.5 이상에서는 보안상 결과값이 {"d": "data"} 형태로 리턴된다. 따라서 스크립트로 처리할때 한번 필터링(dtaFilter) 해준다

Rainbow.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Rainbow</title>

<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.js"></script>
<script type="text/javascript">
$(document).ready(function() {

$("#button").click(function() {
$.ajax({
type: "post",
url: "Service1.asmx/GetMember",
contentType: "application/json; charset=utf-8",
dataType: "json",
dataFilter: function(data) {
var msg;
if (typeof (JSON) !== 'undefined' && typeof (JSON.parse) === 'function') {
msg = JSON.parse(data);
} else {
msg = eval('(' + data + ')');
}

if (msg.hasOwnProperty('d')) {
return msg.d;
} else {
return msg;
}
},
success: function(data) {
alert(data.groupName);
$("#groupName").text(data.groupName);
$("#memberList").text(data.memberList);
}
});
});
});
</script>

<style type="text/css">
#content { paddding:20px; }
#groupName { font-weight:bold; font-size:20px; }
#memberList { color:Blue; }
</style>
</head>
<body>

<div id="content">
<div id="groupName">그룹명</div>
<div id="memberList">멤버리스트</div>
<input type="button" value="클릭!" id="button" />
</div>
</body>
</html>

Service1.asmx.cs

기본 생성 코드에서 [System.Web.Script.Services.ScriptService] 이부분 주석을 풀어주면 json을 사용할 수 있다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace WebService2
{
/// <summary>
/// Service1의 요약 설명입니다.
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// ASP.NET AJAX를 사용하여 스크립트에서 이 웹 서비스를 호출하려면 다음 줄의 주석 처리를 제거합니다.
[System.Web.Script.Services.ScriptService]
public class Service1 : System.Web.Services.WebService
{

[WebMethod]
public string HelloWorld()
{
return "Hello World";
}

[WebMethod]
public Rainbow GetMember()
{
Rainbow r = new Rainbow();

r.groupName = "Rainbow";
r.memberList = "김재경,고우리,김지숙,노을,오승아,정윤혜,조현영";

return r;
}
}


public class Rainbow
{
public string groupName;
public string memberList;
}
}

[참고]

http://encosia.com/2009/02/10/a-breaking-change-between-versions-of-aspnet-ajax/

http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/

 

 

public static string MD5(string password) {
   byte[] textBytes = System.Text.Encoding.Default.GetBytes(password);
   try {
      System.Security.Cryptography.MD5CryptoServiceProvider cryptHandler;
      cryptHandler = new System.Security.Cryptography.MD5CryptoServiceProvider();
      byte[] hash = cryptHandler.ComputeHash (textBytes);
      string ret = "";
      foreach (byte a in hash) {
         if (a<16)
            ret += "0" + a.ToString ("x");
         else
            ret += a.ToString ("x");
      }
      return ret ;
   }
   catch {
      throw;
   }
}

using Excel = Microsoft.Office.Interop.Excel;

 

ExcelSaveDialog.Title = "저장";
            ExcelSaveDialog.CreatePrompt = true;
            ExcelSaveDialog.OverwritePrompt = true;
            ExcelSaveDialog.FileName = dirPath.Substring(0, 4) + "년" + dirPath.Substring(4, 2) + "월" + dirPath.Substring(6, 2) + "일" + dirPath.Substring(8, 2) + "시" + dirPath.Substring(10, 2) + "분수검로그";
            ExcelSaveDialog.DefaultExt = "xls";
            ExcelSaveDialog.Filter = "Excel files(*.xls)|*.xls";
            ExcelSaveDialog.InitialDirectory = "C:\\HRDTMS\\받은자료";
           
            DialogResult result = ExcelSaveDialog.ShowDialog();
            if (result == DialogResult.OK)
            {
                try
                {
                    object missingType = Type.Missing;
                    FileInfo Logtxt = new FileInfo("C:\\HRDTMS\\SET_LOG\\" + CurDate + "_Log.txt");
                    if (Logtxt.Exists)
                    {
                        Excel.Application xls = new Excel.Application();
                        Excel._Workbook wbook = (Excel._Workbook)(xls.Workbooks.Add(Missing.Value));
                        Excel._Worksheet wSheet = (Excel._Worksheet)wbook.ActiveSheet;
                        xls.Visible = false;

                        StreamReader sr = new StreamReader("C:\\HRDTMS\\SET_LOG\\" + CurDate + "_Log.txt", System.Text.Encoding.Default);
                        int i = 0;
                        while (true)
                        {
                            string log = sr.ReadLine();
                            if (log == null)
                            {
                                break;
                            }
                            string[] token = log.Split('|');
                            i++;

                            if (i == 1)
                            {
                                wSheet.Cells[i, 1] = "시간";
                                wSheet.Cells[i, 2] = "PC번호";
                                wSheet.Cells[i, 3] = "비번호";
                                wSheet.Cells[i, 4] = "이름";
                                wSheet.Cells[i, 5] = "사용한연장시간";
                                wSheet.Cells[i, 6] = "로그";
                            }
                            if (log == "")
                            {
                                wSheet.Cells[(i + 1), 1] = "";
                                wSheet.Cells[(i + 1), 2] = "";
                                wSheet.Cells[(i + 1), 3] = "";
                                wSheet.Cells[(i + 1), 4] = "";
                                wSheet.Cells[(i + 1), 5] = "";
                                wSheet.Cells[(i + 1), 6] = "";
                            }
                            else if (log != "" && i != 1)
                            {
                                wSheet.Cells[(i + 1), 1] = token[0];
                                wSheet.Cells[(i + 1), 2] = token[1];
                                wSheet.Cells[(i + 1), 3] = token[2];
                                wSheet.Cells[(i + 1), 4] = token[3];
                                wSheet.Cells[(i + 1), 5] = token[4];
                                wSheet.Cells[(i + 1), 6] = token[5];
                            }
                        }
                        sr.Close();
                        wbook.SaveAs(@ExcelSaveDialog.FileName, Excel.XlFileFormat.xlWorkbookNormal, missingType, missingType, missingType, missingType, Excel.XlSaveAsAccessMode.xlNoChange, missingType, false, missingType, missingType, false);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xls);
                        Process[] ExCel = Process.GetProcessesByName("EXCEL");
                        if (ExCel.Count() != 0)
                        {
                            ExCel[0].Kill();
                        }
                    }
                    else
                    {
                        MessageBox.Show("엑셀로 변경할 파일이 없습니다.");
                    }
                }
                catch (Exception)
                {
                    //MessageBox.Show("엑셀 파일로 변경중에 오류가 발생했습니다.");
                    Process[] ExCel = Process.GetProcessesByName("EXCEL");
                    if (ExCel.Count() != 0)
                    {
                        ExCel[0].Kill();
                    }
                }
            }

protected void ASPxFileUploadComplete(object sender, DevExpress.Web.ASPxUploadControl.FileUploadCompleteEventArgs e)
 {
  string strFilePath = "/";
  string strFileInfo = strFilePath + strFilename;
  
  if (e.UploadedFile.IsValid)
  {
   try
   {
    e.UploadedFile.SaveAs(strFileInfo);
   }
   catch (Exception ex)
   {
    string strErr = ex.Message.ToString();
    throw;
   }
  }
}
Description 이 알기 쉽게 설명되어 있음.

+ Recent posts