'스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 수업을 듣고 정리한 내용입니다.
✔️ 서버에서 처리해야하는 업무
(1) 만약, 웹 애플리케이션 서버 직접 구현이라면?
- 서버 TCP/IP 연결 대기, 소켓 연결
- HTTP 요청 메시지를 파싱해서 읽기
- POST 방식, /save URL 인지
- Content-Type 확인
- HTTP 메시지 바디 내용 피싱
- username, age 데이터를 사용할 수 있게 파싱
- 저장 프로세스 실행
- 비즈니스 로직 실행
- 데이터베이스에 저장 요청
- HTTP 응답 메시지 생성 시작
- HTTP 시작 라인 생성
- Header 생성
- 메시지 바디에 HTML 생성에서 입력
- TCP/IP에 응답 전달, 소켓 종료
(2) 만약, 서블릿을 지원하는 WAS 사용
WAS : Web Application Server
- x
- x
- x
- x
- x
- x
- x
- 비즈니스 로직 실행
- 데이터베이스에 저장 요청
- x
- x
- x
- x
- x
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response{
// 애플리케이션 로직
}
}
urlPatterns(/hello)
의 URL이 호출되면 서블릿 코드가 실행된다.HttpServletRequest
: HTTP 요청 정보를 편리하게 사용할 수 있다.HttpServletResponse
: HTTP 응답 정보를 편리하게 제공할 수 있다.
✔️ HTTP 요청시 동작 과정
WAS
는 Request, Response
객체를 새로 만들어서 서블릿 객체 호출Request
객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용Response
객체에 HTTP 응답 정보를 편리하게 입력WAS
는 Response
객체에 담겨있는 내용으로 HTTP 응답 정보를 생성
✔️ 서블릿 컨테이너란?
helloServlet
와 saveServlet
를 관리해준다.
WAS
를 서블릿 컨테이너라고 한다.
-> 서블릿 객체를 누가 호출하는 걸까??
✔️ 쓰레드
main
이라는 이름의 쓰레드가 실행한다.
✔️ 단일 요청 - 쓰레드 하나 사용
- 응답 처리가 이루어진다.
완료 후,
✔️ 다중 요청 - 쓰레드 하나 사용
servlet
에서 처리 지연이 발생했다.
-> 이와 같을 경우, 요청1과 요청2 동시 요청으로 인해 둘다 죽게 된다.
📣 그러면 요청마다 신규 쓰레드를 생성하면 되지 않을까?
✔️ 해결책! - Watson, 쓰레드 풀
✔️ 쓰레드 풀
요청 마다 쓰레드 생성의 단점 보완
✔️ 쓰레드 풀 - 실무 팁
성능 튜닝에 관한 얘기
WAS
의 주요 튜닝 포인트는 최대 쓰레드(max thread) 수 이다.최대 쓰레드 10개 설정, 동시에 10개의 요청만 가능
이와 같을 때, 100개의 요청이 온다면, 90개의 쓰레드가 대기, 거절하게 된다.
이때, 갑작스레 서버에 문제가 발생한다면?
개발자는 cpu 사용량을 확인했을 때 5%만 사용중이다.
-> 요청이 많이 와서 외부에서 수많은 쓰레드가 대기, 거절하고 있지만, 내부에서 볼 때 최대 개수만큼의 쓰레드 만 돌고 있어 계속 밀리면서 장애가 일어난다. (Waston은 정상 동작, 고객들은 전체적으로 장애 환경을 맡보게 된다.)
-> 결국, 개발자 입장에서는 setting을 잘못한 것이다. (왜냐면, 현재와 같은 100개의 데이터가 들어올 때는 cpu 50%를 사용해야하는데, 5%만 사용하고 있다.)
✔️ 쓰레드 풀 - 쓰레드 풀의 적정 숫자
✔️ WAS의 멀티 쓰레드 지원
💡 참고
스프링 빈은 싱글톤이다.
잘보고 갑니다
덕분에 정리에 도움 얻고 갑니다