카테고리 없음
[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 생명주기
- init() : 클라이언트의 요청이 들어오면 Servlet Container는 해당하는 Serlvelt이 메모리에 있는지 확인, 없을 경우 init()메소드로 생성후 메모리에 저장한다.(한번만 실행)
- service() : 요청에 대한 응답을 처리하여 제공
- 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, 제이미터와 같은 툴을 이용하여 실제 서비스와 유사한 환경에서 성능 테스트후 설정
참고 문헌
- 인프런 - 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
- https://mangkyu.tistory.com/14