ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 MVC (1) 웹 애플리케이션 이해
    Web/Spring 2023. 9. 4. 23:14

     

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

     

     1.1 웹 - HTTP 기반 

     - HTTP 메시지를 통해 많은 것을 전송 (HTML,음성,영상,파일,JSON 등등)

     - 거의 모든 형태의 데이터를 전송할 수 있음 

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

     

     1.2 웹 서버 VS 웹 애플리케이션 서버 

     

      웹 서버:  - HTTP 기반으로 동작, 정적 리소스 제공, 기타 부가기능 

                    - 정적 리소스란 HTML,CSS,JS,이미지 영상 등 

                    -  대표적인 웹 서버는 APACHE이다.

     

      웹 애플리케이션 서버:  - HTTP 기반 동작, 웹서버 기능 포함 

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

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

                                            - 톰캣이 대표적인 웹 애플리케이션 서버  

        

    출처:  스프링 MVC (김영한 - 인프런)

       - 정적 혹은 동적 애플리케이션 로직을 실행한다는 차이점이 있지만, 둘 사이 경계는 모호하다.

       - 웹 서버도 프로그램을 실행하는 기능 포함하기도 하고, WAS는 WEB 기능도 함 

       - 자바에서는 서블릿 컨테이너 기능을 제공하면 WAS이다. (WAS가 애플리케이션 코드 실행 특화

       

    1.3 웹 시스템 구성 

     

     - WAS와 DB만으로 시스템 구성 가능하다! WAS는 정적,동적 리소스 모두 제공 가능하다

     - 이럴 경우 WAS가 너무 많은 역할을 담당하고, 서버 과부화 우려가 있다.

     - 애플리케이션 로직이 정적 리소스 때문에 수행이 어려울 수 있다.

     - WAS 장애시 오류 화면을 출력할 수도 없다.

     - 이를 개선하기 위해 WEB와 WAS DB를 이용하여 웹 시스템을 구성한다. 

     - 정적 리소스는 웹서버가 처리하고, WAS는 애플리케이션 로직만 담당 

     - WAS,DB 장애시 WEB서버가 오류 화면 제공 (WEB는 잘 안죽음) 

     

    * WEB,WAS 분리해두면 효율적 리소스 관리가 가능해짐  

       - 정적리소스 많으면  정적 Web서버 증설 <-> 애플리케이션 리소스가 많이 사용되면 WAS 증설 

     

    * API 서버만 서로 소통하는 경우 WAS 서버만 구축해도 상관없기도 하다 

     

    2. 서블릿 

     

    - HTML From 데이터 전송으로 서버가 HTTP 메시지를 받았다고 해보자 

    출처:&nbsp; 스프링 MVC (김영한 - 인프런)

     

    - 이때 웹 애플리케이션 서버를 직접 구현해야한다면, 처리해야하는 일이 너무 많다.

    -  소켓 열어서 대시 -> 파싱해서 바디 읽고 -> 비지니스 로직 실행 -> 응답 메시지 생성 -> TCP/IP 응답, 소켓 종료

    의미있는 비지니스 로직을 실행하기까지 준비단계가 너무 많다.

    서블릿을 지원하는 WAS를 사용하면, 비지니스 로직 외 나머지 과정을 WAS가 다 해준다.

     - 또한 HTTP 스펙을 매우 편리하게 사용할 수 있다.

     

    출처: 스프링 MVC (김영한) - 인프런

     

    @WebServlet(urlPatterns ="/hello")
    public class HelloServlet extends HttpServlet {
    
       @Override 
       Protected void service(HttpServletRequest request, HttpServletResponse response){
         //로직 
       }
    }

     - URL이 호출되면 서블릿 코드 실행

     - HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest

     - HTTP 응답 정보를 편리하게 사용할 수 있는 HttpServletResponse 

       HTTP 스펙을 매우 편리하게 사용 가능하다! 

     

    출처:&nbsp; 스프링 MVC (김영한 - 인프런)

       - HTTP 요청시 -> WAS Request,Response 객체를 (요청메시지 기반으로 생성) 새로 만들어서 서블릿 객체 호출 

         -> 애플리케이션 로직을 처리하면서 Request,Response 편리하게 사용

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

     

    2.1 서블릿 컨테이너 

    출처:&nbsp; 스프링 MVC (김영한 - 인프런)

     

    - 톰캣과 같이 서블릿을 지원하는 WAS서블릿 컨테이너라고 함

    - 서블릿 컨테이너서블릿 객체 생성,초기화,호출,종료 등 모든 생명주기 관리함 

    - 서블릿 객체싱글톤으로 관리된다. 

       > 고객의 요청이 올 때 마다 계속 객체를 생성하는 것은 비효율 

       > 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용 

       > 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근 

       > 공유 변수 사용 주의 

       > 서블릿 컨테이너 종료시 함께 종료 

    - JSP도 서블릿으로 변환 되어서 사용된다.

    - 동시 요청을 위한 멀티 쓰레드 지원 된다.

     

     

    3.  멀티 쓰레드

     

    - WAS는 내부적으로 멀티 쓰레드를 통해 클라이언트 요청을 처리한다.

    - 웹 개발시 멀티 쓰레드 관련 코드를 신경쓰지 않아도 된다!

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

     

    3.1 요청 마다 쓰레드 생성 

    출처: 스프링 MVC (인프런) -김영한

    - 크게 클라이언트 요청 -> WAS와 연결 -> 쓰레드 -> 서블릿 호출 -> 로직 실행 후 응답 흐름이다.

    - 결국 HTTP도 TCP/IP 방식으로 요청당 1개의 쓰레드가 배정되어 요청을 처리한다.

     

    > 장점 :  - 동시 요청 처리

                  - 리소스 허용시 까지 처리 가능

                  - 하나의 쓰레드가 지연 되어도, 나머지 쓰레드 정상 가동

    > 단점 : - 쓰레드 생성비용이 비싸다 (요청마다 쓰레드 생성시 응답 속도 늦는다)

                 - 컨텍스트 스위칭 비용이 발생한다.

                 - 쓰레드 생성의 제한이 없어서 서버가 다운 될 수 있다.

     

    3.2 쓰레드 풀 방식 

     

    출처: 스프링 MVC (인프런) -김영한

    - 쓰레드 풀을 사용하여 위의 단점을 해소할 수 있다.

    - 필요한 쓰레드는 쓰레드 풀에 보관하고 관리 

    - 생성 가능한 쓰레드의 최대치 관리 (톰캣 기준 최대 200개 기본설정(변경가능))

    - 만일 최대 스레드가 모두 사용중이라면, 기다리는 요청은 거절하거나, 대기를 설정할 수 있다.

     

    장점 : > 쓰레드 미리 생성되어 있어서 쓰레드 생성 및 종료 비용 절약, 응답 시간 빠름

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

     

    * 쓰레드 풀 팁

    - WAS의 주요 튜닝 포인트 최대 스레드 수 

       -> 너무 낮게 설정시 ( 서버 리소스가 여유로움에도 불구하고, 클라이언트 응답 지연)

       -> 너무 높게 설정 (리소스 임계점 초과로 서버 다운)

    - 장애 발생시 

       -> 클라우드면 서버를 늘리고 -> 이후 튜닝

       -> 클라우드가 아니라면 열심히 튜닝하자 

     

    * 적정 쓰레드의 숫자 

    이는 애플리케이션 로직의 복잡도, CPU,IO 등등 여러 상황에 따라 모두 다르다 

    최선의 방법은 성능 테스트를 열심히 해보는 것이다.

     

     

    4. HTML,HTTP API,CSR,SSR

     

    4.1 정적 리소스 

     

    - 고정된 HTML, CSS,JS,이미지 영상등 제공

    - 주로 웹 브라우저 

    출처: 스프링 MVC (인프런) -김영한

     

    4.2  HTML페이지 (동적)

     

    - 동적으로 필요한 HTML 파일을 생성해서 전달

    -  웹 브라우저: HTML 해석 

    출처: 스프링 MVC (인프런) -김영한

    4.3 HTTP API 

     

    - HTML페이지 같은게 아닌 데이터 전달

    - 주로 JSON형식 사용

    - 다양한 시스템에서 호출

    - HTTP 프로토콜 위에서 데이터 주고 받기

     

    출처: 스프링 MVC (인프런) -김영한

    - 웹 클라이언트 to 서버 : 서버에서 데이터 받으면, 웹브라우저에서 UI는 별도 처리

    - 앱 클라이언트 to 서버 : 웹과 동일

    - 서버 to 서버: 서버간 통신에서도 데이터를 주고받을 때 HTTP API사용

     

    4.4 SSR,CSR

     

    SSR (서버사이드 렌더링): - HTML 최종 결과를 서버에서 만들어서 웹브라우저에 전달

                                               - 주로 정적인 화면에 사용한다.

                                               - JSP,타임리프 등등

    CSR(클라이언트 사이드 렌더링): - HTML 결과를 자바스크립트를 사용해 웹 브라우저에서 

                                                            동적으로 생성해서 적용

                                                          - 주로 동적 화면에 사용, 웹 환경을 마치 앱 처럼 부분부분 변경 가능 

     

    * CSR+SSR 동시에 지원하는 웹 프레임워크도 있고, SSR을 써도 자바 스크립트를 통해 일부 동적 변경 가능

     

     

    참고자료: 스프링 MVC 인프런 김영한

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

     

    스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

    웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

    www.inflearn.com

             

Designed by Tistory.