본문 바로가기

청년취업아카데미/DayLog

[ JSP ] Day 10 - ④ 서블릿(Servlet)

더보기

Read Before

Servlet은 톰캣 위에서 동작하는 Java 프로그램입니다. Java언어를 기반으로 동적인 contents를 생성하는 기술입니다. Servlet은 Java를 잘 모르면 상당히 어려운 부분으로, 예전에는 JSP가 서블릿을 대체하는 기술이 되었지만, 현재는 MVC 패턴2가 등장하면서 상호보완적 기술로 자리 잡고 있습니다.

(1) MVC Pattern이란?

MVC(Model-Veiw-Controller) 패턴은 디자인 패턴 중 하나로서, 비지니스 영역과 로직 영역을 명확히 구분하기 위해서 만들어 졌습니다. 

(2) MVC1과 MVC2의 비교

-- 1. MVC1 --

웹 브라우저의 요청을 JSP 페이지가 받아서 처리한다. 쉽게 페이지를 작성할 수 있는 장점이 있지만, JSP 페이지 내에 비지니스 로직을 처리하기 위한 코드와 웹 브라우저에 결과를 보여주는 코드가 함께 존재하여 재사용이 힘들고 읽기도 힘들어 가독성이 떨어지는 단점이 있다.

-- 2. MVC2 --

웹 브라우저의 요청을 하나의 서블릿이 수행하고, 그결과를 JSP 페이지로 포워딩(전송)시킨다. 따라서 클라이언트의 요청, 응답, 비지니스 로직 처리부분을 모듈화 시킨다. 처리작업의 분리로 인해 유지보수 및 확장이 용이한 장점이 있지만, 구조를 설계하는 시간이 많이 소요되어 개발 기간이 증가하는 단점이 있다.

서블릿(Servlet)

▶ 자바 개발환경 구조

eclipse 개발환경에서의 폴더 구조

(1) 서블릿이란?

  • 서블릿은 JSP 표준이 나오기 전에 만들어 진 표준으로 자바에서 웹 애플리케션을 개발할 수 있도록 하기 위해 만들어졌다.

 서블릿(Servlet)은 서버(Server)와 애플릿(Applet)의 합성어로 동적 웹페이지를 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 초창기 CGI(Common Gateway Interface) 방식 웹서버의 성능 개선을 목적으로 썬마이크로시스템스에서 발표하였다.

 기존의 CGI는 멀티 프로세스 방식으로 요청이 증가할수록 시스템 부하율 기하급수적으로 높아져 문제였고, 그 대안으로 나온 것이 서블릿(Servlet)이라 할 수 있다. 서블릿은 JVM안에서 멀티 스레드 방식으로 동작하기 때문에, 아래의 사진을 통해 시스템 부하율이 현저히 저하된 것을 볼 수 있다.

CGI 방식과 서블릿의 차이

 

  • 자바 클래스를 웹에서 호출 및 실행할 수 있도록 한 표준 javax.servlet.http.HttpServlet 클래스로 부터 상속 받아 작성. 위의 클래스는 servlet-api.jar에 포함되어 있다
  • Servlet의 상속구조는 아래와 같다.

Servlet 상속 구조

 

  • GenericServlet과 HttpServlet 구조는 아래에서 살펴볼 수 있는데, HttpServlet 클래스는 Gerneric 클래스를 상속받아 HTTP 프로토콜에 관련된 기능을 구현한 것이다. GernericServlet은 프로토콜에 독립적인 서블릿으로 service()를 오버라이딩해서 사용한다.

GenericServlet과 HttpServlet 차이

 

(2) 작성과정

  1. 서블릿 규칙에 따라 자바 코드 생성
  2. 작성한 코드를 컴파일해서 웹 프로젝트 WEB-INF classes 폴더에 복사
  3. 경우에 따라서 web.xml 파일에서 서블릿을 주소와 매핑
  4. 웹 컨테이너 재실행

(3) 서블릿 요청 처리

  1. 요청 방식에 따라 doGet이나 doPost 메소드를 재정의해서 처리한다.
  2. service 메소드를 재정의해서 사용할 수 있는데, 이메소드는 get방식이나 post 방식 상관없이 호출되며, 이메소드가 호출되면 doGet이나 doPost 메소드는 호출되지 않음.
  3. 서블릿에서 요청을 처리하기 위해 오버라이딩 한 메소드는 request 객체를 이용해서 웹 브라우저의 요청 정보를 읽어 오던가 아니면 response를 이용해서 응답을 전송.
  4. 응답을 전송하고자 하는 경우는 response 객체의 setContentType() 메소드를 이용해서 타입과 인코딩 방식을 지정
  5. 웹 브라우저에 데이터를 전송하려면 getWriter()를 호출해서 문자열 데이터를 출력할 수 있는 PrintWriter를 가져오고 print()나 println()을 이용해서 전송하면 됨

 

Servlet 선언

  • 이클립스 5.0이전 버전에서는 web.xml 파일을 이용해서 매핑했지만, 지금은 annotation의 등장으로 주소와의 매핑을 코드 안에서 가능하여 클래스 정의 상단에 @WebServlet(주소 또는 urlPatterns="패턴")의 형태로 가능하다.
  • web.xml(웹 프로젝트의 설정 파일)에서의 매핑
<servlet>
	<servlet-name> 서블릿 이름 </servlet-name>
	<servlet-class> 클래스 이름 </servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name> 서블릿 이름 </servlet-name>
	<url-pattern> /호출url </url-pattern>
</servlet-mapping>
  • <servlet-mapping> 엘리먼트 안에는 전체 URL이 아니라, 웹 서버의 도메인 이름, 포트번호, 웹 애플리케이션 디렉터리 이름을 제외한 나머지 부분만 기재해야 한다.

 

(1) 매개변수(parameter 폼 안에서 name을 가진 객체, 또는 URL의 ? 다음의 데이터) 처리

  1. 단일 항목 : request 객체의 getParameter("매개변수 이름")으로 처리
  2. 배열 : request 객체의 getParameterValues("매개변수 이름")으로 처리

 

(2) 요청시 응답

  1. 요청시 응답은 response 객체를 이용
  2. 출력 하고자하면, response 객체의 getWriter()를 호출해서 PrintWriter 객체를 받은 후 print 또는 println 메소드를 이용해서 html 코드를 리턴

 

(3) 특정 페이지로 이동

  1. request 공유( forward )
    • RequestDispatcher 변수 = request.getRequestDispatcher("이동할 페이지");
    • 변수.forward(request, response);
  2. request 공유하지 않고 이동( redirect )
    • response.sendRedirect("이동할 페이지");

 

서블릿 호출

(1) Get 방식

  • 주소에 매개변수를 붙여서 호출하는 방식; 주소와 매개변수를 ?로 구분
    • a 태그를 이용해서 페이지를 요청하는 경우
    • 자바스크립트를 이용해서 요청
  • 폼에서 명시적으로 GET방식으로 요청하는 경우
  • 매개변수의 데이터는 255자 이내이며 보안성이 없다
    • 폼에서 사용하면 처리가 지연되는 경우 재요청

(2) Post 방식

  • 매개변수를 본문에 포함시켜 전송하는 방식
  • 폼에서 명시적으로 POST 방식으로 요청
    • 데이터 크기에 제한이 없으며 URL에 표시가 되지 않으므로 보안성이 우수

 

[ References ]

  1. 그림 참고, Beom's Blog, Servlet, link