[Spring] 웹 애플리케이션의 이해
웹 서버, 웹 애플리케이션 서버
웹은 HTTP 기반으로 통신한다.
웹 서버
HTTP 기반으로 동작한다.
정적인 리소스를 제공한다
정적이란? HTML, CSS, JS, 이미지, 영상 등
웹 애플리케이션 서버(WAS - Web Application Server)
HTTP 기반으로 동작
웹 서버 기능 + 정적 리소스 제공
프로그램 코드를 실행해서 애플리케이션 로직을 실행
동적이란? 동적 HTML, HTTP API(JSON), 서블릿, JSP, 스프링 MVC
웹 서버는 정적리소스, WAS는 애플리케이션 로직
WAS는 애플리케이션 코드를 실행하는데 더 특화되어있다.
WAS는 동적, 정적 리소스를 모두 제공 가능하니까 이런식으로 구성할 수 있다.
하지만 WAS에 장애가 발생한다면? 사용자는 에러화면조차 보지 못한다.
따라서 정적 리소스는 웹 서버가 처리하게 하고, 애플리케이션과 같은 동적인 처리가 필요하면 WAS에 요청을 위임한다.
WAS는 중요한 애플리케이션 로직 처리를 담당한다.
이렇게 하면 정적 리소스가 많이 사용되면 web 서버를 증설하고, 애플리케이션 리소스가 많이 사용되면 was를 증설한다.
정적 리소스만 제공하는 웹 서버는 잘 안죽는다. 하지만 was는 잘 죽는다
하지만 우리는 이 둘을 분리했으니 사용자는 web Server을 통해서 서버가 죽었음을 화면으로 확인할 수 있다.
이제까지 프론트 배포, 백엔드 배포 왜 따로하지?? 했었는데
드디어 알게되었다!
개발한지는 꽤 되었는데 이런걸 몰랐다니 반성해야지
서블릿
서버에서 처리해야하는 업무는 위와 같다.
HTTP 메세지 내부의 정보를 읽고, 비지니스 로직을 실행하고, 다시 서버에서 HTTP 응답 메세지를 생성해야한다.
하지만 여기서 의미있는 비지니스 로직은 저 초록색 부분이다. 초록색 부분을 제외한 일을 해줄 수 있는게 서블릿이다.
여기서 urlPatterns(/hello)의 URL이 호출되면 서블릿 코드가 실행된다.
이 때 HTTP 요청정보를 편하게 사용할 수 있게 해주는 것이 Http ServletRequest
HTTP 응답정보를 편하게 사용할 수 있게 해주는 것이 Http ServletResponse이다.
웹 브라우저에서 was에 http 메세지를 보내면, 이 때 서블릿 컨테이너 속 객체가 해당 메세지를 처리하고, 응답하는 일을 도와준다.
전체적인 흐름은 이렇다.
서블릿 컨테이너 속 객체는 계속 생성되는 것이 아니라 싱글톤으로 관리된다.
따라서 공유변수 사용에 주의를 해야한다. 또한 동시 요청을 위한 멀티 쓰레드 처리도 지원한다.
동시요청 - 멀티 쓰레드
이렇게 응답을 받고 서블릿 객체를 누가 호출할까
바로 쓰레드이다.
쓰레드
쓰레드는 애플리케이션 코드를 하나하나 순차적으로 실행하는 것을 말함
자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행됨
쓰레드는 한번에 하나의 코드 라인만 수행하고, 동시처리가 필요하면 쓰레드를 추가로 생성한다.
운영체제에서 배운 적이 있었는데 여기에서 보니까 반갑고 쫌 무섭다..
was에 요청이 오면 was 내의 쓰레드에 해당 일이 할당이 되고, 쓰레드가 서블릿객체를 호출한다.
그 다음 처리가 완료되면 해당 객체가 다시 응답하고, 쓰레드는 휴식상태로 돌아간다.
쓰레드가 하나인데 요청은 2개인 경우는?
만약 쓰레드가 요청1을 처리하고있는데, 서블릿의 문제로 처리가 지연되면?
요청1과 요청2는 아무것도 할 수 없게 된다.
이를 위해서 쓰레드를 여러 개 쓰면 되지 않나라고 생각할 수 있다.
동시요청을 처리할 수 있고, 하나의 쓰레드가 지연되어도 나머지 쓰레드는 정상 동작한다는 장점이 있지만
쓰레드는 생성비용이 매우 비싸고, 컨텍스트 스위칭 비용이 발생한다. 또한 고객 요청이 너무 많이 오면 cpu,메모리 임계점을 넘어서 서버가 죽을수도 있다.
여기서 컨텍스트 스위칭이란? CPU가 하나의 쓰레드 일만 할 수 있다고 할 때, 쓰레드1, 쓰레드2를 번갈아가면서 처리한다.
이 때 쓰레드를 왔다갔다 하는 것을 말한다.
쓰레드 풀
이를 개선하기 위해서 나온 것이 쓰레드 풀이다.
필요한 쓰레드를 쓰레드 풀에 보관하고 관리하고, 풀에 생성 가능한 쓰레드의 최대치를 관리한다.
쓰레드가 필요하면 쓰레드 풀에서 꺼내쓰고, 종료하면 다시 쓰레드 풀에 반납한다.
만약 쓰레드가 모두 사용중이라면? 기다리는 요청을 거절하거나 특정 숫자만큼 대기시킨다.
쓰레드가 미리 생성되어있어 쓰레드를 생성하고 종료하는 비용 절약, 응답시간 빠르다
생성 가능한 쓰레드의 최대치가 있어서 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.
WAS의 주요 튜닝포인트는 최대 쓰레드 수이다.
이 값이 너무 낮으면 -> 동시요청이 많을 때 서버는 여유로운데 클라이언트의 응답 지연
이 값이 너무 높으면 -> 동시요청이 많을 때 CPU, 메모리 임계점 초과로 서버 다운
장애 발생했을 때 클라우드면 서버늘리고 튜닝
아니면 걍 열심히 튜닝
따라서 툴을 사용해서 미리 성능테스트를 해보는 것이 중요하다
멀티쓰레드에 관한 것은 거의 WAS가 처리해서 개발자가 멀티 쓰레드 관련 코드는 신경쓰지 않아도 된다.
이때 멀티쓰레드이므로, 싱글톤 객체 주의해서 사용하기!
HTML, HTTP API, CSR, SSR
정적 리소스는 이와 같이 단순하게 웹 브라우저에게 전달된다.
HTML 페이지
HTML 페이지는 동적으로 필요한 HTML 파일을 생성해서 전달한다.
이 때 웹 브라우저는 HTML 해석을 담당한다.
HTTP API
HTML이 아니라 데이터를 전달한다
주로 JSON 형식을 사용한다.
이와 같이 다양한 시스템에서 호출한다. 만약 UI 화면이 필요하면 클라이언트가 별도로 처리한다.
앱, 웹 클라이언트와 서버 사이 또는 서버끼리의 통신
SSR
서버사이드 랜더링이다. HTML 최종 결과를 서버에서 만들어서 웹에 직접 전달한다.
주로 정적인 화면에 사용함
JSP, 타임리프 등 백엔드 개발자가 해준다.
CSR
HTML 결과를 자바스크립트를 사용해 웹 브라우저에서 동적으로 생성해서 적용한다.
주로 동적인 화면에 사용한다.
React, Vue.js 등 이 부분은 웹 프론트엔드 개발자가 한다
여기서 내가 궁금해진 부분이 있다.
저 맨 위에 요청은 왜 하는가?
지피티 선생 말로는 저 맨 위에 요청을 하면 브라우저는 자바스크립트를 맞이하기 위한 기본 코드를 받아온다
정적인 코드면 그냥 고정해두면 되는 거 아닌가? 왜 요청응답을 하도록 설계했을까
흠 그렇다고 한다 역시 어렵다
아 그리고 그럼 전체적인 프로우는 어떻게 되는건지도 궁금해졌다..
역시 지피티는 대단하다
출처
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 강의 | 김영한 - 인프런
김영한 | , 원리를 알아야 핵심이 보인다!김영한의 스프링 MVC 기본편 👨💻 📌 수강 전 확인해주세요! 본 강의는 자바 스프링 완전 정복 시리즈의 네 번째 강의입니다. 우아한형제들 최연소
www.inflearn.com