| 💡 학습 목표 서블릿(Servlet)에 대한 개념을 알아보자. JSP (JavaServer Pages)에 대한 개념을 살펴 보자. 서블릿과 JSP를 따로 만드는 이유는 뭘까? |
서블릿이란?
서블릿(Servlet)은 자바를 기반으로 한 서버 측 프로그래밍 기술로, 클라이언트의 요청을 처리하고 동적인 웹 콘텐츠를 생성하여 응답하는 역할을 합니다. 서블릿은 javax.servlet(자카르타 : 10 버전 부터) 패키지에 포함되어 있으며, 주로 HTTP 요청을 처리하는 데 사용됩니다.
서블릿의 주요 특징
- 클래스 기반: 서블릿은 자바 클래스로 작성됩니다.
- 비즈니스 로직 처리: 주로 비즈니스 로직을 처리하는 데 사용됩니다.
- 요청 및 응답 처리: HTTP 요청을 받아 처리하고, 응답을 생성합니다.
- 라이프사이클: init(), service(), destroy() 메서드를 통해 서블릿의 생명 주기를 관리합니다.
| 💡 회원가입 비지니스 로직 처리란? 입력 데이터 수집 → 입력 데이터 검증 → 이메일 중복 확인 → 비밀번호 해싱 → 사용자 정보 저장 → 회원가입 성공 응답 비즈니스 로직은 주로 데이터를 처리하고, 애플리케이션의 핵심 기능을 수행하는 작업등을 말하며 반면에, 화면을 어떻게 표현하는 부분은 프레젠테이션 로직이라고 하며, 비즈니스 로직과는 구별됩니다. |
JSP란?
JSP(JavaServer Pages)는 HTML 코드에 자바 코드를 삽입할 수 있는 템플릿 엔진으로, 주로 프레젠테이션 계층에서 동적인 웹 페이지를 생성하는 데 사용됩니다. JSP 파일은 .jsp 확장자를 가지며, 서버에서 서블릿으로 변환되어 실행됩니다.
JSP의 주요 특징
- HTML 기반: JSP는 HTML 코드 내에 자바 코드를 삽입할 수 있습니다.
- 프레젠테이션 계층: 주로 동적인 웹 페이지를 생성하는 데 사용됩니다.
- 태그 라이브러리: JSTL(JavaServer Pages Standard Tag Library) 등을 사용하여 코드를 간결하게 작성할 수 있습니다.
- 변환 및 컴파일: JSP는 서블릿으로 변환되고, 서블릿으로 컴파일된 후 실행됩니다.
템플릿 엔진이란?
템플릿 엔진은 정적 템플릿 파일(주로 HTM)과 동적 데이터를 결합하여 최종 HTML을 생성하는 소프트웨어입니다. 이를 통해 동적인 웹 페이지를 쉽게 생성할 수 있습니다. 템플릿 엔진은 서버 사이드와 클라이언트 사이드 모두에서 사용될 수 있습니다.
- 맞춤형 편지 작성 -
정적 템플릿 -"안녕하세요, [이름]님. 오늘 [날짜]에 우리는 [이벤트]에 대해 이야기할 것입니다."
동적 데이터 - "철수", 날짜 = "2024년 5월 28일", 이벤트 = "코딩 수업"
템플릿 엔진
템플릿 엔진은 템플릿과 데이터를 결합하여 최종 편지를 작성합니다.
결과
"안녕하세요, 철수님. 오늘 2024년 5월 28일에 우리는 코딩 수업에 대해 이야기할 것입니다."
서블릿과 JSP의 차이점
항목 서블릿(Servlet) JSP(JavaServer Pages)
| 항목 | 서블릿(Servlet) | JSP(Java Server Pages) |
| 기본 구조 | 자바 클래스 | HTML 기반 템플릿 |
| 주요 용도 | 비즈니스 로직 처리 | 프레젠테이션 계층 (동적 웹 페이지 생성) |
| 코드 작성 방식 | 자바 코드로 작성 | HTML 코드 내에 자바 코드를 삽입 |
| 변환 과정 | 자바 클래스 그대로 실행 | 서블릿으로 변환 후 실행 |
| 사용 용이성 | 복잡한 로직 처리에 유리 | HTML 작성 및 동적 콘텐츠 생성에 유리 |
| 파일 확장자 | 자바 클래스 파일 ( .java ) | JSP 파일 ( .jsp ) |
서플릿과 JSP의 협력
서블릿과 JSP는 서로 협력하여 MVC(Model-View-Controller) 패턴을 구현할 수 있습니다. 서블릿은 컴트롤러 역할으 ㄹ수행하고, JSP는 뷰 역할을 수행합니다.
create database demo5;
use demo5;
create table users(
id bigint auto_increment primary key,
name varchar(100) not null comment '사용자 이름',
email varchar(255) not null comment '사용자 이메일'
);
desc users;
Insert.jsp - 프레젠테이션 계층으로 활용
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>데이터 삽입</title>
<link rel="stylesheet" type="text/css" href="css/styles.css">
</head>
<body>
<h2>데이터 삽입</h2>
<%-- http://localhost:8080/insert.jsp --%>
<form action="insert" method="post">
<label for="name">이름 : </label>
<input type="text" id="name" name="name">
<label for="email">이메일 : </label>
<input type="email" id="email" name="email" value="a@nate.com">
<br>
<button type="submit">저장</button>
</form>
</body>
</html>
: InsertServlet.java 파일로 이동
InsertServlet 서블릿 파일
package com.tenco.servlet;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
@WebServlet("/insert")
public class InsertServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public InsertServlet() {
super();
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("InsertServlet 초기화");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
// http://localhost:8080/InsertServlet
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 한글명 깨짐 해결
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String email = request.getParameter("email");
// 유효성 검사 생략
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String dbUrl = "jdbc:mysql://localhost:3306/demo5?serverTimezone=Asia/Seoul";
Connection conn = DriverManager.getConnection(dbUrl, "root", "asd123");
String sql = " INSERT INTO users(name, email) values (?, ?) ";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, email);
pstmt.executeUpdate();
pstmt.close();
conn.close();
response.sendRedirect("result.jsp?message=success");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
response.sendRedirect("result.jsp?message=error");
}
}
}
result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>결과 확인 페이지</h1>
<%
String result = request.getParameter("message");
%>
<p> 결과 : <%=result %> </p>
</body>
</html>
데이터 조회 기능
select.jsp 파일을 프레젠테이션 계층으로 활용
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사용자 정보 조회</title>
<link rel="stylesheet" type="text/css" href="css/styles.css">
</head>
<body>
<h2>데이터 조회</h2>
<form action="select" method="get">
<button type="submit">데이터 조회</button>
</form>
</body>
</html>
: SelectServlet.java 파일로 이동
package com.tenco.servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/select")
public class SelectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public SelectServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String dbUrl = "jdbc:mysql://localhost:3306/demo5?serverTimezone=Asia/Seoul";
Connection conn = DriverManager.getConnection(dbUrl, "root", "asd123");
String sql = " SELECT * FROM users ";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
List<Map<String, String>> userList = new ArrayList<>();
while(rs.next()) {
Map<String, String> userMap = new HashMap<>();
userMap.put("id", rs.getString("id"));
userMap.put("name", rs.getString("name"));
userMap.put("email", rs.getString("email"));
userList.add(userMap);
}
request.setAttribute("userList", userList);
// 서블릿에서 다른 JSP 파일로 데이터를 전달할 수 있다.
// WAS 내부에서 새로운 request 생성을 시킬 수 있다(단 외부에서(클라이언트) 모름)
request.getRequestDispatcher("resultSet.jsp").forward(request, response);
pstmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
ResultSet.jsp 파일 활용
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
out.println("ResultSet.jsp 파일 입니다.");
%>
<h1>사용자 목록</h1>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>이름</th>
<th>이메일</th>
</tr>
</thead>
<tbody>
<%
List<Map<String, String>> userList
= (List<Map<String, String>>)request.getAttribute("userList");
if(userList != null) {
for(Map<String, String> userMap : userList) { %>
<tr>
<td><%=userMap.get("id") %></td>
<td><%=userMap.get("name") %></td>
<td><%=userMap.get("email") %></td>
</tr>
<% }
} else { %>
<p>등록된 사용자가 없네요 </p>
<%
}
%>
</tbody>
</table>
</body>
</html>'JSP > CH04 - 서블릿과 JSP의 연동' 카테고리의 다른 글
| 05. JSTL 을 활용한 게시판 기능 만들기 (0) | 2024.07.15 |
|---|---|
| 04. 커스텀 태그(JSTL) 라이브러리 사용, (EL 표현식) (5) | 2024.07.15 |
| 03. JSP와 MVC 패턴 Todo 프로젝트 (4) | 2024.07.10 |
| 02. 간단한 게시판 만들어 보기 (0) | 2024.07.10 |