김영한님의 스프링 MVC 1편 강의를 듣고 정리하는 글입니다
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
1. 웹서버와 웹 애플리케이션 서버
a. 웹 서버(Web Server)란?
- HTTP 기반으로 동작
- 정적 리소스(HTML, CSS, JS, 이미지, 영상 등)를 제공
- ex) NGINX, APACHE
b. 웹 애플리케이션 서버(WAS : Web Application Server)
- HTTP 기반으로 동작
- 웹 서버 기능 + 애플리케이션 로직 수행
- 동적 HTML, HTTP API(JSON, XML)
- 서블릿, JSP, 스프링 등 프레임워크 기술 사용
- ex) 톰캣, Jetty, Undertow
c. 웹 시스템 구성
1. WAS + DB
WAS는 정적 리소스와 애플리케이션 로직을 모두 수행할 수 있기 때문에 WAS와 DB만으로 웹 시스템을 구성할 수 있다.
하지만, WAS가 가장 비싼 애플리케이션 로직을 수행하는 동시에 정적 리소스를 제공하기에는 과부하가 발생할 수 있다.
WAS 외 클라이언트에 리소스를 제공할 수 없기 때문에 WAS가 죽어버리면 오류 화면도 제공할 수 없다.
2. Web Server + WAS + DB
정적 리소스는 Web Server가 처리하도록 하여 WAS의 부담을 줄여주고, WAS + DB만을 가지고 웹 시스템을 구성하면서 발생할 수 있는 문제를 해결할 수 있다. 정적 리소스가 요청이 많으면 Web Server를 증설하고, 애플리케이션 리소스(동적 리소스)에 요청이 많으면 WAS를 증설할 수 있어, 서버 자원을 효율적으로 관리할 수 있다. 또한 애플리케이션 로직을 담당하는 WAS는 자주 죽기 때문에 WAS가 죽으면 Web Server에서 오류 화면을 제공할 수 있다.
2. 서블릿
a. WAS의 기본 동작 과정
WAS를 구성하고, 클라이언트 특정 정보를 DB에 저장하는 요청을 처리하려면,
- 서버 TCP/IP 연결 대기, 소켓 연결
- HTTP 요청 메시지 파싱해서 읽기
- POST 방식, URL 인지
- HTTP 헤더 내용 확인
- HTTP 메시지 바디 내용 확인
- 저장 프로세스 실행
- 비즈니스 로직 실행
- 데이터 베이스 저장 방식
- HTTP 응답메시지 생성 시작
- HTTP 시작 라인 생성
- 헤더 생성
- 메시지 바디 생성
- TCP/IP 응답 전달, 소켓 종료
이렇게 많은 부분과 HTTP 메시지 파싱과 같은 반복적인 작업을 매번 직접 구현해야해서 코드가 복잡해진다.
하지만, 4, 5(비즈니스 로직)을 제외한 로직은 서블릿이 자동으로 처리해줘서 비즈니스 로직에만 신경쓸 수 있게 되었다.
b. 서블릿 특징
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) {
//애플리케이션 로직
}
}
- urlPatterns의 url(/hello)이 호출되면 서블릿 코드가 실행
- HttpServletRequest: HTTP 요청 정보를 편리하게 사용
- HttpServletResponse: HTTP 응답 정보를 편리하게 제공
c. 서블릿 HTTP 요청, 응답 흐름
- WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체 호출
- Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용
- Response 객체에 HTTP 응답 정보를 편리하게 입력(로직)
- WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보 생성
d. 서블릿 컨테이너
- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 함.
- 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
- 서블릿 객체는 싱글톤으로 관리(매 요청마다 새로 생성하는 것은 효율 ↓)
- JSP도 서블릿으로 변환되어 사용
- 동시 요청을 위한 멀티 스레드 처리지원
e. 동시 요청 - 멀티스레드
싱글스레드 환경에서는 클라이언트가 동시에 '/hello' 요청을 보내면 WAS는 요청을 처리하기 전까지 다른 요청을 처리하지 못한다.(논블로킹 모드에서는 가능은 함.) 그럼 동시에 몇만건씩 요청을 처리해야 한다면, 서비스가 제대로 돌아가지 않을 것이다.
서블릿은 요청마다 스레드를 할당해서 요청을 처리하여 동시 요청을 해결할 수 있다.
하지만 요청마다 스레드를 할당하면서 무조건 좋은 점만 있는건 아니다.
f. 스레드 장단점
장점
- 동시 요청 처리 가능
- 스레드는 독립적으로 실행되어, 나머지 스레드에 영향 X
단점
- 스레드 생성 비용은 매우 비쌈
- 컨텍스트 스위칭 비용 발생(CPU 점유를 위해 경쟁)
- 한정된 리소스(CPU, 메모리)가 허용할 때 까지만 사용 가능(스레드를 많이 생성하면 서버가 죽을 수 있음)
g. 스레드 풀
요청마다 스레드를 생성하면 스레드 생성 비용도 계속 발생하고, 스레드 생성에 제한을 둘 수가 없다. 그래서 나온 개념이 스레드 풀이다.
특징
- 미리 스레드를 생성해놓고 스레드 풀에서 관리하도록 하는 방법이다.
- 톰캣은 최대 스레드 수 200개가 기본(변경 가능)
사용
- 요청마다 스레드를 생성하지 않고 스레드 풀에서 꺼내서 스레드를 사용
- 사용을 종료하면 스레드 풀에 반납
- 스레드 풀의 스레드가 모두 사용중이라면 대기하는데, 대기 요청이 너무 많은 요청을 거절하거나 특정 숫자만큼 대기하도록 설정 가능
장점
- 스레드 생성/종료 비용을 감소시켜 리소스를 효율적으로 사용하고 응답도 빠르다.
- 제한된 스레드 수만큼 사용하니깐 한정된 서버 리소스를 안전하게 사용할 수 있다.
사용 팁
- WAS의 주요 튜닝 포인트는 최대 스레드 수이다.
- 최대 스레드 수가 너무 낮으면 서버의 리소스는 여유롭지만, 수많은 동시 요청을 처리하는데 제한
- 최대 스레드 수가 너무 많은면 서버의 리소스 임계점 초과로 서버가 죽을 수 있음.
- 성능 테스트를 통해 서버 리소스를 확인하면서 적정값을 찾도록 하자.
3. HTML, HTTP, API, CSR, SSR
a. 정적 리소스
- 고정된 HTML 파일, CSS, JS, 이미지, 영상 등을 제공
b. HTML 페이지
- 동적으로 필요한 HTML 파일을 생성해서 전달
- 동적 HTML을 생성할 때 사용되는 기술: JSP, 타임리프 등...
c. HTTP API
- HTML이 아닌 데이터를 전달
- JSON,XML 형식 사용(주로 JSON)
- 데이터만 주면, 화면은 CSR(Client Side Redering)에서 별도 처리
- 다양한 시스템 연동
- 앱 클라이언트와 통신
- 웹 브라우저에서 js를 통한 통신
- React, Vue.js 웹 클라이언트와 통신
- 서버 - 서버 통신
d. SSR(Server Side Rendering)
HTML 최종 결과를 만들어서 웹 브라우저에 전달
주로 정적인 간단한 UI 개발에 사용
주요 기술: JSP, 타임리프
e. CSR(Client Side Rendering)
HTML 결과를 자바스크립트를 사용해 웹 브라우저에서동적으로 생성해서 적용
주로 동적인 UI에 사용 (부분 변경 가능)
주요 기술: React, Vue.js
CSR + SSR 동시에 처리하는 웹 프레임워크도 있음
SSR을 사용하더라도 일부 동적으로 변경 가능
4. 자바 웹 기술 역사
1. 서블릿
- HTML 생성이 어려움
2. JSP
- HTML 생성은 편리하지만 역할이 분리되어 있지 않음
3. 서블릿, JSP 조합 MVC 패턴 사용
- 모델/뷰/컨틀러 역할을 나누어 개발
4. MVC 프레임워크 춘추전국시대
- 무수히 많은 MVC 웹 프레임워크 등장
5. 애노테이션 기반 스프링 MVC 등장 (현재 사용)
6. 스프링 부트 (현재 사용)
스프링 + 내장 톰캣
배포 시 WAR로 배포하지 않고 JAR(톰캣 포함)해서 배포
7. Web Reactive - Spring WebFlux (최신 기술)
- 비동기, 논블로킹 처리
- 최소 스레드로 최대 성능 - 스레드 컨텍스트 스위치 비용 효율화
- 함수형 스타일로 개발 - 동시처리 코드 효율화
- 서블릿 기술 사용 x (Netty 기반 프레임워크 사용 - 변경 가능)
- 기술적 난이도가 있음
- 아직 RDB에서 지원 부족
'Programming > Spring' 카테고리의 다른 글
[Spring] 스프링 MVC 1편(서블릿, JSP MVC 패턴) (1) | 2024.02.27 |
---|---|
[Spring] 스프링 MVC 1편(서블릿) (0) | 2024.02.02 |
[Spring] 웹 스코프란? (1) | 2024.01.11 |
[Spring] 싱글톤과 프로토타입 스코프 (1) | 2024.01.10 |
[Spring] 스프링 컨테이너가 빈을 등록하는 방법 (1) | 2024.01.10 |