Backend
home

2024. 8. 6

서블릿 (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:05AM 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 패턴의 핵심으로 모든 사용자 요청의 중심에 위치하는 영역.
사용자의 요청은 특정 뷰에 바로 전달되지 않고, 컨트롤러를 통해 전달된다.
컨트롤러는 사용자의 요청에 따라 모델을 통해 데이터베이스와 연동하여 데이터를 처리하고 뷰에 결과를 전달한다.

기타