깝돌이 2020. 6. 11. 14:33

dispatcher의 의미: 배포, 나누다.

: 굉장히 중요한 역할 이기 때문에 나중에는 라이브러리화 됩니다. 

1) hidden을 이용(form의 이름 command로 해서 한꺼번에 받습니다.)

 

dispatcher의 역할

1) command값 받는다. 

2) command 값에 따라서 각각의 기능에 맞는 함수를 호출한다. (command의 값과 함수의 이름이 일치합니다.) 

3) 각각의 함수는 return type이 String입니다. (path)

- MVC pattern은 요청 하나당 하나의 서블릿이 만들어 집니다. 

- frontController pattern은 요청 하나당 메소드 하나가 만들어 집니다. 

 

이 모델의 경우에는 확장성 있는 프로그램을 만들수 없습니다. 

이 모델을 Fat Client Model(heavy model)이라고합니다. 

if, if else 이런걸로 되어 있다는 것은 코드가 구조화 되어 있지 않다는 것을 말합니다. 

업무의 분화가 되지 않습니다. 

MVC: 서블릿 갯수

frontController: heavy한 front

Factory Method: frontController의 장점인 중요하고 헤비한 servlet을 하나만 가진다. 

DispatcherServlet

component 시킵니다.

그리고 assemble합니다.

이 모든게 library로 합니다.  

component 별로 만드는 사람이 다릅니다. 또한, 중간 중간에 component를 추가하거나 삭제하면 됩니다. 

그러나 이것들이 어떻게 유기적으로 돌아가는지 모릅니다. 

component-> 인터페이스 기반으로 작성된 재사용성 강한 자바 클래스

 

인터페이스가 있어야 합니다. 주로 controller라고 합니다. 

component는 이 controller를 implement해서 만듭니다. 

 

Controller Factory개념(singletone pattern 입니다.)

이 안에서 제품(component)들을 생성한다. 

 

컴포넌트를 개발자가 막 만들면, controllerFactory에서 메모리에 올려서 사용하는 구나 알수 있습니다. 

 

메카니즘

dispatcherServlet

1) Command 값 받습니다. 

2) Controller Factory를 리턴 받습니다. 

- component는 비지니스로직에 따라서 다 다르게 실행이 되어합니다.  

3)  리턴 받은 controller Factory에 들어 오는 값(command value)가 다르면(createComponent())이안에 인자값을 다르게 집어 넣어서  component를 그에 맞게 생성해서 그에 맞는 인터페이스인 controller type으로 return합니다. 

4) 리턴 받은 controller에서 메소드를 실행합니다. 그럼 부모의(인터페이스)의 메소드를 호출 하면, virtual method invocation으로 자식의 메소드가 호출 됩니다. 호출된 결과 값은 String path= c.execute(); 로 합니다. 

5) 네비게이션

 

코딩

package pattern.action;
/*
 * Framework 기술
 * Struts1-> struts2->
 * SpringFrameWordk(사용하는 프레임워크)
 */

public interface Action {
	String execute();//public abstract 생략
}

 

package pattern.action;
/*
 * AddAction::
 * component!!
 * 인터페이스 기반으로 작성된 재사용성이 강한 자바클래스
 */



public class AddAction implements Action{

	@Override
	public String execute() {
	/*
	 * 1. form 값 받아 옵니다. 
	 * 2. DAO 리턴 받습니다. 
	 * 3. biz logic 호출 합니다. 
	 * 4. return 값 binding 합니다. 
	 * 5. path를 최종적으로 리턴
	 */
	return insert();
	}
	public String insert() {
	//위의 로직들이 수행됐다고 치고....
		return "register.jsp";
	}
}

 

package pattern.action;
/*
 * AddAction::
 * component!!
 * 인터페이스 기반으로 작성된 재사용성이 강한 자바클래스
 */



public class UpdateAction implements Action{

	@Override
	public String execute() {
	/*
	 * 1. form 값 받아 옵니다. 
	 * 2. DAO 리턴 받습니다. 
	 * 3. biz logic 호출 합니다. 
	 * 4. return 값 binding 합니다. 
	 * 5. path를 최종적으로 리턴
	 */
	return update();
	}
	public String update() {
	//위의 로직들이 수행됐다고 치고....
		return "register.jsp";
	}
}

 

package pattern.action;
/*
 * AddAction::
 * component!!
 * 인터페이스 기반으로 작성된 재사용성이 강한 자바클래스
 */



public class DeleteAction implements Action{

	@Override
	public String execute() {
	/*
	 * 1. form 값 받아 옵니다. 
	 * 2. DAO 리턴 받습니다. 
	 * 3. biz logic 호출 합니다. 
	 * 4. return 값 binding 합니다. 
	 * 5. path를 최종적으로 리턴
	 */
	
	return delete();
	}
	public String delete() {
	//위의 로직들이 수행됐다고 치고....
		return "register.jsp";
	}
}

 

package pattern.factory;
import pattern.action.Action;
import pattern.action.AddAction;
import pattern.action.DeleteAction;
import pattern.action.UpdateAction;

/*
 * Action들(component)를 만들어 내는 공장입니다. 
 * Dispatcher에서 보내주는 command값에 따라서 생성하는 Action이 달라집니다.
 * 여러개의 Action들을 만들어 내지만, factory는 단 하나면 충분하고 단 하나여야 하기 때문에 싱글톤 패턴으로 작성된다. 
 */
public class ActionFactory {
	private static ActionFactory factory = new ActionFactory();
	private ActionFactory() {
		System.out.println("ActionFactory Creating.......");
	}
	public static ActionFactory getInstance() {
		return factory;
	}
	//Action을 생성하는 기능.....
	public Action creatAction(String command) {
		Action action =null;
		if(command.equals("INSERT")) {
			action = new AddAction();
		}else if(command.equals("DELETE")) {
			action = new DeleteAction();
		}else {
			action = new UpdateAction();
		}
		return action;
	}
}

 

package client;

import pattern.action.Action;
import pattern.factory.ActionFactory;

/*
 * Factory Method Pattern
 * ::
 * 추상화된 클래스(Action)의 객체(구상객체, 실체 클래스)를 생성하고 반환받는 방법
 * 1). dispatcher(카지노 딜러 역할)
 * 구상객체를 실질적으로 생성하는곳은 실글톤 패턴으로 작성된 Factory에서 진행된다. 
 * 이때 인자값으로 넘겨져 오는 command값에 따라서 서로 각각 다른 구상객체가 만들어진다. 
 * 하지만 정작사용자(dispatcher)(server side에서의 client)에게는 구상객체 명이 hiding 되어져서 넘겨진다.  
 * 추상화된 클래스(Action)로 넘겨집니다.
 *--> 클라이언트는 Factory로 하여금 구상 객체를 만들도록 요청하는 것이고, 
 *	  Factory는 요청에 해당하는 제품(component)을 만들고 인터페이스로 형변환해서 전달합니다. 
 * 2) 인터페이스의 메소드를 호출하면 실질적으로 생성된 구상객체가 드디어 핵심적인 일(비지니스 로직 호출)을 진행합니다. 
 *    최종적으로 뷰의 화면의 경로를 리턴 받습니다. 
 *    
 * 3) forward or sendRedirect로 응답함.	 
 */
public class DispatcherMainTest {

	public static void main(String[] args) {
		String command = "INSERT";
		//1. 
		ActionFactory factory=ActionFactory.getInstance();
		Action action = factory.creatAction(command);
		//2. 
		String path = action.execute();
		System.out.println(path);
	}

}