태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


'Portfolio/MoneyPlanner'에 해당되는 글 11건

  1. 2008/03/07 지출?? 타계좌 이체??
  2. 2008/02/05 고민 고민... Service Layer와 DAO들의 상호 관계?
  3. 2008/01/23 [MoneyPlanner] Ajax로 분류선택 구현 - dwr실패... (1)
  4. 2008/01/20 [Moneyplanner] request 한글 깨짐 현상 해결(reeust encoding)
  5. 2008/01/18 [MoneyPlanner] sitemesh 첫적용 - 계좌관리
  6. 2008/01/11 threadLocal이라는 개념...
  7. 2007/11/19 [MoneyPlanner] 지출분류 선택 Ajax로 재구현
  8. 2007/11/17 [MoneyPlanner] Div위에 Selectbox가 나오네...
  9. 2007/11/10 [MoneyPlanner] 계좌관리 기본 설계
  10. 2007/11/06 [Money Planner] 카드결재 기능 추가 - ClassDiagram(1)
2008/03/07 11:30

지출?? 타계좌 이체??

헷갈린다... 쩝...

만약!! 인터넷 쇼핑을 하다가...계좌이체로 결재를 하였다...

이 상황은 계좌이체도되고 지출에도 기록을 하여야 한다...

내 계좌내에서 이체가 아니고 다른 사람 계좌로 이체를 한것이라면... 무조건 지출일까???

흠...

고정지출 관리를 만들어서 붙힐 생각인데... 자동이체하고도 연동이 되어야 할꺼 같고...

이거 이거 점점 일이 커지네...ㅠ_ㅠ
Trackback 0 Comment 0
2008/02/05 01:04

고민 고민... Service Layer와 DAO들의 상호 관계?

Service Layer 에서..... 서비스끼리 참조하는게 맞을까?

흠... 아님 서비스들이 DAO들을 가지고 있어서 서비스들끼리는 참조를 안하게 하는게 맞을까?

난 일단 서비스들끼리는 참조하지 않는게 맞는거 같아서....

하나의 서비스가 DAO들을 여러개 갖는것으로 구현했다.... 쩝...

생각하기 나름이려나....-_-;;
Trackback 0 Comment 0
2008/01/23 00:02

[MoneyPlanner] Ajax로 분류선택 구현 - dwr실패...

@SuppressWarnings("serial")
public class GetBillAndIncomeClassificationServlet extends HttpServlet {
 protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
 {
  response.setContentType("text/html;charset=UTF-8");
  BillAndIncomeClassificationService baiClassificationService = (BillAndIncomeClassificationService) SpringBeanFactory.getBean("BillAndIncomeClassificationService");
 
  List<BillAndIncomeClassification> classificationList = new ArrayList<BillAndIncomeClassification>();
 
  String prevSeq = request.getParameter("prevSeq");
  String billGubun = request.getParameter("billGubun");
 
  classificationList = baiClassificationService.getChildList(billGubun, prevSeq);
   
  StringBuffer results = new StringBuffer("<classifications>");
 
  for(int i = 0 ; i < classificationList.size() ; i++)
  {
   BillAndIncomeClassification classification = (BillAndIncomeClassification)classificationList.get(i);
   results.append("<classification>");
   results.append("<seq>");
   results.append(classification.getActivity_ID());
   results.append("</seq>");
   results.append("<korName>");
   results.append(classification.getKorName());
   results.append("</korName>");
   results.append("</classification>");
  }
  results.append("</classifications>");
 
  response.setContentType("text/xml");
  response.getWriter().write(results.toString());
 }
 
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
 {
  processRequest(request, response);
 }
}






- <classifications>
- <classification>
  <seq>8</seq>
  <korName>전월이월</korName>
  </classification>
- <classification>
  <seq>0</seq>
  <korName>주수입</korName>
  </classification>
- <classification>
  <seq>5</seq>
  <korName>부수입</korName>
  </classification>
  </classifications>
머 위에 서블릿을 실행시키면 요런 결과가 나오게 된다.

Ajax에서는 이 xml을 이용해서 html코드를 만들게 되어 Html Dom에 끼워 넣어 주는것이당...

고로... refresh없이 리스트를 불러올 수 있게 되는 것이다.

원래 dwr을 써서 데이터를 불러올려고 했는데... javascript에서 service객체를 접근할 방법이 없었다...

service객체를 접근하려면 Spring IoC를 통해서 객체에 접근해야 하는데...

그래야 DAO객체도 얻어올 수 있기 때문에... 그렇다고 DAO에 바로 접근을 하자니...

DAO에 있는 sessionFactory(DB접속 객체)도 Spring IoC가 제어를 해주니.... 방법이 없었다....

이게... 이게... IoC라는게 이럴땐 참 불편하구려....-_ㅜ  먼가 방법이 있겠지만... 일단 Pass~!

그냥 Servlet만들어서 SpringFactory를 통해서 Service객체를 얻어와서 데이터를 불러왔다...

불러온 데이터를 xml로 변환하는 잡업까지 진행하였다.


<classification.js>

function updateModelsList()
{
 ShowSelectClassDiv();
 
 var results = xmlHttp.responseXML.getElementsByTagName("classification");
 
 var insertTab;
 if(currentClass != "") {
  insertTab = document.getElementById("ChildClassTable");
 }
 else {
  insertTab = document.getElementById("ClassTable");
 }
 
 for(var i = 0; i < results.length ; i++)
 {
  if(currentClass != "") // 2차
  {
   var objRow = insertTab.insertRow(insertTab.rows.length);
   var objCell = objRow.insertCell(0);
   objCell.width="100";
   var contents = "<a href='#' onclick=\"setClassValue('" + results[i].childNodes[0].text + "','" + results[i].childNodes[1].text + "')\">";
   contents += results[i].childNodes[1].text;
   contents += "</a>";
   objCell.innerHTML = contents;
  }
  else // 1차
  {
   var objRow = insertTab.insertRow(insertTab.rows.length);
   var objCell = objRow.insertCell(0);
   objCell.width="100";
   var contents = "<a href='#' onclick=\"refreshModelList(currentGubun,'" + results[i].childNodes[0].text + "')\">";
   contents += results[i].childNodes[1].text;
   contents += "</a>";
   objCell.innerHTML = contents;
  }
 
 }
}

javascript로 Html DOM에 끼워넣어 주는 부분....


성공한 화면...

사용자 삽입 이미지

Ajax로 분류 불러온 화면

Trackback 0 Comment 1
  1. 밥팅우기 2008/01/23 10:43 address edit & del reply

    Servlet말고... Webwork Action을 이용해보면 어떨까...

    이런 기능을 하는 Servlet을 한곳에 모아 관리할 수 있고...

    Service객체도 IoC로 관리해줄 수 있으니...

    어차리 response.getWriter()에다가 써주기만 하면 되는거니깐...흠...

2008/01/20 22:20

[Moneyplanner] request 한글 깨짐 현상 해결(reeust encoding)

<ServiceFilter.java>
/**
  * initialize filterConfig( which has init-parameter)
  */
 public void init(FilterConfig filterConfig) throws ServletException {
  this.filterConfig = filterConfig;
  log.debug("ServiceFilter is initialized.");
  // extract encoding
  Config config = ConfigFactory.getConfig();
  if (config.containsKey("system/page/encoding")) {
   encoding = config.get("system/page/encoding");
   log.debug(" - encoding( " + encoding + ") will be applied to request");
  } else {
   log.debug(" - encoding is not defined.");
  }
 }

public void doFilter(ServletRequest servletRequest,
   ServletResponse servletResponse, FilterChain filterChain)
   throws IOException, ServletException {
  // request 변경
  HttpServletRequest request = (HttpServletRequest) servletRequest;
  // set encoding
  if (!isMultiPart(request)) {
   // ajax 인경우, utf-8을 설정하고 그이외의 것은 config 정보 활용
   String ajaxValue = request.getHeader("ajax");
   if (StringUtils.isNotEmpty(ajaxValue)
     && ajaxValue.equalsIgnoreCase("true")) {
    setCharacterEncoding(request, "utf-8");
   } else if (StringUtils.isNotEmpty(encoding)) {
    setCharacterEncoding(request, encoding);
   }
  }
  // initialize ClinetObjectMap/ ServiceContext
  ServiceContext.init((HttpServletRequest) servletRequest,
    (HttpServletResponse) servletResponse);
  // chain to next filter
  filterChain.doFilter(servletRequest, servletResponse);
  // destory ServietContext and ClientObjectMap
  ServiceContext.destory();
  ContextHolder.clear();
 }



<configuration.xml>
<system>
  <native>
   <encoding>MS949</encoding>
   <locale>
    <language>ko</language>
    <country>KR</country>
   </locale>
  </native>
  <http>
   <encoding>ISO-8859-1</encoding>
  </http>
  <page>
   <encoding>MS949</encoding>
  </page>
  <file>
   <encoding>utf-8</encoding>
  </file>
 </system>



config객체는 configuration.xml을 자동으로 읽어오게 셋팅이 되어 있다.
config객체를 통하여 system/page/encoding값(MS949)을 불러와 request를 인코딩해준다.

requst 한글 깨지는 현상 해결...
Trackback 0 Comment 0
2008/01/18 01:02

[MoneyPlanner] sitemesh 첫적용 - 계좌관리

아직... 갈길이 먼듯 하다...

sitemesh는 대충 알듯 하고...

현재 Spring IOC Container + Webwork에다가...

persistence Layer는 Hibernate에게 맡겨놓은 채로 구현중이다...

그 전엔 struts로 어느정도 구현을 해놓았었는데 이번기회에 webwork로 변환중이다...

일단 기존 구현했던 부분에서 Action, Service, DAO는  60%정도 구현되었고....

View(Jsp)쪽은... 1%?? ㅋㅋ

오늘은 일단 sitemesh로 계좌리스트를 뿌려주는 화면까지 구현을 했당...

사용자 삽입 이미지
 
Trackback 0 Comment 0
2008/01/11 15:22

threadLocal이라는 개념...

threadLocal...

이번 MoneyPlanner에 사용하였다... (Lucy에것을 참조하여)

간단히 말하여 thread가 살아있는 동안 계속 살아있는 저장소 개념이다...

Map형식으로 되어 있으며...  thread가 살아있는 동안 계속 존재하므로...

전역변수처럼... 사용할 수도 있겠다...


MoneyPlanner에서는.... 하나의 웹어플리케이션이 실행될때... request, response를 ServiceContext라는

객체에 셋팅을 해주는데... ServiceContext는 저 threadLocal 변수를 하나 가지고 있다. static으로....

그러므로 thread가 살아있는 동안 (Dispose() 시키기 전까지) 계속 이용할 수있게 된다.

MoneyPlanner에서는 웹어플리케이션이 끝날때... Dispose()시킨다.


클라이언트는 접속할때마다 하나의 Thread를 가지게 되므로 각 클라이언트마다 별도의 Map정보를

유지할 수 있는 구조를 가지게 된다.

Trackback 0 Comment 0
2007/11/19 12:53

[MoneyPlanner] 지출분류 선택 Ajax로 재구현

사용자 삽입 이미지
 분류의 ▶를 클릭하면

function refreshModelList(billGubun, prevSeq, classDivj)
{
 if(classDivj != null && classDivj != "")
 {
  classDiv = classDivj;
 }
 
 currentGubun = billGubun;  
 currentClass = prevSeq;
 
 var url = headUrl + "/servlet/BillClassificationServlet?billGubun=" + billGubun + "&prevSeq=" + prevSeq;

 createXMLHttpRequest();
 xmlHttp.onreadystatechange = handleStateChange;
 xmlHttp.open("GET", url, true);
 xmlHttp.send(null);
}

function handleStateChange()
{
 if(xmlHttp.readyState == 4)
 {
  if(xmlHttp.status == 200)
  {
   updateModelsList();
  }
 }
}

// 분류 테이블 구성
// xml로 리턴된 데이터로 분류를 나타내는 테이블을 만들어서 출력해준다.
// currentClass가 값이 없으면 최상위 분류인 1차 분류를 나타내는 테이블을 만들고
// 값이 존재하면 sub테이블인 2차 분류를 나타내는 테이블을 만든다.
function updateModelsList()
{
 ShowSelectClassDiv();
 
 var results = xmlHttp.responseXML.getElementsByTagName("classification");
 
 var option = null;
 
 var tableDiv = "<table border='0' cellspacing='1' cellpadding='2' bgcolor='#000000' width='100' align='center' valign='top'>";
 for(var i = 0; i < results.length ; i++)
 {
  tableDiv += "<tr bgcolor='#FFFFFF'><td>";
  tableDiv += "<input type='hidden' value='" + results[i].childNodes[0].text + "'>";
  if(currentClass != "")
  {
   // 서브 노드를 선택했으면 input폼에 value를 넣어주기 위해 setClassValue를 호출해준다.
   tableDiv += "<a href='#' onclick=\"setClassValue('" + results[i].childNodes[0].text + "','" + results[i].childNodes[1].text + "')\">";
   tableDiv += results[i].childNodes[1].text;
   tableDiv += "</a>";
  }
  else
  {
   // 최상위 노드를 선택했으면 해당 선택노드의 서브노드를 가져오는 refreshModelList를 호출한다.
   tableDiv += "<a href='#' onclick=\"refreshModelList(currentGubun,'" + results[i].childNodes[0].text + "','')\">";
   tableDiv += results[i].childNodes[1].text;
  }
 
  tableDiv += "</a>";
  tableDiv += "</td></tr>";
 }
 tableDiv += "</tale>";
 
 var ChildClassDiv = document.getElementById("ChildClassDiv");
 var ClassDiv = document.getElementById("ClassDiv");
 
 // 자식노드들이 나온다
 if(currentClass != "")
 {
  ChildClassDiv.innerHTML = tableDiv;
 }
 else // 최상위 노드
 {
  // 최상위 노드가 나왔으니 서브 노드는 지워주고 선택한 최상위 노드를 출력해준다.
  ChildClassDiv.innerHTML = "";
  ClassDiv.innerHTML = tableDiv;
 }
}



 var url = headUrl + "/servlet/BillClassificationServlet?billGubun=" + billGubun + "&prevSeq=" + prevSeq;
여기 URL로 request를 보내서 xml로 리턴받은 값을 table로 만들어 준다.
물론 비동기 방식으로...-_-;;

클릭할때마다 테이블을 만들어 주며...
두번째 분류일 경우에는 setClassValue메소드를 호출하여 해당 input폼에 값을 넣어준다...

function setClassValue(classSeq, classNm)
{
 var divId = document.getElementById("typeClass" + classDiv);
 divId.value=classSeq;
 var divName = document.getElementById("classDiv_" + classDiv);
 divName.innerHTML = classNm;
 
 HideSelectClassDiv();
}

사용자 삽입 이미지

Ajax로 구현 성공...!

Trackback 0 Comment 0
2007/11/17 01:22

[MoneyPlanner] Div위에 Selectbox가 나오네...

사용자 삽입 이미지

이런... 저건 머냐... -_-

찾아보니... IE 7.0에서야 패치가 된 버그...

이런 된장... 그래도 답이 없는 문제는 없나보다...

iframe을 이용하면 가능하다...

<div id="SelectClassDiv" style="position: absolute; top: 100; left: 0" class="o">
<iframe id="selectblocker" style="position:relative;" frameBorder="0" scrolling="no" src="<%=request.getContextPath()%>/blank.HTML"></iframe>

<table bgcolor="#000000" width="300" height="300" align="center" border='0' cellspacing='1' id="SelectClassTable"  style="position:absolute; background-color: #CCFF99">
<tr align='center' bgcolor='#FFFFFF' height='20'>
 <td width='50%'>1차분류</td>
 <td>2차분류</td>
</tr>
<tr bgcolor='#FFFFFF'>
 <td valign='top'>
  <div id="ClassDiv">
  </div>
 </td>
 <td valign='top'>
  <div id="ChildClassDiv">
  </div>
 </td>
</tr>
<tr bgcolor='#FFFFFF' height='20'>
 <td colspan='2' align='center'><a href='#' onclick='HideSelectClassDiv()'>[닫기]</a></td>
</table>
</div>



<javascript >
function ShowSelectClassDiv()
{
 var SelectClassDiv = document.getElementById("SelectClassDiv");
 SelectClassDiv.style.visibility = "visible";
 
 var divTag = document.getElementById("SelectClassDiv");
 var iFrameTag = document.getElementById("selectblocker");
 var tableTag = document.getElementById("SelectClassTable");
 
 divTag.style.left=420;
 divTag.style.top=150;
 divTag.style.width=300;
 divTag.style.height=300;
 iFrameTag.style.left = 0;
 iFrameTag.style.top = 0;
 iFrameTag.style.width = divTag.style.width;
 iFrameTag.style.height = divTag.style.height;
 iFrameTag.style.zIndex = divTag.style.zIndex-1;
 
 tableTag.style.left = 0;
 tableTag.style.top = 0;
 tableTag.style.width = divTag.style.width;
 tableTag.style.height = divTag.style.height;
 tableTag.style.zIndex = divTag.style.zIndex;
 divTag.style.display = "block";

}
</javascript>


사용자 삽입 이미지



와아... 성공했당...
Trackback 0 Comment 0
2007/11/10 00:53

[MoneyPlanner] 계좌관리 기본 설계

사용자 삽입 이미지

기본적인 계좌관리 설계이다.

Presentation Layer인 AccountMgrAction은 AccountServiceHelper를 통해 AccountService를 얻어온다.

AccountService는 AccountDAO를 통해 DB에 접근을 한다.

이번 플젝에서는 ORM으로 Hibernate를 사용하므로 AccountDAO를 구현한 AccountDAOHibernate가

실제 클래스로 디비에 접근을 한다.

Presentation Layer는 Service Interface만 알고 접근을 하면 되고 persistence Layer인 DAO쪽은

직접 접근을 해서는 안된다.

일단  이러한 구조는 계좌관리 뿐만 아니라 전체 적인 시스템 구성이 되겠다.
Trackback 0 Comment 0
2007/11/06 00:53

[Money Planner] 카드결재 기능 추가 - ClassDiagram(1)

사용자 삽입 이미지

CardMonthlyHistory 클래스 추가



일단 카드 결재 내역을 담고 관리해줄 CardMonthlyHistory클래스를 하나 생성했다.

저 클래스는 매달 결재금액과 상태를 관리해줄 놈이다. 흠.. 맞게 하고 있나...-_-;;
Trackback 0 Comment 0