서블릿이란?
서블릿(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의 차이점
항목 | 서블릿(Servlet) | JSP(JavaServer 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>
: 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' 카테고리의 다른 글
JSP와 MVC 패턴 Todo 프로젝트 (0) | 2024.07.09 |
---|---|
Dynamic Web Project 를 활용한 기본적인 CRUD JSP 게시판 제작 (0) | 2024.07.09 |
쿠키와 세션 관리 (0) | 2024.07.04 |
폼 처리와 요청 방식 (0) | 2024.07.04 |
JSP 내장 객체 (0) | 2024.07.04 |