웹 어플리케이션의 흐름 제어를 위한 인터페이스를 정의해본다.
프로바이더: 최범균

지금까지 2회에 걸쳐서 모델 2 구조를 이용한 '로직과 프리젠테이션의 분리' 및 모델 2 구조에 커맨드 패턴을 적용하는 것에 대해서 살펴보았다. 물론, 이 두가지 요소를 통해서 우리는 모델 2 구조를 상당부분 객체 지향적으로 구현할 수 있게 되었지만 여기에 추가적으로 우리가 해야 할 부분이 있다. 바로 흐름제어를 위한 별도의 방안을 강구하는 것이다.

2부에서는 커맨드 패턴에서 사용되는 각 커맨드 처리 객체가 다음에 보여줄 JSP 페이지를 처리의 결과값을 리턴하는 방식을 사용하여 웹 어플리케이션의 흐름을 제어했었다. 물론, 이처럼 커맨드 패턴의 각 객체가 흐름제어를 하는 방식만으로 충분할 수도 있다. 하지만 커맨드 패턴에서 사용되는 객체가 아닌 별도의 객체에서 흐름 제어를 할 수 있다면, 즉 흐름 제어의 역할을 담당하는 객체를 별도로 사용한다면, 웹 어플리케이션은 더욱 객체 지향적인 구조를 갖게 될 것이다. 이번 3부에서는 흐름 제어를 위한 인터페이스를 작성해봄으로써 모델 2 구조에 대한 애기를 끝맺도록 하겠다.

처음 흐름 제어를 위한 인터페이스를 생각했을 때 생각났던 것이 JDBC API 였다. JDBC의 java.sql.ResultSet 인터페이스를 보면 next(), absolute() 등 결과 집합 행을 이동할 때 사용되는 메소드가 존재하는 것을 알 수 있으며, 이를 통해 읽어올 행의 순서를 제어한다는 사실도 알수 있다. 필자는 이러한 ResultSet 인터페이스와 비슷한 방법으로 웹 어플리케이션의 흐름 제어를 위한 인터페이스를 설계해보았으며, 그 인터페이스는 다음과 같다. (주석문은 소스 코드를 쉽게 볼 수 있도록 하기 위해서 삭제하였다.)

  package org.jcore.webapp.control.spi;
  
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import org.jcore.webapp.control.exception.ControlBoxException;
  
  public interface ControlBox {
     
     public void setHttpInfo(HttpServletRequest request,
                             HttpServletResponse response);
     
     public int getPreviousStep();
     public int getNextStep();
     public int getCurrentStep();
     public int getRequestStep();
     public boolean isValidStep();
     public boolean isFirstStep();
     public boolean isLastStep();
     public void goNextStep() throws ControlBoxException;
     public void goPreviousStep() throws ControlBoxException;
     public void goFirstStep() throws ControlBoxException;
     public void goLastStep() throws ControlBoxException;
     public void goInvalidStep() throws ControlBoxException;
     public void clearControlBox() throws ControlBoxException;
  }

ControlBox 인터페이스를 보면 getXXX() 메소드와 isXXX() 메소드 그리고 goXXX() 메소드의 세 가지 종류의 메소드가 존재하는 것을 알 수 있다. 이러한 메소드들이 무엇을 의미하지 살펴보기 전에 ControlBox 인터페이스가 어떤 의미로 설계되었는지 이해해야만 한다. 필자는 ControlBox를 설계할 때 스텝이라는 개념을 도입하였다. 여기서 스텝은 어떤 일을 처리하는 단계를 의미하는 것이다. 스텝의 의미를 좀더 구체적으로 정의하기 위해서 다음 그림을 살펴보자.

위 그림은 사이트 가입 절차의 일부를 표시한 것으로서 유저는 일반적으로 사이트에 가입신청을 하면 약관을 보게 되고, 이후 회원 정보 입력과 확인 절차 후 최종적으로 사이트의 회원으로 가입하게 된다. 이러한 과정은 크게 두 개의 부분으로 나뉜다. 하나는 위 그림에서 윗줄에 표시된 어떤 행위를 요청하는 부분이고 다른 하나는 위 그림에서 아랫줄에 표시된 요청을 처리하는 부분이다. 여기서 각각의 요청을 하나의 스텝으로 볼 수도 있고 또는 요청의 처리를 하나의 스텝으로 볼 수도 있다. 각각의 요청을 하나의 스텝으로 볼 때, 위 그림에서 "약관보기요청", "화면1 요청", "입력확인 요청" 등이 하나의 스텝이 된다.

그렇다면 흐름 제어는 무엇인가? 위 그림에서 흐름은 "사용자가 일정한 순서로 스텝을 거치는 것"이라고 정의할 수 있으며, 따라서 흐름 제어는 "사용자가 거치게 될 스텝의 순서를 제어해주는 것"으로 정의할 수 있다. 스텝의 순서를 제어하는 것에는 다음과 같은 것이 있을 수 있다.

  • 다음 스텝으로 이동
  • 이전 스텝으로 이동
  • 처음 스텝으로 이동
  • 마지막 스텝으로 이동

ControlBox 인터페이스에 선언되어 있는 goNextStep(), goPreviousStep(), goFirstStep(), goLastStep() 메소드가 바로 이러한 스텝의 이동을 위한 것들이다. 그리고 ControlBox 인터페이스는 현재 스텝이 무엇이고 사용자가 요청한 스텝이 무엇인지 그리고 요청한 스텝은 흐름에서 올바른 지의 여부를 판단하기 위한 메소드를 정의하고 있는 데, 이들 메소드는 다음과 같다.

  • getCurrentStep() - 현재 처리할(또는 처리하는) 스텝을 구한다.
  • getRequestStep() - 요청한 스텝을 구한다.
  • goInvalidStep() - 잘못된 스텝을 요청할 경우 에러 페이지로 이동한다.
  • clearControlBox() - ControlBox와 관련해서 저장된 정보를 삭제한다.
  • isValidStep() - 올바른 스텝인지 판단한다.
  • isFirstStep() - 첫번째 스텝인지 판단한다.
  • isLastStep() - 마지막 스텝인지 판단한다.

그리고 ControlBox 인터페이스는 웹 어플리케이션의 요청/응답과 관련된 객체를 전달받기 위한 메소드인 setHttpInfo()를 선언하고 있다. ControlBox 인터페이스의 기본적인 사용 방법은 다음과 같다.

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
                    throws IOException, ServletException {
	  
	  // ControlBoxImpl은 ControlBox 인터페이스를 구현한 클래스
	  ControlBox box = new ControlBoxImpl();
	  
	  box.setHttpInfo(request, response);
	  if (box.isValidStep()) {
	    // 어떤 알맞은 처리를 한다.
	    ...
	    box.goNext();
	  } else {
	    // 알맞은 스텝이 아니면,
	    box.goInvalidStep();
	  }
  }

위 코드를 보면, 웹 어플리케이션의 흐름 제어는 ControlBox 인터페이스에 정의되어 있는 메소드를 통해서 처리되기 때문에 서블릿이나 기타 로직을 처리하는 객체에서 흐름을 제어하기 위한 코드를 삽입할 필요가 없음을 알 수 있다. 흐름 제어에 있어서 중요한 것은 ControlBox 인터페이스를 구현하는 것 뿐이다. 실제 ControlBox 인터페이스를 구현한 예제는 뒤에서 살펴볼 것이다.

 

프로바이더 최범균 ( madvirus@madvirus.net ) :
가메출판사의 'JSP Professional'을 저술하였으며 Oreilly의 'Java and XML'을 번역하기도 하였다. 현재는 티페이지 글로벌의 기술팀에서 근무하고 있다.

3개의 커멘트가 등록되어 있습니다.
이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이