Servlet의 정의와 목적
서블릿이란 Dynamic Web Page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술입니다
클라이 언트의 요청에 대해 동적으로 작동하는 웹 애플리케이션
동적 작동 : 실시간으로 매번 다른 데이터를 만들어낸다 → 브라우저에게 전송 <HTTP>
<서블릿 jsp 공통점 동적 웹페이지 만들기 >
- 서블릿 → java 안에 html 코드를 넣는 것
- jsp →html 안에 java코드를 넣는 것
에러
- 500대 에러는 서버의 에러 <서버가 실행은 되어있는데 내부적인 문제>
- 400대 에러는 원하는 걸 찾을 수 없을 때 나는 에러
서블릿 로딩하는 시점은 지정할 수 있다
⭐서블릿은 싱글 인스턴스 -멀티스레드가 지나가는 구조 <서블릿은 하나!> -서버의 리소스를 절약하기 위해
게으른 로딩 lazy loading
서블릿의 특징은 처음부터 로딩하는 것이 아닌 필요한 순간까지 작업을 미룬다 (게으른 로딩 lazy loading)
서블릿은 기본적으로 호출을 하기 전까지 인스턴스를 만들지 않는다
load on start up
web.xml의 load on start up 하면 로딩과 동시에 인스턴스가 생긴다
서버가 로딩되기 전에 먼저 준비해줄 수 있다 <생성자를 떠올리자>
서블릿과 JSP
서블릿은 url을 처리하기 위해 만든 것
jsp는 화면을 처리하기 위해 만든 것
서블릿 간의 데이터 교환은 안 하는 것이 좋다
해야 할 상황이 온다면 어떻게 처리해야 할까?
첫 번째 설계단계부터 잘못된 것이다
Scriptlet
jsp 안에 문자열들은 out.write(” “)로 변환된다 그래서
jps에 HTML 코드가 아닌 자바 코드를 쓰고 싶을 때 <% %>를 사용
이걸 Scriptlet이라 부른다
팁 : Scriptlet를 쓰는 기업은 고민해보자... 오래된 기술이고 지금은 안 쓰이는 기술이다... 발전이 없는 회사...
ex) hello
<body>
<h1>Hello World</h1>
<%
String str = "Hong Gil Dong";
%>
</body>
👇
hello_jsp 상황
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta charset=\"UTF-8\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("<h1>Hello World</h1>\r\n");
String str = "Hong Gil Dong";
out.write(">\r\n");
out.write("</body>\r\n");
out.write("</html>");
⭐서블릿과
JSP구조

⭐<TomCat 이 대신 new를 해주기 때문에 인스턴스를 만들 때 new를 안 해줘도 된다>
인스턴스를 하나만 쓰는 걸 코드로 확인해 보기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" buffer ="8kb"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Hello World</h1>
<%
String str = "Hong Gil Dong";
out.write("<h1>"+this+"</h1>");
out.write("<h1>"+Thread.currentThread().getName()+"</h1>");
%>
</body>
</html>
👇서버 출력

새로고침 해보면 this 값은 같고 Thread 값만 일정하게 변한다
이 말은 즉 인스턴스를 하나만 만들어서 사용한다 는 뜻이다
<서블릿과 jsp>
서블릿 - 처리 연동할 때 편하다 - ⭐POST=처리
jsp - 결과를 보여줄 때 - ⭐get=조회 , 확인
<jsp는 규모가 커지면 사용하기가 힘들어진다 그래서 규모가 커질수록 모델 1 이 아닌 모델 2로 사용한다 >
웹의 구조
- 입력과 결과가 분리되어있는 경우 - <회원가입> Ajax
- 입력과 결과가 한 페이지에 나오는 경우 - <게시판>
모델 1

jsp 기반의 모델 1
모델 1의 단점
- jsp는 get과 POST의 구분이 없다
- 유지보수가 어렵다 = 비용 문제를 말하는 것
모델 2 방식을 사용하는 이유
웹은 정보와 정보가 그물망처럼 엮어서 사용하는 것인데 문제는 정보의 포인트가 변하면 그 정보를 수정하는데 비용이 발생한다 기업에서 새로운 상품을 만들면 고객들 하게 보내야 하는 정보들을 전부 수정해야 하는 상황이 생긴다
그래서 url과 실제 화면을 분리해야 한다는 생각을 하게 된다 그런 방법을 모델 2라고 한다
모델 2
주소와 화면을 분리시키자
주소 : 서블릿 <로직>
화면 : jsp <출력 전용> <표현>
모델 2 구조

고객은 브라우저를 통해 정보를 보기 때문에 고객이 보는 링크는 항상 같지만 정보는 달라진다 그러다 보니 주소 값의 중요성이 높아졌다
⭐주소 값 <URL>이 유니크해진다 <중요성 up>
URL 자체가 식별 값이 되어버림
모델 2 방식을 보면서 말씀해주신 소프트웨어의 철칙!
소프트웨어 철칙!!
👍바뀔 거 같으면 분리한다
모델 2 가 바로 여기에 해당된다
모델 2 방법으로 코딩해보기
<이 코드는 모델 2의 구조를 알아보기 위한 예제입니다>
input.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>
<form action="bmi" method="post">
<input type="number" name="height">
<input type="number" name="weight">
<input type="submit">
</form>
</body>
</html>
action.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>${result }</h1>
</body>
</html>
브라우저에서 jsp로 바로 못 들어오게 하기 위해 web-inf로 넣어준다

BMIController
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class BMIController
*/
@WebServlet("/bmi")
public class BMIController extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public BMIController() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/bmi/input.jsp")
.forward(request,response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.print("POST..........");
request.setAttribute("result", 12.4);
request.getRequestDispatcher("/WEB-INF/bmi/input.jsp")
.forward(request,response);
}
}
✨이 코드의 구조

브라우저가 볼 때는 bmi를 보지만 실제로는 나오는 건 input.jsp이다
성능으로 보면 이 방법은 안 좋다 속도가 나올 수가 없다 처리가 한 곳이 아닌 두 군데서 처리하기 때문에 하지만 사용하는 이유는 비용이 덜 들어간다
'개발자 성장 일지' 카테고리의 다른 글
2022.03.31 죽어라 DB야 (0) | 2022.03.31 |
---|---|
2022.03.29 수업일지 (0) | 2022.03.29 |
2022.03.27 주말 공부 <크롤링 , Lombok 오류> (0) | 2022.03.27 |
2022.03.24 ⭐DB 그리고 객체지향의 문제점 (0) | 2022.03.25 |
2022.03.24 수업일지 (0) | 2022.03.24 |