Search
Duplicate

[Spring MVC] 웹 애플리케이션 이해

속성 1
1
태그
네트워크
속성
2022/05/19 06:11
속성 2
2023/12/10 11:48
속성 3
목차

웹 서버, 웹 애플리케이션 서버

웹 서버(Web Server)

HTTP 기반으로 동작
정적 리소스 제공, 기타 부가기능
정적(파일) HTML, CSS, JS, 이미지, 영상
예) NGINX, APACHE

웹 애플리케이션 서버(WAS - Web Apllication Server)

HTTP 기반으로 동작
웹 서버 기능 포함 + (정적 리소스 제공 기능)
프로그램 코드를 실행해서 애플리케이션 로직 수행
동적 HTML, HTTP API(JSON)
서블릿, JSP, 스프링 MVC
예) 톰캣(Tomcat)Jetty, Undertow

웹 서버, 웹 애플리케이션 서버(was) 차이

웹 서버는 정적 리소스를 제공, WAS는 애플리케이션 로직으로 동적으로 정보를 제공
사실은 둘의 용어도 경계도 모호함
웹 서버도 프로그램을 실행하는 기능을 포함하기도 함
웹 애플리케이션 서버도 웹 서버의기능을 제공함
자바는 서블릿컨테이너 기능을 제공하면 WAS
서블릿 없이 자바코드를 실행하는 서버프레임워크도 있음
WAS는 애플리케이션 코드를 실행하는데 더 특화

웹 시스템 구성 - WAS, DB

WAS, DB 만으로 시스템 구성 가능
WAS는 정적 리소스,애플리케이션 로직 모두 제공 가능

웹 시스템 구성 -WAS, DB

WAS가 너무 많은 역할을 담당, 서버 과부하 우려
가장 비싼 애플리케이션 로직이 정적 리소스 때문에 수행이 어려울 수 있음
WAS 장애시 오류 화면도 노출 불가능

웹 시스템 구성 - WEB, WAS, DB

동작 순서
정적 데이터 WEB서버에서 처리 ⇒ 동적 화면, 로직 WAS 처리 ⇒ DB접근 순으로 실행 된다.
장점
정적 리소스는 웹 서버가 처리
웹 서버는 애플리케이션 로직같은 동적인 처리가 필요하면 WAS에 요청을 위임
WAS는 중요한 애플리케이션 로직 처리 전담

웹 시스템 구성 - WEB, WAS, DB

효율적인 리소스 관리
정적 리소스가 많이 사용되면 Web 서버 증설
애플리케이션 리소스가 많이 사용되면 WAS 증설

웹 시스템 구성 - WEB, WAS, DB

정적 리소스만 제공하는 웹 서버는 잘 죽지 않음
애플리케이션 로직이 동작하는 WAS 서버는 잘 죽음
WAS, DB 장애시 WEB 서버가 오류 화면 제공 가능

서블릿

HTML FORM 데이터 전송

POST 전송 - 저장
웹브라우저에서 POST 방식으로 위와 같이 전송하게 되면 클라이언트에서는 POST 방식의 /save경로에 content-Type:apllication/x-www……username=kin&age=20 이라는 것으로 보내게 된다.

서버에서 처리해야 하는 업무

웹 애플리케이션 서버 직접 구현
만약에 우리가 WAS를 구현하게 된다면, 직접 구현해야 된다. 그렇다면 어떻게 해야 될까?
1.
웹 브라우저가 생성한 요청 http 메시지를 다 분석& 분리해야된다.
2.
서버 TCP/IP 연결 대기, 소켓 연결
3.
요청메시지를 잘라서 파싱을 한다.
4.
POST 방식인지, /save URL 확인 후 파싱
5.
Content-type 확인 후 파싱
6.
저장 프로세스 실행
7.
비지니스 로직 실행
a.
데이터베이스에 저장 요청
8.
HTTP 응답 메시지 생성 시작
a.
HTTP 시작 라인 생성
b.
Header 생성
c.
메시지 바디에 HTML 생서에서 입력
9.
TCP/IP에 응답 전달, 소켓 종료
비지니스 로직은 회원이름, 나이를 갖고 DB에 저장하면 끝나는데, 전단계와 후단계가 너무 많고 복잡해서 전세계 개발자가 모두 똑같은것을 개발하기에 너무 비효율적이다.
그래서 나온것이 Servlet이다. Servlet비지니스 로직을 제외한 모든 것들을 처리 해준다.

서블릿

urlPatterns(/hello)의 URL이 호출되면 서블릿 코드가 실행
HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest
HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse
개발자는 HTTP 스팩을 매우 편리하게 사용 할 수있다.
1.
웹 브라우저에서 서버에 요청(localhost:8080/hello)
2.
웹 애플리케이션 서버에서 request, response 생성
3.
서블릿 컨테이너에서 우리가 만든 helloServlet을 실행 해준다.
4.
helloServlet을 종료한 후 이전에 만든 response 객체를 바탕으로 응답메세지를 만든다 .
5.
웹 브라우저에 응답 메시지를 전달해 준다.

서블릿 컨테이너

서블릿을 지원하는 WAS 안에는 서블릿 컨테이너가 존재.
서블릿 객체를 서블릿 컨테이너가 생성, 호출, 생명주기도 자동으로 관리 해준다.

서블릿

서블릿 컨테이너
톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 함
서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
서블릿 객체는 싱글톤으로 관리
객체를 1개만 생성하고 공유해서 사용하는 것, 모두다 공유해서 사용한다.
고객 마다 요청이 다르기 때문에 rquest, reponse 객체는 계속 생성 되는 것이 맞다. 그런데 helloServlet은 굳이 계속 생성할 필요가 없다.
최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용
모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근
공유 변수 사용 주의 멤버변수를 사용할때 조심하자!
서블릿 컨테이너 종료시 함께 종료
JSP도 서블릿으로 변환 되어 사용
동시 요청을 위한 멀티 쓰레드 처리 지원
개발자는 멀티 쓰레드에 크게 신경쓰지 않아도 WAS에서 자동으로 관리해 준다.

동시 요청 - 멀티 쓰레드

백엔드 개발자는 멀티 쓰레드가 중요하다. 멀트쓰레드에 대한 개념을 정리하지 못하면 트레픽 많을 때 어떻게 처리해야 될 지 모른다.
클라이언트 요청 ⇒ WAS 연결 ⇒ servlet 호출 ⇒ 응답 순으로 동작한다
그렇다면 도대체 서블릿 객체를 누가 호출하는가? 쓰레드가 호출한다.

쓰레드

프로세서는 프로그램을 실행, 쓰레드는 프로그램 안에서 여러가지로 나뉜다.
애플리케이션 코드를 하나하나 순차적으로 실행하는 것은 쓰레드
자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행
쓰레드가 없다면 자바 애플리케이션 실행이 불가능
쓰레드는 한번에 하나의 코드 라인만 수행
동시 처리가 필요하면 쓰레드를 추가로 생성

다중 요청 - 스레드 하나 사용

사용자 요청이 WAS로 왔는데, 여러가지 이유가 있어서 처리가 지연이 되고 있는 상황 또 다른 사용자의 요청이 왔을 때 하나의 쓰레드를 동시에 작동하게 되면 두 개의 요청이 타임아웃 나면서 오류가 발생한다.

요청 마다 쓰레드 생성

요청이 올 때마다 쓰레드를 생성해 주고, 사용완료 하면 종료 해 준다.
장점
동시 요청을 처리할 수 있다.
리소스(CPU, 메모리)가 허용할 때 까지 처리가능
하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작한다.
단점
쓰레드는 생성 비용은 매우 비싸다.
고객의 요청이 올 때마다 쓰레드를 생성하면, 응답 속도가 늦어진다.
쓰레드는 컨텍스트 스위칭 비용이 발생한다.
컨텍스트 스위치 비용이란 ?
쓰레드가 2개 이상일 때 발생하는 비용으로, CPU가 1개의 코어일 경우 쓰레드가 2개면 동시에 사용 할 수 없다. CPU1개당 처리 쓰레드 순차적으로 1개씩 실행하는데, 이때 다른 쓰레드로 전환 할 때 발생하는 것이 컨텍트 스위칭 비용이다.
쓰레드는 생성에 제한이 없다.
고객 요청이 너무 많이 오면, CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있다.

쓰레드 풀

단점을 해결 하기위해 보통 WA들은 위와 같이 설계를 한다.
1.
요청1 요청이 온다.
2.
쓰레드 풀에 있는 쓰레드를 빌려준다.
3.
요청2 요청이 온다.
4.
쓰레드 풀에 있는 쓰레드를 빌려준다.
5.
쓰레드 풀은 198개의 쓰레드가 존재한다.
6.
요청1, 요청2가 처리가 끝나고 응답이 보내지면 쓰레드는 쓰레드 풀로 다시 채워놓는다.
200개 이상의 고객의 요청이 왔으면, 클라이언트는 대기를 하거나, 또는 거절 할 수 있다.

쓰레드 풀

요청 마다 쓰레드 생성의 단점 보완
특징
필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다.
쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다. 톰캣은 최대 200개 기본 설정(변경 가능)
사용
쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용한다.
사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납한다.
최대 쓰레드가 모두 사용중이어서 쓰레드 풀에 쓰레드가 없으면?
기다리는 요청은 거절하거나 특정 숫자만큼 대기하도록 설정할 수 있다.
장점
쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용(CPU)이 절약되고, 응답 시간이 빠르다.
생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.

WAS의 멀티 쓰레드 지원

핵심
멀티 쓰레드에 대한 부분은 WAS가 처리
개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨
개발자는 마치 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발
멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용

HTML, HTTP API, CSR, SSR

정적 리소스

고정된 HTML 파일, CSS, JS, 이미지, 영상 등을 제공
주로 웹 브라우저

HTML 페이지

동적으로 필요한 HTML 파일을 생성해서 전달
웹 브라우저: HTML 해석

HTTP API

HTML이 아니라 데이터를 전달
주로 JSON 형식 사용
다양한 시스템에서 호출

HTTP API

다양한 시스템에서 호출
데이터만 주고 받음, UI 화면이 필요하면, 클라이언트가 별도 처리
앱, 웹 클라이언트, 서버 to 서버

서버사이드 렌더링, 클라이언트 사이드 렌더링

SSR - 서버 사이드 렌더링
HTML 최종 결과를 서버에서 만들어서 웹 브라우저에 전달
주로 정적인 화면에 사용
관련기술: JSP, 타임리프 → 백엔드 개발자
CSR - 클라이언트 사이드 렌더링
HTML 결과를 자바스크립트를 사용해 웹 브라우저에서 동적으로 생성해서 적용
주로 동적인 화면에 사용, 웹 환경을 마치 앱 처럼 필요한 부분부분 변경할 수 있음
관련기술: React, Vue.js → 웹 프론트엔드 개발자
참고
React, Vue.js를 CSR + SSR 동시에 지원하는 웹프레임워크도 있음
SSR을 사용하더라도 자바스크립트를 사용해서 화면 일부를 동적으로 변경 가능