
'스프링 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의 멀티 쓰레드 지원
💡 참고
스프링 빈은 싱글톤이다.
잘보고 갑니다
덕분에 정리에 도움 얻고 갑니다