학습 목표
서블릿(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는 서블릿으로 변환되고, 서블릿으로 컴파일된 후 실행됩니다.
템플릿 엔진이란?
템플릿 엔진은 정적 템플릿 파일(주로 HTML)과 동적 데이터를 결합하여 최종 HTML을 생성하는 소프트웨어입니다. 이를 통해 동적인 웹 페이지를 쉽게 생성할 수 있습니다. 템플릿 엔진은 서버 사이드와 클라이언트 사이드 모두에서 사용될 수 있습니다.
- 맞춤형 편지 작성 -
정적 템플릿 - "안녕하세요, [이름]님. 오늘 [날짜]에 우리는 [이벤트]에 대해 이야기할 것입니다.”
동적 데이터 - "철수", 날짜 = "2024년 5월 28일", 이벤트 = "코딩 수업”
템플릿 엔진
템플릿 엔진은 템플릿과 데이터를 결합하여 최종 편지를 작성합니다.
결과
"안녕하세요, 철수님. 오늘 2024년 5월 28일에 우리는 코딩 수업에 대해 이야기할 것입니다.”
서블릿과 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 서블릿 파일
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>
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>
'Java > JSP' 카테고리의 다른 글
커스텀 태그(JSTL) 라이브러리 사용, (EL 표현식) (1) | 2024.07.15 |
---|---|
JSP와 MVC 패턴 Todo 프로젝트 (5) | 2024.07.15 |
쿠키와 세션 관리 (0) | 2024.07.15 |
폼 처리와 요청 방식 (0) | 2024.07.15 |
JSP 내장 객체란 뭘까? (0) | 2024.07.15 |