인프런 - 스프링 MVC 김영한님 강의를 정리한 내용
출저: 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의
1️⃣ 웹 애플리케이션
웹에서 데이터를 주고받을 때 거의 HTTP 프로토콜을 사용.
웹 서버
- HTTP 기반으로 동작
웹 애플리케이션 서버
- 웹 서버의 기능을 포함 + 프로그램 코드를 실행해서 애플리케이션 로직 수행
- 동적 HTML 제공, HTTP API 제공
웹 서버 | WAS |
정적 리소스 제공 | + 애플리케이션 로직까지 실행 가능 |
(자바) 서블릿 컨테이너 기능을 제공 |
간단한 웹 시스템 구성 = WAS & DB
but, WAS 가 너무 많은 역할을 담당
- 서버 과부하 우려
- 정적 리소스 때문에 애플리케이션 로직 수행이 어려움
- WAS에 장애 발생 > 웹에 접근 자체가 안됨, 오류 화면도 노출시킬 수 없다.
일반적인 웹 시스템 구성 = WEB, WAS, DB
웹 서버가 정적 리소스를 처리, 동적 처리는 WAS 에 넘긴다.
WAS는 애플리케이션 로직 만 담당
- 시스템 리소스를 효율적으로 관리 가능
- 정적 리소스 사용이 많을 경우 > 웹 서버 증설 / 동적 처리 많을 경우 > WAS 증설
- 오류 발생 시 웹 서버가 오류 화면 제공
- 웹 서버에선 장애가 잘 발생하지 않음
2️⃣ 서블릿
HTTP 요청, 응답을 편하게 파싱하고 생성할 수 있게 해 준다.
@WebServlet(name="helloServlet", urlPatterns="/hello)
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) {
// 애플리케이션 로직
}
}
- HttpServletRequest: HTTP 요청 정보를 쉽게 파싱 할 수 있게 서블릿이 제공
- HttpServletResponse: HTTP 응답 메시지를 편리하게 생성할 수 있도록 서블릿 제공
HTTP 요청 응답 흐름
- 웹 브라우저가 url로 요청
- WAS에서 요청 메시지 기반으로 request, response 객체 생성 생성한 request, response 객체를 넘기면서 서블릿 객체를 실행
- 서블릿이 response 객체 반환
- WAS 가 response 객체 정보로 HTTP 응답 생성 후 웹 브라우저에 반환
서블릿 사용 시 HTTP 요청이 들어오면
- WAS가 Request, Response 객체를 새로 만들어서 서블릿 객체를 호출
- 개발자는 Request 객체에서 HTTP 요청 정보 편리하게 파싱 가능, Reponse 객체에 HTTP 응답 정보를 편리하게 입력 가능
- WAS는 Resonse 객체에 담긴 내용으로 HTTP 응답 정보를 생성
서블릿 컨테이너
- 서블릿을 지원하는 WAS
- 서블릿 객체 생성, 초기화, 호출, 종료 등 생명 주기 관리를 해준다.
- 서블릿 객체는 싱글톤으로 관리
- request, response 객체는 요청이 올 때마다 새로 생성 (요청마다 다 다름)
- 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근
- 공유 변수 사용 주의 (멤버 변수)
- 서블릿 컨테이너 종료 시 함께 종료
- 동시 요청을 위한 멀티 쓰레드 처리 지원
- 웹 서버에 동시에 여러 요청이 들어와도 서블릿 컨테이너가 알아서 처리해 줌
3️⃣ 동시 요청 - 멀티 쓰레드 🔥
쓰레드가 서블릿을 호출한다.
timeout으로 둘 다 죽게 된다.
해결 방법
요청이 올 때마다 쓰레드 생성
- 쓰레드 별로 각자 실행 된다 > 한 쓰레드가 지연돼도 나머지 쓰레드는 정상 동작
요청 마다 쓰레드 생성
장점
- 동시 요청 처리 가능
- 리소스가 허용하는 만큼 멀티 쓰레드 처리 가능
- 하나의 쓰레드가 지연돼도 나머지 쓰레드는 정상동작한다.
단점
- 쓰레드 생성 비용은 매우 비쌈
> 고객 요청마다 쓰레드를 생성할 경우 응답 속도가 늦어짐
- 쓰레드는 컨텍스트 스위칭 비용 발생
- 쓰레드 생성에 제한이 없다
> 고객 요청이 너무 많이 들어오면 리소스의 한계를 넘어서 서버가 죽을 수 있다.
💡 콘텍스트 스위칭 CPU가 한 프로세스를 실행하는 과정에서 다른 프로세스를 실행하기 위해서, 스케쥴러가 레지스터에 저장된 기존 콘텍스트를 PCB에 저장하고 새 프로세스의 정보나 상태값을 PCB에 넣어주는 교체 작업
- Context : CPU가 해당 프로세스를 실행하면서 가지는 정보
- PCB (Process control block) : 운영체제에서 프로세스 스케쥴링을 위해 필요한 정보를 저장하는 운영체제 커널의 자료구조
해결 방법
쓰레드 풀에게 쓰레드를 요청
- 풀에 미리 쓰레드를 만들어 둔다
- 사용이 끝나면 쓰레드 풀에 쓰레드 반납
쓰레드 풀에 사용 가능한 쓰레드가 없을 경우 > 새로운 요청이 들어오면 쓰레드 대기 or 거절
실무 팁) 성능 튜닝
WAS의 주요 튜닝 포인트는 최대 쓰레드 (max thread) 수 > 적정 값을 찾아야 함
- 너무 낮을 경우
리소스가 여유로워도 요청이 조금만 많아져도 응답이 지연됨
- 너무 높을 경우
동시 요청이 너무 많아서 CPU, 메모리의 임계점을 초과 > 서버 다운
쓰레드 풀의 적정 숫자를 찾는 방법?
상황에 따라 다름 > 결국 성능 테스트를 해봐야 함
💡 핵심
WAS가 멀티 쓰레드를 지원해준다!! > 개발자가 멀티 쓰레드를 신경 쓸 필요 없다. 싱글톤 객체만 주의해서 사용
4️⃣ HTML, HTTP API, CSR, SSR 용어 정리
백엔드 개발자는 아래 세 가지 방식을 어떻게 제공할지 고민해야 한다.
- 정적 리소스
- 동적 HTML
- HTTP API
HTTP API
- HTML이 아닌 데이터(주로 JSON 형식)를 통신
- 사용 케이스
서버 사이드 렌더링, SSR
서버에서 HTML을 다 만들어서 클라이언트에 전달, 클라이언트는 받은 HTML을 그대로 보여주기만 함
클라이언트 사이드 렌더링 CSR
- 웹 브라우저가 서버에 HTML 요청 > 서버에서 빈 HTML에 자바스크립트 링크만 넣어서 응답
- 웹 브라우저가 서버에 자바스크립트 코드 요청 > 서버로부터 자바스크립트를 받음 코드에 클라이언트 로직, HTML 렌더링 코드를 포함한다.
- 웹 브라우저가 서버에 데이터를 요청 > 웹 서버가 데이터를 조회 후 반환
- 웹 브라우저에서 응답받은 데이터와 자바스크립트 코드로 HTML 생성 & 결과 렌더링
💡 백엔드 개발자가 알아햐는 기술
- 서버 사이드 렌더링
- 서버, DB, 인프라 등 백엔드 기술 위주로 공부하기!!
(웹 프론트 기술을 배울 필요는 없음)
'CS > Backend' 카테고리의 다른 글
[Java] 직렬화, 역직렬화 (0) | 2023.06.25 |
---|---|
[Spring] REST, REST API (0) | 2023.06.23 |
[이슈] Spring boot 프로젝트 실행 시 html 파일을 찾지 못하는 에러, whitelabel error page (0) | 2023.06.13 |
[JAVA] 예외 처리 (0) | 2023.05.28 |
[MySQL] WINDOW 함수 (0) | 2023.05.26 |