BACK/SPRING

[Spring] 스프링 MVC1- 웹 애플리케이션 이해(WAS, 서블릿, 쓰레드)

연듀 2024. 3. 4. 21:35

 

현재 거의 모든 형태의 데이터를 HTTP 로 전송한다.

 

Web Server

  • HTTP 기반으로 동작
  • 정적 리소스(html, css , js, img..)제공, 기타 부가 기능
  • ex) nginx, apache

 

Web Application Server(WAS)

  • HTTP 기반으로 동작
  • 프로그램 코드를 실행해 애플리케이션 로직 수행
  • ⇒ HTTP 요청이 오면 사용자에 따라서 다른 화면을 보여줄 수 있음
  • 정적 리소스도 제공 가능
  • 동적 html, http api(json) 생성 가능
  • 서블릿, jsp, 스프링 mvc가 WAS 에서 동작
  • ex) tomcat, jetty

 

WAS는 애플리케이션 코드를 실행하는데 더 특화되어 있다.

 

💡 Web Server: 정적 리소스 제공하는 서버

      WAS: 애플리케이션 로직을 실행하는 서버

 

 

 

WAS가 정적 리소스와 애플리케이션 로직 모두 제공 가능하기 때문에 WAS, DB 만으로 시스템을 구성할 수 있다.

하지만 이렇게 하면 WAS 가 너무 많은 역할을 담당해 서버 과부하가 있을 수 있다.

또 WAS 장애시 오류 화면도 사용자에게 노출해줄 수 없다.

 

⇒ WEB, WAS, DB 로 구성한다. 

정적 리소스는 웹서버가 처리, 동적인 처리가 필요하면 WAS에게 요청 위임

WAS 장애시 WEB 서버가 오류 화면 제공

* 화면 없이 API 만 주고받는 경우 WAS 서버만 구축해도 됨

 

 


 

서블릿

웹 브라우저가 생성한 요청 HTTP 메시지를 가지고

비즈니스 로직을 실행하는 것 외의 모든 일들을 지원해준다.

 

  • HttpServlet을 상속받으면 url이 호출되었을 때 service() 메소드(애플리케이션 로직 작성하는 부분)가 실행됨
  • service() 파라미터로 HTTP 요청 정보와 응답 정보를 사용할 수 있는 HttpServletRequest, HttpServletResponse를 받아 사용한다.

 

서블릿 컨테이너

서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.

서블릿 컨테이너는 서블릿 객체를 자동으로 생성하고, 호출하고, 생명주기를 관리한다.

(WAS가 종료될때 서블릿 객체를 종료)

동시 요청을 위한 멀티 쓰레드 처리를 지원해준다.

 

 

 

  1. 웹 브라우저에서 url로 요청하면 HTTP 요청 메세지를 기반으로 request, response 객체를 만든다.
  2. 서블릿 컨테이너에서 request, response 객체를 파라미터로 하여 서블릿 객체를 호출한다.
  3. response를 바탕으로 HTTP 응답 메세지를 만들어 웹 브라우저에 전달한다.

 

 

request, response는 사용자마다 다른 데이터를 가지기 때문에 요청이 들어올 때마다 새로 생성되는게 맞다.

그러나 helloServlet은 한번 생성하고 재사용을 하는게 효율적이다. 그래서 서블릿 객체는 싱글톤으로 관리된다. 

모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근하게 된다.

 

 


 

쓰레드

  • 애플리케이션 코드를 하나하나 순차적으로 실행하는 것은 쓰레드
  • 자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행

쓰레드가 하나면 요청이 들어올 때 쓰레드가 다른 요청을 처리중이라면 두 요청 다 오류가 발생할 수 있다.

그렇다고 요청 마다 쓰레드를 생성한다면 생성 비용이 비싸고, 컨텍스트 스위칭 비용이 발생한다.

⇒ 쓰레드 풀을 사용해 문제를 해결한다. 

 

쓰레드 풀

쓰레드 풀에 미리 쓰레드를 준비하고, 사용 후에 다시 반납하는 형식

요청이 올 때 쓰레드 풀에 사용 가능한 쓰레드가 없으면 대기하거나 거절할 수 있다.

 

→ 쓰레드 생성, 종료 하는 비용(CPU)이 절약되고 응답 시간이 빠름

→ 생성 가능한 쓰레드 최대치가 있어 너무 많은 요청이 들어와도 기존 요청을 안전하게 처리

 

WAS 의 멀티 쓰레드 지원

  • 멀티 쓰레드에 대한 부분은 WAS가 처리
  • 개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨
  • 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 멤버 변수가 공유되기 때문에 주의해서 사용

 

 

 

참고) 인프런 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1