본문 바로가기

Spring

JSP(Java Server Page)

이번 포스트를 보기 앞서 아래에 있는 이전 포스트를 보고 오시기 바랍니다.

 

https://jaystorage.tistory.com/10

 

서블릿(Servlet)

초창기 웹(Web) 초창기 웹은 웹 서버에 미리 만든 웹 페이지(정적 페이지)를 가공 없이 단순히 보여주는 것이 목적이었다. 그러나 많은 웹 사용자들은 미리 저장된 정보를 보는 것뿐만 아니라, 유

jaystorage.tistory.com

 


 

JSP란

 

JSP는 HTML내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하는 기술이다.

 


 

JSP 등장 배경

 

정적인 페이지만 제공하던 초창기 웹이 발전하면서 CGI와 Servlet이 등장했지만 Servlet에도 단점이 존재했다.

 

 

Servlet의 한계

  • 서블릿을 이용하면 웹 프로그래밍이 가능하지만, 자바에 대한 지식이 필요하고, 화면 인터페이스 구현에 너무 많은 코드를 필요로 하는 등 비효율적인 측면이 있다.
  • Java 클래스이기 때문에 테스트하기 위해서는 항상 빌드를 다시하여 확인해야 한다.

 

이러한 단점을 보완하고자 서블릿 기반의 서버 스크립트 기술인 JSP가 등장하게 되었다.

 

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

 


 

Servlet과 JSP 코드 비교

 

Servlet 코드

@WebServlet(name = "memberListServlet", urlPatterns = "/servlet/members")
public class MemberListServlet extends HttpServlet {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");

        List<Member> members = memberRepository.findAll();

        PrintWriter w = response.getWriter();
        w.write("<html>");
        w.write("<head>");
        w.write("    <meta charset=\"UTF-8\">");
        w.write("    <title>Title</title>");
        w.write("</head>");
        w.write("<body>");
        w.write("<a href=\"/index.html\">메인</a>");
        w.write("<table>");
        w.write("    <thead>");
        w.write("    <th>id</th>");
        w.write("    <th>username</th>");
        w.write("    <th>age</th>");
        w.write("    </thead>");
        w.write("    <tbody>");


        for (Member member : members) {
            w.write("    <tr>");
            w.write("        <td>" + member.getId() + "</td>");
            w.write("        <td>" + member.getUsername() + "</td>");
            w.write("        <td>" + member.getAge() + "</td>");
            w.write("    </tr>");
        }
        w.write("    </tbody>");
        w.write("</table>");
        w.write("</body>");
        w.write("</html>");
    }
}
  • 서블릿은 자바 코드 안에 HTML 코드가 들어있는 형태이다.
  • 이로 인해 HTML 생성이 매우 불편한 것을 볼 수 있다.

 

JSP 코드

<%@ page import="java.util.List" %>
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    MemberRepository memberRepository = MemberRepository.getInstance();
    List<Member> members = memberRepository.findAll();
%>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/index.html">메인</a>
<table>
    <thead>
    <th>id</th>
    <th>username</th>
    <th>age</th>
    </thead>
    <tbody>
    <%
        for (Member member : members) {
            out.write("    <tr>");
            out.write("         <td>" + member.getId() + "</td>");
            out.write("         <td>" + member.getUsername() + "</td>");
            out.write("         <td>" + member.getAge() + "</td>");
            out.write("    </tr>");
        }
    %>
    </tbody>
</table>
</body>
</html>
  • JSP는 HTML 코드 안에 자바 코드가 있는 형태이다.
  • Servlet에 비해 HTML 생성이 훨씬 간편한 것을 볼 수 있다.

 


 

MVC 모델에서의 Servlet과 JSP

 

MVC 모델에 서블릿과 JSP가 결합되면서 위와 같은 불편함을 해소할 수 있는 방안이 마련되었다. 서블릿 혹은 JSP만으로 웹 로직 전체를 작성하는 것이 아닌 컨트롤러 로직에 서블릿을, 뷰 로직에 JSP를 사용하는 방식이 등장한 것이다.

 

JSP 만으로 웹 로직을 구성하는 경우

 

 

Controller 에 Servlet을 적용하고 View에 JSP를 적용한 형태

 

보여지는 부분은 HTML이 중심이 되는 JSP, 다른 자바클래스에게 데이터를 넘겨주는 부분은 Java코드가 중심이 되는 Servlet이 담당하여 이를 통해 유지보수가 훨씬 용이해졌다.

 


 

JSP 작동방식

 

 

  1. 웹 서버가 사용자로부터 서블릿에 대한 요청을 받으면 서블릿 컨테이너(ex. Tomcat)에 그 요청을 넘긴다.

  2. 요청을 받은 컨테이너는 HTTP Request와 HTTP Response 객체를 만들어, 이들을 통해 서블릿 doPost()나 doGet()메소드를 호출한다.

  3. JSP를 사용하여 비지니스 로직과 프레젠테이션 로직을 분리하는데, 여기서 서블릿은 데이터의 입력, 수정 등에 대한 제어를 JSP에게 넘겨서 프레젠테이션 로직을 수행한 후 컨테이너에게 Response를 전달한다.

  4. 이렇게 만들어진 결과물은 사용자가 해당 페이지를 요청하면 컴파일이 되어 자바파일을 통해 .class 파일이 만들어지고, 두 로직이 결합되어 클래스화된다.

 


출처 : 
https://mangkyu.tistory.com/14
https://www.ibm.com/docs/ko/developer-for-zos/9.5.1?topic=files-javaserver-pages-jsp-technology
https://velog.io/@effirin/Servlet%EA%B3%BC-JSP%EC%97%90-%EB%8C%80%ED%95%B4
https://velog.io/@peanut_/%EC%8A%A4%ED%94%84%EB%A7%81-MVC-1%ED%8E%B8-%EC%9E%90%EB%B0%94-%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EC%97%AD%EC%82%AC
https://ko.wikipedia.org/wiki/%EC%9E%90%EC%B9%B4%EB%A5%B4%ED%83%80_%EC%84%9C%EB%B2%84_%ED%8E%98%EC%9D%B4%EC%A7%80
https://velog.io/@junhok82/Servlet%EA%B3%BC-JSP%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-MVC-%ED%8C%A8%ED%84%B4

'Spring' 카테고리의 다른 글

SL4J와 Logback을 이용한 Logging  (0) 2024.03.03
Filter, Interceptor, AOP  (0) 2023.11.29
Spring Framework의 특징과 작동 과정  (1) 2023.11.18
서블릿(Servlet)  (0) 2023.11.06
POJO (Plain Old Java Object)  (1) 2023.10.03