뉴렉처 [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) 등)
예시 흐름
- 사용자가 form.html에서 숫자를 입력하고 제출
- 서블릿(EvenOddServlet.java)이 요청을 받고 숫자를 분석해서 "짝수"/"홀수"를 결정
- 그 결과를 JSP에게 넘김 (forward)
- 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 기반 가능 |
협업 용이성 | ❌ 어려움 | ✅ 나음 | ✅ 매우 좋음 |
전체 흐름 요약
- 사용자가 /spag?n=3 같은 URL을 요청합니다.
- 서블릿 Spag이 요청을 받아서 숫자 n의 홀짝 여부를 판단합니다.
- 판단 결과를 result라는 이름으로 JSP에 전달합니다.
- 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 |