Servlet & JSP

JSP MVC model2

1space 2025. 7. 12. 14:52

뉴렉처 [Servlet&JSP 프로그래밍]강의를 통해 공부한 내용을 정리한 글입니다.

 

Model 1 방식: JSP 하나에 모든 역할을 몰아넣은 구조

구조 설명

  • 하나의 JSP 파일이 입력 받기, 처리하기, 출력하기 모든 역할을 다 합니다.
  • 예를 들면 이런 코드가 JSP에 모두 들어갑니다:
 
<%
  String n = request.getParameter("n");
  int num = Integer.parseInt(n);
  String result = (num % 2 == 0) ? "짝수" : "홀수";
%>
<html>
<body>
  <%= result %>입니다.
</body>
</html>

문제점: 스파게티 코드

  • 로직이 HTML 사이에 섞여 있어서 복잡하고 가독성 떨어짐
  • 로직과 디자인이 물리적으로 분리되지 않음
  • 디자이너가 HTML을 수정하려면 Java 코드까지 이해해야 함
  • 협업과 유지보수에 매우 불리

 

Model 2 방식: JSP와 서블릿 분리 (MVC 기초 구조)

구조 설명

  • JSP는 화면(View)만 담당하고,
  • 서블릿(Servlet)이 Controller 역할을 맡아 로직 처리를 담당함
  • 처리 결과는 JSP로 넘겨줌 (request.setAttribute("결과", result) 등)

예시 흐름

  1. 사용자가 form.html에서 숫자를 입력하고 제출
  2. 서블릿(EvenOddServlet.java)이 요청을 받고 숫자를 분석해서 "짝수"/"홀수"를 결정
  3. 그 결과를 JSP에게 넘김 (forward)
  4. JSP는 결과만 HTML로 출력

장점

  • 역할 분리가 되어 코드가 깔끔함
  • 디자이너는 JSP만, 개발자는 서블릿만 작업 가능
  • 유지보수가 쉬움

 

MVC Model2 with Dispatcher: 중앙집중식 구조 (Spring MVC 구조의 기반)

구조 설명

  • 모든 요청을 Dispatcher라는 하나의 중심 컨트롤러가 먼저 받음
  • Dispatcher가 요청을 보고 알맞은 서브 컨트롤러로 연결
  • 각 컨트롤러는 로직(Model)을 수행하고, 결과를 View(JSP)에 넘김

핵심 개념

  • web.xml에 모든 요청을 Dispatcher가 받도록 설정
  • Dispatcher가 URL을 보고 어떤 Controller를 실행할지 결정
  • 처리 결과를 View(JSP)로 넘겨 화면을 구성
 
<servlet>
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

장점

  • 확장성과 유지보수성이 가장 뛰어난 구조
  • 웹 애플리케이션이 커져도 중앙 집중적으로 관리 가능
  • Spring, Struts 등 프레임워크가 사용하는 방식

요약 정리

구분 Model 1 Model 2 (JSP + Servlet) Model 2 + Dispatcher
뷰와 로직 분리 ❌ X ✅ 분리 ✅ 철저히 분리
유지보수성 ❌ 낮음 ⚠️ 중간 ✅ 높음
확장성 ❌ 불리함 ⚠️ 괜찮음 ✅ 대규모 웹에 적합
프레임워크 적용 ❌ 없음 ⚠️ 일부 가능 ✅ Spring 기반 가능
협업 용이성 ❌ 어려움 ✅ 나음 ✅ 매우 좋음
 

 

전체 흐름 요약

  1. 사용자가 /spag?n=3 같은 URL을 요청합니다.
  2. 서블릿 Spag이 요청을 받아서 숫자 n의 홀짝 여부를 판단합니다.
  3. 판단 결과를 result라는 이름으로 JSP에 전달합니다.
  4. JSP(spag.jsp)는 View 역할을 수행하며 결과를 HTML로 출력합니다.

 

각 코드 설명

1. Spag.java - Controller 역할 (요청 처리, 로직 처리)

@WebServlet("/spag")
public class Spag extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException {

        int num = 0;
        String num_ = request.getParameter("n");
        if (num_ != null && !num_.equals("")) 
            num = Integer.parseInt(num_);

        String result;

        if (num % 2 != 0)
            result = "홀수";
        else
            result = "짝수";

        // 결과를 request에 저장 (Model에 해당)
        request.setAttribute("result", result);

        // View로 이동 (출력 담당 JSP로)
        RequestDispatcher dispatcher = request.getRequestDispatcher("spag.jsp");
        dispatcher.forward(request, response);
    }
}

핵심 정리:

  • request.getParameter("n"): 사용자가 입력한 숫자 가져오기
  • if(num % 2 != 0): 홀짝 판단
  • request.setAttribute(...): 결과 저장 (JSP에 넘겨줄 데이터)
  • dispatcher.forward(...): JSP에게 화면 출력 위임

 

spag.jsp - View 역할 (출력만 담당)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%= request.getAttribute("result") %>입니다.
</body>
</html>

핵심 정리:

  • request.getAttribute("result"): 서블릿에서 전달받은 홀수 or 짝수를 출력
  • 비즈니스 로직 없이 출력 전용 View 역할만 수행

 

Model2 방식

  • 컨트롤러(서블릿): 입력 처리 및 비즈니스 로직 담당
  • 모델(request.setAttribute): 전달할 데이터 저장소 역할
  • 뷰(JSP): 화면 구성 및 출력만 수행 (HTML 중심)

Dispatcher 중심 구조

  • web.xml 또는 어노테이션(@WebServlet)으로 URL 매핑
  • Dispatcher(서블릿)가 모든 요청을 받아 컨트롤러에 분배
  • 컨트롤러가 처리 후, JSP에게 출력 위임

 

요약

Controller 요청 파라미터 수집, 처리, 분기 Spag.java
Model 처리 결과 데이터 request.setAttribute()
View 결과를 HTML로 출력 spag.jsp

'Servlet & JSP' 카테고리의 다른 글

EL(Expression Language)  (0) 2025.07.13
JSP MVC model1  (0) 2025.07.12
스파게티 코드  (0) 2025.07.11
JSP의 내장객체  (0) 2025.07.11
JSP 코드블록  (0) 2025.07.11