카테고리 없음

Java 서블릿(Servlet)과 JSP

vamosdev12 2025. 9. 16. 17:25

Servlet

 

자바(Java)에서 Servlet을 사용한 경우와 사용하지 않은 경우의 차이를 이해하면 “왜 톰캣 같은 WAS가 필요한가?”까지 연결해서 보실 수 있습니다.


🔹 1. Servlet이란?

  • Servlet = 자바 기반의 웹 요청/응답 처리 규격(인터페이스)
  • 즉, “HTTP 요청을 받아서 처리하고 응답하는 표준 방식”을 정의한 것.
  • 개발자는 HttpServlet을 상속받아 doGet(), doPost() 같은 메서드를 구현하면 됩니다.
  • 실행은 톰캣 같은 **WAS(Web Application Server)**가 해 줍니다.

🔹 2. Servlet을 사용하지 않고 웹을 만든다면?

  • 개발자가 **소켓 프로그래밍(java.net.ServerSocket)**으로 직접 서버를 만들어야 합니다.
  • 클라이언트(브라우저) 요청이 오면:
    • 소켓 연결 수립
    • 요청(Request) 파싱 (HTTP 헤더, 쿠키, 바디 등 직접 분석)
    • 응답(Response) 생성 (HTTP 응답 코드, Content-Type 등 직접 작성)
  • 즉, 모든 HTTP 프로토콜 세부 동작을 직접 처리해야 합니다.

👉 단점:

  • 코드가 길고 복잡해짐.
  • 요청이 많아지면 스레드 관리, 세션 관리, 보안 처리 등을 전부 직접 구현해야 함.
  • 유지보수 어려움.

🔹 3. Servlet을 사용한다면?

  • 개발자는 비즈니스 로직에만 집중할 수 있습니다.
  • 요청/응답 파싱, 스레드 풀 관리, 세션/쿠키 관리 같은 저수준 작업은 톰캣(WAS)이 대신 처리합니다.
  • 개발자는 단순히 request.getParameter("id") 같은 식으로 데이터를 읽고,
    response.getWriter().write("Hello") 같은 방식으로 응답만 작성하면 됨.

👉 장점:

  • 생산성 향상 (개발자가 HTTP 프로토콜을 직접 다룰 필요 없음).
  • 표준화된 구조 (JSP, Spring MVC 등 다른 기술도 Servlet 위에서 동작).
  • 보안, 세션, 멀티스레딩 같은 기능을 WAS가 기본 제공.

🔹 4. 비교 정리

구분 Servlet 사용 X Servlet 사용 O

방식 소켓 프로그래밍으로 직접 HTTP 요청/응답 처리 Servlet API 표준 사용, WAS가 처리 지원
난이도 HTTP 프로토콜, 스레드, 세션 등을 직접 구현해야 함 비즈니스 로직에 집중 가능
유지보수 어렵고 비효율적 구조화·표준화되어 쉬움
활용 교육용, 아주 단순한 서버 실무, 모든 Java 웹 프레임워크(Spring 등)의 기반

🔹 5. 결론

  • Servlet을 쓰지 않으면 → 서버 기본 기능(HTTP 파싱, 세션, 멀티스레드)까지 직접 구현해야 함.
  • Servlet을 쓰면 → WAS(톰캣 등)가 다 처리해주므로, 개발자는 “무엇을 어떻게 응답할지”만 작성하면 됨.
  • 그래서 현대의 모든 자바 웹 프레임워크(Spring MVC 등)는 결국 Servlet 위에서 동작합니다.

👉 한마디로 요약하면:
“Servlet = 자바 웹 개발에서 HTTP 요청/응답을 쉽게 다루도록 만든 표준 인터페이스.
없으면 모든 걸 직접 구현해야 하고, 있으면 WAS가 대신 처리해준다.”

 


JSP

🔹 JSP란?

  • Java Server Pages의 약자.
  • HTML 코드 안에 자바 코드를 삽입해 웹페이지를 동적으로 생성할 수 있게 해주는 기술.
  • 확장자는 .jsp.
  • 실행할 때는 Servlet으로 변환되어 WAS(톰캣 등) 위에서 동작합니다.

🔹 JSP의 동작 원리

  1. 클라이언트(브라우저)가 index.jsp 요청.
  2. WAS(예: Tomcat)는 JSP 파일을 Servlet 자바 클래스로 변환.
    • HTML은 out.write("...") 형태로 변환.
    • JSP 안의 <% ... %> 자바 코드는 그대로 실행문으로 들어감.
  3. 변환된 Servlet 클래스가 컴파일 → 실행.
  4. 실행 결과로 HTML이 생성되어 브라우저에 응답.

👉 즉, JSP는 결국 Servlet으로 바뀌어 실행된다는 게 핵심입니다.


🔹 JSP 코드 예시

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head><title>Hello JSP</title></head>
<body>
    <h1>Hello, JSP!</h1>
    <% 
        // 자바 코드 삽입
        String name = "진화님";
        out.println("<p>안녕하세요, " + name + "!</p>");
    %>
</body>
</html>
  • HTML + 자바 코드 혼합.
  • <% ... %> 안에 자바 코드 작성 가능.
  • out.println() 대신 ${변수} 표현을 쓰는 EL(Expression Language), JSTL 같은 태그 라이브러리도 자주 사용.

🔹 JSP의 장점

  • HTML에 자바 코드를 삽입하므로 배우기 쉽고 직관적.
  • Servlet에 비해 UI 작성이 간단 (HTML을 그대로 쓰니까).
  • 간단한 동적 웹페이지를 빠르게 만들 수 있음.

🔹 JSP의 단점

  • 자바 코드와 HTML이 섞여 유지보수성이 떨어짐.
  • MVC 패턴에 어긋남 → 비즈니스 로직이 JSP에 들어가면 코드가 복잡해짐.
  • 대규모 프로젝트에는 부적합.

👉 그래서 현재는 JSP는 뷰(View) 역할에만 제한적으로 사용하고,
실제 로직은 Servlet, Spring MVC 같은 컨트롤러에서 처리하는 방식이 일반적입니다.


🔹 JSP vs Servlet 비교

구분 Servlet JSP

작성 방식 자바 코드 안에 HTML을 out.println()으로 작성 HTML 안에 자바 코드 삽입
가독성 UI 코드 작성이 불편함 UI 작성이 쉬움
실행 직접 작성된 자바 클래스 JSP → Servlet으로 변환 후 실행

🔹 결론

  • JSP = HTML에 자바 코드를 삽입해 동적 페이지를 만들 수 있는 기술.
  • 실행 시 JSP는 자동으로 Servlet으로 변환되어 WAS에서 동작.
  • 초창기에는 많이 썼지만, 지금은 Spring MVC + Thymeleaf/Freemarker 같은 템플릿 엔진이 JSP를 대체하는 경우가 많음.

 

Servlet과 JSP 코드 비교

같은 기능(“사용자 이름을 입력받아 Hello, OOO! 출력하기”)을 ServletJSP 두 가지 방식으로 비교


🔹 1. Servlet 버전

// HelloServlet.java
import java.io.*;
import jakarta.servlet.*;
import jakarta.servlet.http.*;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        String name = request.getParameter("name"); // ?name=진화
        if (name == null) name = "Guest";
        
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head><title>Hello Servlet</title></head>");
        out.println("<body>");
        out.println("<h1>Hello, " + name + "!</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

👉 특징:

  • HTML도 out.println()으로 한 줄씩 출력해야 해서 UI 코드 작성이 불편합니다.
  • 비즈니스 로직과 화면 코드가 섞이기 쉬움.

🔹 2. JSP 버전

<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head><title>Hello JSP</title></head>
<body>
    <% 
        String name = request.getParameter("name"); // ?name=진화
        if (name == null) name = "Guest";
    %>
    <h1>Hello, <%= name %>!</h1>
</body>
</html>

👉 특징:

  • HTML은 그대로 작성 가능.
  • 자바 코드는 <% %> 안에 넣으면 되므로 가독성이 훨씬 좋음.
  • <%= 변수 %> 문법으로 바로 출력 가능.

🔹 비교 정리

구분 Servlet JSP

코드 구조 자바 클래스 안에서 HTML을 문자열로 출력 HTML 안에 자바 코드 삽입
가독성 불편 (out.println 연속) 편리 (HTML 그대로 작성)
장점 자바 코드만으로 제어 가능 UI 작성이 훨씬 직관적
단점 화면 코드가 너무 복잡 비즈니스 로직이 섞이면 유지보수 어려움

결론

  • Servlet만으로도 동적 웹페이지 구현 가능하지만, HTML 표현이 너무 불편합니다.
  • JSP는 HTML 작성이 쉬워서 Servlet보다 생산성이 높음.
  • 그래서 JSP = UI(View) 담당, Servlet = 로직 담당으로 함께 쓰거나,
    더 발전된 구조로는 **Spring MVC + 템플릿 엔진(Thymeleaf 등)**이 대세가 된 거예요.