일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- C#강의
- Python
- 1일1솔
- deque
- appendleft
- spring
- 인프런
- JPA
- 프로그래머스
- Java
- 완전탐색
- 우선순위큐
- unity
- popleft
- 누적합
- LCM
- 파이썬
- DP
- python3
- mvc
- 소수판별
- 연관관계
- BFS
- 그리디 알고리즘
- 소수찾기
- pypy3
- 합 구하기
- c#
- 백준
- 브루투포스
- Today
- Total
jae_coding
[Web MVC] 웹 애플리케이션 이해 본문
본 리뷰는 인프런 김영한님의 스프링 MVC 리뷰를 한 포스팅입니다.
목차
- 웹 서버, 웹 애플리케이션 서버
- 서블릿
- 동시 요청 (멀티 쓰레드)
- HTML, HTTP API, CSR, SSR
1. 웹 서버, 웹 애플리케이션 서버
-. Web은 HTTP를 기반으로 접근, 클라이언트에서 데이터 전송 및 응답을 할 때, HTTP 라는 프로토콜로 동작을 한다.
-. 현재 모든 것이 HTTP라는 메시지에 모든 것을 전송합니다.
- HTML, TEXT, IMAGE, 음성, 영상, 파일
- JSON, XML (API)
- 서버 간 데이터를 전송 및 응답할 때, HTTP를 사용한다.
-. Web서버: HTTP를 기반으로 동작하는 서버
- 정적 리소스(특정 폴더에 파일을 두면 서버가 파일들을 서빙해주는 것) 제공, 기타 기능
- 정적 파일: HTML, CSS, JS, IMAGE, 영상 '
-. Web 애플리케이션 서버 (WAS: Web Application Server): 애플리케이션 로직을 사용할 수 있는 서버
- HTTP를 기반으로 동작하는 서버
- 프로그램 코드를 실행해서 애플리케이션 로직 수행(사용자명, 사용자 특성이 사용가능하다.)
- Rest API제공
- 서블릿, JSP, 스프링 MVC
- 예) 톰캐스, Jetty, Undertow
-. 차이점
- 웹 서버: 정적 리소스(파일)
- WAS: 애플리케이션 로직을 사용할 수 있음.
-. 실무에서의 용도
웹 시스템 구성: WAS, DB
1) WAS는 정적 리소스, 애플리케이션 로직을 사용이 가능하다. (동적으로 파일생성가능)
2) WAS가 너무 많은 역할을 담당하기에 서버 과부하를 우려할 수 있다.
3) 가장 비싼 애플리케이션 로직이 정적 리소스때문에 수행이 어려울 수 있다.
4) WAS장애시 오류가 나는 화면이 노출이 불가능할 수 있다.
웹 시스템 구성: WAS, DB, Web
1) 정적인 리소스는 Web서버가 처리하도록 만들어준다.
2) 웹 애플리케이션 로직 등 동적 리소스 처리가 필요하다면 WAS에서 처리한다.
3) 그러면 WAS, DB만으로 구성된 웹 애플리케이션의 단점을 보완할 수 있다.
4) 시스템 리소스를 효율적으로 이용할 수 있다.
- 정적 리소스가 많이 사용된다면 Web서버 증설
- 애플리케이션 리소스가 많으면 WAS서버 증설
5) 정적 리소스만 제공하는 웹 서버는 과부하가 일어날 일이 별로 없고, 애플리케이션 로직이 실제로 필요한 WAS서버는 과부하가 일어날 수 있다. 이는 WAS서버 과부하가 일어나더라도 웹서버가 오류 화면을 제공할 수 있다.
2. 서블릿
서블릿이란?
의미있는 비지니스로직을 제외한 반복되는 로직을 구현을 해주는 것이다.
*반복되는 로직: 서버 TCP/IP 대기, 소켓연결, HTTP 요청 메시지를 파싱해서 읽기, POST방식, /save URL인지,
Content-Type확인, HTTP 메시지 바디 내용 파싱, 응답 메시시 생성, TCP/IP에 응답전달, 소켓 전달
- url(/hello)의 URL이 호출되면 서블릿 코드가 실행
- HttpServletRequest와 HttpServletResponse 등 요청정보를 제공
예제
가정) 서버: localhost:8080, /hello 요청
1) WAS 서버에서 request response 객체를 파라미터로 넘긴다.
2) 서블릿 실행
3) 서블릿을 통한 response return값으로 HTTP응답 메시지를 만든다.
4) 웹 브라우저에 응답메시지 전달 완료
5) 웹브라우저가 렌더링하여 우리들에게 보여주는 웹사이트 출력
서블릿 컨테이너
- 서블릿 컨테이너:톰켓처럼 서블릿을 지원하는 WAS
- 서블릿 객체 생성, 초기화, 호출, 종료하는 생명주기 관리
- 싱글톤을 통하여 관리
-. client가 요청이 올 때마다 객체를 생성하는 것은 비효율적이다.
-. 최초 로딩 시점에 서블릿 객체를 미리 만들어 놓는다.
-. 같은 서버라면 동일한 서블린 인스턴스에 접근
-. 공유 변수를 사용하는 것을 주의하여야한다. (싱글톤 특징)
-. 서블릿 컨테이너가 종료시에 함께 종료된다.
- 동시 요청을 위한 멀티쓰레드를 지원한다.
3. 동시 요청 (멀티 쓰레드)
서블릿을 호출하는 객체? 쓰레드!
쓰레드: 애플리케이션 코드를 순차적으로 실행하는 것이다.
다중요청이 있을 때, 쓰레드가 1개만 사용하는 것이라면 지연이 일어난다. (지연 or 타임아웃이 일어난다)
이를 해결하기 위해서 요청마다 쓰레드를 생성해야한다. (멀티 쓰레드 사용)
멀티쓰레드의 장단점
장점
- 동시 요청 처리가능
- 리소스가 허용할 때까지 처리가능
- 쓰레드 하나가 지연되어도 나머지는 정상동작
단점
- 쓰레드의 생성비용이 매우 비싸다.
- 컨텍스트 스위칭 비용이 발생한다.
- 쓰레드 생성에 제한이 없다. (CPU, Memory가 너무 많이 먹어 서버의 과부하가 일어날 수 있다)
쓰레드 제한이 없기때문에 서버의 과부하가 일어날 수 있기때문에 이를 제한하기위해서 쓰레드 풀을 적용해야한다.
쓰레드 풀의 크기를 200이라고 가정한 Diagram
쓰레드 풀
특징
-. 필요한 쓰레드를 쓰레드 풀에 보관하여 관리한다.
-. 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다. (톰켓: 최대 200개 기본설정)
장점
-. 쓰레드가 미리 생성되어 있으므로, 생성 및 종료 비용이 절약되고, 응답 시간이 빠르다.
-. 최대치가 있기때문에 너무 많은 요청이 들어와도 기존 요청이 안전하게 처리될 수 있다.
실무 팁
-. 최대 쓰레드가 너무 낮게 설정하면 동시 요청이 많을 때, 서버 리소스는 여유롭지만, 클라이언트는 금방 지연 응답한다.
-. 너무 높게 설정한다면 임계값 초과로 인하여 서버가 과부하될 수 있다.
-. 장애 발생 시, 클라우드면 서버를 늘리고 튜닝한다. 클라우드가 아니라면 튜닝을 열심히 해야한다.
-. 적정 숫자: CPU, 메모리, 리소스 상황에 따라 다르기때문에 성능 테스트를 해보아야한다.
성능테스트 툴: 아파치 ab, 제이미터, nGrinder 추천
4. HTML, HTTP API, CSR, SSR
정적 리소스
-. 고정된 HTML, CSS, JS, IMAGE, etc. 제공
HTML
-. 동적으로 필요하 HTML파일을 생성해서 전달한다.
-. 웹 브라우저: HTML을 해석한다.
HTTP API
-. HTML을 단순하게 전달하는 것이 아닌 데이터를 전달해준다.
-. 주로 JSON형식의 데이터를 사용한다.
-. 데이터를 다양한 시스템에서 호출한다. (데이터만 주고받거나 UI화면이 필요하면 클라이언트가 별도로 처리함)
-. 앱, 웹(브라우저: JS, 클라이언트: React or Vue.js, etc.), 서버 to 서버
고민해야할 점? 3가지이다.
백엔드의 입장: 정적 리소스 제공, 동적으로 제공되는 HTML 제공, HTTP API 제공에 대한 고민을 해야한다!!!
SSR (Server Side Rendering) - Back-end
웹 브라우저에서 서버에 요청을 하면 DB를 조회하여 JSP나 타임리프를 이용하여 동적으로 렌더링 후 HTML 코드를 전달하여 클라이언트에서 보여준다. (서버에서 모두 완료)
-. HTML 최종 결과물을 서버에서 만들어서 웹 브라우저에 전달한다.
-. 주로 정적인 화면에 사용된다.
CSR (Client Side Rendering) - Front-end
웹 브라우저는 서버에서 요청을 하는 것은 SSR과 동일하다. HTML을 서버에서 응답하지만 내용은 없다. 대신에 JS링크를 요청한다. JS코드 안에는 클라이언트 로직과 어떻게 렌더링할지에 대한 로직을 서버에 전달한다. 그러면 JSON 파일로 서버에서 웹브라우저에 전달하여준다. 그렇게되면 동적으로 HTML코드를 만들어 클라이언트에게 보여줄 수 있다.
-. 클라이언트에서 동적으로 생성해서 적용한다.
-. 주로 동적인 화면에 사용하며 웹 환경을 앱처럼 필요한 부분을 변경할 수 있다.
'Spring, java > Spring_MVC' 카테고리의 다른 글
[Web MVC] Spring MVC 구조이해 (0) | 2022.08.31 |
---|---|
[Web MVC] MVC 프레임워크 만들기 (0) | 2022.08.31 |
[Web MVC] MVC 패턴 (0) | 2022.08.31 |
[Web MVC] 서블릿, JSP로 회원관리 애플리케이션 만들기 (0) | 2022.08.30 |
[Web MVC] 서블릿 (0) | 2022.08.30 |