ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스프링 MVC 1] 1. 웹 애플리케이션 이해
    INFLEARN/스프링 MVC 1편 2021. 10. 13. 00:53

    1. 웹 애플리케이션 이해

     

    [강의 정리] 김영한님 :: 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

     

     

     

     

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

     

    # 웹 HTTP 기반 통신

    • 클라이언트 -> 서버 , 서버 -> 클라이언트 (HTTP 프로토콜 기반)
    • 거의 모든 형태, 서버간에 데이터까지 주고 받을 때 대부분 HTTP 사용

    # 웹 서버 (Web Server)

    • HTTP 기반으로 동작
    • 정적 리소스 (HTML, CSS, JS, 이미지, 영상)
    • ex) NGINX, APACHE

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

    • HTTP 기반으로 동작
    • 프로그램 코드를 실행해서 애플리케이션 로직 수행 (동적HTML, HTTP API, 서블릿, JSP, 스프링 MVC) (+ 웹 서버 기능)
    • ex) 톰캣, Jetty

    # Web Server vs WAS 

    • 웹 서버는 정적, WAS는 애플리케이션 로직
    • 자바 서블릿 컨테이너 기능 - WAS
    • 특히, WAS는 애플리케이션 코드를 실행하는데 특화 

    # 웹 시스템 구성 - WAS, DB

    • WAS는 정적 리소스, 애플리케이션 로직 모두 제공 가능하여 WAS, DB만으로 시스템 구성 가능
    • 하지만, 너무 많은 역할을 담당하면 서버 과부화 우려 + 비싼 애플리케이션 로직이 정적 리소스 때문에 수행이 어려움 가능
    • WAS장애시 오류 화면도 출력 불가

    # 웹 시스템 구성 - Web Server, WAS, DB

    • WAS 앞에 Web Server를 두고, 정적 리소스는 Web Server가 처리 
    • 장점) WAS는 중요한 애플리케이션 로직 처리 전담
    • 장점) 리소스 관리에 효율적 - 정적 리소스가 많으면 Web 서버 증설 / 애플리케이션 리소스가 많으면 WAS 증설
    • 장점) Web Server는 정적 리소스만 제공하여 잘 죽지 않음 - WAS, DB 장애시 오류 화면 제공 가능 (WAS는 잘 죽음..)

     

     

    2. 서블릿

     

    # 서블릿

    • 동적인 웹 페이지를 만들 수 있도록 도와주는 서버 측 프로그래밍 기술
    • 서블릿을 (지원하는 WAS를) 사용하면 서버에서 처리해야 하는 업무 (서버 TCP/IP 대기, 소켓 연결 부터 .. TCP/IP에 응답 전달, 소켓 종료 까지) 중 비즈니스 로직 실행을 제외한 모든 업무를 제공
    • urlPatterns의 URL이 호출되면 서블릿 코드가 실행
    • HTTP 요청 정보 - HttpServletRequest, HTTP 응답 정보 - HttpServletResponse 제공

    # 서블릿 - HTTP 요청, 응답 흐름

    • WAS는 Request, Response 객체 생성 -> 서블릿 객체 호출
    • 개발자는 Request, Response 객체 이용
    • WAS는 Response 객체 -> 웹 브라우저에 HTTP 응답 정보 생성

    # 서블릿 컨테이너

    • 서블릿을 지원하는 WAS 안에 존재 (ex. Tomcat)
    • 생명주기 관리 (서블릿 객체 생성, 초기화, 호출, 종료)
    • 싱글톤 관리
      • request, response 객체는 요청이 들어올 때마다 항상 새로 만들지만, 서블릿 객체는 재활용 (요청 때마다 생성하는 것은 비효율)
      • 즉, 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근
      • 공유 변수 사용 주의 (멤버 변수에 값 세팅할 때 주의!)
      • 서블릿 컨테이너 종료시 서블릿 객체도 종료 
    • JSP도 서블릿으로 변환되어 사용
    • 동시 요청을 위한 멀티 쓰레드 처리 지원

     

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

     

    # 쓰레드

    • 클라이언트에서 요청이 들어오고, WAS에서 응답을 할 때.. TCP/IP 커넥션 연결이 일어나고 Servlet을 호출을 하는데 이 때 누가 서블릿 객체를 호출하는것이 쓰레드
    • 애플리케이션 코드를 순차적으로 실행하는 것
    • 자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행되는데, 쓰레드가 없다면 자바 어플리케이션 실행 불가능
    • 쓰레드는 한 번에 하나의 코드 라인만 수행하므로 동시 처리가 필요하다면 쓰레드를 추가 생성 해야함

    #  단일 요청 - 쓰레드 하나 사용

    • 요청이 오면 쓰레드를 할당하고 서블릿을 호출하고, 끝나면 쓰레드는 휴식

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

    • 요청1이 왔을 때 쓰레드를 할당하여 처리 중인데 지연이 발생했다고 가정
    • 이 때 요청2가 들어오면 쓰레드는 대기 중에 있고 결국 둘 다 죽음

    #  요청 마다 쓰레드 생성

    • 요청이 들어올 때마다 신규 쓰레드를 생성하는 경우
    • 장점
      • 동시 요청 처리 가능
      • 리소스(CPU, 메모리) 허용 내에서 처리 가능
      • 하나 지연 되어도 나머지 정상 동작
    • 단점
      • 생성 비용 비쌈
      • 컨텍스트 스위치 비용 발생
      • 쓰레드 생성에 제한이 없으므로, 요청이 많이 들어오면 서버 죽을 수 있음

    #  쓰레드 풀

    • "요청 마다 쓰레드 생성" 단점 보완
    • 필요한 쓰레드를 쓰레드 풀에 보관하고 관리하며, 생성 가능한 쓰레드의 최대치를 관리 (톰캣 기본설정 200개이지만 변경 가능)
    • 미리 쓰레드를 쓰레드 풀에 만들어 놓고, 필요할 때마다 갖다 쓰고 사용 종료 후 쓰레드 풀에 반납 (쓰레드 풀에 없는 경우 - 거절/대기)
    • 장점
      • 쓰레드 생성/종료 비용(CPU) 절약
      • 응답 시간 빠름
      • 쓰레드 생성 가능 최대치가 있어서 안전하게 처리 가능
    • WAS의 튜닝 포인트 "최대 쓰레드 (max thread)"
    • 단, 동시 요청이 많을 때 최대 쓰레드 값이 너무 낮으면 클라이언트 응답 지연 가능 / 너무 높으면 CPU, 메모리 소스 임계점 초과로 서버 다운

    #  WAS의 멀티 쓰레드 지원

    • 멀티 쓰레드에 대한 부분은 WAS에서 처리하므로, 비즈니스 로직을 제외한 멀티 쓰레드 관련 코드는 개발자가 신경 쓰지 않아도 됨
    • 단, 멀티 쓰레드 환경이므로 싱글톤 객체는 주의해서 사용

     

    4. HTML, HTTP API, CSR, SSR

     

    #  정적 리소스

    • 웹 브라우저에서 요청이 오면 웹 서버에서 이미 생성된 리소스 파일 제공

    #  HTML 페이지

    • WAS가 DB 통해서 동적으로 필요한 HTML파일을 생성하여 전달

    # HTTP API

    • HTML이 아니라 데이터 (주로, JSON)를 전달
    • 데이터만 주고 받는 경우 UI 화면이 필요하면 클라이언트가 별도 처리
      • 앱 클라이언트 (아이폰, 안드로이드, PC 앱)
      • 웹 브라우저에서 자바스크립트를 통한 HTTP API호출
      • 웹 클라이언트 (React, Vue.js) 
    • 서버 to 서버

    #  SSR (서버 사이드 렌더링)

    • 서버에서 HTML 최종 결과물을 다 만든 후 웹 브라우저에 전달
    • 주로 정적인 화면에서 사용
    • ex) JSP, 타임리프

    # CSR (클라이언트 사이드 렌더링)

    • HTML결과를 자바스크립트를 사용해 웹 브라우저에서 동적으로 생성해서 적용
    • 주로 동적인 화면에서 사용 (웹 환경에서 마치 앱 처럼)
    • 프로세스
      • HTML 요청 (<- 빈 HTML파일, 자바스크립트 링크)
      • 자바스크립트 요청 (<- 클라이언트 로직, HTML 렌더링 코드)
      • HTTP API 데이터 요청 (<- JSON)
      • 웹 브라우저에서 자바스크립트로 렌더링
    • ex) React, Vue.js

     

    5. 자바 백엔드 웹 기술 역사

     

    #  과거 기술

    • 서블릿 - HTML 생성이 어려움
    • JSP - HTML 생성은 편리, 비즈니스 로직까지 많은 역할 담당
    • 서블릿, JSP 조합의 MVC 패턴 - 비즈니스와 화면단을 나눔
    • MVC 프레임워크 - MVC 패턴 자동화

    #  현재 사용 기술

    • 애노테이션 기반의 스프링 MVC
    • 스프링 부트 - 서버 내장, 빌드 배포 단순화

    #  최신 기술

    • Spring WebFlux - 비동기 넌 블러킹 처리, 서블릿 기술 사용 X, RDB 지원하지 않고 실무에서 아직은 많이 사용하지 않음

    #  자바 뷰 템플릿

    • JSP - 스프링 부트에서 권장하지 않음
    • 프리마커, 벨로시티
    • 타임리프 - 스프링 MVC와 강력한 기능 통합

    댓글

Programming Diary