ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 웹 MVC 1일차
    Spring 2021. 3. 9. 15:30

     

    1. 웹 서버와 웹 애플리케이션 서버(WAS)

     

    모든 것이 HTTP

     

    HTML, TEXT, IMAGE, JSON, XML 등 거의 모든 형태의 데이터 전송 가능

    서버간에 데이터를 주고 받을 때도 대부분  HTTP를 사용한다.

     

    웹 서버

     

    HTTP 기반으로 동작하고, 정적 HTML, CSS, JS, 이미지, 영상 제공

    ex) NGINX, APACHE

     

    웹 애플리케이션 서버(WAS)

     

    HTTP 기반으로 동작하고, 웹 서버 기능 포함 + (정적 리소스 제공 가능)

    프로그램 코드를 실행해서 애플리케이션 로직 수행 가능

    • 동적 HTML, HTTP API(JSON), 서블릿, JSP, 스프링 MVC

    ex) 톰캣, Jetty

     

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

     

    웹 서버는 정적 리소스, WAS는 애플리케이션 로직, but 둘의 경계가 모호하다. 왜냐하면 웹 서버도 프로그램을 실행하는 기능을 포함하기도 하고, WAS도 웹 서버의 기능을 제공함

    자바는 서블릿 컨테이너 기능을 제공하면 WAS로 구분 가능

     

    웹 시스템 구성 - WAS, DB

     

    WAS, DB 만으로 시스템 구성이 가능

    WAS가 정적 리소스, 애플리케이션 로직 모두 제공 가능하기 때문

    웹 시스템 구성 - WAS, DB

    하지만 WAS가 너무 많은 역할을 담당해서 서버 과부하 우려 있음

    WAS 장애시 오류 화면 노출 불가능

     

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

     

    정적 리소스는 웹 서버가 처리

    WAS는 중요한 애플리케이션 로직 처리 담당

     

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

    효율적인 리소스 관리가 가능하다. 정적 리소스가 많이 사용되면 Web 서버를 증설하면 되고,

    애플리케이션 리소스가 많이 사용되면 WAS를 증설하면 된다.

     

    효율적인 리소스 관리

    정적 리소스만 제공하는 웹 서버는 잘 죽지 않음 + WAS, DB 장애 시 WEB 서버가 오류 화면 제공 가능

     

     

    2. 서블릿

     

    HTTP 요청 흐름

    HTTP 요청시 WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체 호출하고,

    개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용 할 수 있음

    그리고 Response 객체에 HTTP 응답 정보를 입력하면

    WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보 생성

     

    서블릿 컨테이너

     

    톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다. 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리해줌 + 서블릿 객체는 싱글톤으로 관리

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

     

    3. 쓰레드

     

    애플리케이션 코드를 순차적으로 실행하는 것이 쓰레드

    자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행됨

    쓰레드가 없으면 자바 애플리케이션 실행이 불가능

    쓰레는 한번에 하나의 코드 라인만 수행하기 때문에 동시 처리가 필요하면 쓰레드를 추가로 생성

     

    멀티 쓰레드

     

    단일 요청이 올 때에는 쓰레드를 하나만 사용하게 된다. 하지만 다중 요청이 온다면?

    이때는 하나의 쓰레드로 처리가 불가능하므로 쓰레드를 추가로 생성해야 한다.

     

    요청마다 쓰레드를 생성하면 장단점이 존재하는데,

    장점은 동시 요청을 처리할 수 있고,

    리소스(CPU, 메모리)가 허용할 때 까지 처리 가능, 하나의 쓰레드가 지연되어도 나머지 쓰레드는 정상 동작한다.

    but 단점이 명확하다.

    쓰레드의 생성 비용은 매우 비싸고, 요청이 올 때마다 쓰레드를 생성하면, 응답 속도가 늦어진다.

    쓰레드는 컨텍스트 스위칭 비용이 발생한다. (컴퓨터가 멀티태스킹이 불가능하기 때문)

    쓰레드의 생성에 제한이 없기 때문에 요청이 너무 많이 들어오면 서버가 죽을 수도 있다.

     

     

    쓰레드 풀을 사용하면 위의서 보았던 단점을 보완할 수 있다.

    특징: 필요한 쓰레드를 쓰레드 풀에 보관하고 관리, 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리

     

    사용: 쓰레드가 필요하면 이미 생성되어 있는 쓰레드를 풀에서 꺼내 쓴다.

    사용이 끝나면 쓰레드풀에 반납, 모든 쓰레드가 사용중이면, 기다리는 요청은 거절 or 대기하도록 설정 가능

     

    장점: 쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용을 줄일 수 있고 응답 속도가 빠름

    생성 가능한 쓰레드의 최대치가 정해져 있으므로 너무 많은 요청이 와도 서버가 다운될 일이 없음

     

    쓰레드 풀의 최대치 설정이 주요 튜닝 포인트인데, 이 값을 너무 낮게 설정하면 서버 리소스 성능에 비해 응답이 지연된다. 그렇다고 너무 높게 설정하면 CPU, 메모리 리소스 임계점 초과로 서버가 다운될 수 있다.

    따라서 적정 숫자는 애플리케이션 로직의 복잡도, CPU, 메모리의 상황에 따라 모두 다르므로, 성능 테스트를 통해 찾는 것이 제일 좋다.

     

    WAS의 멀티 쓰레드 지원

     

    멀티 쓰레드에 대한 부분은 WAS가 처리하므로 개발자는 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨.

    개발자는 싱글 쓰레드 프로그래밍 하듯이 편리하게 소스 코드를 개발할 수 있음

    그래도 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)은 주의해서 사용

     

     

    참고자료: www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

    'Spring' 카테고리의 다른 글

    스프링 웹 MVC 3일차  (0) 2021.03.13
    스프링 웹 MVC 2일차  (0) 2021.03.11
    스프링 시큐리티 흐름 (1)  (0) 2021.03.04
    Spring boot 로 메일 보내기  (0) 2021.03.04
    스프링 Annotation 알아보기  (0) 2021.02.14

    댓글

Designed by Tistory.