서블릿 (Servlet)
•
사용자 요청을 처리한 후에는 적절한 화면으로 넘어갈 수 있어야 한다.
•
만약 별도의 데이터를 포함하지 않는다면, 해당 페이지로 바로 리다이렉션할 수 있다.
세션에 데이터를 저장한 경우라면, 세션이 유효한 동안 리다이렉션을 통해서도 데이터 참조가 가능하다.
response.sendRedirect("main.jsp");
Java
복사
•
서블릿 실습
package com.page_web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
프로젝트 생성 시
contextRoot : 프로젝트명
contentDirectory : src/main/webapp
http://localhost:8080/redirect.html
프로젝트 내 src/main/webapp 폴더에 있는 redirect.html를 열어서 보여준다.
서블릿 생성 시
URL Mapping: @WebServlet("/서블릿매핑")
http://localhost:8080/프로젝트명/서블릿매핑
*/
@WebServlet("/RedirectServlet")
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// sendRedirect를 통한 화면 전환
// - 별도의 데이터를 추가로 전달할 수 없다.
// - 주소가 변경된다.
// - 세션을 통한 데이터 전달은 가능하다.
resp.sendRedirect("redirect.html");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
Java
복사
•
JSP 연동 실습
◦
DispatchServlet
package com.page_web;
import com.page_web.model.Book;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/DispatchServlet")
public class DispatchServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 데이터를 포함한 화면 전환
// 데이터 포함 : request.setAttribute(String key, Object value)
Book book = new Book(1, "자바 완전 정복", 30000);
req.setAttribute("name", book);
// 원하는 페이지에 request와 response를 전달하는 객체 생성
// RequestDispatcher dispatcher = request.setAttribute(String path);
RequestDispatcher dispatcher = req.getRequestDispatcher("dispatch.jsp");
// request와 response를 전달(페이지 포워딩)
dispatcher.forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
Java
복사
◦
Book
package com.page_web.model;
public class Book {
private int id;
private String title;
private int price;
public Book(int id, String title, int price) {
this.id = id;
this.title = title;
this.price = price;
}
@Override
public String toString() {
return "Book [" +
"id=" + id +
", title='" + title + '\'' +
", price=" + price +
']';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
Java
복사
◦
dispatch.jsp
<%--
Created by IntelliJ IDEA.
User: haminsung
Date: 8/6/24
Time: 9:36 AM
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>데이터를 포함</title>
</head>
<body>
<h1>dispatcher.forward(req, res)</h1>
<p>
${name.getTitle()}
</p>
</body>
</html>
HTML
복사
•
쿠키는 클라이언트에 저장되는 작은 정보를 의미한다.
•
서버의 요청에 의해 브라우저가 저장하게 되며, 서버가 요청할 때 제공하는 형식이다.
•
쿠키의 특징은 아래와 같다.
◦
파일로 클라이언트 컴퓨터에 저장되는 방식으로 보안상 문제가 될 수 있다.
◦
광고 혹은 기타 목적으로 사용자 이용 행태 추적에 이용될 수 있으며, 이러한 경우에는 사용자 동의가 필요하다.
◦
연속되는 페이지 이동에 대한 정보보다는 재방문 등의 확인 용도로 많이 사용된다.
◦
'name=value(키:값)' 형식이며 유효 기간, 요청 경로, 도메인 지정 등의 부가 속성을 포함한다.
◦
주로 자바스크립트를 통해 처리하지만 HttpOnly 설정으로 서버에서만 사용할 수 있도록 설정할 수 있다.
•
세션은 클라이언트가 웹 애플리케이션 서버에 접속할 때 서버 쪽에 생성되는 공간이다.
•
내부적으로는 세션 아이디를 통해 참조된다.
•
즉, 브라우저는 서버에 접속할 때 발급받은 세션ID를 기억하고 서버는 해당 세션ID로 할당된 영역에 접근하는 형식이다.
•
세션 유효 시간이나 브라우저 종료 전까지 유지되므로 서로 다른 페이지에서도 정보 공유가 가능하다.
•
로그인 유지, 장바구니, 컨트롤러 구현 등에서 다양하게 사용된다.
•
사용자마다 생성되는 공간으로, 동시에 많은 사용자가 접속하는 경우 충분한 메모리를 비롯한 세션 관리 대책이 필요하다.
실습
•
jstl
package com.example.jstl;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/jsp")
public class JSPServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("loginUser", "Jonathan");
RequestDispatcher dispatcher = req.getRequestDispatcher("jstl.jsp");
dispatcher.forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
Java
복사
<%--
Created by IntelliJ IDEA.
User: haminsung
Date: 8/6/24
Time: 11:05 AM
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>JSTL 실습</title>
</head>
<body>
<!-- JSTL을 사용하기 위해서는 taglib 지시어(JSTL이 어디에 있는지, 접두어가 무엇인지)를 추가해야 한다. -->
<c:set var="title" value="<h1>JSP</h1>" />
${title}
<c:set var="greeting" value="안녕하세요" />
${greeting}
<c:set var="numArr" value="${[1, 2, 3, 4, 5]}"/>
${numArr[2]}
<c:if test="${loginUser != null}">
<p>${greeting}, ${loginUser}님!</p>
</c:if>
<c:if test="${loginUser == null}">
<p>로그인부터 해주세요!</p>
</c:if>
</body>
</html>
Java
복사
•
로그인, 로그아웃
<%--
Created by IntelliJ IDEA.
User: haminsung
Date: 8/6/24
Time: 11:05 AM
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"
pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>JSTL 실습</title>
</head>
<body>
<!-- JSTL을 사용하기 위해서는 taglib 지시어(JSTL이 어디에 있는지, 접두어가 무엇인지)를 추가해야 한다. -->
<c:set var="title" value="<h1>JSP</h1>" />
${title}
<c:set var="greeting" value="안녕하세요" />
${greeting}
<c:set var="numArr" value="${[1, 66, 3, 4, 5]}"/>
${numArr[2]}
<%-- <c:set var="loginUser" value='${sessionScope.loginUser}'/>--%>
<c:if test='${loginUser != null}'>
<p>${greeting}, ${loginUser.getName()}님!</p>
<form action="/jstl/logout" method="post">
<button>로그아웃</button>
</form>
</c:if>
<c:if test='${loginUser == null}'>
<p>로그인부터 해주세요!</p>
<form action="/jstl/login" method="post">
<input type="text" name="name"/>
<button>로그인</button>
</form>
</c:if>
</body>
</html>
HTML
복사
package com.example.jstl;
import com.example.jstl.jsp.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8"); // 인코딩 처리
String parameter = req.getParameter("name");
HttpSession session = req.getSession();
session.setAttribute("loginUser", new User(parameter));
// req.setAttribute("loginUser", new User(parameter));
resp.sendRedirect("/jstl/jsp");
}
}
Java
복사
package com.example.jstl.jsp;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.invalidate();
resp.sendRedirect("/jstl/jsp");
}
}
Java
복사
빌드 도구
•
Maven: 빌드 설정을 pom.xml 파일에 작성한다.
•
Gradle: Groovy라고 하는 JVM 기반 언어를 통해 프로그램 구조로 설정한다.
(Maven에 비해 10~100배 성능 향상)
MVC 패턴
•
Model - View - Controller의 약어로 주로 GUI 기반 애플리케이션 개발에 사용되는 디자인 패턴이다.
•
백엔드 기반의 웹 애플리케이션 개발의 기본 모델이 되엇다.
•
모바일 앱 및 프론트앤드 기반의 웹 개발이 늘어나면서
MVP(Model-View-Presenter), MVVM(Model-View-ViewModel)과 같은 패턴도 사용되고 있다.
•
패턴들의 공통적인 목적은 화면과 데이터 처리를 분리하여 코드 간의 종속성을 줄이는 것에 있다.
•
즉, 구성 요소 간 역할을 명확하게 하여 코드를 쉽게 분리하고 협업을 용이하게 만드는 것이다.
•
모델(Model): 데이터를 처리하는 영역
•
DAO
◦
데이터베이스와의 상호작용 담당
◦
CRUD 작업 수행
◦
데이터베이스의 데이터에 접근하고 조작하는 역할
•
DO / 엔티티 클래스
◦
데이터베이스의 테이블과 매핑되는 클래스
◦
각 필드는 데이터베이스의 컬럼에 대응되며, 데이터 구조를 표현
•
뷰(View): 화면 구성을 담당하는 영역.
•
뷰는 기본적으로 모델, 컨트롤러와의 종속성이 없도록 구현해야 한다.
•
뷰에서는 데이터를 직접 가져오는 방식보다, 주어진 데이터를 출력하는 용도로만 사용하는 것이 바람직하다.
•
뷰 영역의 구현을 위해 뷰 템플릿 엔진이 사용되며, 그 중 대표적인 것이 JSP이다.
◦
SpringBoot → Thymeleaf
•
컨트롤러: MVC 패턴의 핵심으로 모든 사용자 요청의 중심에 위치하는 영역.
•
사용자의 요청은 특정 뷰에 바로 전달되지 않고, 컨트롤러를 통해 전달된다.
•
컨트롤러는 사용자의 요청에 따라 모델을 통해 데이터베이스와 연동하여 데이터를 처리하고
뷰에 결과를 전달한다.