JSP(JavaServer Pages)는 웹 개발을 처음 접하는 사람에게 다소 복잡하게 느껴질 수 있습니다. 하지만 그 구조를 단계별로 나누어 보면 생각보다 훨씬 이해하기 쉽습니다. 이 글에서는 웹 서버가 JSP 페이지를 어떻게 처리하고, 브라우저에 최종 결과물을 전달하는지 그 전체 흐름을 쉬운 언어로 풀어 설명합니다.
JSP 컨테이너란 무엇인가?
웹 서버가 JSP 페이지를 처리하려면 반드시 JSP 엔진, 즉 JSP 컨테이너라는 것이 필요합니다. JSP 컨테이너는 JSP 페이지로 들어오는 요청을 가로채서 처리하는 역할을 담당합니다.
이 튜토리얼에서는 JSP 컨테이너가 내장되어 있어 별도 설정 없이도 JSP 페이지 개발을 지원하는 Apache를 사용합니다.
JSP 컨테이너는 웹 서버와 협력하여 JSP가 동작하는 데 필요한 런타임 환경과 각종 서비스를 제공합니다. 또한 JSP 안에 포함된 특수 요소들을 해석하는 방법도 알고 있습니다.
아래 다이어그램은 웹 애플리케이션에서 JSP 컨테이너와 JSP 파일이 어디에 위치하는지 보여줍니다.

JSP 처리 과정: 단계별 흐름
그렇다면 웹 서버는 JSP를 이용해 어떻게 웹페이지를 만들어낼까요? 다음 단계별 흐름을 따라가 보겠습니다.
브라우저의 HTTP 요청: 일반적인 웹페이지와 마찬가지로, 사용자의 브라우저가 웹 서버에 HTTP 요청을 보냅니다.
요청 판별 및 전달: 웹 서버는 해당 HTTP 요청이 JSP 페이지를 대상으로 한 것임을 인식하고, 이를 JSP 엔진으로 전달합니다. 이때 URL이 .html이 아닌 .jsp로 끝나는지 여부로 판별합니다.
서블릿 코드로 변환: JSP 엔진은 디스크에서 JSP 페이지를 불러온 뒤 이를 서블릿(servlet) 콘텐츠로 변환합니다. 변환 방식은 매우 단순합니다. 모든 템플릿 텍스트는
println()문으로 바뀌고, 모든 JSP 요소는 자바(Java) 코드로 변환됩니다. 이 코드가 페이지의 동적 동작을 실제로 구현합니다.컴파일 및 요청 전달: JSP 엔진은 변환된 서블릿을 실행 가능한 클래스로 컴파일한 후, 원래의 요청을 서블릿 엔진으로 넘깁니다.
서블릿 실행과 HTML 생성: 웹 서버의 일부인 서블릿 엔진이 서블릿 클래스를 로드하여 실행합니다. 실행 과정에서 서블릿은 HTML 형식의 출력을 생성하며, 서블릿 엔진은 이 출력을 HTTP 응답에 담아 웹 서버로 되돌려줍니다.
브라우저로 응답 전송: 웹 서버는 이 HTTP 응답을 정적 HTML 콘텐츠 형태로 브라우저에 전달합니다.
최종 화면 출력: 마지막으로 브라우저는 HTTP 응답 안에 담긴 동적으로 생성된 HTML 페이지를 마치 정적 페이지인 것처럼 그대로 처리하여 화면에 표시합니다.
위에서 설명한 전체 과정은 다음 다이어그램에서 확인할 수 있습니다.

JSP가 빠른 이유: 스마트한 재컴파일 방식
흥미로운 점은 JSP 엔진이 매번 같은 작업을 반복하지 않는다는 사실입니다. JSP 엔진은 먼저 해당 JSP 파일에 대한 서블릿이 이미 존재하는지, 그리고 JSP 파일의 수정 날짜가 기존 서블릿보다 오래된 것인지 확인합니다.
JSP 파일이 이미 생성된 서블릿보다 오래되었다면, JSP 컨테이너는 "JSP가 변경되지 않았으므로 기존 서블릿이 여전히 유효하다"고 판단합니다. 덕분에 PHP 같은 다른 스크립트 언어보다 처리 과정이 더 효율적이고 속도도 빠릅니다.
결론: JSP는 결국 서블릿을 쉽게 쓰는 방법
정리하면, JSP 페이지는 자바 프로그래밍 전문가가 아니더라도 서블릿을 작성할 수 있게 해주는 또 하나의 방법이라고 할 수 있습니다. 번역(변환) 단계를 제외하면 JSP 페이지는 일반 서블릿과 완전히 동일하게 처리됩니다.