본문 바로가기

DEVELOP/BackEnd

서블릿(Servlet) 프로그래밍

1. 서블릿의 특징

서블릿은 Server Side Applet의 약어로 웹 서버 즉, 웹 컨테이너에서 수행되는 Java 클래스이다.

자바에서도 CGI 방식을 따라 웹 프로그래밍을 할 수 있도록 하기 위해 자바 서버 프로그래밍 기술인 서블릿이 등장하게 되었다.

 

...더보기

CGI(Common Gateway Interface)

- 웹 서버와 외부 프로그램 간의 연결에 대한 규약

- 실행 코드 방식

- 웹 브라우저가 웹 서버에 실행을 요청하면 웹 서버가 직접 프로그램 실행

- 요청이 발생할 때마다 요청 개수만큼 메모리에 로딩되어 전체적인 성능 저하가 발생한다.

- 웹 어플리케이션 서버 방식과 대비됨

- 웹 어플리케이션 서버 방식은 웹 서버가 웹 어플리케이션 서버를 통해 간접적으로 프로그램 호출

    -> 다수의 웹 브라우저가 같은 웹 어플리케이션을 요청하더라도 한번만 로딩. 메모리 사용량이 적다.

 

  실행 코드 방식(GCI) 스크립트 방식(웹 어플리케이션)
코드 형태 컴파일 된 실행 프로그램 컴파일 되지 않은 스크립트 코드
실행 방식 컴파일 된 기계어 코드 직접 실행 스크립트 코드를 해석한 뒤 실행
코드 변경 소스 코드를 다시 컴파일 해야함 스크립트 코드만 고치면 됨
종류 C기반 CGI 프로그램, Servlet JPS, ASP.NET

 

- 서블릿은 서버의 응용 프로그램을 구현하는 기술로서 서버 프로토콜 종류에 관계없이 FTP, SMTP, HTTP 등 여러가지 어플리케이션 기반의 응용 프로그램을 개발 가능

- 서블릿을 주로 활용하는 주요 서버 환경은 웹 환경에서 HTTP 프로토콜을 사용하며, HTTP 프로토콜을 기반으로 한 서블릿 프로그램을 주로 구현

- 서블릿은 클라이언트의 요청에 대하여 서블릿 컨테이너에 의해 독립된 스레드 기반으로 서비스가 되는 기술로서 다중 스레드 서비스가 기본적으로 제공됨.

     => 프로세스 기반의 CGI에 비해 수행속도 빠름

- 서블릿 컨테이너는 클라이언트에서 전송되는 서블릿 요청(request)과 응답(response)에 대한 처리 담당

- 서블릿 컨테이너로는 오픈소스인 tomcat이 대표적.

- 서블릿은 비즈니스 로직과 프레젠테이션 로직이 혼합된 형태 -----> 후에 JSP로 분리

 

 

2. HTTP 프로토콜

- HTTP(HyperText Transfer Protocol)

인터넷 상에서 Hyper Text를 지원하는 HTML과 관련 데이터(이미지, 동영상, 파일 등)를 주고 받기 위한 서버/클라이언트 모델을 따르는 전송 프로토콜

TCP/IP 위에서 작동하는 응용 프로토콜

 

- Stateless(비연결상태)

클라이언트 요청에 의해 서버와 연결이 되면 서버에서 요청에 대한 응답이 이루어지면 프로토콜에서 연결을 끊어버림

 => 장점 : 접속 유지 최소화 -> 다수를 대상으로 하는 서비스에 빠르게 응답 가능

 => 단점 : 클라이언트의 이전 상태를 알 수 없음 -> 로그인 정보나 사용자의 상태 유지 불가능

 

- Keep Alive

HTTP 1.1부터 지원

지정된 시간동안 연결을 끊지 않고 요청을 계속해서 보낼 수 있게 되었다.

 

- Request 메시지 구조

요청 라인 : GET/HTTP/1.1

  - 요청 메소드 : GET, POST, PUT, DELETE

  - 요청 URL

  - HTTP 버전

요청 헤더 : key-value 방식으로 들어감

  - Accept : 클라이언트가 받을 수 있는 컨텐츠

  - Cookie : 쿠키

  - Content-Type : 메시지 바디 종류

  - Content-Length : 메시지 바디 길이

  - If-Modified-Since : 특정 날짜 이후에 변경되었을 때

요청 바디(엔터티)

 

- Response 메시지 구조

응답 라인 : HTTP/1.1 200 OK

  - 버전

  - 상태 코드

  - 상태 메시지 

응답 헤더 

  - Content-Type : 바디 데이터의 타입

  - Content-Length : 바디 데이터의 크기

  - Set-Cookie : 쿠키 설정

  - ETag : 엔터티 태그

응답 바디 : HTML, JSON, Octet Stream 등

 

 

3. 서블릿 동작과정

 

1. 웹 클라이언트는 웹 서버에서 HTTP요청(GET 또는 POST방식) 메시지를 보낸다.

  이 때, 필요에 따라 매개변수(parameter)와 쿠키 정보를 같이 보낼 수도 있다.

2. 웹 서버는 웹 클라이언트로부터 들어온 HTTP 요청을 해석하여 서블릿에 대한 요청을 서블릿 컨테이너에게 네트워크를 통해서 전달한다. 

3. 웹 서버로부터 클라이언트의 요청을 전달받은 서블릿 컨테이너는 해당 서블릿을 생성하여 서비스를 수행할 수 있도록 service() 메소드를 호출한다.

4. 서블릿은 서블릿 컨테이너에 의해 인스턴스가 생성되어 필요에 따라 init() 메소드가 호출되어 초기화되고, 다음으로 실제로 서비스를 수행하기 위한 service() 메소드가 호출된다.

5. 서블릿에서는 서비스를 수행한 후, 해당 결과 페이지를 웹 서버에게 네트워킹을 통해 전달한다.

6. 웹 서버는 서블릿 컨테이너로부터 전달받은 결과 페이지를 웹 클라이언트에게 HTTP 응답으로 되돌려준다.

 

 

4. 서블릿 API

자바 서블릿 패키지는 javax.servlet 패키지와 javax.servlet.http 패키지로 구성되어 있다.

서블릿을 작성하기 위해서는 두 개의 패키지에서 제공하는 클래스 또는 인터페이스를 이용해야 한다.

 

서블릿 작성을 위한 기본 인터페이스와 클래스

 

HttpServlet 클래스

: HTTP 서블릿을 작성하기 위해서는 HttpServlet 클래스를 상속받고, HTTP 요청에 해당하는 doGet(), doPost() 메소드를 재정의 해주어야 한다.

 

HttpServletRequest 클래스

: HTTP 서블릿에서 웹 클라이언트로부터 전달된 요청과 관련된 작업을 할 수 있도록 기능을 제공

일반적으로 CGI 환경변수 값을 참조하거나, 웹 클라이언트로부터 전달된 매개변수(parameter)를 파싱하거나, 웹 클라이언트로부터 전달된 Cookie 데이터를 파싱하는 작업을 할 수 있다. 

또는 HTTP 요청에 대한 헤더 정보를 얻을 수 있다.

 

HttpServletResponse 클래스

: 일반 서블릿에서 웹 클라이언트에게 전달할 응답과 관련된 작업을 할 수 있도록 기능을 제공

일반적으로 ServletResponse 객체를 이용하여 PrintWriter 객체를 얻은 후, 결과 페이지를 출력하는 작업을 할 수 있다. (html을 직접 작성)

응답 데이터가 문자열(html태그, xml)인 경우 response.getWriter() 호출

응답 데이터가 바이너리 코드(file)인 경우 response.getOutputStream() 호출

또는, HTTP 응답에 대한 헤더 정보를 설정하거나, 웹 클라이언트에게 부여할 Cookie를 추가할 수 있다. 

 

 

5. 서블릿 작성시 사용되는 응용 인터페이스와 클래스

javax.servlet.ServletConfig 인터페이스

: 일반 서블릿 또는 HTTP 서블릿의 이름, 실행되고 있는 실행 환경 등과 같은 서블릿의 구성 정보 제공

 

javax.servlet.ServletContext 인터페이스

: 서블릿이 실행되고 있는 실행 환경과 통신할 수 있도록 기능을 제공

서블릿 컨테이너에 대한 정보를 얻거나,

web.xml 파일에 설정된 서블릿의 초기화 매개변수 값을 얻거나,

서블릿 컨테이너의 로그 파일에 로그 메시지를 출력하거나,

서블릿 컨테이너에서 같이 실행되고 있는 서블릿을 얻거나, 

서블릿의 실제 디렉토리를 구하거나,

include, forward 하기 위한 서버 자원의 RequestDispatcher 객체를 얻기위해 사용

 

javax.servlet.RequestDispatcher 인터페이스

: 동일 Context내에 있는 자원을 사용할 수 있도록하는 API로 다른 서블릿의 결과로 생성된 결과 페이지를 include 하거나 다른 서블릿으로 forward 하기 위해 해당 서블릿에 대한 RequestDispatcher 객체를 얻기 위해 사용할 수 있다.

 

javax.servlet.http.HttpSession 인터페이스

: 특정 클라이언트와 관련된 상태 정보를 클라이언트가 연결되어있는 세션 기간동안 저장하기 위한 저장소 제공

모든 클라이언트는 자신만의 정보를 저장할 수 있도록 각각의 세션을 갖는다.

 

javax.servlet.http.Cookie 클래스

: 웹 클라이언트로부터 전달된 쿠키로부터 데이터를 읽어오거나, 웹 클라이언트에게 쿠키를 부여하기 위해 사용

 

 

6. 서블릿의 라이프 사이클

서블릿 클래스는 SE 자바 클래스와 다르게 객체를 생성하거나 메소드를 호출하는 주체가 서블릿 컨테이너이다.

웹 클라이언트로부터 온 요청을 받아 처리하기 위해 서블릿은 서블릿 컨테이너 내에서 실행되고,

클라이언트가 쇼핑한 물품 등과 같은 데이터를 유지하기 위해 세션을 사용할 수 있다.

 

서블릿 컨테이너가 서블릿 인스턴스의 라이프 사이클을 관리하면서 다음 메소드들을 호출해준다.

따라서 서블릿 구현시 라이프 사이클과 관련된 메소드들을 작성해야 한다.

 

init()

: 서블릿 컨테이너는 요청을 처리할 서블릿의 인스턴스를 생성한 후, 내부적으로 init() 메소드를 자동 호출한다.

초기화 해야 할 작업이 있는 경우 init() 메소드 내에 정의하면 된다.

 

service(...)

: 서블릿 컨테이너는 init() 메소드 호출 후에 service(...) 메소드를 호출하여 클라이언트로부터 온 요청을 받아 처리할 수 있도록 한다. ServletRequest, ServletResponse 객체를 service() 메소드의 매개변수로 전달한다.

따라서 서블릿에서는 ServletRequest 객체를 이용하여 요청을 처리하고, 

응답에 해당하는 결과 페이지를 ServletResponse 객체에서 얻은 PrintWriter 객체를 통해서 출력한다.

 

destroy()

: 서블릿이 요청과 관련된 작업을 모두 마치게 되면 서블릿 컨테이너에 의해 스레드 풀에 들어가거나 메모리에서 내려가게 된다.

메모리에 내려갈 때는 GC(Garbage Collection)되기 때문에 서블릿이 마무리 작업을 하도록 해야 한다.

따라서 GC 되기 전에 마지막으로 수행해야 할 작업이 있다면 destroy() 메소드 내에 정의한다.

 

두 개의 브라우저로 하나의 서블릿을 요청하면 해당 서블릿 인스턴스는 하나 생성되고, 멀티 스레드에 의해 서비스를 제공한다. 

 

<서블릿의 사용자 요청 처리 과정>

 

1. 서블릿 컨테이너는 Servlet 클래스를 메모리에 적재하여 상주시킨다.

2. 서블릿 클래스의 생성자 메소드를 호출해 인스턴스를 생성하여 메모리에 적재한다.

3. 생성된 인스턴스의 init() 메소드 호출한다.

    init() 메소드는 서블릿 라이프 사이클에서 단 한번만 실행된다. 

4. service() 메소드는 클라이언트의 요청이 있을 때마다 수행되는 메소드이다.

   서블릿에 대한 사용자 요청에 대해서는 web.xml 파일을 참조해 URL매핑을 확인하고

   해당 서블릿 인스턴스로부터 스레드를 생성하여 service() 메소드를 호출한다.

   HttpServlet에 구현된 service() 메소드에서는 요청 방식에 따른 서비스 메소드를 호출하도록 구현되어있다.

   GET 방식 요청은 doGet(), POST 방식 요청은 doPost() 메소드가 호출된다.

5. destroy() 메소드는 서블릿 인스턴스가 더이상 존재할 이유가 없어서 메모리에서 소멸될 때 호출한다.

'DEVELOP > BackEnd' 카테고리의 다른 글

URI와 URL의 차이점  (0) 2019.10.14
서블릿(Servlet) 프로그래밍 4  (0) 2019.09.29
서블릿(Servlet) 프로그래밍 3  (0) 2019.09.29
서블릿(Servlet) 프로그래밍 2  (0) 2019.09.26
웹 어플리케이션의 개념  (0) 2019.09.25