Servlet과 JSP

Sundae·2023년 10월 30일
0
post-thumbnail

Servlet과 JSP의 역할


JSP와 Servlet(서블렛)은 모두 웹 어플리케이션을 만들기 위한 도구이다. JSP와 Servlet은 역할의 차이만 있고 기능적 차이는 거의 없다.

Servlet

  • 확장자명이 .java
  • HttpServlet 클래스를 상속받은 클래스
  • Servlet이 수정된 경우 Java 코드를 컴파일한 후 요청을 처리하기 때문에 전체 코드를 업데이트하고 다시 컴파일한 후 재배포하는 작업이 필요하다.

클라이언트가 서버를 통해 html 문서를 요청하면 servlet은 아래와 같이 IO 입출력으로 html 코드를 전부 print 해주어야한다.

		response.setContentType("text/html;")
		PrintWriter writer = response.getWriter();
		writer.println("<html>");
		writer.println("<head>");
		writer.println("</head>");
		writer.println("<body>");
        writer.println("Hello");
        writer.println("</body>");
		writer.println("</html>");
		writer.close();

이러한 방식은 레이아웃이 조금만 복잡해져도 코드가 매우 길어지고 가독성 또한 좋지 않아진다. 이러한 단점을 보완하기 위해 JSP가 나왔다.

JSP

  • 확장자명이 .jsp
  • HTML 코드 안에 Java 코드를 넣어 사용할 수 있다.
  • JSP가 수정된 경우 재배포할 필요가 없이 WAS가 알아서 처리한다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%-- 자바 코드 --%>
<% 
	for(int i = 0; i < 10; i++) {
		out.println(i);
	}
%>

</body>
</html>

위와 같이 JSP는 기본적으로 HTML 형식을 하며, 필요한 부분에 자바 코드를 삽입해 페이지를 구성하기 위한 로직을 작성할 수 있다. 클라이언트로부터 요청을 받으면 JSP는 Servlet으로 변환하여 반환된다. 이러한 이유로 당연하게, 처음 실행 시 변환 과정이 Servlet에 비해 한 번 더 있으므로 서블릿보다 느리다. 그러나 첫 실행 시 class 파일을 생성해두고 실행하면 컴파일 과정이 없기 때문에 서블릿과 거의 동일하게 실행된다.

JSP만으로 프로젝트를 구성하면?

class파일이 존재한다면 Servlet과 거의 동일하게 실행되며 자바 언어를 이용해 손쉽게 페이지 구성과 로직을 짤 수 있다. 하지만, JSP만 사용한다면, 화면 로직(View)과 비즈니스 로직(Controller)이 한 공간에서 작성되어 협업이 매우 어려워진다. 또한, JSP 코드가 복잡해져 유지 보수가 어려워진다.

위와 같은 특징으로 일반적으로 Servlet과 JSP를 같이 사용하는 MVC Model을 많이 이용한다. 위의 이미지를 보면 화면(View)은 JSP, 비즈니스 로직(Controller)은 Servlet이 담당한다.

Servlet의 생명주기


서블릿 클래스에서 처리되는 요청과 응답은 서블릿 컨테이너에서 다음과 같은 생명주기를 거치게 된다.

  1. Web Server에서 WAS로 request를 보낸다.
  2. 요청받은 서블릿이 처음 실행되는 것이라면 서블릿 객체를 메모리에 올리고 init() 메소드를 실행한다.
  3. 이후, service() 메소드를 실행한다.
  4. 웹 어플리케이션이 종료되어, 서블릿 종료 요청이 있을 경우 destroy() 메소드를 실행한다.
  • init(): 서블릿을 처음 메모리에 올릴 때 실행된다. 다시말해, 서블릿 인스턴스가 생성된 이후 호출된다. 처음에 한 번만 실행된다.
  • service() : request의 HTTP method를 확인한 뒤 적절한 메서드, 예로 doGet() 또는 doPost() 메소드를 호출한다.
  • destroy(): 서블릿 종료 요청이 있을 때 destroy() 메소드가 실행된다.


profile
성장 기록 / 글에 오류가 있다면 댓글 부탁드립니다.

0개의 댓글