본문 바로가기

HTTP

HTTP- 서블릿 개념, 동시 요청, 멀티 쓰레드

서블릿

우리가 웹서버를 만들려면 위의 왼쪽 박스에 있는 모든 기능을 싹 다 구현해야한다. 하지만 우리가 정작 중요한 것은 초록색 박스의 비즈니스 로직을 수행하는 것 뿐이다. 따라서 나머지들은 구현이 매우 귀찮을 것이다. 나머지를 우리가 하지 않고 자동적으로 구현해주는 것이 바로 서블릿의 역할이다. 

 

위의 코드의 경우 urlPatterns(/hello)의 url이 호출되는 경우 helloServelet이 실행된다. http Request 정보는 전부 HttpServletRequest 객체 request에 주입되어 편리하게 사용이 가능하고, response 또한 HttpServeltResponse 객체 response를 통해서 관리된다.

 

request와 response 객체는 http 메시지를 기반으로 해서 자동으로 생성된다. 이 객체들을 이용해 helloServlet에서 비즈니스 다양한 처리를 자동적으로 해준다. 우리는 이 데이터를 사용해서 비즈니스 로직만을 수행하면 된다. 귀찮은 부분은 servlet이 자동으로 처리해준다.

 

HTTP 요청시

  • WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체 호출
  • 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용
  • 개발자는 Response 객체에 HTTP 응답 정보를 편리하게 입력
  • WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성

서블릿은 싱글톤이다.

 서블릿은 싱글톤으로 처음에 서블릿 컨테이너가 실행되는 경우에 단 한개만 생성되고, 서블릿 컨테이너가 종료될 때 반환된다. 이는 객체를 여러개 생성하지 않고 재사용하여 효율을 높이기 위해서이고, 이 때문에 공유변수 사용에 있어서 주의가 필요하다.

쓰레드

 쓰레드는 기본적으로 한 프로세스 내에 작은 여러가지 조각이라고 생각하자. 쓰레드는 서블릿을 호출한다.

하나의 쓰레드는 위에서 처럼 하나의 요청에 응답할 수 있다. 따라서 만일 하나의 쓰레드에 여러개의 request가 존재한다면 나머지 request는 대기해야 한다.

동일 요청

요청1은 지연중, 쓰레드가 하나뿐이라 요청2는 대기중

또한 위에 그림처럼 요청1이 처리중에 지연이 발생하여 요청2가 계속해서 대기를 하는 상황이 발생한다고 하자. 이렇게 되면 두 요청이 모두 kill 될 수있다.

둘 다 실패

이러한 문제를 해결하기 위해서 요청 시마다 쓰레드를 여러개 생성한다면 여러개의 요청에 동시에 응답이 가능하다. 이 기법에는 장단점이 존재한다.

요청 마다 쓰레드 생성 장단점 

 장점

  • 동시 요청을 처리할 수 있다. 
  • 리소스(CPU, 메모리)가 허용할 때 까지 처리가능 
  • 하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작한다. 

 단점

  • 쓰레드는 생성 비용은 매우 비싸다. 
  • 고객의 요청이 올 때 마다 쓰레드를 생성하면, 응답 속도가 늦어진다. 
  • 쓰레드는 컨텍스트 스위칭 비용이 발생한다. (cpu에서 쓰레드 변환 시 오버헤드)
  • 쓰레드 생성에 제한이 없다. 
  • 고객 요청이 너무 많이 오면, CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있다.

쓰레드 풀

 위의 단점을 해결하기 위해서 쓰레드 풀 안에 미리 생성 가능한 최대치의 쓰레드를 생성해 놓고 요청마다 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내어 사용하고 사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납한다. 만일 쓰레드 풀의 쓰레드를 모두 사용하고 있는 경우 요청을 거절 혹은 대기하도록 설정한다.

 쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용이 절약되고 응답이 빠름. 또한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리가능.

핵심

 

'HTTP' 카테고리의 다른 글

HTTP- Rest Api  (0) 2024.02.28
HTTP- GET, POST Method 정리  (0) 2023.06.25