Enthusiasm! Enthusiasm!

웹 애플리케이션의 이해 본문

자바 스프링/스프링MVC

웹 애플리케이션의 이해

열동 2023. 4. 2. 00:23

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

  • 웹 - HTTP 기반
    • HTTP 메시지에 모든 것을 전송한다. (HTML,TEXT,이미지,음성,파일,API…)
    • 서버간에 데이터를 주고 받을 때도 대부분 HTTP 사용한다.
  • 웹 서버(Web Server)
    • HTTP 기반으로 동작
    • 정적 리소스 제공, 기타 부가기능
    • 정적 HTML, CSS, JS, 이미지, 영상
    • ex) NGINX, APACHE
  • 웹 애플리케이션 서버(WAS - Web Application Server)
    • HTTP 기반으로 동작
    • 웹 서버 기능 포함+ (정적 리소스 제공 가능)
    • 프로그램 코드를 실행해서 애플리케이션 로직 수행
      • 동적 HTML, HTTP API(JSON)
      • 서블릿, JSP, 스프링 MVC
    • ex) 톰캣(Tomcat) Jetty, Undertow
  • 웹 서버, 웹 애플리케이션 서버의 차이
    • 웹 서버는 정적 리소스, WAS는 애플리케이션 로직을 다룸
    • 둘의 경계가 명확히 구분되지는 않지만 나눈다면 위와 같이 나눔
    • 자바는 서블릿 컨테이너 기능을 제공하면 WAS
    • WAS는 애플리케이션 코드를 실행하는데 더 특화

 

웹 시스템 구성

※WAS와 DB만 사용하는 경우

WAS와 DB만 사용

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

 

※WEB,WAS,DB 사용

WEB 추가

-정적 리소스는 웹 서버가 처리하고, WAS는 중요한 애플리케이션 로직 처리를 전담한다. 웹 서버는 애플리케이션 로직같은 동적인 처리가 필요하면 WAS에 요청을 위임한다.

-정적리소스가 많이 사용되면 Web Server를 증설하고, 애플리케이션 리소스가 많이 사용되면 WAS를 증설하는 효율적인 리소스 관리가 가능하다.

-웹서버는 잘 죽지 않고 WAS 서버는 잘 죽기때문에 WAS,DB 장애시 WEB서버가 따로 오류화면을 제공 가능하다.


서블릿

아무 도구 없이 웹 서버를 설계한다 가정하면, HTTP 통신을 위해 소켓을 연결하고, HTTP 요청 메시지를 파싱하고 … 이런 과정들을 매번 수행해야 하고, 이는 상당히 번거러운 과정이다. 서블릿을 지원하는 WAS를 사용하면 비즈니스 로직을 제외한 나머지 과정을 전부 해준다.

톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라 한다. 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다. 흐름은 아래 그림과 같다.

서블릿 컨테이너의 흐름

-HTTP 요청시 WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체 호출한다.

-요청 메시지를 기반으로 하여 Request 객체가 생성되며, 개발자는 Request 객체에서 요청 정보를 편리하게 꺼내서 사용할 수 있다.

-개발자는 Response 객체에 HTTP 응답정보를 편리하게 입력할 수 있고, WAS는 이 내용으로 HTTP 응답정보를 생성한다.

-서블릿 객체(helloServlet)는 싱글톤으로 관리된다. 싱글톤 사용시 주의사항을 잘 지키면서 이용해야한다. 다만 request와 response 객체는 매번 다르기 때문에 요청시마다 새로운 객체를 매번 생성한다.


쓰레드 풀

동시에 여러개의 요청을 처리하려면 멀티 쓰레드를 지원해야한다. 이 때 요청 마다 쓰레드를 생성하면 여러개의 요청을 동시에 처리할 수 있지만, CPU 성능의 입장에서 쓰레드의 생성 비용이 매우 비싸기 때문에 이는 좋은 방법이 아니다. 따라서 서블릿은 설정한 쓰레드의 수 만큼 쓰레드를 미리 생성해놓고 쓰레드 풀 이라는 곳에 저장해둔 뒤, 요청이 올때마다 매핑한다. 흐름은 아래와 같다.

쓰레드 풀 흐름

쓰레드 풀에서 가장 중요한 포인트는 최대 쓰레드 수이다.

너무 높게 설정 시 동시요청이 최대일 때 CPU 및 메모리 리소스 한계로 서버가 다운될 위험이 있다.

너무 낮게 설정 시 서버는 여유로운데 요청을 처리할 수 없는 낭비가 발생한다. 성능 테스트등을 통해 가장 최적의 쓰레드 개수를 찾아 설계해야한다.

이와 같이 WAS가 멀티 쓰레드를 처리함에 따라 개발자는 멀티 쓰레드를 신경쓰지 않고, 마치 싱글 쓰레드 프로그래밍을 하듯이 편리하게 개발을 진행할 수 있다!


이 포스팅은 Inflearn 김영한님의 스프링 강의 및 강의자료를 참고하여 작성하였습니다.

Comments