Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags more
Archives
Today
Total
관리 메뉴

개발공부 일지

학원수업_50day [JSP,Servlet(17day) - Front Controller 3 / Command Pattern] 본문

학원수업/Web(HMTL,CSS,JSP,Servlet)

학원수업_50day [JSP,Servlet(17day) - Front Controller 3 / Command Pattern]

짜몽- 2022. 10. 13. 17:36

인터페이스란 ?

인터페이스와 구현부를 나눈다.


요청에 대해서 컨트롤러가 응답하고, 결과에 따라 서블릿이나 JSP 로 만든 뷰를 보여주게 된다.

서버 측에서 메서드를 사용하여 화면을 전환하는 방법에 두 가지가 있다.

  • Response 객체의 sendRedirect 메서드
  • RequestDispatcher 객체의 forward 메서드

sendRedirect는 속성을 저장할 수 없고 다른 로직을 추가할 수 없다.

반면에 forward 메서드는 서버 내부에서만 흐름이 이동하므로 속성을 저장할 수 있고,

브라우저(클라이언트)에게 바로 전달하지 않고 원하는 작업을 처리한 후에 응답을 전환할 수 있다.

forward 메서드를 사용하기 위해서는 requestDispatcher 객체를 생성해야 한다

여기서 requestDispatcher 객체의 경로는 절대경로로 지정해야 한다.

컨트롤러에서 화면에 보여 주는 구문은 위와 같이 if문으로 분기처리하게 되는데, 이렇게 직접적으로 forward메서드를 사용하게 될 경우 URL이 변경되거나 뷰가 변경될 때마다 컨트롤러를 변경하게 되어서 추후에 유지보수가 어려워진다.

이럴 때는 Command pattern을 이용해서 복잡도를 낮출 수 있다. 그래서  Command pattern 를 쓰는 방법이 있다.

 

Command pattern 이란?

- Command pattern 은 명령(로직)을 객체안에 캡슐화해서 저장함으로써 컨트롤러와 같은 클래스를 수정하지 않고

재사용 할 수 있게 하는 패턴이다. 

invoker역할은 컨트롤러가 담당한다.

 

doGet 메서드는 command객체로 사용될 클래스의 이름을 입력 받은 후 리플랙션을 이용해서

인스턴스를 생성하고 execute 메서드를 호출한다. execute메서드는 입력받은 파라미터와 뷰 클래스들을 매칭해서

응답을 전달하는 역할을 한다. 뷰 클래스들의 패키지 위치 정보는 command.properties 파일로 관리한다.

 

  • ServletConfig : 하나의 Servlet에서 사용한다.(config 객체라고도 하면 Servlet당 하나 존재)  get메소드만 지원하여 Read-only이다. init()메서드를 호출하여 초기화된 parameter를 ‘name / value’형식으로 읽는다.
  • ServletContext : servlet과 jsp에서 모두 접근가능하며 전체(JVM)에서 한 개만 존재한다
    위의 둘다 Servlet에 상속되어 있어 다른 선언없이 바로 get() 이 가능.

command.properties 파일은 입력된 파라미터가 view 클래스들과 연결되도록 하는 역할을 한다.

 

페이지 경로를 모르더라도 cmd 파라미터에 따라서 페이지로 이동된다

 

모든 요청은 FrontController 클래스가 받는다. HomeView.java는 Command 클래스를 상속받았고 요청 파라미터가 Home인 경우 homew.jsp를 호출하는데, 이와 같이 프론트 컨트롤러 패턴은 뷰 페이지 요청을 한 곳에서 관리할 수 있게 해준다.

 


Refactoring Ver 7
  Ver6 까지는 
  client 측에서 모든 요청에 대해 FrontControllerServlet 으로 집중시켜 처리하게 하기 위해
  command 정보를 전달했다
  예)  <form action="FrontControllerServlet">
  <input type="hidden" name="command" value="FindCustomerController">
  <input type="text" name="id">
  </form>
  예2> <a href="FrontControllerServlet?command=FindCustomerController&id=java"> ...
 
  생각해 볼 점 : 요청시점의 생산성을 위해 action 또는 query string 의 url 자체를 command 로
  처리하는 방안 
  Ver 7 의 목적
  예) <form action="FrontControllerServlet">
  <input type="text" name="id">
  </form>
  예2> <a href="FindCustomerController&id=java"> ...

 

 


  * webstudy23-url-pattern-do-test 에서
  단위 테스트 
  *.do 로 요청 url-pattern 을 처리 
이 것을 특정 서블릿에서 받아와서 컨트롤러명을 추출