좋아요! 업로드해주신 화이트보드 내용을 기반으로 Servlet & JSP 전반을 총정리한 A4 4장 분량의 벨로그 스타일 포스팅을 작성해드릴게요. 이 포스팅은 당신의 웹 프로젝트 준비와 이론 이해를 모두 돕기 위해 공식 문서 기반 설명, 실제 코드 예시, 실무 응용까지 포함합니다.
JSP와 Servlet은 여전히 강력하고 유연한 웹 개발의 시작점입니다. 이 글에서는 Servlet & JSP의 동작 원리부터 EL/JSTL 문법, 필터와 리스너, 파일 업로드까지 백엔드 기초 전반을 정리합니다. 특히 여러분의 프로젝트 준비에 맞춰 실무 코드 예시도 함께 제시합니다.
| 구성요소 | 담당 역할 | 예시 코드 또는 기능 |
|---|---|---|
| Servlet | Controller 역할 (Java 코드 중심) | doGet(), doPost() 내 비즈니스 로직 |
| JSP | View 역할 (HTML + 출력 중심) | <%= request.getAttribute(...) %> |
| 공통 요소 | 이동방식: forward, redirect, PRG 패턴 | RequestDispatcher, sendRedirect() |
폼 제출 후 브라우저 새로고침 시 중복 제출 방지.
// Servlet 내 POST 처리 후
response.sendRedirect("result.jsp");
@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);
}
}
| 객체 | 설명 |
|---|---|
HttpServletRequest | 사용자 요청 데이터 (파라미터, 헤더 등) |
HttpServletResponse | 응답 객체 (출력 스트림 포함) |
HttpSession | 사용자 상태 유지 객체 (로그인 등) |
ServletContext | 웹 어플리케이션 전체 범위 공유 객체 |
JSP는 HTML에 Java 코드를 삽입하는 방식입니다.
| 문법 종류 | 예시 | 설명 |
|---|---|---|
<% %> | <% int x = 10; %> | 스크립트릿 (Java 코드 실행) |
<%= %> | <%= x %> | 표현식 (출력) |
<%! %> | <%! int count = 0; %> | 선언문 (필드/메서드 정의) |
${param.name} <!-- 요청 파라미터 -->
${sessionScope.id} <!-- 세션 범위 접근 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${not empty user}">
<p>환영합니다, ${user.name}님!</p>
</c:if>
| 스코프 | 객체 | 설명 |
|---|---|---|
| page | PageContext | 페이지 단위 |
| request | HttpServletRequest | 요청 단위 |
| session | HttpSession | 로그인 등 사용자 상태 유지 |
| application | ServletContext | 웹 어플리케이션 전체 공유 |
Cookie c = new Cookie("userId", "jang");
c.setMaxAge(60*60); // 1시간
response.addCookie(c);
HttpSession session = request.getSession();
session.setAttribute("userId", "jang");
세션은 서버 메모리 or Redis 등에 저장되며 쿠키보다 보안상 안전. 단, 과부하 주의.
모든 요청/응답을 가로채서 전처리/후처리 가능.
@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 서블릿 호출
}
}
서블릿 생명주기, 세션 생성/소멸 감지
@WebListener
public class SessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session created: " + se.getSession().getId());
}
}
@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 또는 서버 외부 저장소 연동 필요.
| 구분 | forward | redirect |
|---|---|---|
| 서버 내부 이동 | O | X |
| URL 변경 | X | O |
| request 데이터 공유 | O | X |
| 사용 예 | 조회 결과 페이지 | 폼 제출 후 PRG |
✨ “신상품 알림 커뮤니티 플랫폼”을 Servlet/JSP로 구현 가능
Servlet & JSP는 지금도 학습과 실무에 중요한 기반 기술입니다. Spring으로 넘어가기 전, 요청과 응답의 흐름, 상태 관리 방식, 스코프 개념을 완전히 이해하는 것이 중요합니다.
원하신다면 이 글을 벨로그 포스팅용 마크다운(.md) 형식으로도 변환해드릴게요!
프로젝트 주제나 커뮤니티 기능 확장 관련해서도 더 구체적인 설계 도와드릴 수 있어요 :)