2011년 5월 23일 월요일

The Service-to-Worker pattern

6. The Service-to-Worker pattern
Service-to-Worker 디자인 패턴은 두개의 서브 패턴(Front Controller 와 View Helper)을 합쳐 Micro 프레임워크를 만들었다. 이 프레임워크의 참여 객체들은 컨트롤러, 디스패처, 뷰 그리고 헬퍼이다.
구조

Service-to-Worker patterclass diagram

Service-to-Worker pattersequence diagram


역할
Controller :
요청을 처리하는 시작점이고, 중앙화된 요청 처리 단위로 ‘Dispatcher’를 사용하여 다음 뷰에 권한을 위임한다. 또, 헬퍼를 사용하여 많은 기능들을 개별 모듈로 분리시킨다. 인증,권한 부여 그리고 위임들을 책임진다.
Dispatcher :
뷰 관리와 네비게이션을 담당한다. ‘Dispatcher’는 다음 뷰에 권한을 위임시킨다. ‘Service-to-Worker’패턴에서 ‘Dispatcher’는 헬퍼를 사용하여 데이터를 뷰에 보낸다.
View :
클라이언트에 정보를 보여준다.
Helper :
뷰나 컨트롤러가 처리를 완성할 수 있도록 도와 준다. ‘Service-to-Worker’ 패턴에서 데이터를 뷰에 넘겨준다.
Value Bea:
헬퍼의 다른이름이다.
Business Service :
클라이언트가 접근하려는 서비스, 비즈니스 티어에 접근하는 시작점이다. 일반적으로 ‘비즈니스 위임’이라고 한다.

의도
Front Controller 와 View Helper 패턴을 합쳐 장점만을 가진 프레임워크를 만든다.

결론
  • 패턴들을 결합해 하나의 프레임워크를 만드는 것은 각 패턴과 관련된 장점을 모두이용한다는 점에서 매우 중요하다.
  • Front Controller 패턴과 같이 Service-to-Worker 패턴은 제어를 중앙화하고, 모듈화와 재사용성을 증가시켜 어떤 한 곳에서 시스템 서비스와 여러가지 요청에 대한 비즈니스 로직을 처리할 수 있도록 한다. 이것은 뷰에서 프레젠테이션과 관련 없는 로직을 헬퍼 클래스로 분리시켜서 모델과 뷰의 결합도를 감소시킨다.
  • 두개의 서브패턴 ‘Front Controller’와 ‘View Helper’를 합친것이다.
  • 컨트롤러, 디스패처, 뷰 그리고 뷰 헬퍼로 이루어진다.
  • 컨트롤러와 디스패처의 역할이 중요하다. 디스페처는 요청 처리, 관리 그리고 네이게이션을 중앙 제어한다.
  • 뷰는 디스페처가 검색한 데이터의 프레젠테이션을 담당한다.
  • 컨트롤러, 디스패처, 그리고 헬퍼 앞에 로직과 행위를 될수 있는한 많이 넣어 뷰를 가능한 한 간단하게 만든다.
  • Push MVC를 사용한다.


예제소스
Class


소스
package serviceToWorker;
import java.io.Serializable;
public class valueBeaimplements Serializable {
private String name;
private String email;
private int age;
public String getName() {
returname;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
returemail;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
returage;
}
public void setAge(int age) {
this.age = age;
}
}
package serviceToWorker;
import java.util.ArrayList;
public class businessService {
private static ArrayList array = new ArrayList();
public businessService() {
}
public static valueBean[] getMailList() {
valueBean[] values = new valueBean[array.size()];
array.toArray(values);
returvalues;
}
public static void addMail(valueBeavalue) {
array.add(value);
}
public static void delMail(valueBeavalue) {
for(int i=0; i<array.size(); i++) {
if(((valueBean)array.get(i)).getName().equals(value.getName()))
array.remove(i);
}
}
}
package serviceToWorker;
import javax.servlet.http.HttpServletRequest;
public class AccountingHelper {
public static void getMailList(HttpServletRequest request) {
request.setAttribute("accountList",businessService.getMailList());
}
public static void addMail(valueBeavalue) {
businessService.addMail(value);
}
public static void delMail(valueBeavalue) {
businessService.delMail(value);
}
}
package serviceToWorker;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
public interface Command {
public String execute(HttpServletRequest helper)
throws ServletException, IOException;
}
package serviceToWorker;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
public class accountAddCommand implements Command {
public accountAddCommand() {
}
public String execute(HttpServletRequest request)
throws ServletException, IOExceptio{
valueBeavalue = new valueBean();
value.setName(request.getParameter("name"));
value.setEmail(request.getParameter("email"));
value.setAge(Integer.parseInt(request.getParameter("age")));
AccountingHelper.addMail(value);
accountListCommand listCommand = new accountListCommand();
listCommand.execute(request);
retur"/view.jsp";
}
}
package serviceToWorker;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
public class accountListCommand implements Command {
public accountListCommand() {
}
public String execute(HttpServletRequest request)
throws ServletException, IOExceptio{
AccountingHelper.getMailList(request);
retur"/view.jsp";
}
}
package serviceToWorker;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
public class accountRemoveCommand implements Command {
public accountRemoveCommand() {
}
public String execute(HttpServletRequest request)
throws ServletException, IOExceptio{
valueBeavalue = new valueBean();
value.setName(request.getParameter("name"));
AccountingHelper.delMail(value);
accountListCommand listCommand = new accountListCommand();
listCommand.execute(request);
retur"/view.jsp";
}
}
package serviceToWorker;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestHelper {
private HttpServletRequest request = null;
private HttpServletResponse response = null;
public RequestHelper(HttpServletRequest request,
HttpServletResponse response) {
this.request = request;
this.response = response;
}
public Command getCommand() {
String requestName =
request.getServletPath().substring(request.getServletPath().lastIndexOf("/"),
request.getServletPath().lastIndexOf("."));
if(requestName.equals("/accountDetail"))
returnew accountListCommand();
else if(requestName.equals("/accountAdd"))
returnew accountAddCommand();
else if(requestName.equals("/accountRemove"))
returnew accountRemoveCommand();
else
returnull;
}
}
package serviceToWorker;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.PrintWriter;
import java.io.IOException;
public class Controller extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=EUC-KR";
public void init(ServletConfig config) throws ServletExceptio{
super.init(config);
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOExceptio{
doProxy(request, response);
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOExceptio{
doProxy(request, response);
}
protected void doProxy(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOExceptio{
RequestHelper helper = new RequestHelper(request, response);
Command command = helper.getCommand();
String nextURL = command.execute(request);
dispatch(request, response, nextURL);
}
protected void dispatch(HttpServletRequest request,
HttpServletResponse response,
String page)
throws ServletException, IOExceptio{
RequestDispatcher dispatcher =
getServletContext().getRequestDispatcher(page);
dispatcher.forward(request, response);
}
}
view.jsp
<%@ page contentType="text/html;charset=EUC-KR"%>
<%
serviceToWorker.valueBean[] values = (serviceToWorker.valueBean[])request.getAttribute("accountList");
int listNum = 0;
if(values != null)
listNum = values.length;
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Service-To-Worker Pattern</title>
<SCRIPT>
functioreCall(mode) {
var ff = document.form;
if(mode == 'add')
ff.actio= '/accountAdd.ctr';
else
ff.actio= '/accountRemove.ctr';
ff.method = 'post';
ff.submit();
}
</SCRIPT>
</head>
<body>
<P>
<STRONG><FONT size="6">Service-To-Worker Pattern</FONT></STRONG>
</P>
<hr/>
<P>
Total Num(<%=listNum%>)
<BR/>
<STRONG>Mail List</STRONG>
</P>
<table cellspacing="2" cellpadding="3" border="1" width="100%">
<tr>
<td bgcolor="#cccccc">
<DIV align="center">Name</DIV>
</td>
<td bgcolor="#cccccc">
<DIV align="center">EMail</DIV>
</td>
<td bgcolor="#cccccc">
<DIV align="center">Age</DIV>
</td>
</tr>
<% for( int i = 0; i < listNum; i++ ) {%>
<tr>
<td>
<DIV align="left"><%=values[i].getName()%></DIV>
</td>
<td>
<DIV align="left"><%=values[i].getEmail()%></DIV>
</td>
<td>
<DIV align="left"><%=values[i].getAge()%></DIV>
</td>
</tr>
<% } %>
</table>
<P>&nbsp;</P>
<P>
<STRONG>Insert &amp; Delete</STRONG>
</P>
<form name="form">
<table cellspacing="3" cellpadding="2" border="1" width="100%">
<tr>
<td width="15%">Name</td>
<td width="85%">
<input type="text" name="name"/>
</td>
</tr>
<tr>
<td width="15%">EMail</td>
<td width="85%">
<input type="text" name="email"/>
</td>
</tr>
<tr>
<td width="15%">Age</td>
<td width="85%">
<input type="text" name="age"/>
</td>
</tr>
<tr>
<td width="15%">&nbsp;</td>
<td width="85%">
<input type="BUTTON" name="addMail" value="Add Mail" omclick="reCall('add');">
<input type="BUTTON" name="delMail" value="Del Mail" omclick="reCall('del');">
</td>
</tr>
</table>
</form>
<P>&nbsp;</P>
</body>
</html>

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...