ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Servlet] Servlet 개념
    카테고리 없음 2024. 4. 21. 23:50

    Servlet이란?

    클라이언트의 요청을 처리하고 , 그결과를 반환 시켜주는 프로그래밍 기술

     

     

     

    Servlet 없이 요청 처리

    • Form 데이터 전송을 하면 Form 데이터관련 HTTP 메시지를 만든다.
    • TCP 통신을 통해 전송한다.
    • HTTP 메세지는 Text형태임으로 관련 내용을 하나한 파싱하여 URL, 실행할 로직과 필요한 데이터를 얻는다.
    • 비즈니스 로직을 수행한다.
    • HTTP  응답 메시지를 작성 후 TCP 통신을 통해 결과를 반환한다.

    ※ 비즈니스 로직 작성을 위해서 전후 처리가 많아 비효율적

     

     

    Servlet 으로 요청처리

    Servlet 코드

    // /hello 요청에 반응하는 servlet
    // HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 을 상속 받는다.
    @WebServlet(name = "helloServlet", urlPatterns = "/hello")
    public class HelloServlet extends HttpServlet {
    	
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) {
        	//애플리케이션 로직
        }
    }

     

     

    동작 원리

    • 요청한 HTTP 메시지 기반으로 HttpServletRequest, HttpServletResponse 객체를 만든다.
    • Servlet 컨테이너에 있는 Sevlet을 통해 요청과 일치하는 servlet을 실행시킨다
    • 해당 Servlet이 가진 비즈니스 로직을 실행하여 Response객체에 담는다. 객체정보로 HTTP 응답 메시지를 생성한다.
    • Response 객체정보로 HTTP 응답 메시지를 생성후 클라이언트에 전송한다.
    • 만든 HttpServletRequest, HttpServletResponse를 소멸시킨다.

     

     

     

     

    Servlet Container

    servlet을 관리해주는 컨테이너이다.

    • Servlet Container는 Servlet 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리
    • Servlet 객체는 싱글톤으로 관리
      • 고객의 요청이 올 때마다 계속 객체를 생성하는것은 비효율적
      • 최초 로딩 시점에서 Servlet객체를 미리 만들어 재활용
      • 모든 클라이언트 요청은 동일한 Servlet 객체 인스턴스에 접근
      • 공유 변수 사용시 주의(하나의 객체이므로)
      • Servlet  Container 종료시 함께 종료
    • JSP도 서블릿으로 변환되어 아용
    • 동시요청을 위한 멀티스레드지원

     

     

    Servlet 생명주기

    1. init() : 클라이언트의 요청이 들어오면  Servlet Container는 해당하는 Serlvelt이 메모리에 있는지 확인, 없을 경우 init()메소드로 생성후 메모리에 저장한다.(한번만 실행)
    2. service() : 요청에 대한 응답을 처리하여 제공
    3. destory() : Servlet Container Servlet에 종료요청을 할때 실행되는 메서드로 한번만 실행된다.

     

     

     

    Servlet 과 Thread

    요청이 들어왔을 때 Servlet 객체를 호출하는 것은 Thread이다.

     

    요청이오면 thread를 할당하고 할당된 thread는 servlet이 응답까지 하고나서 반환된다.

    만일 , 반환되기전에 다른 클라이언트로부터 요청이 들어오면 스레드가 부족하여 에러가 나거나 요청처리가 지연되게 된다.

     

    이를 방지하기 위해 요청마다 스레드를 생성한다면??

    • 장점
      • 동시 요청을 처리할 수 있다.
      • 리소스(CPU, 메모리)가 허용할 때가지 처리 가능
      • 하나의 thread가 지연되어도, 나머지 thread는 정상 동작한다.
    • 단점
      • thread 생성 비용이 비싸다. -> 요청이 들어올때마다 생성하는 것은 응답 속도에 영향을 준다.
      • 컨텍스트 스위칭 비용 발생
      • 스레드 생성 제한이 없다면 CPU, 메모리 임계점을 넘어 서버가 죽을 수 있다.

     

     

     

    Thread Pool 적용

    위 단점을 해결하기 위해 Thread Pool을 적용

    애플리케이션이 시작될 때 미리 Thread를 만들어 놓고 보관하는 Thread Pool을 생성

    Thread Pool의 크기는 설정이 가능하고 톰캣은 최대 200개 기본 설정이다.

     

    동작원리

    • 요청이 오면 Thread Pool에서 생성되어져 있는 Thread를 꺼내어 Servlet 객체를 호출한다.
    • 요청이 왔을 때 Thread Pool에 더 이상 이용가능한 Thread가 없다면 요청을 거절하거나 대기하도록 설정 할 수 있다.
    • 응답 후 사용된 Thread는 다시 Thread Pool에 반납한다.

    장점

    • Thread가 미리 생성되어 있어 Thread를 생성하고 종료하는 비용(CPU)이 절약되고 응답시간이 빠르다.
    • 생성 가능한 Thread의 최대치가 있어 많은 요청이 들어와도 기존 요청을 안전하게 처리 할 수 있다.

     

    Thread Pool 설정

    • 너무 낮게 설정하면 자원의 사용량(CPU, 메모리)이 놀게 되고 응답이 지연되는 현상이 발생해 비효율적
    • 너무 높게 설정하면 자원의 사용량(CPU, 메모리)이 임계점 초과로 서버 다운
    • 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 설정
    • 아파치 ab, 제이미터와 같은 툴을 이용하여 실제 서비스와 유사한 환경에서 성능 테스트후 설정

     

     

     

     

    참고 문헌

Designed by Tistory.