Blog

JSP 와 Servlet, 왜 같이 쓸까?

November 18, 2013

JSP 와 Servlet, 왜 같이 쓸까?

Framework 의 늪

웹 기술을 공부하지 않았던 나에게 항상 JSP, PHP, ASP 이런 것들은 탐험 가능하지만 재미없을 것 같은 그런 곳 ㅠ 그러다 올해 8월부터 갑자기 1년 반동안 하지 않던 코딩을 다시 시작하고 웹 기술을 공부하면서, Java를 다시 손에 쥐니 눈앞에 있는게 JSP

다들 아시겠지만 JSP 를 공부하다 보면 항상 처음에 마주치는 관문이 있습니다. Servlet 은 무엇인가, JSP랑 뭐가 다르지? 어? 인터넷 뒤져보면 같이 쓴다는데, Servlet 만으로도 페이지를 만들고, JSP 만으로도 되네. 응? 근데 Model 1은 뭐고 Model 2 는 무엇이지? MVC? Spring이 좋다던데 이건 또 뭐냐.

이렇게 제대로 공부하지도 못하고 끝 없이 이어져 나오는 프레임워크의 늪에 빠져 방황하다가 다시 정신차리고 보니 눈앞엔 JSP가 있었습니다…

Back to the basics

그래서 다시 기본부터 시작하기로 했습니다. JSP는 무엇이고, Servlet 은 무엇인가?

Servlet

servlet은 톰캣 위에서 동작하는 java 프로그램입니다. 더 정확히 말하자면 servlet 이 초기화 되는 과정을 보면 됩니다. 여기 에 의하면, 서블릿 초기화는 다음과 같은 과정을 거칩니다.

servlet

톰캣과 같은 WAS 가 java 파일을 컴파일해서 Class로 만들고 메모리에 올려 Servlet 객체를 만들게 되고 이 Servlet 객체doPost, doGet을 통해 요청에 응답합니다. 초기화 과정을 더 자세히 보면

servlet life cycle

init, Service, destory 이런 콜백이 각 시점에 불리는걸 볼 수 있지요. init은 서블릿이 메모리에 로드 될때 실행됩니다. destory는 마찬가지로 언로드되기 전에 수행되는 콜백이구요. service 메소드는 HTTP Method 타입에 따라 doGet 혹은 doPost를 호출합니다.

기억해야 할 점은, 초기화된 서블릿이 클라이언트의 요청이 있을 때 마다 Thread를 생성해서 병렬적으로 service를 수행한다는 것. 서블릿 객체는 여러개 생성되지 않습니다. 생명주기 까지 길게 왔는데, 요약하면

WAS 를 통해 컴파일 된 후 메모리에 적재되어 클라이언트의 HTTP Get, Post 등의요청을 처리하는 자바 프로그램임.

Servlet 샘플 코드를 보시면 알겠지만, HTML 을 넣기 굉장히 불편합니다.

public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException {
    
res.setContentType("text/html;charset=UTF-8");
PrintWriter out = res.getWriter();

out.println("<HTML>");
out.println("<BODY>");
out.println("Hello World!!");
out.println("</BODY>");
out.println("</HTML>");
out.close();
}
}

JSP

그래서 JSP가 나왔답니다. HTML을 코딩하기 너무 불편해서, HTML 내부에 Java 코드를 삽입하는 형식의 JSP!! 샘플 코드를 보시겠습니다. 여기서 펌

<%@page import="java.util.Calendar" %>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
 String str=String.format("%tF",Calendar.getInstance());
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
오늘은 <%=str%><br/>
한시간만 참으면 점심....
</body>
</html>

보시면 알겠지만, HTML 내부에 Java 코드가 있어 HTML 코드를 작성하기 쉽습니다. 단, 로직과 디자인이 한 파일내에 섞여있어 유지보수가 어렵답니다. 클래스 단위로 분해해서 OOP적으로 코드를 짜기도 어렵구. 하나가 편한대신, 다른 불편한 점들이 온 것이지요.

JSP 라는 새로운 개발 방법이 나왔지만, 사실 이 JSP 도 내부적으로는 TomcatServlet 으로 바꾸어서 돌립니다. 그림을 보시지요.

JSP to Servlet

결국엔 java 클래스 파일로 변환되어 메모리 상에 적재되지만, 개발자들이 HTML 부분을 편하게 코딩할 수 있게 만든건가봐요. 그리고 사람들이 이런 JSP를 이용해서 코딩을 하다보니 다음과 같이 하게 되더랍니다.

Model 1

Model1

여기 에 의하면, 사용자로부터 요청을 JSP가 받아(더 정확히는 JSP 에서 사용자가 요청을 합니다.) Java Bean(DTO, DAO)을 호출해 처리합니다. 이런 방식을 Model1 이라고 한답니다.

– 개발 속도가 빠르고
– 배우기 쉽지만
– 프레젠테이션 로직과 비즈니스 로직이 혼재
– JSP 코드가 복잡해져 유지 보수가 어려워집니다.

Model 2

Model2

단순히 JSP 만 사용하거나, Servlet만 사용하는 것이 아니라 두개의 장단점을 모두 취해 ViewJSP로, ControllerServlet 을 사용한 것이 바로 Model2 지요. 보여지는 부분은 HTML이 중심이 되는 JSP, 다른 자바 클래스에게 데이터를 넘겨주는 부분은 Java 코드가 중심이 되는 Servlet 이 담당하게 됩니다. 그리고 Model 영역 에서는 DTO, DAO를 통해 Mysql 과 같은 Data Storage 에 접근합니다.

익스프레션, 스크립틀릿 등 탐구할 영역이 많이 남았지만, 그것 이외에 공부하면서 얻을 수 있는 부분이 다른 Backend 와는 조금 다를 것 같다는 생각이 들어요.

Java 웹 서비스 진영의 디자인패턴이나 OOP적 노하우가 축적되면서 Spring 나왔고, 이것이 의미하는 바는 제가 ‘경험적’인 부분을 배울게 많다는 뜻이겠지요 ^^; 다른 Backend-language 보다 더요. 가장 잘나가니까.

Ref 🙂
http://atlas49.tistory.com/128
http://www.javajigi.net/pages/viewpage.action?pageId=73