Spring JSP와 Servlet

Kevin·2024년 2월 28일
0

Spring

목록 보기
12/27
post-thumbnail

서론

사실 Servlet과 JSP는 거의 같은 말이라고 이해해도 된다.

Servlet과 JSP 모두 동적 웹페이지를 만들거나 데이터 처리를 수행하기 위해 사용되는 웹 어플리케이션 프로그래밍 기술이다.

Servlet은 Tomcat이 이해할 수 있는 순수 JAVA 코드로만 이루어진 웹 서버용 클래스이며, 동적 웹 페이지를 만들 때 JAVA 코드 안에 HTML 태그가 삽입되는 구조이다.

JSP는 HTML 코드 속에 자바 코드가 들어가는 구조의 스크립트 언어이다.

이는 아래의 예시 코드들을 보면 더 쉽게 이해할 수 있을 것이다.

Servlet 이후 JSP가 등장하게 된 이유로는 Servlet을 이용하면 웹 프로그래밍이 가능했지만, JAVA에 대한 지식이 필요하고, 화면 인터페이스 구현에 너무 많은 리소스가 사용되는 등 비효율적인 측면이 존재했다.

Servlet을 사용하면 out 객체의 print() 메서드를 이용하여 HTML 문서를 작성해야 하는데, 이는 추가/수정을 어렵게 하고 가독성도 떨어졌다.

이런 한계를 보완하기 위해 등장한 것은 서블릿 기반의 서버 스크립트 기술 JSP였다.

서버 스크립트 기술 → ASP, PHP처럼 미리 약속된 규정에 따라 간단한 키워드를 조합하여 입력하면, 실행 시점에 각각의 키워드에 매핑이 되어있는 어떤 코드로 변환 후에 실행되는 형태이다.

MVC 모델에서 JSP는 View, Servlet은 Controller로 사용된다.

이에 대해서 더 자세한 내용은 추후에 별도로 다뤄보겠다.

해당 글에서는 차이점에 대해서만 집중적으로 다루겠다.


Servlet이란?

@WebServlet("/rollDice2")
public class TwoDiceServlet extends HttpServlet {
    int getRandomInt(int range) {
	return new Random().nextInt(range)+1;
    }

    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
        int idx1 = getRandomInt(6);
        int idx2 = getRandomInt(6);

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("</head>");
        out.println("<body>");
        out.println("<img src='resources/img/dice"+idx1+".jpg'>");
        out.println("<img src='resources/img/dice"+idx2+".jpg'>");
        out.println("</body>");
        out.println("</html>");
        out.close();	    
    }
}

Servlet의 특징

  • Servlet은 클래스에만 매핑 가능 → 클래스가 엄청 많아진다.
  • Servlet은 싱글톤이다.
  • ServletContainer가 메서드들을 생명주기에 맞게 호출한다.
    • init() → 서블릿 초기화 : 서블릿이 생성 또는 리로딩 때, 단 한번만 수행
    • service() → 호출될 때마다 반복적으로 수행
    • destory() - 뒷정리 작업 : 서블릿이 제거될 때, 단 한번만 수행

JSP(Java Server Pages)

  • 서블릿과 똑같다. JSP를 사용하면 자동으로 서블릿으로 변환된다.
    <%@ page contentType="text/html;charset=utf-8"%>
    <%@ page import="java.util.Random" %>
    <%-- <%! 클래스 영역 %> --%>
    <%!  
    	int getRandomInt(int range){
    		return new Random().nextInt(range)+1;
    	}
    %>
    <%-- <%  메서드 영역 - service()의 내부 %> --%>
    <%
    	int idx1 = getRandomInt(6);
    	int idx2 = getRandomInt(6);
    %>
    <html>
    <head>
    	<title>twoDice.jsp</title>
    </head>
    <body>
    	<img src='resources/img/dice<%=idx1%>.jpg'>
    	<img src='resources/img/dice<%=idx2%>.jpg'>
    </body>
    </html>
    • 위의 JSP가 아래의 Servlet으로 변환된다.

      @WebServlet("/rollDice2")
      public class TwoDiceServlet extends HttpServlet {
          int getRandomInt(int range) {
      	return new Random().nextInt(range)+1;
          }
      
          public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
              int idx1 = getRandomInt(6);
              int idx2 = getRandomInt(6);
      
              response.setContentType("text/html");
              response.setCharacterEncoding("utf-8");
              PrintWriter out = response.getWriter();
              out.println("<html>");
              out.println("<head>");
              out.println("</head>");
              out.println("<body>");
              out.println("<img src='resources/img/dice"+idx1+".jpg'>");
              out.println("<img src='resources/img/dice"+idx2+".jpg'>");
              out.println("</body>");
              out.println("</html>");
              out.close();	    
          }
      }

이 때 JSP는 아래와 같은 과정을 겪으며, 서블릿으로 변환된다.

  1. 클라이언트에서 서비스가 요청되면, JSP의 실행을 요구한다.
  2. JSP는 WAS 서버(Tomcat)의 서블릿 컨테이너에서 서블릿 원시코드로 변환된다.
  3. 서블릿 원시 코드는 바로 컴파일된 후 실행되어 결과를 HTML 형태로 클라이언트에게 돌려준다.

JSP의 특징

  • HTML안에 Java Code를 넣는다고 생각하면 된다.
  • JSP의 <%! %> 영역은 Servlet의 클래스 변수나 메서드로 들어간다.
    • <% %> 영역은 Servlet의 Service 메서드 영역으로 들어간다.
  • JSP의 HTML 태그는 Servlet에서 out.println으로 변환된다.
profile
Hello, World! \n

0개의 댓글