[스프링 MVC 1편] 1. 웹 애플리케이션의 이해

조은지·2021년 5월 5일
0

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

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

모든 것이 HTTP

웹은 HTTP기반의 통신을 하고, HTTP 메시지를 이용하여 모든 데이터를 주고 받을 수 있다.

  • HTML,TXT
  • IMAGE,음성, 영상, 파일
  • JSON,XML(API)
  • 거의 모든 형태의 데이터 전송 가능
  • 서버 간에 데이터를 주고 받을 때도 대부분 HTTP사용

웹 서버(Web Server)

  • HTTP를 기반으로 동작
  • 정적 리소스 제공, 기타 부가기능
  • 정적 리소스: 정적 HTML, CSS, JS, 이미지, 영상
  • 예시) Nginx,Apache
클라이언트가 HTTP요청을 하면 웹 서버에서 해당 정적 파일을 응답해주는 구조

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

  • HTTP를 기반으로 동작
  • 웹 서버 기능 포함 + (정적 리소스 제공 기능)
  • ⭐ 프로그램 코드를 실행해서 애플리케이션 로직을 수행한다.
    - 동적 HTML, HTTP API(JSON)
    - 서블릿, JSP, 스프링 MVC
  • 예시) 톰캣, Jetty, Undertow 등
동적 파일(ex-class)을 준다는 것이 차이점

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

  • 둘의 용어와 경계가 모호하다.
    - 웹 서버도 프로그램을 실행하는 기능을 포함하기도 한다.
    - WAS도 웹 서버의 기능을 제공한다.
  • 자바에서는 서블릿 컨테이너를 제공하면 WAS라고 한다.
    - 요즘에는 서블릿 없이 자바코드를 실행하는 서버 프레임워크도 존재
  • WAS는 애플리케이션 코드를 실행하는데 최적화

웹 시스템 구성 - WAS,DB

  • WAS,DB만으로 시스템 구성 가능
  • WAS는 정적 리소스, 애플리케이션 로직을 모두 제공이 가능하다.
  • 그러나 WAS와 DB만으로 구성을 한다면?
    => WAS가 너무 많은 역할을 담당, 서버 과부하 우려
    html,css,js와 같은 정적 리소스는 값이 싸다. 그러나 애플리케이션 로직은 굉장히 비싸다.

  • 가장 비싼 애플리케이션 로직이 정적 리소스 때문에 수행이 어려워질 수 있다.
    정적리소스 응답에 WAS가 빼앗기기 때문에 동적리소스를 처리하지 못할 수 있다.
  • ❓ 만약 WAS가 죽는다면 (WAS는 잘 죽는다..)
    => 오류 화면 노출이 불가능해진다.
(오류페이지는 정적리소스지만, 정적리소스도 WAS에서 관리하기 때문)

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

위에서의 문제를 Web Server - WAS - DB구조로 해결한다.

  • 정적 리소스는 웹 서버가 처리를 한다.
    - WAS,DB 장애 시 Web서버에서 오류 화면 제공이 가능하다.

  • 그러다가 애플리케이션 로직같은 동적인 처리가 필요하면 WAS에 요청을 위임한다.
    => WAS는 중요한 애플리케이션 로직 처리 전담

  • 효율적인 리소스 관리가 가능하다.
    - 정적인 리소스가 많이 사용되면 웹 서버 증설
    - 애플리케이션 리소스가 많이 사용되면 WAS 증설

2. 서블릿

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

  • 웹 애플리케이션에서 서버를 직접 구현할 때
HTML Form을 이용해서 데이터 전송을 한다고 했을 때 비즈니스 로직 실행 전후로 많은 처리들을 해주어야 한다.😢

서블릿은 비즈니스 로직을 제외한 나머지 부분을 모두 자동화 해준다⭐.

서블릿 특징

  • HttpServlet을 상속받아야 한다.
  • 해당 서블릿은 service method를 이용해서 실행이 된다.
  • request와 response 파라미터를 통해 요청 정보와 응답 정보를 편리하게 사용하고 제공할 수 있다.
  • WebServlet 어노테이션에서 name을 통해서 서블릿 컨테이너에 서블릿을 등록할 수 있다.
  • WebServlet 어노테이션에서 urlPatterns의 url이 호출되면 서블릿 코드가 실행된다.

2-1. 서블릿 컨테이너

WAS안에는 서블릿 컨테이너가 존재
서블릿 객체를 서블릿 컨테이너가 자동으로 생성, 호출, 관리, 종료 등을 해준다.(생명주기들을 관리해준다.)

웹 브라우저에서 'localhost:8080/hello'url을 호출하면
⭐서블릿에서는 request,response 객체를 "새로" 만들어서 전달을 해준다.⭐
서블릿에서 해당 요청을 실행하고 response에 헤더, 바디를 추가해서 전달해준다.
⭐WAS는 response 객체에 담겨있는 내용으로 HTTP응답정보를 생성⭐

2-2. 정리

  • 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
    컨테이너는 생명주기를 관리해준다.

  • 서블릿 객체는 "싱글톤"으로 관리한다.
    왜 이렇게 사용하냐?
    • 사용자마다 요청과 응답은 다르기 때문에 response,request객체는 매 번 다르게 생성이 된다.
    • 그런데 helloServlet이라는 것은 굳이 매 번 생성할 필요가 없다.(재사용을 한다.)

  • 최초 로딩 시점에서 서블릿 객체를 미리 만들어두고 재활용한다.
  • 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근한다.

  • ⭐⭐공유 변수 사용 주의⭐⭐
    싱글톤을 사용할 때는 공유 변수를 사용하는데 굉장히 주의해야 한다.

  • JSP도 서블릿으로 변환되어서 사용
  • ⭐동시 요청을 위한 멀티 쓰레드 처리를 지원한다.⭐

3. 동시요청 - 멀티 쓰레드

서블릿 객체는 누가 호출? => 쓰레드가 호출을 한다.
자바의 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행된다.
동시처리가 필요하면 쓰레드를 추가적으로 생성해줘야 한다.

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

요청1이 들어오고, 그 다음 요청2가 들어온 상황
요청2는 요청1이 완료될 때 까지 기다려야 한다.
그런데 요청1이 완료가 되면 쓰레드를 놔줘야 하는데 못하고 있는 상황이라면 요청1,2 둘 다 처리를 못하게 된다.

방법 1) 신규 쓰레드를 생성해준다.

요청 마다 쓰레드를 생성해 줄 때의 장단점
생성하고 없애는 방식으로 WAS를 구현

  • 장점
    - 동시요청을 처리할 수 있다.
    - 리소스(CPU,메모리)가 허용할 때 까지 처리 가능
    - 하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작한다.

  • 단점
    - 쓰레드는 생성비용이 매우 비싸다.
    - 컨텍스트 스위칭 비용이 발생한다.
    - 쓰레드 생성에 제한이 없다. (고객 요청이 너무 많이 오면, CPU,메모리 임계점을 넘어서 서버가 죽을 수 있다.)

방법 2) 쓰레드 풀
해결방안

내부에 쓰레드 풀이 존재
풀 안에 쓰레드를 미리 만들어줌
요청이 올 때 마다 쓰레드 풀에서 가져오고 요청이 완료되면 쓰레드 풀에 반납을 한다.
  • 만약 쓰레드 풀에 있는 모든 쓰레드를 사용하고 있으면?
    👉요청을 대기하거나 거절할 수 있다.
(대기 : 일정 요청 개수만 대기를 받아서 쓰레드가 반납되면 다시 수행할 수 있도록 한다.)

쓰레드 풀에 있는 쓰레드의 개수도 중요하다.

4,5는 생략...

0개의 댓글