JSP란 Java Server Pages의 약자이며
HTML 코드에 JAVA 코드를 넣어 동적 웹 페이지를 생성하는 웹 어플리케이션 도구이다.
JSP가 실행되면 자바 서블릿(Servlet)으로 변환되며 웹 어플리케이션 서버에서 동작되면서 필요한 기능을 수행하고
그렇게 생성된 데이터를 웹페이지와 함께 클라이언트로 응답을 보낸다.
JSP는 전통적인 자바 서블릿의 화면처리가 어렵다는 단점을 보완하기 위해 등장했다. 서블릿은 자바 기반의 웹 프로그램 개발을 위해 만들어진 기술로, 클라이언트가 서버에 페이지(url)를 요청하면 서버는 요청 url에 매핑되는 서블릿을 호출하면서 파라미터를 전달한다. 이후 서블릿이 실행되고 파라미터로 전달된 값을 처리하거나 DB를 연동한다. 이때 서블릿은 html과 데이터를 조합하여 재구성한 다음 클라이언트에 리턴하고 웹 브라우저는 수신받은 html 내용을 해석해서 화면에 표시한다.
서블릿은 위와 같이 동작하는데 이때 서블릿에서 데이터와 html을 조합하는 방식에서 구조의 문제가 발생한다. 문자열을 결합하는 코드를 자바 언어로 작성해야하는 비효율성이 발생한 것인데 JSP의 등장으로 html과 데이터의 결합이 손쉬워졌다.

서블릿과 달리 html을 중심으로 데이터를 처리하는 특징을 가지고 있다. html에서 자바코드를 사용할 수 있는 구조라고 이해하면 쉽다. JSP 자체는 page 지시어 선언 부분을 제외하면 일반적인 html 파일 구조 형식을 띄고 있는데 스크립트릿(<% %>)으로 자바코드를 자유롭게 사용가능하다. html 부분은 out.println()을 사용하는 형태로 변환되게 되고 따라서 JSP는 html이 아니라 궁극적으로 서블릿 형태의 프로그램으로 변환된다.
정리하자면, JSP는 html + java 코드 형태로 구성되고 서블릿 컨테이너에 의해 서블릿 형태의 자바 코드로 변환된 다음 컴파일되어 컨테이너에 적재되는 구조이다.
.jsp 의 확장자를 가진다서블릿 컨테이너는 JSP 파일을 서블릿 구조의 .java 소스코드로 변환하며 컴파일을 수행한다. 컴파일이 완료되면 JSP는 더이상 파일로부터 처리되는 구조가 아니라 컨테이너에 로드된 서블릿으로 동작하는 구조이다.

JSP로 작성된 프로그램은 서버로 요청 시 서블릿 파일로 변환되어 JSP 태그를 분해하고 추출하여 다시 순수한 HTML를 반환하는 것이다.
전반적으로 JSP 자체의 단점이라기 보다는 SSR(Server Side Rendering) 방식의 백엔드 웹 개발의 문제라고 볼 수 있다
JSP 파일의 구성 요소는 다음과 같다.
이 중 page 지시어와 커스텀 태그에 대해서만 기술하겠다.
page 지시어는 현재의 JSP 페이지를 컨테이너에서 처리(서블릿으로 변환)하는데 필요한 각종 속성을 기술하는 부분으로, 소스코드 맨 앞에 위치하며 구문과 일반적인 사용예는 다음과 같다
<%@ page page_directive_attr_list %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" errorPage="error.jsp"%>
language: 현재 페이지의 스크립트 언어를 지정하는 속성, 스펙상 다른 언어도 가능하지만 당연히 java를 기본으로 함.contentType: 현재 페이지의 파일 형식을 지정하는 속성, 클라이언트 요청에 응답할때 전달하는 HTTP 헤더 정보가 된다.pageEncoding: jsp 파일을 컨테이너가 처리할때 사용하는 캐릭터 인코딩을 지정하는 속성, 올바른 한글처리를 위해서는 UTF-8 로 지정.import: jsp 파일내에서 자바코드(스크립트릿)를 직접 사용하는 경우 일반 자바 코드와 마찬가지로 클래스에 대한 패키지 import 가 필요하다.errorPage: 현재 jsp 요청 처리중에 에러가 발생하는 경우 서버 에러를 클라이언트에 전달하지 않고 별도의 페이지에서 처리하기 위한 속성. 매 페이지에 에러 페이지 설정을 넣는것 보다는 서버 설정을 사용하는 것이 권장됨.커스텀 태그는 표준 html 태그 이외 사용자 정의 태그를 말하며 스크립트릿 사용을 줄이고 태그와 같은 형태로 프로그램 코드를 대체하거나 재활용 가능한 구조를 통해 사용자 정의 태그를 자바 프로그램 형태로 구현하고 JSP를 서블릿 형태로 변환할 때 함께 처리될 수 있도록 태그 라이브러리로 활용하고자 개발된 규격이다.
외형적인 형태는 xml(html) 태그 구조를 가지지만 서블릿 형태로 변환될 때 자바 코드로 변경되어 통합되는 구조이다. 커스텀 태그를 직접 구현하는 것은 여러 방법이 있으며 잘 사용하면 매우 편리하지만 커스텀 태그 자체가 서버에서 해석되는 구조이며 프로젝트가 특정 커스텀 태그에 종속될 수 있어 사용자가 직접 커스텀 태그를 만드는 것을 점점 줄어들고 있다.
대신 커스텀 태그 기술로 만들어진 <jsp:useBean>이나 <jsp:setProperty>와 같이 JSP에 기본적으로 제공되는 action 태그는 JSP 개발에 꼭 알아야하는 주요 요소이다. 또한 몇몇 유용한 기능을 구현해둔 JSTL(JSP Standard Tag Library)dml 경우 개발에 꼭 필요한 요소가 된다.
구글에 JSP를 검색하면 자동완성으로 JSP 안 쓰는 이유, JSP 배워야 하나요 등이 검색될 만큼 왠지 JSP는 사장되어가는 분위기를 느낄 수 있었다. 그러나 JSP에 대해 어느 정도의 개념조차 없이 아예 모르고 넘어가는 것은 위험할 수 있다. Spring은 자바 기반의 대표적인 백엔드 개발을 위한 프레임워크이고 전세계적으로 널리 사용되고 있으며 특히 국내에서는 절대적인 위치를 가지고 있다. 이러한 Spring framework의 뿌리가 되는 것이 servlet과 jsp이다. servlet을 알아야 Spring의 dispatcher servlet을 이해할 수 있으며 언어의 발생 순서로 공부하는 것이 탄탄한 기초를 올릴 수 있는 방법이다.
JSP 공부가 필수적이라는 뜻은 아니다. 웹 개발 추세를 살펴보면 백엔드 개발 및 운영 환경의 변화를 확인할 수 있다. 대규모 상용 서비스 개발에 필수적으로 인식되던 자바 엔터프라이즈 에디션(Java EE)의 방대한 스펙과 구현의 복잡함으로 인해 스프링 프레임워크가 등장하게 되었고 클라우드 기반의 서버 운영이 보편화되면서 전통적인 Monorithic Architecture 중심의 서버 운영 전략이 소규모 분산 서비스 운영 방식인 MSA(Micro Service Architecture)로 전환되기 시작했다.
또한 프론트엔드 중심의 개발이 가속화되면서 서버 프로그램들이 보다 간결한 형태로 전환되었다. 특히 REST API 형태의 개발이 주를 이루게 되고 있어 백엔드에서 화면을 다루어야하는 경우는 점점 줄어들고 있다. 또한 스프링 프레임워크에서 기본적으로 권장되는 뷰 템플릿 엔진은 타임리프(Tymeleaf)이다. 물론 JSP도 가능하고 Free Marker도 가능하지만 스프링을 손쉽게 사용할 수 있도록해주는 스프링부트(Spring Boot)의 경우 JSP 사용에 제약이 있어 특히 권장되지 않는다. 또한 JSP, JSTL, EL과 같은 핵심 요소들은 더 이상 업데이트가 이루어지지 않고 있다.
현재의 개발 트렌드를 보면 새로운 프로젝트에 JSP를 꼭 사용해야할 만큼의 메리트는 없다고 본다. 그러나 지난 20여년 가까이 JSP를 사용해 개발된 프로젝트들이 많이 있고 기존 시스템과의 호환성이나 유지보수를 위해 아직도 많은 곳에서 JSP 개발자들을 필요로 하고 있다. 그 외에도 여러가지 이유로 JPS 기반의 개발이 필요한 곳이 있으며 이는 국내에서 뿐만이 아니다.
따라서 JSP 자체보다는 전반적인 웹프로그램 개발의 큰 그림을 이해하고 특히 자바 기반의 서버 프로그램, 나아가 스프링 프레임워크 기반의 백엔드 프로그램 개발을 메인으로 하되 최소한의 JSP에 대한 이해를 겸비해놓는 것이 올바른 학습방향이라고 생각한다.
참고문서
https://dinfree.com/lecture/backend/javaweb_1.1.html
https://javacpro.tistory.com/43
https://okky.kr/articles/891698
https://www.clien.net/service/board/cm_app/16864181