목차
1. 웹 서버, 웹 애플리케이션 서버
웹 서버(Web Server)
특징
- 웹 클라이언트의 요청을 받아서 처리하고, 그 결과를 웹 클라이언트에게 전달한다.
- 주로 정적 페이지 HTML, CSS, JS 등을 제공할 때 이용된다.
- 동적 처리가 필요할 땐 웹 애플리케이션 서버에 처리를 넘긴다.
웹 애플리케이션 서버(WAS)
특징
- 웹 서버로부터 동적 페이지 요청을 받아 요청을 처리하고, 그 결과를 웹 서버로 반환한다.
- 주로 동적 페이지 생성을 위해 사용된다.
웹 시스템 구성 모형
웹 서버, 웹 애플리케이션 서버의 차이
- 웹 서버는 정적 리소스, WAS는 애플리케이션 로직(동적)
- 둘의 경계가 모호하긴 함, 웹 서버도 프로그램을 실행하는 기능을 제공함 ,웹 애플리케이션 서버도 웹 서버의 기능을 제공함
- 자바는 서블릿 컨테이너 기능을 제공하면 WAS
- WAS 애플리케이션 코드를 실행하는데에 더 특화 되어 있다.
웹 서버, 웹 애플리케이션 서버를 구분한 이유
1. WAS 혼자 너무 많은 역할을 담당하면, 서버 과부하의 우려가 있기 때문이다.
2. 가장 비싼 애플리케이션 로직이 정적 리소스 때문에 수행에 어려움이 있을 수 있기 때문이다.
3. WAS 장애시 오류 화면도 노출 불가능하기 때문이다.
4. 역할을 구분하여 효율적으로 리소스를 관리할 수 있기 때문이다.
(정적 리소스가 많이 사용되면 Web 서버 증설, 동적 리소스가 많이 사용되면 WAS 증설)
2. 서블릿
개념
http를 동작하는 데에 있어 웹 애플리케이션 서버를 직접 구현하기엔 너무 복잡하여 등장한 것이 바로 서블릿이다.
간단히 말해 아래와 같이 의미있는 비지니스 로직만 구현할 수 있게 해주는 것이다.
JAVA 서블릿 코드 예시
서블릿 HTTP 요청, 응답 흐름
HTTP 요청 시 아래와 같이 동작한다.
- WAS는 Request, Response 객체를 새로 만들어 서블릿 객체를 호출한다.
- 개발자가 Request 객체에서 HTTP 요청 정보를 쉽게 꺼내 사용할 수 있다.
- 개발자가 Response 객체에 응답 정보를 편리하게 입력할 수 있다.
- WAS는 Response 객체에 담긴 내용으로 HTTP 응답 정보를 생성한다.
서블릿 컨테이너
1. 톰켓처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
2. 서블릿 컨테이너는 서블릿 객체를 생성, 초기화 하는 등 생명주기를 관리해준다.
3. 서블릿 컨테이너는 싱글톤으로 관리한다.
4. 최초 로딩 시점에 서블릿 객체를 미리 만들어 재활용한다.
5. 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근한다.
6. 동시 요청을 위한 멀티 쓰레드 처리도 지원한다.
3. 동시 요청 - 멀티 쓰레드
쓰레드
- 애플리케이션 코드를 하나하나 순차적으로 실행하는 것을 쓰레드라고 한다.
- 자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행되는 것이다.
- 쓰레드 없으면 자바 애플리케이션을 실행할 수 없다.
- 동시 처리가 필요하면 쓰레드를 추가로 생성해야 한다.
단일 쓰레드의 문제점
위에 설명했던 서블릿을 실행하는 주체는 쓰레드이다. 따라서 요청이 오면 쓰레드가 서블릿을 실행한다. 하나의 스레드만 있다면 여러 요청이 왔을 때 어떻게 해야할까? 예를 들어 요청1를 처리하다 지연된 경우, 요청2까지 처리하지 못하는 문제가 발생한다.
요청마다 쓰레드 생성하기
장점
- 동시 요청 처리 가능하다.
- 리소스(CPU, 메모리)가 허용할 때까지는 처리가 가능하다.
- 하나의 쓰레드가 지연되어도, 나머지 쓰레드는 정상 동작한다.
단점
- 쓰레드는 생성 비용이 매우 비싸다.
- 쓰레드는 컨텍스트 스위칭 비용이 발생한다.
- 쓰레드 생성에 제한이 없어, 고객 요청이 임계점을 넘어서면 서버가 죽을 수 있다.
쓰레드 풀
특징
- 필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다.
- 쓰레드 풀에 생성 가능한 쓰레드의최대치를 관리한다. 톰캣은 최대 200개 기본 설정(변경 가능)
사용
- 쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용한다.
- 사용을 종료하면 쓰레드를 쓰레드 풀에 반납한다.
- 쓰레드 풀의 쓰레드가 모두 사용 중일 때, 기다리는 요청은 거절하거나, 특정 숫자만큼만 대기하도록 설정할 수 있다.
장점
- 쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성,종료하는 비용이 절약되고, 응답 시간이 빠르다.
- 생성 가능한 최대 치가 있으므로, 기존 요청은 안전하게 처리가 가능하다.
쓰레드 풀 실무 팁
- WAS 최대 쓰레드를 너무 낮게 설정하면 서버 리소스는 여유롭겠지만, 클라이언트는 응답 지연을 받을 확률이 커진다.
- 너무 높게 설정해도, 리소스 임계점 초과로 서버가 다운될 수 있다.
클라우드면 일단 서버부터 늘리고, ,이후에 튜닝하면되지만, 클라우드가 아니면 열심히 평상시에 튜닝해야한다..
WAS의 멀티 쓰레드 지원
멀티 쓰레드 부분을 WAS가 처리해주어, 개발자는 멀티 쓰레드 관련 코드를 신경쓰지 않아도 된다. 마치 싱글 쓰레드 프로그래밍을 하듯 편하게 소스 코드를 개발할 수 있다. 하지만 스프링 빈 등은 싱글톤 객체이기 때문에, 공유되는 멤버 변수 등을 신경써주어야 한다.
4. HTML, HTTP API, CSR, SSR
HTML
정적 리소스로 고정된 HTML 파일을 웹 서버가 웹 브라우저에게 전달하거나, WAS가 DB에서 정보를 가져와 웹 브라우저에게 HTML을 전달해준다.
HTTP API
API
애플리케이션이 어떤 프로그램이 제공하는 기능을 사용할 수 있게 한 매개체
서버에서 제공하고자 하는 데이터나 기능을 API로 만들면, 접근 권한이 있는 프로그래머나, 프로그램이 API를 톹ㅇ해 서버에서 제공하는 데이터를 요청해서 사용할 수 있다.
HTTP API
HTTP를 사용하여 프로그램끼리 소통하는 API
데이터(대부분 JSON)만 주고받으며, UI 화면이 필요하면, 클라이언트가 별도로 처리한다.
SSR - 서버 사이드 렌더링
서버에서 HTML까지 생성하여 웹 브라우저에 전송하는 것.
- 주로 정적인 화면에 사용한다.
- JSP, 타임리프 -> 백엔드 개발자
CSR - 클라이언트 사이드 렌더링
HTML 결과를 자바스크립트를 사용해서 웹 브라우저에서 동적으로 생성하여 적용하는 것.
- 주로 동적인 화면에 사용
- React, Vue.js -> 웹 프론트 개발자
5. 자바 웹 기술 역사
역사
서블릿 - 1997
JSP - 1999
서블릿, JSP 조합 MVC 패턴 사용
MVC 프레임 워크 춘추 전국 시대 - 2000년~2010년 초
현재 사용 기술
어노테이션 기반의 스프링 MVC 등장 후 춘추 전국 시대 마무리
스프링 부트 등장
본 포스팅은 김영한님의 스프링MVC 강의를 기반으로 작성하였습니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'백엔드 > Spring' 카테고리의 다른 글
[Spring] 서블릿, MVC 패턴 (0) | 2022.06.10 |
---|---|
[Spring] 서블릿 (0) | 2022.06.09 |
[Spring] @RequestMapping 에 대하여 (0) | 2022.05.30 |
[Spring] 스프링 생명주기와 초기화, 종료 콜백 (0) | 2022.05.18 |
[Spring] 스프링 의존관계 주입 방식의 종류와 생성자 주입 방식을 사용해야 하는 이유 (0) | 2022.05.03 |