[ETC] 서블릿과 JSP

JD_S·2022년 12월 2일
0

etc

목록 보기
4/4

서블릿(Servlet)이란?

서블릿은 Server + Applet의 합성어로 서버에서 실행되는 Applet이란 의미로 자바를 이용하여 웹에서 실행되는 프로그램을 작성하는 기술을 말한다. 서블릿은 자바 클래스 형태의 웹 애플리케이션을 말하는데, 브라우저를 통해 자바 클래스가 실행되도록 하기 위해서 javax.servlet.http패키지에서 제공하는 HttpServlet클래스를 상속받아 구현해야 한다. HttpServlet클래스를 상속 받아 만든 서브 클래스를 서블릿 클래스라고 한다.

서블릿 또한 자바 프로그램의 다른 클래스들처럼 자바 가상머신인 JVM에서 동작해야 하므로 클래스 파일이 생성되어야 한다. 그래서 클래스 형태로 작성한다. JDK에는 웹 애플리케이션을 제작할 수 있는 클래스가 제공되지 않고 톰캣을 설치하고 나면 웹 애플리케이션을 제작할 수 있는 클래스가 제공되는데, 그 클래스가 바로 HttpServlet이다. HttpServlet은 웹 서비스가 가능한 웹 애플리케이션을 제작할 수 있도록 자바를 확장해 놓은 클래스로 톰캣을 설치하면 제공된다. HttpServlet을 상속받은 클래스를 서블릿이라고 한다.

서블릿 개요

서블릿을 요청할 때 직접 클래스를 요청하는 것이 아니고 @WebServlet()안에 기술된 URL로 요청을 한다. 서블릿 클래스에는 doGet() 혹은 doPost()가 있는데, 요청 방식에 따라 호출되는 메서드가 달라진다. get 방식으로 요청하면 doGet()이 호출되고 post 방식으로 요청하면 doPost() 메서드가 호출된다. 다음은 doGet(), doPost()의 형태이다.

public void doGet(HttpServletRequest request, HttpServeltResponse response) throws IOException, ServletException {
  ...
}

public void doPost(HttpServletRequest request, HttpServeltResponse response) throws IOException, ServeltException {
  ...
}

request는 클라이언트 요청을 처리해주고, response는 요청 처리 결과를 클라이언트에게 응답하기 위해 사용한다.

서블릿 클래스 정의하기

새롭게 서블릿 클래스를 정의하기 위해서 javax.servlet.http 패키지에서 제공하는 HttpServlet 클래스를 상속받아 구현해야 하고 브라우저를 통해 외부에서 실행되기 때문에 접근 제한자는 반드시 public이어야 한다.

public class HelloServelt extends HttpServlet {

}

HelloServlet은 서블릿 클래스 이름이다. HttpServlet을 상속받아야 한다.

클라이언트의 요청이 있을 때마다 doGet메서드가 자동 호출된다. HttpServletRequest 객체에 의해서 요청이 처리되고 HttpServletResponse 객체에 의해서 처리 결과가 전달된다.

서블릿의 실행 방식 : 일반적인 자바 클래스를 실행하기 위해서 main 메서드가 있는 클래스에서 객체를 생성하여 실행해야 한다. 하지만 서블릿은 이런 방식으로 실행되지 않고 웹 서버가 실행을 해주는 독특한 방식을 갖고 있다. 서블릿은 Event-Driven Programming으로 사용자의 요청이 들어오면 동작을 시작한다. 요청이 들어오면 톰캣 서버가 서블릿 객체를 생성한 후에 init() 메서드를 호출한 후 요청 방식에 따라 doGet() 혹은 doPost() 메서드가 호출된다.

서블릿의 동작 원리

서블릿의 동작 원리를 알기 위해서는 우선 서블릿 컨테이너에 대한 이해를 해야 한다. 톰캣 사이트의 Documentation에서는 아파치 톰캣을 서블릿/JSP 컨테이너(이하 서블릿 컨테이너)라고 규정하고 있다. 즉, 톰캣이 웹 서버이면서 서블릿 컨테이너라는 얘기이다. 톰캣이 구동되면 자바가상머신이 구동되어 자바 문법을 따르는 서블릿을 처리 할 수 있는 환경을 제공하여 서블릿 컨테이너라는 별칭이 붙여있다라고 생각하면 될 거 같다.

서블릿 실행은 이렇게 서블릿 컨테이너에 의해 이루어진다. 다음은 서블릿의 동작 원리를 나타낸 그림이다.

  1. 브라우저에서 서블릿을 요청
  2. WAS 안에 웹 서버가 서블릿 요청을 인식하여 서블릿 컨테이너에게 서블릿을 수행하도록 넘김
  3. 서블릿은 쓰레드를 기동하여 해당 서블릿 객체를 생성하여 이를 수행
  4. 서블릿 객체의 작업이 종료되면 기동되었던 쓰레드가 종료
  5. 서블릿 수행 결과가 웹 서버에 전송
  6. 이를 클라이언트에 전송

서블릿의 라이프 사이클

서블릿이 다른 웹 기술보다 주목을 받게 된 이유는 수행 속도가 빠르다는 점이다. 수행 속도가 빠를 수 있는 이유는 두 번째 이상의 요청이 첫 번째 요청인 경우와 다르게 처리되기 때문이다. 다른 웹 기술들은 클라이언트들의 요청이 있을 때마다 작업을 처음부터 새롭게 하여 제공하지만, 서블릿은 그렇지 않다. 서블릿이 첫 번째 요청인 경우에는 서블릿 클래스를 찾아 메모리에 로딩하여 인스턴스(객체)를 생성한다. 이때 생성된 서블릿 인스턴스는 메모리에 계속 남아 있게 되므로 이후부터는 서블릿이 호출되어도 서블릿 인스턴스가 다시 생성되지 않고 이미 메모리에 로딩된 서블릿으로부터 서비스만 받기 때문에 수행 속도가 빠르다. 반면에 PHP나 ASP는 요청될 때마다 인터프리터 방식으로 코드가 재해석되기 때문에 수행 속도가 느리다. 다음은 서블릿 라이프 사이클을 나타낸 그림이다.

우선 객체가 생성되면서 init() 메서드가 단 한번 호출된다. init() 메서드에서는 주로 초기화 작업을 한다. 그 후에 클라이언트의 요청이 있을 때 doGet() 혹은 doPost() 메서드가 실행된다. 여러 클라이언트가 동시에 요청을 하더라도 쓰레드가 생성되므로 동시에 doGet 혹은 doPost() 메서드가 실행되기 때문에 수행 속도가 빠르다. 서블릿이 더 이상 서비스를 하지 않을 경우 destory() 메서드가 호출되는데, 예를 들면 서블릿 컨테이너가 종료(톰캣 재가동)되거나 서블릿 내용이 변경되어 다시 컴파일해서 클래스 파일이 바뀌는 경우이다.

JSP(Java Server Page)이란?

JSP는 자바로 서버 페이지를 작성하기 위한 언어이다. HTML과 JSP 태그로 구성되어 화면을 작성하는 데 유리한 웹 프로그래밍 기술이다. 서버 페이지는 웹 서버에서 실행되는 페이지를 말하며 요청에 필요한 페이지를 위한 로직이나 데이터베이스와의 연동을 위해 필요한 것들을 포함한다. 이러한 서버 페이지에서 실행되는 로직을 구현하기 위해서 프로그래밍 언어가 필요한데, JSP에서는 자바를 사용하고 있다.

  1. 회원 가입 페이지에서 회원 정보를 입력한 후 확인 버튼을 클릭하면 웹 서버에 정보가 전송
  2. 입력된 회원 정보 전송
  3. 입력된 회원 정보를 읽어와 데이터베이스에 저장
  4. 회원 가입 성공 실패 여부를 결과값으로 얻어옴
  5. 회원 가입 처리 결과 전송
  6. 가입 결과를 HTML 형태로 확인

JSP와 HTML

JSP는 HTML 태그에 자바로 프로그래밍하여 브라우저에 보여주는 특별한 페이지이다. JSP 파일은 HTML 파일과 다르게 동작한다. HTML 파일은 확장자가 html이고 이는 웹브라우저 내의 번역기가 돌리는 반면 JSP 파일은 톰캣 서버가 번역하여 그 결과를 HTML 태그로 변환한 후 웹브라우저에 내려 보낸다.

JSP와 HTML의 차이점 추가 설명
HTML은 확장자가 "html"인 파일로서 클라이언트의 브라우저에 의해서 내용을 해석하여 실행하며 자바나 톰캣 서버가 설치되어 있지 않아도 실행한다. 반면 JSP는 자바와 톰캣이 설치된 컴퓨터 내에서 실행된다. 톰캣이 동작시키기 위해서는 JSP 파일은 확장자가 "jsp"이어야 하고 페이지에 JSP인 것을 알리는 페이지 지시자인 <%@ page %>가 반드시 있어야 한다. JSP로 만들어진 파일은 서버 측에서 동작해야 할 코드들이 있을 경우 사용한다. HTML 파일에는 바뀌지 않는 단순 정보만 기술한다.

서블릿 vs JSP

자바 기반으로 웹 애플리케이션을 작성하기 위한 도구로 서블릿이 먼저 만들어졌다. 하지만 서블릿은 HTML 코드가 자바 코드 안에 들어가는 구조이다. 디자이너가 자바를 이해하지 못한 채 HTML 코드를 자바 형태인 서블릿에서 작성한다는 것은 어불성설이다. 이러한 문제점 때문에 등장한 것이 JSP이다. JSP는 HTML 문서에 자바 코드가 들어가는 구조이기 때문에 서블릿보다는 JSP로 개발하는 편이 훨씬 쉽고 간단하다. JSP는 서블릿보다 간편하게 웹 애플리케이션을 개발하기 위해서 등장한 것이기 때문에 서블릿 컨테이너는 JSP를 있는 그대로 받아들이지 못하고 이를 서블릿으로 변환한 후 동작한다.

그렇다면 컨테이너가 알아서 해주기 때문에 서블릿을 배울 필요가 없을까?

MVC 패턴으로 웹 프로그램을 작성할 경우 컨트롤러로 서블릿이 사용되기 때문에 서블릿은 반드시 공부해야 한다. 또한 JSP 페이지에서 오류가 발생하면 에러 메시지가 서블릿으로 변환된 코드로 알려준다. 서블릿을 모른 채 JSP를 학습하면 발생하는 오류도 잡기 힘들 것이다.

JSP가 서블릿 컨테이너에서 동작하는 순서

  1. 브라우저에서 JSP 페이지(.jsp)를 웹 서버에게 요청
  2. 웹 서버는 JSP에 대한 요청을 서블릿 컨테이너에게 넘김. 그러면 서블릿 컨테이너는 해당 JSP를 찾아서 서블릿 파일(.java)을 생성
  3. 서블릿 파일은 컴파일되어 서블릿 클래스 파일(.class)을 생성
  4. 서블릿 수행 결과가 웹 서버에 전송
  5. 사용자는 서블릿의 출력 결과인 HTML 형태로 응답 결과를 보게 됨

JSP가 서블릿에 비해 처리 속도가 느리지 않는 이유

클라이언트가 요청한 것은 JSP(.jsp) 파일이지만 응답하는 것은 JSP 파일이 아니라 .class 확장자를 가지고 있는 서블릿 파일(.class)이다. JSP는 서블릿으로 변환되는 과정이 추가되기 때문에 서블릿보다 응답시간이 느릴것이라고 생각할 수 있지만, 서블릿과 JSP는 응답하는 데 걸리는 시간 차이가 그리 크지 않다. 왜냐하면 JSP가 서블릿으로 변환되는 과정은 JSP 페이지가 최초로 요청되었을 때 단 한 번뿐이고 이미 요청되었던 페이지가 다시 요청되면 이미 변환이 된 서블릿 파일로 서비스가 처리되기 때문이다.

Reference

  • 백견불여일타 JSP&Servlet : Eclipse&Oracle (성윤정 지음)
profile
Whatever does not destroy me makes me stronger.

0개의 댓글