step0-getting-started 브랜치 소스코드를 열어보면 서블릿/JSP 기반으로 회원가입(서블릿)과 사용자 목록(JSP) 기능을 이미 구현해 놓았다. 회원가입(서블릿)과 사용자 목록(JSP) 소스코드를 리뷰하면서 서블릿과 JSP에 대해 간략하게 살펴본다.
회원가입 화면은 /user/form.html 을 그대로 사용한다. 사용자가 입력한 데이터를 추출한 후 데이터베이스에 데이터를 추가하는 회원가입 서블릿 코드는 다음과 같다.
- src/main/java/next/web/CreateUserServlet.java
package next.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import next.model.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import core.db.DataBase;
@WebServlet("/user/create")
public class CreateUserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final Logger log = LoggerFactory.getLogger(CreateUserServlet.class);
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User user = new User(
req.getParameter("userId")
, req.getParameter("password")
, req.getParameter("name")
, req.getParameter("email")
);
log.debug("user : {}", user);
DataBase.addUser(user);
resp.sendRedirect("/user/list");
}
}
5장에서 구현한 CreateUserController 와 비교해보면 다른 점이 거의 없다. 만약 위 소스코드가 어떻게 동작하는지 이해하기 힘들다면 4장과 5장을 다시 복습한다.
회원가입 완료 후 사용자 목록을 출력하기 위해 "/user/list"로 리다이렉트 한다. "/user/list" URL과 매핑되어 있는 ListUserServlet 코드는 다음과 같다.
- src/main/java/next/web/ListUserServlet.java
package next.web;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import core.db.DataBase;
@WebServlet("/user/list")
public class ListUserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("users", DataBase.findAll());
RequestDispatcher rd = req.getRequestDispatcher("/user/list.jsp");
rd.forward(req, resp);
}
}
ListUserServlet 은 회원가입할 때 저장한 사용자 목록을 조회한 후 JSP에 "users" 라는 이름으로 전달하고 있다. 5장에서 구현한 ListUserController 는 사용자 목록을 보여주는 HTML 을 StringBuilder 를 활용해 동적으로 생성했지만 ListUserServlet 은 JSP 파일로 위임하고 있다. 5장에서 구현한 ListUserController 는 간단한 HTML을 생성하는 데도 소스코드가 복잡해졌다. 그렇다면 /user/list.jsp 파일의 HTML을 ListUserController 에서 생성한다면 어떻게 될까? 서블릿으로 동적으로 HTML을 생성하려면 ListUserController 와 같은 방식으로 프로그래밍 해야 한다. 이 같은 서블릿의 한계를 극복하기 위해 등장한 것이 JSP 이다.
JSP는 정적인 HTML은 그대로 두고 동적으로 변경되는 부분만 JSP 구문을 활용해 프로그래밍으로 구현하면 된다. JSP는 Java Server Page라는 이름에서 알 수 있듯이 JSP에서 자바 구문을 그대로 사용할 수 있다. 따라서 JSP 초창기에는 사용자 목록을 출력하기 위해 다음과 같이 자바 구문을 직접 사용해 구현했다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*" %>
<%@ page import="next.model.*" %>
<%
Collection<User> users = (Collection<User>) request.getAttribute("users");
for (User user : users) {
%>
<tr>
<td><%=user.getUserId()%></td>
<td><%=user.getName()%></td>
<td><%=user.getEmail()%></td>
<td><a href="#" class="btn btn-success" role="button">수정</a></td>
</tr>
<%
}
%>
JSP에서는 스크립트릿(scriptlet)이라고 하는 <% %> 내에 자바 구문을 그대로 사용할 수 있게 되었다. 위와 같이 구현하는 것만으로도 서블릿으로 구현할 때보다 훨씬 더 편해졌다. 그런데 웹 애플리케이션 요구사항의 복잡도가 증가하면서 많은 로직이 JSP에 자바 코드로 구현되다보니 JSP를 유지보수하기 너무 힘들어졌다. 이 같은 한계를 극복하기 위해 등장한 기술이 JSTL(JavaServer Pages Standard Tag Library)과 EL(Expression Language)이며, JSP의 복잡도를 낮춰 유지보수를 쉽게 하자는 목적으로 MVC 패턴을 적용한 프레임워크가 등장하게 되었다.
JSTL과 EL을 활용해 앞에서 구현한 사용자 목록을 다시 구현하면 다음과 같다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach items="${users}" var="user" varStatus="status">
<tr>
<th scope="row">${status.count}</th>
<td>${user.userId}</td>
<td>${user.name}</td>
<td>${user.email}</td>
<td><a href="#" class="btn btn-success" role="button">수정</a></td>
</tr>
</c:forEach>
JSTL과 EL을 활용하면 JSP에서 자바 구문을 완전히 제거할 수 있다. 사실 자바 구문을 완벽하게 제거하려면 한 가지가 더 필요하다. JSP가 출력할 데이터를 전달해 줄 컨트롤러이다. 즉, MVC 패턴 기반으로 개발해야 JSP에서 자바 구문을 완전히 제거할 수 있다. 앞에서 사용자 목록을 조회한 후 JSP에 전달했던 ListUserServlet 이 MVC 패턴에서 컨트롤러 역할을 한 것이다.
지금까지 서블릿에서 JSP로 변화 과정에 대해 간략하게 살펴봤다. 이 과정에서 등장한 JSTL과 EL 용어는 반드시 외워둔다. JSTL과 EL 문법은 생각보다 간단하기 때문에 이 용어들만 알고 있으면 검색을 통해 문법을 쉽게 찾을 수 있기 때문이다.
간단하게 맛을 봤으니 복습한다는 마음으로 나머지 기능을 구현한다. 만약 서블릿과 JSP에 대한 경험이 충분하다면 이 실습을 건너뛰고 다음 실습을 진행한다.
참고도서 : https://roadbook.co.kr/169
[신간안내] 자바 웹 프로그래밍 Next Step
● 저자: 박재성 ● 페이지: 480 ● 판형: 사륙배변형(172*225) ● 도수: 1도 ● 정가: 30,000원 ● 발행일: 2016년 9월 19일 ● ISBN: 978-89-97924-24-0 93000 [강컴] [교보] [반디] [알라딘] [예스24] [인터파크] [샘
roadbook.co.kr
'교재 실습 > 자바 웹 프로그래밍 Next Step' 카테고리의 다른 글
6.1.3 로그인/로그아웃 기능 실습 (4) | 2025.04.21 |
---|---|
6.1.2 개인정보수정 실습 (3) | 2025.04.20 |
6.1 서블릿/JSP로 회원관리 기능 다시 개발하기 (4) | 2025.04.14 |
6장 서블릿/JSP를 활용해 동적인 웹 애플리케이션 개발하기 (4) | 2025.04.12 |
5.4.3 템플릿 엔진 (3) | 2025.04.11 |
댓글