6.     The Service-to-Worker pattern

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

 

구조


사용자 삽입 이미지

Service-to-Worker pattern class diagram

 


사용자 삽입 이미지

Service-to-Worker pattern sequence diagram

 

 

역할

n       Controller :

요청을 처리하는 시작점이고,중앙화된 요청 처리 단위로‘Dispatcher’를 사용하여 다음 뷰에 권한을 위임한다.,헬퍼를 사용하여 많은 기능들을 개별 모듈로 분리시킨다.인증,권한 부여 그리고 위임들을 책임진다.

n       Dispatcher :

뷰 관리와 네비게이션을 담당한다. ‘Dispatcher’는 다음 뷰에 권한을 위임시킨다. ‘Service-to-Worker’패턴에서‘Dispatcher’는 헬퍼를 사용하여 데이터를 뷰에 보낸다.

n       View :

클라이언트에 정보를 보여준다.

n       Helper :
뷰나 컨트롤러가 처리를 완성할 수 있도록 도와 준다. ‘Service-to-Worker’패턴에서 데이터를 뷰에 넘겨준다.

n       Value Bean :
헬퍼의 다른이름이다.

n       Business Service :
클라이언트가 접근하려는 서비스,비즈니스 티어에 접근하는 시작점이다.일반적으로비즈니스 위임이라고 한다.

 

의도

Front ControllerView Helper패턴을 합쳐 장점만을 가진 프레임워크를 만든다.

 

결론

패턴들을 결합해 하나의 프레임워크를 만드는 것은 각 패턴과 관련된 장점을 모두이용한다는 점에서 매우 중요하다.

Front Controller패턴과 같이Service-to-Worker패턴은 제어를 중앙화하고,모듈화와 재사용성을 증가시켜 어떤 한 곳에서 시스템 서비스와 여러가지 요청에 대한 비즈니스 로직을 처리할 수 있도록 한다.이것은 뷰에서 프레젠테이션과 관련 없는 로직을 헬퍼 클래스로 분리시켜서 모델과 뷰의 결합도를 감소시킨다.

 

n         두개의 서브패턴‘Front Controller’‘View Helper’를 합친것이다.

n         컨트롤러,디스패처,뷰 그리고 뷰 헬퍼로 이루어진다.

n         컨트롤러와 디스패처의 역할이 중요하다.디스페처는 요청 처리,관리 그리고 네이게이션을 중앙 제어한다.

n         뷰는 디스페처가 검색한 데이터의 프레젠테이션을 담당한다.

n         컨트롤러,디스패처,그리고 헬퍼 앞에 로직과 행위를 될수 있는한 많이 넣어 뷰를 가능한 한 간단하게 만든다.

n         Push MVC를 사용한다.

 

예제소스

 

Class


사용자 삽입 이미지

 

소스

package serviceToWorker;

import java.io.Serializable;

 

public class valueBean implements Serializable {

   private String name;

   private String email;

   private int age;

 

   public String getName() {

       return name;

   }

 

   public void setName(String name) {

       this.name = name;

   }

 

   public String getEmail() {

       return email;

   }

 

   public void setEmail(String email) {

       this.email = email;

   }

 

   public int getAge() {

       return age;

   }

 

   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);

       return values;

   }

   

   public static void addMail(valueBean value) {

       array.add(value);

   }

   

   public static void delMail(valueBean value) {

       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(valueBean value) {

       businessService.addMail(value);

   }

   

   public static void delMail(valueBean value) {

       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, IOException {

       valueBean value = 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);

       return "/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, IOException {

       AccountingHelper.getMailList(request);

       return "/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, IOException {

       valueBean value = new valueBean();

       value.setName(request.getParameter("name"));

       AccountingHelper.delMail(value);

       accountListCommand listCommand = new accountListCommand();

       listCommand.execute(request);

       return "/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"))

           return new accountListCommand();

       else if(requestName.equals("/accountAdd"))

           return new accountAddCommand();

       else if(requestName.equals("/accountRemove"))

           return new accountRemoveCommand();

       else

           return null;

   }

}

 

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 ServletException {

       super.init(config);

   }

 

   public void doGet(HttpServletRequest request,

                       HttpServletResponse response)

                       throws ServletException, IOException {

       doProxy(request, response);

   }

 

   public void doPost(HttpServletRequest request,

                       HttpServletResponse response)

                       throws ServletException, IOException {

       doProxy(request, response);

   }

   

   protected void doProxy(HttpServletRequest request,

                           HttpServletResponse response)

                           throws ServletException, IOException {

       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, IOException {

       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>

   function reCall(mode) {

       var ff = document.form;

       if(mode == 'add')

           ff.action = '/accountAdd.ctr';

       else

           ff.action = '/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>


사용자 삽입 이미지

 


Posted by 영웅기삼
,