6장_ : ListUser 화면 구현

2026. 2. 6. 15:45·Book/자바 웹 프로그래밍 Next Step

 

서블릿에서 HTML을 직접 생성하는 문제

회원 목록을 화면에 출력한다고 가정해보자.
회원가입 시 저장된 사용자 목록을 조회한 뒤 HTML 테이블로 출력해야 한다.

이 작업을 서블릿(ListUserServlet) 에서 직접 처리한다면 다음과 같은 문제가 발생한다.

  • PrintWriter로 <table>, <tr>, <td>를 직접 출력해야 한다
  • 문자열로 HTML을 이어 붙여야 한다
  • 로직과 화면 코드가 뒤섞인다
  • 가독성과 유지보수성이 급격히 나빠진다

즉, 서블릿에서 HTML을 직접 생성하는 방식은 확장성과 유지보수 측면에서 한계가 명확하다.

이 한계를 극복하기 위해 등장한 기술이 JSP(Java Server Page) 이다.

 

 

JSP의 핵심 개념

JSP의 핵심 아이디어는 단순하다.

정적인 HTML은 그대로 두고,
동적으로 변하는 부분만 프로그래밍으로 처리하자

JSP는 서버에서 실행되어 HTML을 만들어서 브라우저로 보내는 역할을 한다.
이름 그대로 Java Server Page이다.

JSP에서는 자바 코드를 그대로 사용할 수 있도록 scriptlet 문법을 제공했다.

 

 

JSP 초창기 방식: Scriptlet 사용

초기 JSP에서는 <% %> 안에 자바 코드를 직접 작성했다.

사용자 목록 출력 예제 (Scriptlet 방식)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*"%>

<%
    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>
<%
	}
%>

이 방식의 장점은 분명하다.

  • 서블릿에서 HTML을 출력하는 것보다 훨씬 편하다
  • 화면 구조가 눈에 보인다

하지만 문제는 곧 드러났다.

 

 

Scriptlet 방식의 한계

웹 애플리케이션의 요구사항이 복잡해질수록 JSP에 다음과 같은 코드가 쌓이기 시작했다.

  • 반복문
  • 조건문
  • 비즈니스 로직
  • 데이터 가공 로직

그 결과 JSP는 점점 이런 상태가 된다.

  • HTML과 자바 코드가 뒤섞인다
  • 디자이너와 협업이 어렵다
  • 테스트하기 힘들다
  • 유지보수가 지옥이 된다

즉, JSP가 화면(View)이 아니라 또 다른 컨트롤러처럼 변질된다.

이 문제를 해결하기 위해 등장한 것이 JSTL과 EL이다.

 

 

JSTL과 EL의 등장 목적

JSTL과 EL의 목표는 명확하다.

  • JSP에서 자바 문법을 제거
  • JSP를 순수한 View 계층으로 만들기
  • 로직은 컨트롤러로 이동시키기

용어 정리

  • EL(Expression Language)
    ${user.name} 처럼 값을 꺼내는 표현식
  • JSTL(JavaServer Pages Standard Tag Library)
    반복, 조건, 포맷 등을 태그 형태로 제공하는 라이브러리

 

 

JSTL + EL을 사용한 사용자 목록 출력

앞서 Scriptlet으로 구현했던 코드를 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>
<td scope="row">${status.count}</td>
<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>

이 코드의 특징은 다음과 같다.

  • JSP에 자바 코드가 단 한 줄도 없다
  • 반복은 <c:forEach> 태그가 담당한다
  • 데이터 접근은 ${} 표현식이 담당한다
  • JSP는 화면 출력에만 집중한다

 

 

여기서 중요한 전제 조건

JSTL과 EL만 쓴다고 해서 JSP에서 자바 코드가 완전히 사라지는 것은 아니다.

한 가지 조건이 필요하다.

JSP가 출력할 데이터는
이미 준비된 상태로 전달되어야 한다

즉, JSP는 데이터를 조회하거나 가공하면 안 된다.

 

 

컨트롤러의 역할 (MVC 패턴)

이 역할을 담당하는 것이 컨트롤러이다.

  • 요청을 받는다
  • 비즈니스 로직을 실행한다
  • 데이터를 조회한다
  • 결과를 request에 담는다
  • JSP로 forward한다
request.setAttribute("users", users);
request.getRequestDispatcher("/user/list.jsp").forward(request, response);

사실 이미 이 구조는 사용하고 있었다.

  • ListUserServlet
    → 사용자 목록을 조회
    → "users"라는 이름으로 JSP에 전달

즉,

ListUserServlet은 MVC 패턴에서 Controller 역할을 하고 있었던 것이다.

 

 

 

정리

  • 서블릿에서 HTML을 직접 생성하는 방식은 유지보수에 치명적이다
  • JSP는 HTML 중심으로 화면을 구성할 수 있게 해준다
  • Scriptlet은 편했지만 결국 JSP를 더럽혔다
  • JSTL과 EL은 JSP에서 자바 코드를 제거하기 위해 등장했다
  • JSP를 순수 View로 만들기 위해서는 컨트롤러가 반드시 필요하다
  • 이 흐름이 바로 MVC 패턴이다

 

 

요약

JSP는 화면만 그려야 하고,
데이터 준비는 컨트롤러가 해야 한다.

 

 

 


출처 : 《자바 웹 프로그래밍 Next Step》, 박재성, 로드북

'Book > 자바 웹 프로그래밍 Next Step' 카테고리의 다른 글

6장_ 요구사항3 : 세션 기반 로그인/로그아웃 상태 만들기  (0) 2026.02.07
6장_ 요구사항1: 개인정보 수정  (0) 2026.02.06
6장_ : ListUSerServlet 구현  (0) 2026.02.06
5장_ : 서블릿 컨테이너가 하는 일: 생명주기와 인스턴스 생성  (0) 2026.02.05
5장_ : Servlet으로 Hello World 출력하기  (0) 2026.02.05
'Book/자바 웹 프로그래밍 Next Step' 카테고리의 다른 글
  • 6장_ 요구사항3 : 세션 기반 로그인/로그아웃 상태 만들기
  • 6장_ 요구사항1: 개인정보 수정
  • 6장_ : ListUSerServlet 구현
  • 5장_ : 서블릿 컨테이너가 하는 일: 생명주기와 인스턴스 생성
sqaxe1
sqaxe1
woojoo-devlog 님의 블로그 입니다.
  • sqaxe1
    Woojoo's Devlog
    sqaxe1
  • 전체
    오늘
    어제
    • 분류 전체보기 (148)
      • Backend (9)
        • Servlet (7)
        • Spring (2)
      • Frontend (1)
      • CS (0)
      • Book (33)
        • 자바 웹 프로그래밍 Next Step (30)
        • 테스트 주도 개발: 고품질 쾌속개발을 위한 TDD.. (1)
        • 성공과 실패를 결정하는 1%의 네트워크 원리 (2)
      • Engineering (0)
        • Testing (0)
      • Infra (6)
        • AWS (6)
      • Java (4)
      • Network (1)
      • 김영한 (28)
        • 자바 입문 (8)
        • 실전 자바 - 기본편 (6)
        • 실전 자바 - 중급편 (10)
        • 실전 자바 - 고급편 (4)
      • Web (39)
        • Web Basics (39)
      • Project (24)
        • NeoSquare (0)
        • Memo Evolution (24)
      • 정보처리기사 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    개발서적
    aws
    java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sqaxe1
6장_ : ListUser 화면 구현
상단으로

티스토리툴바