카테고리 없음

[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, 제이미터와 같은 툴을 이용하여 실제 서비스와 유사한 환경에서 성능 테스트후 설정

 

 

 

 

참고 문헌