IT/JSP

JSP와 Servlet의 등장 배경 및 개념

binary? 2024. 9. 16. 16:24

JSP와 Servlet의 등장 배경 및 개념

웹 애플리케이션 개발의 초기 단계에서는 정적인 HTML 페이지가 주로 사용되었습니다. 하지만 사용자와의 상호작용을 통해 동적인 콘텐츠를 생성하고, 서버에서의 복잡한 로직 처리가 필요해짐에 따라 새로운 기술이 등장하게 되었습니다. 이 배경에서 JSP(JavaServer Pages)와 Servlet이 개발되었으며, 웹 개발의 혁신을 이끌었습니다.

1. 초기 웹 개발의 한계

초기의 웹 페이지는 기본적으로 정적인 HTML로 구성되어 있었기 때문에, 데이터의 동적 처리가 필요할 때는 자바나 다른 서버 사이드 언어로 별도로 로직을 구현해야 했습니다. 이러한 방식은 유지보수와 확장성에 문제가 있었고, 개발자는 복잡한 서버 로직과 프론트엔드 디자인을 별도로 관리해야 했습니다.

  • 웹의 역사와 흐름에 따라 각 개념이 등장한 순서 : CGI → Servlet → JSP

2. CGI와 그 한계

정적 HTML의 한계를 극복하기 위해 CGI(Common Gateway Interface) 기술이 도입되었습니다. CGI는 서버 측에서 스크립트를 실행하여 동적 페이지를 생성할 수 있도록 해주었습니다. 그러나 CGI는 매 요청마다 새로운 프로세스를 생성하므로 성능이 저하되고, 코드의 재사용성과 유지보수에 어려움이 있었습니다.

3. 서블릿의 등장

1997년, 자바 서블릿(Servlet) 기술이 도입되면서 동적 웹 페이지 생성을 위한 새로운 방법이 제시되었습니다. 서블릿은 자바 언어로 작성된 서버 사이드 컴포넌트로, HTTP 요청을 처리하고 동적인 콘텐츠를 생성하는 데 사용됩니다. 서블릿은 효율적인 성능과 코드 재사용성을 제공하며, 자바의 객체 지향적 특성을 활용하여 복잡한 로직을 관리할 수 있게 해주었습니다.

 

서블릿 예제코드

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class KcueSimpleMappingExceptionResolver {

	@Override
	protected ModelAndView doResolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex) {
		String name = request.getParameter("username");
		
		out.println("<html>");
		out.println("	<body>");
		out.println("	<h2>안녕 내 이름은" + name + "</h2>");
		out.println("	</body>");
		out.println("</html>");
		return super.doResolveException(request, response, handler, ex);
	}
 

4. JSP의 탄생

서블릿의 장점에도 불구하고, HTML과 자바 코드가 혼합된 서블릿은 코드 작성이 번거로웠습니다. 이를 해결하기 위해 1999년에 JSP(JavaServer Pages) 기술이 소개되었습니다. JSP는 HTML 코드와 자바 코드를 분리하여 웹 페이지의 디자인과 로직을 독립적으로 관리할 수 있도록 해줍니다. JSP는 기본적으로 HTML 페이지 내에 자바 코드를 삽입할 수 있는 템플릿 엔진으로, 개발자는 UI와 비즈니스 로직을 명확히 분리할 수 있습니다.

JSP 예제코드

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<meta charset="UTF-8">
<div class="board_wrap">
                    <table class="board_view01 mb20" summary="Jsp예제">
                        <caption>Jsp예제</caption>
                        <colgroup>
                            <col width="138px" />
                        </colgroup>
                        <tbody>
                            <tr>
                                <th>분류</th>
                                <td class="tit_l01">알림</td>
                                <th>제목</th>
                                <td colspan="3"  class="tit_l01">Jsp예제</td>
                            </tr>
                        </tbody>
                    </table>
                </div>
 

 

5. MVC 패턴과 JSP/Servlet

MVC (Model-View-Controller) 패턴은 웹 애플리케이션의 구조를 세 가지 주요 구성 요소로 나누어, 각 부분의 책임을 명확히 하고 유지보수를 용이하게 합니다. JSP와 Servlet은 이 MVC 패턴과 밀접한 관계를 가지고 있습니다.

  • Model: 애플리케이션의 데이터와 비즈니스 로직을 관리합니다. 서블릿이나 EJB(Enterprise Java Beans) 등이 이 역할을 맡을 수 있으며, 데이터베이스와의 상호작용을 통해 비즈니스 로직을 처리합니다.
  • View: 사용자에게 보여지는 화면을 담당합니다. JSP는 이 부분을 맡으며, HTML과 JSP 태그를 사용하여 사용자 인터페이스를 구성합니다. JSP는 사용자에게 데이터를 표현하는 역할을 합니다.
  • Controller: 사용자 입력을 처리하고 적절한 비즈니스 로직을 실행한 후, 결과를 View로 전달합니다. 서블릿이 이 역할을 맡으며, HTTP 요청을 받아 비즈니스 로직을 처리한 후, 결과를 JSP에 전달하여 최종 사용자에게 보여줍니다.

MVC 패턴을 통해 JSP와 Servlet은 역할을 분리하여 각 부분이 독립적으로 개발되고 유지보수될 수 있도록 도와줍니다. 이는 코드의 재사용성을 높이고, 시스템의 복잡성을 줄여줍니다.

6. 자바 웹 애플리케이션 동작과정

위의 MVC 패턴 구조 조금 더 상세하게 나누면 아래처럼 표현할 수 있습니다.

  1. 클라이언트 요청: 클라이언트가 웹 브라우저를 통해 서버로 HTTP 요청을 보냅니다.
  2. 서블릿 컨테이너: 요청은 서블릿 컨테이너(예: Tomcat, Jetty)로 전달됩니다. 서블릿 컨테이너는 웹 애플리케이션을 관리하고 실행하는 서버 소프트웨어입니다.
  3. 필터 체인(Filter Chain): 요청이 DispatcherServlet에 도달하기 전에, 필터들이 요청을 가로채서 전처리를 수행할 수 있습니다. 필터는 주로 인증, 인코딩 설정, 로깅 등과 같은 전역적인 작업을 처리합니다.
  4. DispatcherServlet: 요청이 DispatcherServlet에 도달하면, 이 서블릿이 요청을 처리하기 시작합니다. 이때 요청의 처리를 위한 추가적인 작업들이 수행됩니다.
  5. 핸들러 맵핑(Handler Mapping): DispatcherServlet은 요청 URL에 따라 어떤 컨트롤러가 이 요청을 처리할지 결정하기 위해 Handler Mapping을 사용합니다.
  6. 인터셉터(Interceptor): 핸들러(Controller)로 요청이 전달되기 전에 인터셉터들이 요청을 가로채어 추가 작업을 수행할 수 있습니다. 인터셉터는 컨트롤러의 메서드 호출 전후에 특정 작업을 수행할 수 있습니다.
  7. 컨트롤러(Controller): 최종적으로 핸들러(컨트롤러)가 요청을 처리합니다. 컨트롤러는 비즈니스 로직을 실행하고, 서비스 계층과 상호작용하며, 데이터를 처리한 후, 뷰(View)에 전달할 모델 데이터를 준비합니다.
  8. 뷰 리졸버(View Resolver): 컨트롤러가 반환한 뷰 이름을 기반으로 DispatcherServlet은 어떤 뷰(HTML, JSP 등)를 렌더링할지 결정합니다.
  9. 뷰 렌더링(View Rendering): 결정된 뷰를 렌더링하여 HTML 콘텐츠를 생성합니다. 타임리프(Thymeleaf) 같은 템플릿 엔진이 여기서 사용될 수 있습니다.
  10. 응답 반환: 렌더링된 뷰가 클라이언트에게 반환됩니다.