웹 애플리케이션 서버 : HTTP 기반 (WAS)
HTTP 기반으로 동작
웹 서버는 정적 리소스, WAS는 프로그램 코드를 실행해 애플리케이션 로직 실행
- 동적 HTML, HTTP API(JSON)
- 서블릿, JSP, 스프링 MVC
예) 톰캣, Jetty, Undetow
클라이언트가 Http 요청을 보내면
웹 서버가 요청한 정보의 http 응답을 하는 방식으로 실행된다.
웹 시스템 구성 - WAS, DB
WAS는 정적 리소스, 애플리케이션 로직 모두 제공 가능하지만
WAS가 너무 많은 역할을 담당해 서버 과부하가 우려된다.
단점 및 보완방법
- 애플리케이션 로직이 동작하는 WAS 서버는 잘 죽는다.
- 가장 비싼 애플리케이션 로직이 정적 리소스 때문에 수행이 어려울 수 있음
정적 리소스만 제공하는 웹 서버는 잘 죽지 않는다.
WAS 장애시 오류 화면도 노출 불가능하기 때문에 정적 리소스는 웹서버가 처리한다.
WAS는 애플리케이션 로직 처리를 전담한다
장점
효율적인 리소스 관리가 가능하다
정적 리소스가 많이 사용되면 웹서버 증설
애플리케이션 리소스가 많이 사용되면 WAS 증설
- 정적 리소스만 제공하는 웹 서버는 잘 죽지 않음
- 애플리케이션 로직이 동작하는 WAS 서버는 잘 죽음
- WAS, DB 장애시 WEB 서버가 오류 화면 제공 가능
웹 애플리케이션 서버를 직접 구현하기 위해
서블릿을 지원하는 WAS 사용
서블릿
1. 웹 브라우저에서 요청을 하면 url이 호출되면서 서블릿 코드가 실행
2. 생성된 요청 메세지 기반으로 request, response 객체 생성
3. http 응답 정보를 사용하는 HttpServletRequest
4. http 응답 정보를 제공하는 HttpServletResponse
서블릿 컨테이너
- 톰캣처럼 서블릿을 지원하는 WAS
- 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
- 서블릿 객체는 싱글톤으로 관리
- 객체를 하나만 만든다.
- 고객의 요청이 올 때 마다 계속 객체를 생성하는 것은 비효율적이다.
- 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용한다.
- 모든 고객의 요청사항은 동일한 서블릿 객체 인스턴스에 접근한다.
- 공유 변수 사용 주의
- 서블릿 컨테이너 종료시 함께 종료
- JSP도 서블릿으로 변환 되어 사용
- 동시 요청을 위한 멀티 쓰레드 처리 지원
쓰레드
애플리케이션 코드를 하나하나 순차적으로 실행하는 것은 쓰레드
자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행
쓰레드가 없다면 자바 애플리케이션 실행이 불가능
쓰레드는 한번에 하나의 코드 라인만 수행
동시 처리가 필요하면 쓰레드를 추가로 생성
클라이언트 요청 -> 쓰레드 요청 -> 서블릿 실행
요청마다 쓰레드 생성의 장단점
장점 | 단점 |
동시 요청을 처리할 수 있다 | 고객의 요청이 올때마다 쓰레드를 생성하면 응답 속도가 늦다 |
리소스(CPU, 메모리)가 허용할 때 까지 처리가능 | 쓰레드는 컨텍스트 스위칭 비용이 발생한다 |
하나의 쓰레드가 지연 되어도 나머지 쓰레드는 정상 동작 | 쓰레드 생성에 제한이 없다. |
고객 요청이 너무 많이 오면 CPU, 메모리 임계점을 넘어 서버가 죽는다 |
쓰레드 풀
요청마다 쓰레드 생성의 단점 보완
특징
필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다
쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다. 톰캣은 최대 200개 기본 설정 (변경 가능)
사용
쓰레드가 필요하면 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내 사용한다.
사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납한다
최대 쓰레드가 모두 사용중이라 쓰레드 풀에 쓰레드가 없으면
기다리는 요청은 거절당하거나 특정 숫자만큼 대기하도록 설정할 수 있다
장점
쓰레드가 미리 생성되어있으므로 쓰레드를 생성하고 종료하는 비용이 절약되고 응답 시간이 빠르다
생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리된다
WAS의 멀티 쓰레드 지원
멀티 쓰레드에 대한 부분은 WAS가 처리
개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨
개발차는 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드 개발
멀티 쓰레드 환경이므로(서블릿, 스프링빈) 주의해서 사용
HTML
동적으로 필요한 HTML 파일을 생성해서 전달
웹 브라우저 HTMl 해석
HTML이 아니라 데이터 전달
주로 JSON 형식 사용
다양한 시스템에서 호출
웹 브라우저 -> was (db) -> db
HTTP API
다양한 시스템에서 호출
데이터만 주고 받음. UI화면이 필요하면 클라이언트가 별도 처리
앱, 웹 클라이언트, 서버간 통신
주로 JSON 형태로 데이터 통신
- UI 클라이언트 접점
- 앱 클라이언트(아이폰, 안드로이드, PC)
- 웹 브라우저에서 자바스크립트를 통한 HTTP API 호출
- REACT, VUE.js같은 웹 클라이언트
서버 to 서버
- 주문 서버 -> 결제 서버
- 서버간 리소스 통신
서버사이드 렌더링 - SSR
서버에서 최종 HTML을 생성해 클라이언트에 전달
동적으로 실행
클라이언트 사이드 렌더 - CSR
HTML 결과를 자바스크립트를 사용해 웹브라우저에서 동적으로 생성하여 적용
주로 동적인 화면에 사용, 웹 환경을 마치 앱처럼 필요한 부분부분 변경 가능
예) 구글 지도, Gmail, 구글 캘린더
관련기술: React, Vue.js
'CS > SPRING' 카테고리의 다른 글
JPQL과 SQL의 차이점 (0) | 2024.08.12 |
---|---|
JPA의 영속성 컨텍스트 (0) | 2024.08.12 |
JPA를 사용한 간단한 CRUD 구현 (0) | 2024.08.12 |
serviceImpl 을 사용하는 이유 (1) | 2024.07.23 |
JPA (0) | 2024.06.28 |