Post

서블릿(Servlet)과 JSP

서블릿(Servlet)과 JSP

1. 서블릿(Servlet)이란?

서블릿(Servlet)은 Java 기반의 웹 애플리케이션 프로그래밍 기술로, 클라이언트의 요청을 처리하고 동적인 웹 페이지를 생성하는 서버측 프로그램입니다. 서블릿은 javax.servlet.http.HttpServlet 클래스를 상속받아 구현되며, Java EE(Enterprise Edition) 스펙의 일부로 정의되어 있습니다.

1.1 서블릿의 기본 개념

1.1.1 웹 서버와 WAS의 관계

  • 웹 서버(Web Server): 정적 리소스(HTML, CSS, 이미지 등) 제공
  • WAS(Web Application Server): 서블릿 컨테이너를 포함하여 동적 컨텐츠 처리
    • 예: Tomcat, JBoss, WebLogic, WebSphere 등
  • 동작 과정: 클라이언트 요청 → 웹 서버 → WAS → 서블릿 컨테이너 → 서블릿

1.1.2 서블릿 컨테이너 아키텍처

1
2
3
4
5
[클라이언트]  [ 서버]  [WAS (서블릿 컨테이너)]
                                    
                            [서블릿 인스턴스 ]
                                    
                            [스레드  관리]

1.2 서블릿의 특징

1.2.1 플랫폼 독립성

  • 자바 기반: Write Once, Run Anywhere 철학 준수
  • 크로스 플랫폼: 다양한 운영체제에서 동일하게 동작
  • 이식성: 다른 WAS로 손쉽게 이전 가능

1.2.2 서버측 처리

  • 서버 자원 활용: 데이터베이스 연동, 파일 처리 등 서버 자원 직접 사용
  • 보안성: 비즈니스 로직이 서버에서 실행되어 클라이언트에 노출되지 않음
  • 확장성: 다양한 비즈니스 요구사항 구현 가능

1.2.3 상태 관리

1
2
3
4
5
6
7
// 세션 관리 예시
HttpSession session = request.getSession();
session.setAttribute("user", userObject);

// 쿠키 관리 예시
Cookie cookie = new Cookie("username", "홍길동");
response.addCookie(cookie);

1.2.4 효율적인 자원 관리

  • 싱글톤 패턴: 서블릿 인스턴스는 한 번만 생성되어 재사용
  • 스레드 풀: 요청마다 새로운 스레드 할당으로 동시 처리 지원
  • 메모리 관리: 컨테이너가 자동으로 메모리 관리

1.3 서블릿의 고급 특징

1.3.1 비동기 처리 지원

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@WebServlet(urlPatterns = "/async", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        AsyncContext asyncContext = req.startAsync();
        asyncContext.start(() -> {
            // 비동기 작업 수행
            try {
                // 긴 작업 처리
                Thread.sleep(1000);
                // 응답 처리
                asyncContext.complete();
            } catch (InterruptedException e) {
                // 예외 처리
            }
        });
    }
}

2. JSP(JavaServer Pages)란?

JSP는 HTML 코드 안에 자바 코드를 삽입하여 동적인 웹 페이지를 생성하는 기술입니다. 서블릿의 단점인 HTML 작성의 불편함을 보완하기 위해 만들어졌습니다.

2.1 JSP의 특징

  • HTML 중심: HTML 코드에 자바 코드를 삽입하는 형태
  • 서블릿 변환: JSP는 실행 시 서블릿으로 변환됨
  • 쉬운 개발: HTML 작성이 용이함
  • 내장 객체: request, response 등 주요 객체가 미리 선언되어 있음

2.2 JSP 기본 문법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>JSP 예제</title>
</head>
<body>
    <%-- JSP 주석입니다 --%>
    
    <%! 
    // 선언부: 멤버 변수/메소드 선언
    String message = "안녕하세요";
    %>
    
    <%
    // 스크립틀릿: 자바 코드 작성
    for(int i = 1; i <= 3; i++) {
    %>
        <h<%= i %>><%=message%></h<%= i %>>
    <%
    }
    %>
    
    <%-- 표현식: 값을 출력 --%>
    <p>현재 시간: <%= new java.util.Date() %></p>
</body>
</html>

3. 서블릿과 JSP의 차이점

3.1 주요 차이점

구분서블릿JSP
작성 방식자바 코드 안에 HTMLHTML 안에 자바 코드
장점자바 로직 처리에 적합화면 구현에 적합
변환 과정직접 실행서블릿으로 변환 후 실행
용도비즈니스 로직 처리화면 표현

3.2 MVC 패턴에서의 역할

현대 웹 개발에서는 MVC 패턴을 적용하여:

  • 서블릿: Controller 역할 (요청 처리 및 흐름 제어)
  • JSP: View 역할 (화면 표현)
  • 자바 클래스: Model 역할 (비즈니스 로직 및 데이터)

4. 실제 활용 예시

4.1 서블릿을 이용한 폼 데이터 처리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // 폼 데이터 받기
        String username = request.getParameter("username");
        String email = request.getParameter("email");
        
        // 비즈니스 로직 처리
        UserService userService = new UserService();
        boolean success = userService.registerUser(username, email);
        
        // 결과에 따른 페이지 이동
        if (success) {
            request.setAttribute("message", "등록 성공!");
            request.getRequestDispatcher("/success.jsp").forward(request, response);
        } else {
            response.sendRedirect("/error.jsp");
        }
    }
}

4.2 JSP를 이용한 결과 표시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>등록 결과</title>
</head>
<body>
    <h1>등록 결과</h1>
    <p>${message}</p>
    
    <% if(request.getAttribute("message") != null) { %>
        <p>처리 결과: <%= request.getAttribute("message") %></p>
    <% } %>
</body>
</html>

참고 자료

  • Java EE 공식 문서
  • Tomcat 공식 문서
  • Head First Servlets & JSP
This post is licensed under CC BY 4.0 by the author.