본문 바로가기
Java , Spring/Spring

[JSP] JSP의 등장 배경, 동작 원리, 장단점

by 방배킹 2025. 9. 7.

 

회사에서 JSP를 사용하는 프로젝트에 참여하게 되었다. 요즘 JSP라고 하면 흔히 “옛날 기술”이라는 평가를 받지만, JSP가 처음 등장했을 당시에는 웹 개발 패러다임을 크게 바꾼 혁신적인 기술이었다.

무엇보다 어떤 기술이든 등장 배경, 장단점, 동작 원리를 이해하고 사용하는 것과 그렇지 않은 것 사이에는 큰 차이가 있다고 생각한다. 그래서 이번 기회에 JSP에 대해 정리해보려 한다.

JSP의 등장 배경

초기 웹 개발에서 HTML은 정적인 페이지로만 동작했기 때문에 서버에서 동적으로 데이터를 삽입하기 어려웠다. 이를 해결하기 위해 등장한 것이 Servlet이다.

하지만 Servlet은 자바 코드 안에 HTML을 문자열로 작성해야 해서, 가독성이 떨어지고 유지보수가 어려운 문제가 있었다.

// Servlet 예시 코드
out.println("<html>");
out.println("<body>");
out.println("<h1>Hello, Servlet!</h1>");
out.println("</body>");
out.println("</html>");

이후 JSP가 등장하면서, 개발자는 HTML 중심 문서에 자바 로직을 삽입할 수 있게 되었다. 이 덕분에 디자이너는 HTML 작업에, 개발자는 로직 구현에 집중할 수 있었고 협업 효율성이 크게 개선되었다.

<!-- JSP 예시 코드 -->
<html>
  <body>
    <h1>Hello, JSP!</h1>
    현재 시간: <%= new java.util.Date() %>
  </body>
</html>

JSP 동작 원리

JSP는 단순히 “HTML에 자바 코드를 끼워 넣는 문법”이 아니다. 내부적으로는 Servlet으로 변환되어 실행되는 구조다. 즉, 개발자 입장에서는 편리한 문법이지만, 서버 입장에서는 결국 Servlet과 동일하게 동작한다.

브라우저에서 http://localhost:8080/hello.jsp 요청이 들어오면 Tomcat 같은 Servlet Container는 다음 과정을 거친다.

  1. JSP 파일 확인
    • 최초 요청이거나 JSP 소스가 수정되었을 경우 → 다시 변환 및 컴파일
    • 수정되지 않았을 경우 → 기존 컴파일된 클래스 재사용
  2. JSP → Servlet 변환
    • JSP 파일이 Servlet 자바 코드(.java) 로 변환
    • HTML은 out.println() 코드로, <%= %> 같은 스크립트릿은 자바 코드로 변환
  3. Servlet 컴파일
    • 변환된 .java 파일을 컴파일해 .class 파일 생성
  4. Servlet 실행
    • Container가 .class 파일을 로드하고, 요청 시 service() → doGet()/doPost() 실행
  5. 응답 반환
    • 실행 결과가 HTML 형태로 브라우저에 전달됨
// hello.jsp
<html>
  <body>
    <h1>Hello JSP!</h1>
    현재 시간: <%= new java.util.Date() %>
  </body>
</html>

// 변환된 Servlet
@WebServlet("/hello.jsp")
public final class hello_jsp extends HttpServlet {
    public void _jspService(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        response.setContentType("text/html;charset=UTF-8");
        JspWriter out = response.getWriter();

        out.println("<html>");
        out.println("<body>");
        out.println("<h1>Hello JSP!</h1>");
        out.println("현재 시간: " + new java.util.Date());
        out.println("</body>");
        out.println("</html>");
    }
}

Servlet이란?

Servlet은 자바로 작성된 서버 측 프로그램이다.

  • 클라이언트 요청을 받아 처리하고 결과(HTML, JSON 등)를 반환
  • Tomcat 같은 Servlet Container에서 실행되며, 요청/응답 흐름을 표준화된 API로 제공
  • 장점: CGI와 달리 요청마다 프로세스를 생성하지 않고 멀티스레드 기반으로 효율적 동작

단점: HTML을 직접 out.println() 방식으로 작성해야 하므로 코드 가독성과 유지보수성이 떨어진다.

JSP의 장단점

Servlet의 한계를 보완하기 위해 JSP(JavaServer Pages)가 등장했다. JSP는 HTML 중심 문서에 자바 코드를 삽입할 수 있어 생산성과 협업 효율성을 크게 높였다.

장점

  1. HTML 중심 개발 → 디자이너와 개발자 협업 용이
  2. 코드 간결성 → Servlet처럼 out.println() 반복 불필요
  3. 표준화된 태그 지원 → JSTL, 커스텀 태그 활용 가능
  4. 자동 변환/컴파일 → 결국 Servlet으로 실행되므로 성능과 안정성 확보

단점

  1. 비즈니스 로직 혼재 → HTML과 자바 코드가 섞여 유지보수 어려움
  2. MVC 패턴 미약 → 규모가 커질수록 구조적 한계
  3. 표현력 한계 → 복잡한 동적 UI에는 불리
  4. 현대 웹 아키텍처와 괴리 → React, Vue 같은 프론트엔드 프레임워크 보급 이후 사용 감소

JSP의 한계와 대안

이러한 JSP의 한계를 보완하기 위해 다양한 기술과 프레임워크가 등장했다.

  • JSTL & EL: JSP 안의 자바 코드 사용을 줄이고 태그와 표현식 언어로 대체
  • MVC 프레임워크: JSP를 View에 집중시키고 Controller, Model을 분리
  • 템플릿 엔진: JSP보다 가볍고 Spring Boot와의 통합성이 뛰어남
  • 프론트엔드 프레임워크 + REST API: React/Vue/Angular 등으로 FE와 BE를 완전히 분리하는 현대적 아키텍처

정리

  • JSP는 HTML 코드안에 Java 코드를 삽입할 수 있는 서버 사이드 랜더링 기술이다.
  • 동작원리는 JSP 파일이 최초 요청 시 Servlet으로 변환되어 실행되는 구조이다. 이후에는 Servlet처럼 요청을 처리하면서 HTML 응답을 만들어낸다.
  • 장점은 Servlet 보다 가독성과 협업이 용이하다는 것이고, 단점은 HTML과 비즈니스 로직이 섞여서 유지보수가 어렵다는것이다.
  • 그래서 이후 JSTL, Spring MVC 같은 기술들이 사용되었고, 최근에는 React와 Vue 같은 프론트엔드 프레임워크와 Rest API 아키텍처로 발전하게 되었다.

댓글