Servlet & JSP 완전정복

moon.kick·2025년 4월 19일

좋아요! 업로드해주신 화이트보드 내용을 기반으로 Servlet & JSP 전반을 총정리한 A4 4장 분량의 벨로그 스타일 포스팅을 작성해드릴게요. 이 포스팅은 당신의 웹 프로젝트 준비이론 이해를 모두 돕기 위해 공식 문서 기반 설명, 실제 코드 예시, 실무 응용까지 포함합니다.


🌐 Servlet & JSP 완전정복 | Java 웹 개발의 핵심 기초 다지기

JSP와 Servlet은 여전히 강력하고 유연한 웹 개발의 시작점입니다. 이 글에서는 Servlet & JSP의 동작 원리부터 EL/JSTL 문법, 필터와 리스너, 파일 업로드까지 백엔드 기초 전반을 정리합니다. 특히 여러분의 프로젝트 준비에 맞춰 실무 코드 예시도 함께 제시합니다.


📌 1. JSP와 Servlet의 역할 분담: MVC 아키텍처에서의 위치

구성요소담당 역할예시 코드 또는 기능
ServletController 역할 (Java 코드 중심)doGet(), doPost() 내 비즈니스 로직
JSPView 역할 (HTML + 출력 중심)<%= request.getAttribute(...) %>
공통 요소이동방식: forward, redirect, PRG 패턴RequestDispatcher, sendRedirect()

✅ PRG (Post-Redirect-Get) 패턴이란?

폼 제출 후 브라우저 새로고침 시 중복 제출 방지.

// Servlet 내 POST 처리 후
response.sendRedirect("result.jsp");

📌 2. Servlet 핵심 개념과 동작 원리

🚀 Servlet 실행 흐름

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        request.setAttribute("message", "Hello World!");
        RequestDispatcher dispatcher = request.getRequestDispatcher("hello.jsp");
        dispatcher.forward(request, response);
    }
}

🔁 Servlet 주요 객체

객체설명
HttpServletRequest사용자 요청 데이터 (파라미터, 헤더 등)
HttpServletResponse응답 객체 (출력 스트림 포함)
HttpSession사용자 상태 유지 객체 (로그인 등)
ServletContext웹 어플리케이션 전체 범위 공유 객체

📌 3. JSP 문법 – 스크립트릿과 선언문

JSP는 HTML에 Java 코드를 삽입하는 방식입니다.

문법 종류예시설명
<% %><% int x = 10; %>스크립트릿 (Java 코드 실행)
<%= %><%= x %>표현식 (출력)
<%! %><%! int count = 0; %>선언문 (필드/메서드 정의)

📌 4. EL (Expression Language) & JSTL (JSP Standard Tag Library)

✅ EL 문법 예시

${param.name}      <!-- 요청 파라미터 -->
${sessionScope.id} <!-- 세션 범위 접근 -->

✅ JSTL 대표 태그

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:if test="${not empty user}">
  <p>환영합니다, ${user.name}님!</p>
</c:if>

📌 5. 스코프(Scope)와 객체 저장소

스코프객체설명
pagePageContext페이지 단위
requestHttpServletRequest요청 단위
sessionHttpSession로그인 등 사용자 상태 유지
applicationServletContext웹 어플리케이션 전체 공유

📌 6. 쿠키와 세션: 사용자 상태관리

🍪 쿠키

Cookie c = new Cookie("userId", "jang");
c.setMaxAge(60*60); // 1시간
response.addCookie(c);

🧾 세션

HttpSession session = request.getSession();
session.setAttribute("userId", "jang");

세션은 서버 메모리 or Redis 등에 저장되며 쿠키보다 보안상 안전. 단, 과부하 주의.


📌 7. Filter & Listener

🔍 Filter

모든 요청/응답을 가로채서 전처리/후처리 가능.

@WebFilter("/*")
public class EncodingFilter implements Filter {
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
      throws IOException, ServletException {
    req.setCharacterEncoding("UTF-8");
    chain.doFilter(req, res); // 다음 필터 or 서블릿 호출
  }
}

👂 Listener

서블릿 생명주기, 세션 생성/소멸 감지

@WebListener
public class SessionListener implements HttpSessionListener {
  public void sessionCreated(HttpSessionEvent se) {
    System.out.println("Session created: " + se.getSession().getId());
  }
}

📌 8. 파일 업로드/다운로드 – @MultipartConfig와 Part 객체

@MultipartConfig
@WebServlet("/upload")
public class FileUploadServlet extends HttpServlet {
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    Part filePart = request.getPart("file");
    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();
    InputStream fileContent = filePart.getInputStream();

    Files.copy(fileContent, new File("uploads/" + fileName).toPath(), StandardCopyOption.REPLACE_EXISTING);
  }
}

multipart/form-data 전송 방식이어야 함.
대용량 파일은 S3 또는 서버 외부 저장소 연동 필요.


📌 9. 이동 방식: Forward vs Redirect

구분forwardredirect
서버 내부 이동OX
URL 변경XO
request 데이터 공유OX
사용 예조회 결과 페이지폼 제출 후 PRG

📌 10. 확장 응용: 프로젝트 아이디어 예시

✨ “신상품 알림 커뮤니티 플랫폼”을 Servlet/JSP로 구현 가능

  • Servlet: 로그인 처리, 상품 등록, 댓글 기능
  • JSP: 제품 목록/디테일 페이지 렌더링
  • 세션: 사용자 로그인 상태 유지
  • 쿠키: 최근 본 상품 기록
  • EL/JSTL: 제품 목록 출력, 조건부 렌더링
  • 파일 업로드: 썸네일 이미지 저장
  • Listener: 사용자 통계 집계

✍️ 마무리

Servlet & JSP는 지금도 학습과 실무에 중요한 기반 기술입니다. Spring으로 넘어가기 전, 요청과 응답의 흐름, 상태 관리 방식, 스코프 개념을 완전히 이해하는 것이 중요합니다.

✅ 다음 단계 추천

  • Spring MVC → DispatcherServlet 중심 구조로 확장
  • Thymeleaf or React → JSP 대체
  • JWT + OAuth2 → 세션/쿠키 인증 대체
  • Spring Boot Multipart → 파일 업로드 최적화

원하신다면 이 글을 벨로그 포스팅용 마크다운(.md) 형식으로도 변환해드릴게요!
프로젝트 주제나 커뮤니티 기능 확장 관련해서도 더 구체적인 설계 도와드릴 수 있어요 :)

profile
@mgkick

0개의 댓글