[JSP] 레거시 웹 개발에서 JSP가 여전히 중요한 이유 (Feat. 사용 가이드)
초기 웹 페이지는 대부분 정적 HTML로 작성되어, 사용자별로 맞춤형 콘텐츠를 제공하는 동적 기능을 구현할 수 없었습니다. 이러한 한계를 극복하기 위해 Java의 Servlet 기술이 등장했는데요, 이를 통해 동적인 콘텐츠 생성이 가능해졌습니다.
하지만 Servlet은 HTML을 Java 코드 안에 직접 작성해야 하므로 코드가 복잡해지고, HTML과 Java 코드가 뒤섞이는 불편함이 있었습니다.
이 문제를 해결하기 위해 탄생한 기술이 바로 ‘JSP(Java Server Pages)’입니다.
JSP(Java Server Pages)란?
JSP(Java Server Pages)는 Java 기반의 서버 측 스크립팅 기술로, 동적인 웹 페이지를 생성하기 위해 설계된 Java EE(Java Platform, Enterprise Edition) 표준 기술입니다.
JSP는 주로 HTML 코드에 Java 코드를 결합하여 동적 콘텐츠를 생성하며, Servlet에서 자바 문자열로 프레젠테이션 로직을 작성해야 하는 복잡함을 해소하고 보다 간단하고 직관적인 방식으로 작성할 수 있게 합니다.
* 정규 표현식을 활용해 자바 문자열을 손쉽게 처리하는 방법이 궁금하다면 아래 링크를 참고하세요.
▶️ 정규 표현식; 자바 정규식을 활용해서 문자열을 손쉽게 처리하는 방법
JSP를 개발 가이드 없이 단독으로 사용하면 View 로직과 비즈니스 로직이 강하게 결합되어 코드의 가독성과 유지보수성이 크게 저하될 수 있습니다.
이러한 문제를 해결하고 JSP를 효율적으로 활용하려면 MVC 패턴을 적용하는 것이 중요한데요. 지금부터, 개발 방법론인 MVC 패턴에 대해 자세히 알아보겠습니다.
JSP와 MVC 패턴
JSP를 개발 방법론 없이 단독으로 사용하면 View 로직과 비즈니스 로직이 강결합되어 코드의 가독성과 유지보수성이 크게 떨어질 수 있습니다. 이러한 문제를 해결하고 JSP를 효과적으로 사용하려면 MVC 패턴을 활용하는 것이 좋습니다. 이제, MVC 패턴이 무엇인지 자세히 알아볼까요?
JSP와 Servlet은 이 패턴에서 다음과 같은 역할을 수행합니다.
- Model: 데이터와 비즈니스 로직을 포함하며, 보통 데이터베이스와의 상호작용을 처리합니다. 자바 빈즈(JavaBeans)나 POJO(Plain Old Java Object) 클래스 등이 모델 역할을 수행합니다.
- View: 사용자에게 표시되는 화면으로, JSP가 주로 담당합니다. JSP는 모델에서 가져온 데이터를 바탕으로 사용자에게 동적 웹 페이지를 제공합니다.
- Controller: 요청을 받아 처리하고 적절한 모델과 뷰를 연결하는 역할을 합니다. 주로 Servlet이 컨트롤러 역할을 수행하여 모델에서 데이터를 가져와 뷰(JSP)로 전달합니다.
MVC 패턴을 통해 JSP를 View에 집중에 집중한다면 복잡한 비즈니스 로직과 프리젠테이션 로직을 분리할수 있어 관심사의 분리를 통해 코드의 가독성이 높아지고 유지보수가 용이해집니다.
JSP는 View 로직에 집중할수 있게 도와주는 여러 편의기능을 제공하기 때문에 MVC 패턴에 잘 부합될수 있는 기술입니다. 이러한 편의기능으로는 EL 문법, 액션태그, 사용자 정의 태그가 있는데요 자세한 사항은 이후에 JSP 구성요소와 사용방법에 대해서 설명하겠습니다.
JSP 주요 구성요소와 사용법
JSP의 작동원리
JSP는 클라이언트가 jsp 파일을 최초 요청할 때마다 Servlet 파일을 생성하여 요청을 처리합니다. 결국 JSP도 Servlet의 일종인 것입니다. 그림으로 좀 더 자세히 살펴보겠습니다.
1. 클라이언트가 hello.jsp 를 최초 요청하였다.
2. JSP 컨테이너가 JSP 파일을 읽는다.
3. JSP 컨테이너가 Servlet(.java) 파일을 생성한다.
4. .java 파일은 .class 파일로 컴파일된다.
5. Servlet 클래스는 HTML 파일을 생성하여 JSP 컨테이너 에게 전달한다.
6. JSP 는 HTML 페이지를 클라이언트 에게 전달한다.
이후 동일한 JSP 요청이 들어오면 다시 변환 및 컴파일 과정을 거치지 않고, 컴파일된 Servelt을 재사용하여 빠르게 응답할 수 있습니다.
동적 콘텐츠 작성 시 Servlet으로 작성하여 발생하는 복잡성을 간편하게 바꿔주는 JSP를 효율적으로 활용하기 위해 중요하면서서 자주 쓰이는 사용 방법을 빠르게 살펴보겠습니다.
JSP의 구성요소와 사용법
디렉티브(Directive)
디렉티브는 JSP 페이지의 속성이나 전역 설정을 정의하는 요소로, JSP 페이지 전체에 영향을 미칩니다. JSP 페이지에서 가장 많이 사용하는 디렉티브에는 JSP page, JSP include, JSP taglib 디렉티브가 있습니다.
- JSP page: 페이지의 속성을 정의하며, 예를 들어 응답의 콘텐츠 타입이나 import할 클래스를 설정할 수 있습니다.
<%@ page contentType="text/html; charset=UTF-8"%> <%@ page import="java.util.Date" %> |
- JPS include: 다른 JSP 파일이나 HTML 파일을 포함할 때 사용합니다. 재사용성을 높이기 위한 설정입니다.
<%@ include file="header.jsp" %> |
- JSP taglib: JSP에서 태그 라이브러리를 사용할 때 설정합니다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:if test="${user != null}"> <p>안녕하세요, ${user.name}님!</p> </c:if> |
내장 객체(Implicit Object)
내장 객체는 JSP에서 별도의 선언 없이 바로 사용할 수 있는 객체들로, 웹 애플리케이션의 주요 기능을 제공합니다. 주로 클라이언트와 서버 간의 요청과 응답을 관리하는 데 사용되는데요. 총 9개의 내장 객체가 중, 가장 주요하게 쓰이는 5가지 내장 객체를 간단하게 살펴보겠습니다.
- JSP request: 서버 요청 객체
클라이언트 IP 주소: <%= request.getRemoteAddr() %> |
- JSP response: 서버 응답 객체
<% response.setContentType("text/html; charset=UTF-8"); response.sendRedirect("https://example.com"); %> |
- JSP session: 세션 객체
<%= session.getAttribute("username") %> |
- JSP application: 애플리케이션 범위의 속성 정보를 저장하는 객체
<%= application.getAttribute("appName") %> |
- JSP out: 클라이언트에게 데이터를 출력하는 객체
<% out.println("<p>안녕하세요, JSP입니다!</p>"); %> |
스크립트(Script)
스크립트는 JSP 페이지에서 Java 코드를 작성할 수 있는 요소로, HTML과 함께 Java 코드를 삽입하여 동적 콘텐츠를 처리할 수 있습니다. JSP에서 지원하는 스크립트 요소에는 스크립트릿(Scriptlet), 표현식(Expression), 선언(Declaration)이 있습니다.
- 스크립트릿: <% ... %> 안에 Java 코드를 삽입하여 로직을 처리합니다.
<% int a = 10; int b = 20; int sum = a + b; |
<p>합계: <%= sum %></p> |
- 선언: <%! ... %> 안에 변수를 선언하거나 메서드를 정의합니다
<%! public String greet(String name) { return "안녕하세요, " + name + "님!"; } %> |
EL(표현 언어)
EL은 JSP에서 간단한 문법으로 데이터를 출력할 수 있게 하는 표현 언어입니다. EL은 ${...} 문법을 사용하여 변수를 출력하거나 간단한 연산을 수행할 수#4. 있습니다. 이는 JSP 페이지에서 데이터 바인딩을 보다 간결하고 직관적으로 처리하는 데 도움을 줍니다. EL은 스코프(scope) 라는 개념을 사용해 데이터를 탐색합니다. 아래 순서로 데이터를 검색합니다.
- PageContext (페이지 범위)
- Request (요청 범위)
- Session (세션 범위)
- Application (애플리케이션 범위)
example.jsp?username=John의 URL로 요청이 오게 된다면
${username} |
위 코드의 결과는 request 요청 범위의 스코프에서 탐색되게 됩니다. 또한 EL 문법은 jsp 내장 객체에 명시적으로 접근이 가능합니다. 위 코드를 다르게 표현하면 아래와 동일하게 됩니다.
${param.username} |
액션태그와 사용자 정의 태그
JSP에서 자주 사용하는 기능을 태그 형태로 재사용할 수 있게 해줍니다. 액션 태그는 JSP 표준 태그로, 주로 JavaBean 과의 연동, 페이지 포함, 요청 포워딩 등의 작업을 단순화하기 위해 사용됩니다.
사용자 정의 태그는 개발자가 필요에 따라 직접 정의한 태그로, 복잡한 로직을 캡슐화하여 재사용 가능한 태그를 만들 수 있게 합니다.
<% String targetPage = "profile.jsp"; request.setAttribute("userId", "12345"); request.setAttribute("userRole", "admin"); RequestDispatcher dispatcher = request.getRequestDispatcher(targetPage); dispatcher.forward(request, response); %> |
(스크립트로 구현 시)
<jsp:forward page="profile.jsp"> <jsp:param name="userId" value="12345" /> <jsp:param name="userRole" value="admin" /> </jsp:forward> |
(액션 태그로 구현 )
액션 태그는 스크립트 코드와 비교해 보면 코드의 의미가 훨씬 명확합니다. profile.jsp로 포워드 하면서 파라미터를 같이 전달하고 있는 걸 한눈에 파악할 수 있어 가독성이 좋습니다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <body> <c:if test="${userRole == 'admin'}"> <p>관리자 권한이 있습니다.</p> </c:if> <c:if test="${userRole != 'admin'}"> <p>일반 사용자 권한입니다.</p> </c:if> </body> </html> |
위의 코드는 사용자 정의 태그로 대표적인 jstl입니다. jstl 태그를 사용하여 뷰를 렌더링 하기 위해서 필요한 로직을 간단하게 구현할 수 있습니다.
JSP 사용시 주의사항
JSP는 스크립트 문법으로 html 문서 안에 자바 코드를 작성하여 다양한 동적 콘텐츠를 생성할수 있습니다.
하지만 지나치게 많은 사용은 프레젠테이션 로직과 비즈니스 로직이 뒤섞여 가독성이 매우 안 좋아질 수 있습니다.
따라서 가급적 EL 문법이나 JSTL을 사용하여 데이터 바인딩만 하여 비즈니스 로직과는 분리하는것이 좋습니다.
또한 웹 프레임워크로 현재 가장 많이 사용되고 있는 Spring 웹 프레임워크로 JSP를 사용하기 위해서는 몇 가지 설정이 필요한데요. Spring에서 JSP를 사용하기 위한 설정 방법을 알려드리겠습니다.
Gradle을 통한 JSP 라이브러리 설정
dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' implementation "org.apache.tomcat.embed:tomcat-embed-jasper" } |
Spring boot가 사용하고 있는 내장 톰캣에는 jasper 라이브러리를 포함하고 있지 않기 때문에 직접 gradle을 활용해 jasper 라이브러리를 설정해야 합니다.
JSP 파일을 랜더링하기 위한 ViewResolver 설정
spring.application.name=jsptest spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp |
application.properties 파일에 view 파일 경로와 view-resolver가 사용할 view 파일의 suffix를 설정을 위와 같이 설정합니다.
webapp 폴더를 root 폴더로 그 아래에 application.properties에 설정한 파일 경로의 폴더들을 생성합니다 (WEB-INF > views) 그다음 jsp 파일을 여기에 위치 시킵니다.
* Spring Framwork를 활용한 개발 시간 단축 방법
▶️ Spring Framework, 개발 시간을 단축하고 싶으면 ‘3가지’를 확인하세요.
레거시 시스템을 효율적으로 운영하려면
JSP 활용이 필수적입니다.
JSP는 Java 기반의 서버 측 스크립팅 기술로, Servlet의 복잡함을 줄이고 동적인 HTML 생성을 지원하기 위해 개발되었습니다.
JSP는 MVC 패턴에서 View 역할을 수행하며, 비즈니스 로직과 프레젠테이션 로직을 분리하여 유지보수를 용이하게 합니다.
JSP는 Java 생태계 내에서 오랜 시간 사용되었으나 기존의 레거시 시스템이나 특정 환경에서는 여전히 JSP가 유용하게 사용되고 있고 레거시 시스템을 운영하기 위해서는 필수적으로 익혀야 할 기술 스택중 하나입니다.
이랜서에서 알려드리는 JSP 사용법을 숙지하고 효율적으로 동적 웹 페이지를 개발해 보세요. JSP의 핵심 개념과 실무 활용법을 익히면, 레거시 시스템 운영부터 현대적인 웹 애플리케이션 개발까지 폭넓게 활용할 수 있습니다.
이랜서 추천, 데이터 처리를 효율적으로 도와주는 데이터 처리 콘텐츠
▶️ Ajax 란, 활력 있는 웹페이지를 만들기 위한 필수 기능
▶️ styled components vs tailwind css 어떤 것을 사용해야 할까?
▶️ Maven vs Gradle, 20년차 개발자는 실무에서 이렇게 활용합니다.
이랜서 추천, 기업 서비스 퀄리티 상승에 도움이 되는 AI 활용 콘텐츠
▶️ 알고리즘 추천 시스템을 위한 '협업 필터링'이란?
▶️ AI 챗봇, Chat GPT API를 활용하여 서비스 특화 AI 챗봇을 만드는 방법
25년, 약 80,000만 건 이상의 매칭 노하우를 활용한
IT 프리랜서와 IT 프로젝트의 최적의 매칭 서비스
대한민국 No.1 IT 인재 매칭 서비스 이랜서
이랜서는 25년간 축적된 데이터를 기반으로 기업의 프로젝트와 IT 프리랜서를 최적의 방식으로 매칭하는 IT 인재 매칭 플랫폼입니다.
약 80,000건 이상의 프로젝트에 프리랜서를 매칭하며 얻은 검증된 데이터를 활용하여 기업에게는 프로젝트에 적합한 IT 프리랜서를, 프리랜서에게는 성향과 맞는 IT 프로젝트를 매칭하는 프리미엄 서비스를 제공합니다.
[1.5억 개의 사용자 데이터] / [350만 개의 프리랜서 평가 데이터]
25년의 노하우와 데이터로 이루어지는 프리미엄 매칭 서비스
이랜서는 25년의 데이터를 활용해 프로젝트에 가장 적합한 IT 전문가를 24시간 안에 매칭합니다. 빠르게 변화하는 IT 트렌드에 맞춰 IT 프로젝트를 성공적으로 진행할 IT 전문가가 필요한 기업에게 약 1.5 억개의 사용자 데이터와 350만 개의 프리랜서 평가 데이터를 활용하여 전문성과 협업 능력이 검증된IT 전문가를 빠르게, 24시간 안에 매칭합니다.
검증된 IT 전문가 24시간 내에 매칭하는 프리미엄 서비스
- 이랜서의 매칭 서비스를 활용해 IT 전문가를 매칭받은 기업들의 리뷰 -
25년의 경험과 데이터를 활용하여
프로젝트에 가장 적합한 IT 프리랜서를 매칭해 드립니다.
이랜서는 25년간 쌓아온 경험과 방대한 데이터를 기반으로, 기업에게는 최적의 IT 프리랜서를, 프리랜서에게는 가장 이상적인 IT 프로젝트를 매칭합니다.
25년의 데이터를 활용해 경력 기술서와 이력서, 포트폴리오만으로는 확인할 수 없는 IT 프리랜서의 전문성부터 협업 능력까지 확인해 최적합 매칭 서비스를 제공합니다.
현재까지지 약 80,000 건 이상의 프로젝트에 IT 프리랜서를 성공적으로 매칭하며, 98%의 높은 프로젝트 재의뢰율을 달성하고 있습니다.
프로젝트를 성공적으로 진행할 IT 전문가를 찾으신다면 지금 이랜서를 선택하세요. 당신의 비즈니스 목표가 현실이 되는 놀라운 경험이 시작됩니다!