모델2 방식 : Model-View-Controller Design Pattern

zwundzwzig·2023년 1월 13일
1

Java

목록 보기
3/9
post-thumbnail

JSP 웹 어플리케이션 구조는 모델1과 모델2 방식으로 나뉜다.

모델1

지금까지 공부했던 JSP 방식은 모델1 방식으로, 모든 요청을 JSP가 자바빈이나 서비스 클래스를 사용해 응답했다. 이를 통해 쉽고 편리한 기능 구현이 가능하다.

그러나 요청 데이터가 방대해지면 JSP 페이지에 비즈니스 로직을 처리하기 위한 코드와 웹 브라우저에 결과를 출력하는 코드가 섞여 유지보수와 재사용성에 문제가 생길 수 있다.

모델2

모델2의 핵심은 클라이언트의 요청, 응답, 비즈니스, 로직 등 WAS의 각 기능을 모듈화하자는 개념이다. 개발자들은 자신이 맡은 모듈만 구현하면 되기 때문에 독립적이고 효율적으로 일처리 할 수 있다.

Model-View-Controller Design Pattern

모델2의 여러 방식 중 대표적인 개념이다.

Controller

  • 클라이언트 요청 및 흐름 제어를 통해 적합한 JSP 선택
  • 서블릿이 컨트롤러 역할
  • 요청에 대해 필요한 Model 호출

Model

  • 비즈니스 로직을 처리
  • DAO와 DTO 클래스로 구성된 자바빈
  • 데이터베이스 연동

View

  • 브라우저 화면을 담당
  • JSP이 뷰 역할
  • Model에서 처리한 결과를 화면에 표시

과정은 다음과 같다.
1. 클라이언트가 웹 브라우저에서 HTTP 요청을 전송한다.
2. 해당 요청은 컨트롤러의 서블릿이 받는다.
3. 서블릿은 요청에 적합한 모델의 DAO를 호출한다.
4. DAO 빈은 DTO를 거쳐 데이터베이스에 접근해 알맞는 로직을 구현한다.
5. 다시 반환~~~하여 서블릿은 뷰 역할을 하는 적합한 JSP를 선택한다.
6. JSP는 포워딩한 정보를 브라우저 화면에 구현한다.

Command Pattern

NodeJS로 프로젝트할 때 url 파라미터에 명령어를 주고 받으며 로직을 구현하곤 했다.

이때 커멘드 패턴을 사용할 수 있는데, 요청을 캡슐화해 커멘드 객체가 명령하는 객체들에 대한 의존성을 느슨하게 만들 수 있다.

사용법은 CommandHandler 인터페이스를 사용해 명령어 처리기를 분리할 수 있다. 위의 과정에서 모델이 하는 기능을 해줄 수 있다.

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public interface CommandHandler {
    public String process(HttpServletRequest req, HttpServletResponse res)
        throws Exception;
}

public class SomeHandler implements CommandHandler{
    
    public String process(HttpServletRequest request, HttpServletResponse response){
        // 1. 명령어와 관련된 비즈니스 로직 처리
        ...
        // 2. 뷰 페이지에서 사용할 정보 저장
        request.setAttribute("somValue", value);
        ...
        // 3. 뷰 페이지의 URI 리턴
        return "/view/someView.jsp";
    }
}

명령어를 처리하는 핸들러 클래스는 CommandHandler 인터페이스를 구현하면 된다.

핸들러 클래스의 process() 메서드는 다음과 같은 세 가지 작업을 처리한다.

첫 번째 단계에서는 요청받은 작업을 수행한다. 보통 모델을 사용해서 비즈니스 로직을 처리하는 코드가 위치한다.

두 번째 단계에서는 뷰 페이지가 요청 처리 결과를 보여줄 때 필요한 객체를 request 기본 객체의 속성에 저장한다.

마지막으로, 처리 결과를 보여줄 뷰 페이지를 리턴한다.

컨트롤러 서블릿은 process() 메서드의 실행 결과로 리턴받은 뷰 페이지의 URI를 사용해서 뷰 페이지로 이동하며, 뷰 페이지는 두 번째 단계에서 저장한 request의 속성값을 읽어와 결과를 보여준다.

참고

profile
개발이란?

0개의 댓글