⭐️ Servlet이란 ?
서블릿이란 Java 웹 애플리케이션에서 클라이언트 요청을 처리하는 서버 측 프로그램이다.
쉽게 말해서 웹 브라우저(클라이언트)에서 요청을 보내면 서블릿이 요청을 처리하고
응답을 반환하는 역할을 한다.
[ 서블릿 동작 흐름 ]
✨ 동작순서
1. 클라이언트가 Http 요청을 보냄
2. 웹서버(Tomcat)가 request 객체와 response 객체를 생성
3. 서블릿 컨테이너가 서블릿 객체를 생성(최초 요청시 - 싱글톤으로 관리되기 때문)
4. service() 메서드를 호출하여 서블릿 클래스의 @WebServlet("요청경로") 어노테이션
경로와 맵핑되는 메서드 , doGet() 또는 doPost() ... 실행
5. 서블릿이 클라이언트 요청을 처리하고 동적페이지를 만들어서 response객체를 통해 응답 처리함
6. 웹서버서가 응답을 클라이언트에게 전송 -> 클라이언트 화면에 응답 화면이 뜬다.
이때 5번에서 처리하는 방식이 2가지가 있다.
⭐️ 동적 페이지 만드는 2가지 방법 ( SSR - Server Side Rendering )
우선 request와 response 객체가 무엇을 하는지 알아보자.
request객체는 요청시 전달된 내용들이 담겨있는 객체이다.
사용자가 입력한값, 요청방식, 요청URL등 들어있다.
response객체는 요청 처리후 응답에 사용되는 객체이다.
어떤타입으로 응답할지, 어떤 값을 응답할지 등을 넣어주면 된다.
요청 처리를 위해서 요청시 전달된 값을 추출 할 수 있다.
request의 parameter영역안에 존재하는
request.getparameter("키"); 를 통해
form태그에서 넘어온 name 속성(key)의 value(value)를 가져올 수 있다.
[ 예시 코드 ]
String name = req.getParameter("name");// 홍길동 | 값이 없을경우 ""
String gender = req.getParameter("gender"); // M | F | null
int age = Integer.parseInt(req.getParameter("age")); // "23" -> 23
String address = req.getParameter("address"); // "경기" | "서울" 등등
double height = Double.parseDouble(req.getParameter("height")); // "180.0" -> 180.0
// 체크박스와 같이 여러개의 값을 추출하고자 할 때 배열로 받으면 된다
String[] foods = req.getParameterValues("food"); // ["한식", "중식"] | null
이후에는 추후에 이 정보들을 service > dao > db 순으로 전달하여 반환 값을 통하여
(현재는 db를 사용하지 않으므로 설정한 값으로 진행)
응답페이지를 만들어서 전송한다.
즉, 여기 Java코드내에 사용자가 보게될 응답 html구문을 작성하면 된다.
이때 response 객체를 통해서 직접 클라이언트에게 응답화면을 구현하냐,
jsp에게 위임하여 view단을 구현하냐 두가지로 나뉜다.
🔥 서블릿에서 직접 구현
[ 예시 코드 ]
/ 1) 응답으로 출력할 내용은 html이고 문자셋은 utf-8이다 -> 선언
resp.setContentType("text/html;charset=UTF-8");
// 2) 응답받는 사용자와의 스트림 연결 ( 출력 )
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<body>");
out.println("<h2>개인정보 응답화면</h2></br>");
out.printf("<span>%s</span>님은</br>",name);
out.printf("<span>%s</span>살이며</br>",age);
out.printf("<span>%s</span>에 삽니다</br>",address);
out.println("성별은");
if (gender == null) {
out.println(" 미입력 상태입니다.");
} else if (gender.equals("M")) {
out.println("남자입니다");
}else {
out.println("여자입니다");
}
out.println("</body>");
out.println("</head>");
out.println("</html>");
req객체르 통해서 문자셋을 정하고 출력 스트림을 연결하여 직접 out.println()으로
클라이언트에게 html을 넘겨주고 있다.
이렇게 하면 html 태그를 입력하는것도 불편하지만, 기능이 추가되면 더욱더 불편할 것이다.
이를 보완한게 JSP(Java Server Page)이다.
🔥 JSP를 통해 구현
응답 페이지(view)를 만드는 과정을 JSP에게 위임할것이다.
JSP 또한 서블릿이며 response객체를 통해 응답처리를 할 수 있다.
우선 응답화면에서 필요로하는 데이터들을 차곡차곡 담아서 전달해줘야한다.
request의 attribute영역에있는
request.setAttribute("키", "값") 을 통해서 데이터를 담아서
RequestDispatcher 객체를 통해 위임할 JSP의 경로를 설정해준 뒤
foward()함수를 통해 서블릿 -> 서블릿 으로 응답을 위임 할 수 있다.
[ 예시 코드 ]
req.setAttribute("name", name);
req.setAttribute("gender", gender);
req.setAttribute("age", age);
req.setAttribute("address", address);
req.setAttribute("height", height);
req.setAttribute("foods", foods);
// 현재 요청을 responsePage.jsp로 전달하기 위한 객체
RequestDispatcher view = req.getRequestDispatcher("/views/responsePage.jsp");
// 위에서 설정한 view로 응답을 위임함
view.forward(req, resp);
[ 응답을 위임 받은 JSP ]
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<% //스크립틀릿(scriptlet) -> html문서내에서 자바코드를 쓸 수 있는 영역
String name = (String)request.getAttribute("name"); // 넘어올때 Object 타입으로 오기떄문에 String으로 변경해야함. 그리고 키를 넣어야 값이 나옴
int age = (int)request.getAttribute("age"); %>
<h1>개인정보 응답화면</h1>
<span><%= name %>님은 <%=age%>살이며 ~에 삽니다.</span>
</body>
</html>
JSP에서 값을 꺼낼땐 getAttribute("키")로 꺼낼 수 있고 ,
이를 표현문(<%= %>) 또는 ${ } (EL)을 통해서 출력할 수 있다.
서블릿이 어떻게 동작하는지를 알아야 나중에 Sping FrameWork를 진행 할때도
이해가 잘 될것이다.
여기서 중요한건 JSP의 서블릿을에게 위임해서 view와 기능을 분리 시켜주는 것이다 ‼️
'Server > JSP - TomCat - Servlet' 카테고리의 다른 글
JSP 포워딩(Forwarding)과 리다이렉트(Redirect)의 차이 (1) | 2025.02.27 |
---|---|
session.removeAttribute()와 session.invalidate() 차이 (2) | 2025.02.26 |
JSTL에 대하여 (2) | 2025.02.24 |
JSP Scope에 대하여 (0) | 2025.02.23 |
IntelliJ 와 Tomcat 연결 (2) | 2025.02.20 |