delpho

JSP (등장 배경, 특징, 작동 방식, 한계, MVC 패턴) 본문

카테고리 없음

JSP (등장 배경, 특징, 작동 방식, 한계, MVC 패턴)

delpho 2024. 4. 5. 13:04

[ 0. 들어가기 전 ]


Servlet 등장 이후 JSP 라는 기술이 추가로 등장하게 되었는데, 관련해서 내용을 정리해보았습니다.

 

 

[ 1. JSP의 등장 배경 ]


서블릿의 등장으로, CGI 프로그래밍의 한계를 개선했지만, 또다른 단점이 존재하였습니다. Servlet을 통해 HTTP 요청을 처리하고 동적 컨텐츠를 생성 후 응답으로 반환해주어야하는데, 프레젠테이션 로직(ex. HTML 코드)과 비즈니스 로직이 혼합되어 코드관리가 어려웠습니다.

 

  • 서블릿의 복잡성: 초기 웹 애플리케이션 개발은 주로 서블릿을 통해 이루어졌습니다. 서블릿은 Java 코드 안에서 HTML을 출력하는 방식으로 동작했는데, 이는 코드가 복잡해지고 유지 보수가 어려워지는 문제가 있었습니다.
  • 페이지 디자인의 어려움: 디자이너와 개발자 간의 작업 분할이 어려웠습니다. HTML 코드를 Java 코드와 분리하기 위한 명확한 방법이 없었기 때문에 페이지 디자인과 로직 구현이 혼합되어 있었습니다.

 

이를 해결하기 위해 다음 기술인 JSP가 등장하게 됩니다.

 

 

서블릿에 HTML 코드가 포함되어있는 형태

@WebServlet(name = "memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {

    private final MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        final String username = request.getParameter("username");
        final int age = Integer.parseInt(request.getParameter("age"));
        final Member member = new Member(username, age);
        memberRepository.save(member);

				// 아래 코드 참고
        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");
        final PrintWriter printWriter = response.getWriter();
        printWriter.write("<html>\n" +
            "<head>\n" +
            " <meta charset=\"UTF-8\">\n" +
            "</head>\n" +
            "<body>\n" +
            " <li>id=" + member.getId() + "</li>\n" +
            " <li>username=" + member.getUsername() + "</li>\n" +
            " <li>age=" + member.getAge() + "</li>\n" +
            "</body>\n" +
            "</html>");
    }
}

 

 

 

 

[ 2. JSP ]


웹 페이지를 생성하고 웹 애플리케이션을 구축하는 데 사용되는 Java 기반 기술

JSP는 본질적으로 서블릿의 확장

 

 

JSP는 HTML 내에 자바 코드를 삽입할 수 있게 함으로써, 디자인과 개발을 분리할 수 있는 방법(프레젠테이션 로직과 비즈니스 로직 분리)을 제공했습니다.

 

 

JSP 특징

  • Java 코드 내장: JSP는 HTML 코드 내에 Java 코드를 삽입할 수 있도록 해줍니다. 이를 통해 동적인 페이지 콘텐츠를 쉽게 생성할 수 있습니다.
  • 서블릿과의 변환: JSP 파일은 서버에서 서블릿으로 변환되어 실행됩니다. 즉, JSP는 서블릿의 특별한 형태라고 볼 수 있으며, 개발자는 복잡한 서블릿 코드를 직접 작성하지 않아도 됩니다.
  • 태그 라이브러리 (Tag Library): JSP 태그 라이브러리(JSTL)와 같은 태그 라이브러리를 사용하여 복잡한 Java 코드 없이도 로직을 구현할 수 있습니다. 이를 통해 코드의 가독성이 향상되고, 디자인과 로직의 분리가 용이해집니다.
  • MVC 아키텍처 지원: JSP는 Model-View-Controller(MVC) 디자인 패턴을 지원합니다. 이를 통해 애플리케이션의 구조를 더 명확하게 분할하고 관리할 수 있습니다.

 

JSP와 관련된 기술들

  • JSTL (JavaServer Pages Standard Tag Library): 공통적인 작업을 위한 태그 세트를 제공합니다. 이를 통해 개발자는 복잡한 Java 코드 없이도 웹 페이지에 로직을 적용할 수 있습니다.
  • EL (Expression Language): JSP 페이지 내에서 Java 객체와 상호작용하기 위한 간단하고 효율적인 방법을 제공합니다. 이는 코드의 가독성을 향상시키고, 개발 속도를 높입니다.

 

JSP 코드 예

<%@ page import="hello.servlet.basic.domain.member.Member" %>
<%@ page import="hello.servlet.basic.domain.member.MemberRepository" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    final MemberRepository memberRepository = MemberRepository.getInstance();
    final String username = request.getParameter("username");
    final int age = Integer.parseInt(request.getParameter("age"));
    final Member member = new Member(username, age);
    memberRepository.save(member);
%>
<html>
<head>
    <title>Title</title>
</head>
<body>
성공
<ul>
    <li>id=<%=member.getId()%>
    </li>
    <li>username=<%=member.getUsername()%>
    </li>
    <li>age=<%=member.getAge()%>
    </li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>

 

 

 

 

[ 3. JSP의 작동 방식 ]


  1. 클라이언트로부터 요청이 들어옵니다. (JSP 응답을 원하는 요청)
  2. 웹 서버는 해당 JSP 파일을 찾아 서블릿 코드로 변환합니다. (서블릿 컨테이너에 의해 변환) 이 과정은 처음 요청될 때만 수행되며, 이후 요청은 변환된 서블릿 코드를 재사용합니다.
  3. 변환된 서블릿 코드는 Java 바이트코드로 컴파일됩니다.
  4. 컴파일된 서블릿이 실행되어 HTML을 생성하고, 이를 클라이언트에게 전송합니다.

 

출처 : https://mangkyu.tistory.com/14

 

 

 

[ 4. MVC 패턴 ]


프레젠테이션 로직과 비즈니스 로직의 분리를 가능하게 한 JSP를 활용해서 웹 애플리케이션의 구조를 명확하게 정의하고, 개발과 유지 보수를 용이하게 하기위해 MVC 패턴을 활용하여 백엔드를 구현하게 되었습니다. 이 내용은 다음 단계에서 정리해보겠습니다. 그런데, MVC 패턴은 그럼 JSP 등장 이후에 생긴 개념인지 궁금해졌습니다.

 

 

 

[ 5. MVC 패턴의 등장배경 ]


웹 기술 발전 과정을 찾아보다보면, MVC 패턴에 대한 내용은 JSP 기술부터 등장했기에 JSP 기술이 생기면서 MVC 패턴이 등장했다고 생각했습니다. 그런데 검색해보니까 그건 아니었네요.

 

MVC 패턴은 JSP 기술이 등장하기 훨씬 이전부터 존재하는 개념입니다. 이 패턴은 원래 웹 애플리케이션 개발과는 별개의 맥락에서, 데스크톱 GUI (Graphical User Interface) 애플리케이션의 설계를 위해 고안되었습니다. MVC 패턴은 웹 기술이 등장하기 전, 1970년대 후반에 이미 소프트웨어 설계 패턴으로 등장했습니다. MVC 패턴은 1970년대 후반에 Trygve Reenskaug가 소프트웨어 엔지니어링에서 사용하기 위해 개발한 것으로, Smalltalk 프로그래밍 언어의 개발 과정에서 처음으로 도입되었습니다. MVC 패턴은 처음에는 Smalltalk 프로그래밍 언어의 개발 과정에서 GUI 애플리케이션 설계를 위해 사용되었습니다. Xerox PARC에서 방문 연구원으로 근무하면서, Smalltalk 언어를 사용해 MVC 패턴을 제안하고 구현했습니다. (Trygve Reenskaug의 기록 : https://folk.universitetetioslo.no/trygver/themes/mvc/mvc-index.html)

 

웹 애플리케이션에서 MVC 패턴의 사용은 1996년 NeXT의 WebObjects 도입 이후 증가했습니다 . WebObject는 원래 Objective-C (Smalltalk에서 많이 차용한)로 작성되었으며 MVC 패턴을 시행하는 데 도움이 되었습니다. 나중에 WebObjects가 Java 로 포팅되면서 MVC 패턴은 Java 개발자들 사이에서 인기를 얻었습니다. Spring (2002년 10월 출시) 과 같은 최신 Java용 프레임워크는 Java와 MVC 패턴간의 강력한 유대를 계속 이어갔습니다. (MVC 패턴 위키피디아 中)

 

 

 

JSP의 한계

JSP와 같은 웹 기술의 발달 등으로 인해 점점 1) 엔터프라이즈 애플리케이션의 복잡성이 증가하였고, 이러한 요구사항을 충족시키기 위해 더욱 강력하고 확장 가능한 솔루션이 필요했습니다. 또한, 개발자가 2) 저마다의 방식으로 문제를 해결하다보니 재사용성 및 유지보수 측면에서 문제가 발생하였고, 이로 인해 자바의 표준화의 필요성이 생겼습니다.

 

이 다음 다음 단계에서는 이 JSP의 한계를 해결하기 위해 등장한 Spring Framework에 대해 정리하겠습니다.