[Spring] web app의 이해

노유성·2023년 8월 11일
0

Spring MVC

목록 보기
1/1
post-thumbnail

HTTP

현재 인터넷 상에서 통신하는 대부분의 데이터는 HTTP, HTTPS로 통신을 한다.
HTML/CSS, JS, Image, 음성, 영상 등 모든 데이터는 HTTP를 통해서 통신을 한다고 해도 과언이 아니다.

HTTP 이전에는 FTP를 이용해서 서버와 클라이언트 사이에서 서로 데이터를 주고받았는데 이제는 HTTP를 이용해서도 파일 데이터를 주고받을 수 있다.

Web Server란?

웹서버(Web Server)는 인터넷을 통해 사용자가 웹 브라우저를 통해 웹 페이지를 요청할 때 해당 웹 페이지를 제공하는 소프트웨어나 하드웨어입니다. 웹서버는 클라이언트(웹 브라우저)로부터의 요청을 받아들이고, 요청된 웹 페이지나 파일을 찾아서 해당 내용을 클라이언트에게 전송하는 역할을 수행합니다.
-chatGPT

HTTP 기반으로 동작하며, 정적 리소스를 제공하고 기타 부가기능을 제공한다.
여기서 정적 파일은 파일을 제공하는 서버 측에서 파일에 로직을 부여하지 않고 있는 그대로 파일을 제공하는 것을 의미한다..

WAS란

Web Application Server란 웹 서버에서 동적으로 프로그래밍을 하여 파일 및 데이터를 제공할 수 있는 서버를 의미한다.

요청에 대해서 별다른 로직없이 데이터를 제공하는 웹서버와는 다르게 비즈니스 로직 및 데이터베이스와의 통신 등 비싼 리소스들을 이용해서 데이터를 제공하는 서버이기 때문에 많은 트래픽이 몰릴 때에는 서버에 장애가 생길 수도 있다. 또, WAS가 정적 리소스 제공, 비즈니스 로직 수행, DB에서 데이터를 읽어오기 등 너무 많은 일을 담당할 경우에도 서버에 장애가 생길 수 있다.

WAS만으로 웹서비스를 제공하면은 오류 화면도 노출하기가 불가능하다.

그래서 웹 시스템은 위와 같이 구성이 된다. 정적 리소스를 제공하는 웹 서서버, 그리고 비즈니스 로직을 담당하는 WAS가 웹 서버 뒤에 위치하게 한다. 정적 리소스만 제공하는 웹 서버는 잘 죽지 않기 때문에 트래픽이 몰려 WAS가 죽더라도 웹서버는 죽지 않고 오류 화면을 보여줄 수 있고 또 정적리소스를 WAS 대신 제공하면서 WAS 할 일을 줄여줄 수도 있다.

서블릿

서블릿(Servlet)은 Java 언어를 기반으로 웹 애플리케이션을 개발할 때 사용되는 서버 사이드 프로그래밍 기술입니다. 서블릿은 동적인 웹 페이지를 생성하고 처리하는데 사용되며, 웹서버와 웹 어플리케이션 서버에서 동작합니다.

서블릿은 주로 다음과 같은 역할을 수행합니다:

  • 동적인 콘텐츠 생성: 서블릿은 웹 페이지의 내용을 동적으로 생성할 수 있습니다. 사용자 요청에 따라 데이터베이스 조회, 계산, 다양한 로직을 수행하여 동적인 HTML 페이지를 생성하여 클라이언트에게 제공할 수 있습니다.
  • 요청 처리: 클라이언트의 요청을 처리하고 그에 따른 응답을 생성합니다. 사용자가 웹 어플리케이션에서 어떤 동작을 하면, 서블릿은 그에 따른 처리를 수행하고 결과를 반환합니다.
  • 세션 관리: 서블릿을 통해 웹 어플리케이션은 세션을 관리할 수 있습니다. 사용자가 웹사이트에 접속할 때 생성되는 세션을 이용하여 사용자 상태를 유지하거나 정보를 저장할 수 있습니다.
  • 웹 양식 처리: 서블릿은 웹 양식(form) 데이터를 받아서 처리하고 결과를 처리할 수 있습니다. 예를 들어, 사용자가 로그인 폼에 데이터를 입력하면 서블릿은 그 정보를 받아 인증을 처리할 수 있습니다.


WAS에 요청이 들어오면 이를 처리하는 과정을 도식화 한 것이다. 의미있는 비즈니스 로직을 수행하는 부분은 전체의 과정에서 극히 일부분이며 앞으로 request를 받아들이는 과정이, 뒤로는 response를 생성하고 보내는 과정이 있다. 즉, 어떤 비즈니스 로직을 만들더라도 앞의 과정과 뒤의 과정을 모두 개발해야하는 것이다.

이 과정을 매우 간편한게 해주는 것이 서블릿이다.

HttpServlet을 상속받아 서블릿을 구현하고, 어노테이션을 이용해 URL과 서블릿을 매핑해준다. 그러면 service()함수의 인자로 서블릿이 비즈니스 로직을 제외한 모든 과정을 대신 수행해 request 객체로 요청을 받아서 개발자에게 제공하고 전달해야 하는 내용을 response에 담아서 보낼 수 있게 제공한다.


간단한 전체적인 과정은 위와 같다. 클라이언트가 요청을 보내면은 요청으로 WAS가 request요청을 생성하고 서블릿 컨테이너에게 전달하면, 서블릿 컨테이너는 요청을 처리할 수 있는 서블릿(java class)을 가져와서 처리를 한다. 서블릿은 비즈니스 로직을 수행하고 응답 객체에 응답 내용을 넣고 응답 객체를 브라우저에게 응답한다.

톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너 라고 한다. 서블릿 컨테이너는 서블릿의 생명주기를 관리한다.
서블릿은 다른 요청을 받아도 매번 같은 요청을 관리하기에 요청이 들어올 때마다 서블릿 객체를 생성하는 것은 많이 비효율적이다. 그러므로 서블릿 객체는 싱글톤으로 관리한다. 그래서 최초 서버 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용을 한다.
하지만 동시에 요청을 처리하다보니 공유 변수를 사용하는데에는 주의를 해야 한다. 또 동시 요청 처리를 위한 멀티 쓰레드를 지원한다(그래서 공유자원에 주의해야한다).

만약에 서버에서 단일 쓰레드만 지원한다면 어떨까?

그러면 위와 같이 쓰레드를 다른 요청이 사용하고 있을 때 또 다른 요청이 들어온다면 뒤에 들어온 요청은 대기를 해야하는 상황이 발생한다. 만약에 첫번째 요청이 많은 시간을 잡아먹는다면 그 뒤의 모든 요청들도 대기를 해야하는 상황이 발생한다.
그래서 서블릿에서는 요청마다 쓰레드를 생성한다.

쓰레드에는 여러 가지 장점과 단점이 있다.
먼저 장점에는

  • 동시 요청 처리 가능
  • 리소스가 허용할 때까지 처리
  • 특정 쓰레드가 지연되어도 다른 쓰레드는 영향을 받지 않음

단점은

  • 스레드 생성비용이 비쌈
  • context switching 비용이 발생함
  • 스레드 생성의 제한이 없음 -> 필요한 리소스가 주어진 리소스를 넘어버리면 서버가 죽을 수도 있음

그래서 이런 단점을 극복하고자 스레드 풀이라는 것을 사용한다. 스레드를 미리 생성해서 보관하고, 요청이 들어오면 스레드를 제공하고 요청이 끝나면스레드를 반납하는 바업ㅂ이다.
이런 방식을 이용하면 스레드 생성 비용을 줄일 수 있고, 스레드 무한 생성을 제한할 수 있다. 스레드 풀에 스레드가 너무 적으면 클라이언트 응답이 지연되고 너무 많은면 리소스의 임계점을 넘게 된다. 그래서 모니터링을 하면서 스레드 풀의 수를 치밀하게 정해야한다.

응답의 종류

HTTP 응답의 종류에는 3가지가 있따.

  1. 정적 리소스: 고정된 HTML, CSS, JS, 이미지 등을 제공
  2. HTML 페이지: 동적으로 필요한 HTML 파일을 생성해서 전달하는 방식
  3. HTTP API: HTML이 아니라 데이터를 전달하는 것. 주로 JSON 형식을 이용한다. 데이터를 단순히 클라이언트 뿐만 아니라 다른 서버에게도 제공할 수 있다.
profile
풀스택개발자가되고싶습니다:)

1개의 댓글

comment-user-thumbnail
2023년 8월 11일

정리가 잘 된 글이네요. 도움이 됐습니다.

답글 달기