최근 몇 년 동안 마이크로서비스 아키텍처와
클라우드 네이티브 기술의 발전으로 인해
Servlet을 대체할 수 있는 다양한 대안이 등장했다.
예를 들어, Spring Boot와 같은 경량화된 웹 프레임워크,
웹 서비스로의 전환과 함께 스프링 프레임워크의
RESTful API 지원 등이 있다.
그럼에도 Servlet은 여전히 많은 웹 애플리케이션에서
사용되고 있으며, 특히 Java 기반의 웹 애플리케이션에서는
여전히 중요한 역할을 하고 있다.
Servlet은 동적인 웹 컨텐츠를 생성하고 관리하는 데 사용되고
Java 웹 프레임워크인 Spring에서도 활용되고 있다.
오늘은 서블릿과 JSP에 대해 자세히 살펴보고
둘의 차이점에 대해 집중해서 다뤄보고자 한다.
서블릿(Servlet)
Servlet은 Server + Applet의 합성어로
서버에서 실행되는 Applet*을 의미한다.
Applet?
Applet은 웹 페이지에서 실행되는 작은 프로그램
혹은 애플리케이션을 말한다. 주로 Java 언어로 작성되고
사용자가 웹 브라우저를 통해 웹 페이지를 방문할 때
다운로드되어 실행된다.
Java Applet은 웹 브라우저에서 실행되는 것으로,
사용자의 로컬 시스템에 직접적인 액세스는 제한되지만
그래픽, 애니메이션, 데이터 입력 등의 기능을 제공할 수 있다.
예를 들어, 실시간 그래픽을 생성하거나, 웹 페이지에서
데이터를 입력하고 서버로 전송하는 등의 작업을 수행할 수 있다.
하지만 요즘에는 보안과 호환성 문제로 인해
Java Applet의 사용이 줄어들고 있다.
대신에 HTML5, JavaScript, CSS 등의 웹 기술을 사용하여
비슷한 기능을 구현하는 것이 일반화되고 있다.
서블릿은 자바를 이용하여 웹에서 실행되는
프로그램을 작성하는 기술이라고 할 수 있다.
서블릿은 자바클래스 형태의 웹 애플리케이션을 의미하는데,
브라우저를 통해 자바 클래스가 실행되도록 하기 위해서는
javax.servlet.http 패키지에서 제공하는 HttpServlet 클래스를
상속받아 구현해야 한다. 이때 HttpServlet 클래스를 상속 받아 만든
서브 클래스를 서블릿 클래스라고 한다.
서블릿은 자바 가상머신인 JVM*에서 동작해야 하므로
클래스 파일이 생성되어야 한다. 그래서 클래스의 형태로 작성한다.
JDK*에는 웹 애플리케이션을 제작할 수 있는 클래스가 제공되는데,
그 클래스가 바로 HttpServlet이다. HttpServlet은 웹 서비스가
가능한 웹 애플리케이션을 제작할 수 있도록 자바를 확장해 놓은
클래스로 톰캣을 설치하면 제공된다.
JVM (Java Virtual Machine) ?
JVM은 자바 가상 머신이라는 의미이며,
자바 프로그램을 실행하기 위한 가상의 컴퓨터라 할 수 있다.
자바 프로그램은 자바 소스 코드(.java 파일)로 작성되고,
이 소스 코드는 JVM이 이해할 수 있는 바이트 코드(.class 파일)로 컴파일된다.
JVM은 이 바이트 코드를 실행하여 기기 및 운영 체제에 독립적으로
자바 프로그램을 실행한다. 즉, 한 번 작성한 자바 프로그램은
어떤 운영 체제에서든 실행할 수 있다.
JDK (Java Development Kit) ?
JDK는 자바 개발 키트를 의미하며,
자바 프로그램을 개발하기 위한 도구 모음이다.
JVM은 이러한 프로그램을 실행하는 가상 머신이다.
JDK에는 JVM이 포함되어 있고, 이 외에도
자바 컴파일러(javac), 디버거(jdb),
자바 런타임 환경(JRE), 다양한 개발 도구 및
라이브러리가 포함되어 있다. 따라서 JDK를 설치하면
개발과 실행 모두를 위한 환경이 갖춰진다.
JDK를 사용하여 자바 프로그램을 개발하고
컴파일할 수 있으며, 개발된 프로그램은
JRE 또는 JVM에서 실행된다.
JRE(Java Runtime Environment) ?
JRE는 자바 프로그램 을 실행하는 데 필요한
모든 런타임 환경을 제공한다.
모든 런타임 환경에는 자바 애플리케이션을
실행하는 데 필요한 모든 라이브러리, 클래스,
자바 가상 머신(JVM)과 같은 핵심 구성 요소가 포함된다.
따라서 자바 프로그램을 실행하려면 시스템에 JRE가
설치되어 있어야 한다.
JDK(Java Development Kit)를 설치하면
JRE도 함께 포함되어 있으므로
개발 및 실행 환경이 모두 제공되는 셈이다.
JSP(Java Server Page)
JSP는 서버 페이지를 작성하기 위한 언어를 말한다.
HTML과 JSP 태그(스크립트릿)로 구성되어 화면을
작성하는 데 유리한 웹 프로그래밍 기술이다.
여기서 서버 페이지는 웹 서버에서 실행되는 페이지를 말하며
요청에 필요한 페이지를 위한 로직이나 데이터베이스와의
연동을 위해 필요한 것들을 포함한다.
이러한 서버 페이지에서 실행되는 로직을 구현하기 위해서는
프로그래밍 언어가 필요한데, JSP에서는 자바를 사용하고 있다.
즉 JSP에서는 자바 언어로 로직(프로그램)을 구현한다.
JSP와 Servlet으로 "회원 조회"기능 구현하기
"member.jsp"를 만들어서 아래와 같이 코드를 작성했다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 조회</title>
</head>
<body>
<h2>회원 조회</h2>
<form action="MemberServlet" method="post">
이름: <input type="text" name="name">
<input type="submit" value="조회">
</form>
<%
String name = request.getParameter("name");
if (name != null && !name.isEmpty()) {
// 서블릿을 호출하여 회원 정보 조회
request.getRequestDispatcher("/MemberServlet").forward(request, response);
}
%>
</body>
</html>
그런 다음, 회원 조회를 처리하는 서블릿을 만들어서
JDBC 드라이버를 사용하여 데이터베이스와 연결하였고,
데이터베이스(MySQL)와 상호작용하도록 했다.
아래는 "MemberServlet.java"라는 서블릿의 코드이다.
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
public class MemberServlet extends HttpServlet {
private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
private static final String DB_URL = "jdbc:mysql://localhost:3306/mydatabase";
private static final String USER = "username";
private static final String PASS = "password";
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
Connection conn = null;
Statement stmt = null;
try {
Class.forName(JDBC_DRIVER);
conn = DriverManager.getConnection(DB_URL, USER, PASS);
stmt = conn.createStatement();
String sql = "SELECT * FROM members WHERE name='" + name + "'";
ResultSet rs = stmt.executeQuery(sql);
out.println("<h2>회원 정보</h2>");
out.println("<table border='1'>");
out.println("<tr><th>ID</th><th>Name</th><th>Email</th></tr>");
while (rs.next()) {
int id = rs.getInt("id");
String memberName = rs.getString("name");
String email = rs.getString("email");
out.println("<tr><td>" + id + "</td><td>" + memberName + "</td><td>" + email + "</td></tr>");
}
out.println("</table>");
//자원 반납
rs.close();
stmt.close();
conn.close();
} catch (SQLException se) {
se.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (stmt != null) stmt.close();
} catch (SQLException se2) {}
try {
if (conn != null) conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
}
}
Servlet과 JSP의 차이
Servlet과 JSP는 모두 자바 웹 애플리케이션을
개발하기 위한 기술이지만, 그 작동 방식과
사용 목적에 있어서 몇 가지 중요한 차이점이 있다.
Servlet | JSP | |
작성 언어 | - Java 코드로 작성 - Servlet은 Java 클래스이며, 서버 측에서 실행됨(컨트롤러 역할) |
- HTML과 Java 코드가 혼합된 형태로 작성 - JSP는 HTML 페이지에 동적인 내용을 삽입할 수 있는 스크립팅 언어로 Java 코드를 사용함 |
컴파일 방식 | Java 코드를 컴파일한 후 클래스 파일(.class)을 생성함 |
JSP 파일은 서블릿 클래스로 변환됨. 웹 애플리케이션이 처음 요청될 때 JSP 파일이 자바 서블릿으로 컴파일되고, 이후 요청에서는 컴파일된 서블릿이 실행됨 |
UI 구성 | 자바 코드로 HTML 형식의 응답을 직접 작성해야 함. 따라서 UI와 비즈니스 로직이 분리되지 않을 수 있음 |
HTML 형식의 문서 안에 자바 코드를 삽입하여 작성함. 이로써 UI와 비즈니스 로직을 분리하여 유지보수와 개발이 용이해짐 |
사용목적 | 주로 비즈니스 로직을 처리하고 데이터를 처리하는 데 사용됨. HTML 형식의 응답을 생성하고, 요청을 처리하여 데이터베이스와 상호작용하는 등의 역할을 함 |
주로 사용자 인터페이스를 작성하고 동적인 내용을 표시하는 데 사용됨. 서버 측 코드와 HTML을 혼합하여 보다 동적이고 사용자 친화적인 웹 페이지를 만들 수 있음 |
일반적으로는 비즈니스 로직은 서블릿에서 처리하고,
사용자 인터페이스는 JSP에서 작성하여 MVC 아키텍처를
따르는 방식으로 개발된다.
이를 통해 코드의 가독성을 향상시키고
유지보수를 용이하게 할 수 있다.
그 이유는 크게 3가지로 들 수 있다.
1. 모듈을 분리한다.
서블릿은 비즈니스 로직을 처리하고 데이터를 조작하는
역할을 담당하고, JSP는 사용자 인터페이스를 표시하는
역할을 담당한다. 이를 통해 코드의 기능적인 역할이
분명해지므로 코드의 가독성이 향상된다.
2. 역할을 분리한다.
MVC 아키텍처에서는 각각의 역할이 분명히 정의되어 있다.
모델(Model)은 데이터를 처리하고 비즈니스 로직을 수행하며,
뷰(View)는 사용자에게 정보를 표시하며,
컨트롤러(Controller)는 사용자 입력을 처리하고 모델과 뷰를 연결한다.
이러한 역할에 따라 사용자 인터페이스를 변경할 때는
JSP 파일만 수정하면 되고, 비즈니스 로직이 변경되어도
서블릿만 수정하면 되므로 유지보수가 용이해진다.
3. 재사용성이 증가한다.
MVC 아키텍처에서는 각각의 구성 요소가 재사용 가능하도록
설계된다. 예를 들어, 동일한 서블릿을 여러 JSP와 연결하여
다양한 사용자 인터페이스를 생성할 수 있다.
'Framework > Spring, Spring Boot' 카테고리의 다른 글
[Spring boot] 컨트롤러와 정적 리소스 (1) | 2024.02.27 |
---|---|
[Spring] MVC 아키텍처 (1) | 2024.02.25 |