서블릿

위 내용들은 WAS에서 클라이언트로부터 요청이 왔을 때 수행해야하는 로직들이다.
근데 이 모든 로직들을 개발자가 하나하나 설정하기 너무 번거롭다.
이 문제를 해소시켜주기 위해 나온 것이 서블릿으로 서블릿을 사용하게 되면
위 로직들 중 초록색 네모칸 쳐진 비즈니스 로직만 개발자가 작성하면 된다.
서블릿 작동 과정

웹 브라우저로부터 HTTP 요청 시 WAS는 request, response 객체를 새로 생성하고 사용할 서블릿 객체를 호출한다.
(호출되는 서블릿은 웹 브라우저가 요청한 URL에 맞게 호출될 수 있는 서블릿이 존재할 경우 호출된다.)
request, response 둘 다 개발자가 편리하게 HTTP 스펙을 사용할 수 있도록 만들어진 개체로
request는 HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServeletRequest 클래스로 만들어진 객체이고,
response는 HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse 클래스로 만들어진 객체이다.
서블릿 컨테이너가 탑재된 WAS는 위 그림에서처럼
WAS가 수행해야할 모든 로직을 자동으로 수행해주고, request와 response 객체를 이용해 비즈니스 로직을
Servlet을 통해 수행하고 변경된 response값을 웹 브라우저에 전달해준다.
서블릿 특징
- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
- 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
- 서블릿 객체는 싱글톤으로 관리
1) 최초 로딩 시점에서 서블릿 객체를 하나 만들고 모든 고객이 동일한 해당 서블릿 객체에 접근하여 사용
2) 공유 변수 사용에 주의한다.
3) 서블릿 컨테이너 종료시 함께 종료
- JSP도 서블릿으로 변환되어 사용된다.
- 동시 요청을 위한 멀티 쓰레드를 자동으로 지원한다.
멀티 쓰레드
쓰레드
- 애플리케이션 코드를 하나하나 순차적으로 실행하는 것을 쓰레드라고 한다.
- 쓰레드는 한 번에 하나의 코드 라인만 수행한다.
- 동시 처리가 필요하면 쓰레드를 추가로 생성해야한다.
다중 요청 - 쓰레드 하나 사용

WAS는 클라이언트로부터 요청이 올 때마다 쓰레드가 Servlet과 연결되어 필요한 로직들을 처리해준다.
그런데 만약 쓰레드가 하나만 있을 경우 위 그림에서처럼 요청1에 대한 처리가 지연되면
요청2는 쓰레드의 작업이 끝날 때까지 대기해야한다.
만약 요청1에 대한 처리에 문제가 발생하여 처리가 무한정 늦어지게 되면,
요청1뿐만 아니라 요청2, 이후의 요청들 모두에 대한 처리가 불가능하게 되는 문제가 발생한다.
요청마다 쓰레드 생성

위와 같은 구조를 사용하면 요청1에 대한 처리가 늦어져도, 요청2에 대한 처리를 문제없이 처리할 수 있게된다.
또한 리소스(CPU,메모리)가 허용할 때까지 동시 요청을 처리할 수 있다.
단, 비싼 쓰레드 생성비용으로 인해 요청이 많아질 수록 응답 속도가 늦어지며
쓰레드 컨텍스트 스위칭 비용이 많이 발생하게 된다.
(컨텍스트 스위칭 비용이란 CPU가 여러개의 쓰레드를 처리하기 위해 하나의 코어에서 매우 빠른 속도로 쓰레드들을 번갈아가며 실행하여 동시에 실행되는 것처럼 작업을 수행하는데, 쓰레드를 변경할 때마다 발생하는 오버헤드 비용을 뜻한다.)
또한 쓰레드 생성에 제한이 없다보니 요청이 CPU, 메모리 임계점을 넘도록 오게되면 서버가 다운될 수 있다.
쓰레드 풀 사용
사용할 쓰레드만큼만 쓰레드 풀에 보관하고 관리한다.
쓰레드가 필요하면 이미 생성되어 있는 쓰레드 풀에서 꺼내 사용하며 사용을 종료하면 해당 쓰레드를 반납한다.
만약 모든 쓰레드가 사용중이면 대기하거나 요청을 거절하도록 설정할 수 있다.
이를 통해 쓰레드를 생성하고 종료하는 비용을 절약할 수 있으며, 많은 요청이 들어와도 안전하게 처리가 가능하다.

단, 실무에서 쓰레드 풀을 사용할 때 중요한 튜닝 포인트는 최대 쓰레드 개수를 정하는 일이다.
너무 낮게 설정하면 서버 리소스는 여유롭지만 클라이언트 요청이 늦어질 수 있고,
너무 높게 설정하면 더 많은 동시 요청을 처리할 수 있지만 과도하면 CPU, 메모리 리소스 임계점 초과로
서버가 다운될 수 있기 때문에 주의해야 한다.
WAS 멀티 쓰레드 지원으로 인한 핵심 장점
멀티 쓰레드에 대한 부분을 WAS가 처리하기 때문에 개발자는 싱글 쓰레드를 쓰듯 편리하게 개발이 가능하다.
단, 실제로는 멀티 쓰레드 환경이기 때문에 싱글톤 객체 사용에 주의해야한다.(공유 변수 사용 등)
<내용 출처>
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의
웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원
www.inflearn.com
'스프링 > 스프링 MVC - 핵심기술' 카테고리의 다른 글
스프링 MVC - WAS가 전송하는 데이터 유형, 렌더링 기법 (0) | 2023.09.11 |
---|---|
스프링 MVC - 웹 애플리케이션 이해 (0) | 2023.09.11 |
서블릿

위 내용들은 WAS에서 클라이언트로부터 요청이 왔을 때 수행해야하는 로직들이다.
근데 이 모든 로직들을 개발자가 하나하나 설정하기 너무 번거롭다.
이 문제를 해소시켜주기 위해 나온 것이 서블릿으로 서블릿을 사용하게 되면
위 로직들 중 초록색 네모칸 쳐진 비즈니스 로직만 개발자가 작성하면 된다.
서블릿 작동 과정

웹 브라우저로부터 HTTP 요청 시 WAS는 request, response 객체를 새로 생성하고 사용할 서블릿 객체를 호출한다.
(호출되는 서블릿은 웹 브라우저가 요청한 URL에 맞게 호출될 수 있는 서블릿이 존재할 경우 호출된다.)
request, response 둘 다 개발자가 편리하게 HTTP 스펙을 사용할 수 있도록 만들어진 개체로
request는 HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServeletRequest 클래스로 만들어진 객체이고,
response는 HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse 클래스로 만들어진 객체이다.
서블릿 컨테이너가 탑재된 WAS는 위 그림에서처럼
WAS가 수행해야할 모든 로직을 자동으로 수행해주고, request와 response 객체를 이용해 비즈니스 로직을
Servlet을 통해 수행하고 변경된 response값을 웹 브라우저에 전달해준다.
서블릿 특징
- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
- 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
- 서블릿 객체는 싱글톤으로 관리
1) 최초 로딩 시점에서 서블릿 객체를 하나 만들고 모든 고객이 동일한 해당 서블릿 객체에 접근하여 사용
2) 공유 변수 사용에 주의한다.
3) 서블릿 컨테이너 종료시 함께 종료
- JSP도 서블릿으로 변환되어 사용된다.
- 동시 요청을 위한 멀티 쓰레드를 자동으로 지원한다.
멀티 쓰레드
쓰레드
- 애플리케이션 코드를 하나하나 순차적으로 실행하는 것을 쓰레드라고 한다.
- 쓰레드는 한 번에 하나의 코드 라인만 수행한다.
- 동시 처리가 필요하면 쓰레드를 추가로 생성해야한다.
다중 요청 - 쓰레드 하나 사용

WAS는 클라이언트로부터 요청이 올 때마다 쓰레드가 Servlet과 연결되어 필요한 로직들을 처리해준다.
그런데 만약 쓰레드가 하나만 있을 경우 위 그림에서처럼 요청1에 대한 처리가 지연되면
요청2는 쓰레드의 작업이 끝날 때까지 대기해야한다.
만약 요청1에 대한 처리에 문제가 발생하여 처리가 무한정 늦어지게 되면,
요청1뿐만 아니라 요청2, 이후의 요청들 모두에 대한 처리가 불가능하게 되는 문제가 발생한다.
요청마다 쓰레드 생성

위와 같은 구조를 사용하면 요청1에 대한 처리가 늦어져도, 요청2에 대한 처리를 문제없이 처리할 수 있게된다.
또한 리소스(CPU,메모리)가 허용할 때까지 동시 요청을 처리할 수 있다.
단, 비싼 쓰레드 생성비용으로 인해 요청이 많아질 수록 응답 속도가 늦어지며
쓰레드 컨텍스트 스위칭 비용이 많이 발생하게 된다.
(컨텍스트 스위칭 비용이란 CPU가 여러개의 쓰레드를 처리하기 위해 하나의 코어에서 매우 빠른 속도로 쓰레드들을 번갈아가며 실행하여 동시에 실행되는 것처럼 작업을 수행하는데, 쓰레드를 변경할 때마다 발생하는 오버헤드 비용을 뜻한다.)
또한 쓰레드 생성에 제한이 없다보니 요청이 CPU, 메모리 임계점을 넘도록 오게되면 서버가 다운될 수 있다.
쓰레드 풀 사용
사용할 쓰레드만큼만 쓰레드 풀에 보관하고 관리한다.
쓰레드가 필요하면 이미 생성되어 있는 쓰레드 풀에서 꺼내 사용하며 사용을 종료하면 해당 쓰레드를 반납한다.
만약 모든 쓰레드가 사용중이면 대기하거나 요청을 거절하도록 설정할 수 있다.
이를 통해 쓰레드를 생성하고 종료하는 비용을 절약할 수 있으며, 많은 요청이 들어와도 안전하게 처리가 가능하다.

단, 실무에서 쓰레드 풀을 사용할 때 중요한 튜닝 포인트는 최대 쓰레드 개수를 정하는 일이다.
너무 낮게 설정하면 서버 리소스는 여유롭지만 클라이언트 요청이 늦어질 수 있고,
너무 높게 설정하면 더 많은 동시 요청을 처리할 수 있지만 과도하면 CPU, 메모리 리소스 임계점 초과로
서버가 다운될 수 있기 때문에 주의해야 한다.
WAS 멀티 쓰레드 지원으로 인한 핵심 장점
멀티 쓰레드에 대한 부분을 WAS가 처리하기 때문에 개발자는 싱글 쓰레드를 쓰듯 편리하게 개발이 가능하다.
단, 실제로는 멀티 쓰레드 환경이기 때문에 싱글톤 객체 사용에 주의해야한다.(공유 변수 사용 등)
<내용 출처>
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의
웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원
www.inflearn.com
'스프링 > 스프링 MVC - 핵심기술' 카테고리의 다른 글
스프링 MVC - WAS가 전송하는 데이터 유형, 렌더링 기법 (0) | 2023.09.11 |
---|---|
스프링 MVC - 웹 애플리케이션 이해 (0) | 2023.09.11 |