[스프링] MVC - 웹 애플리케이션의 이해

sonnng·2023년 6월 28일
0

Spring

목록 보기
6/41

I. 모든 것이 HTTP

다음은 모두 HTTP 기반으로 동작합니다.

1)웹 서버

  • http 프로토콜로 주고 받을 수 있는 것을 웹 서버라고 하며 http 기반으로 동작합니다

2) 웹 애플리케이션 서버

  • 사용자에 따라서 다른 화면들을 보여줄 수 있습니다
  • 동적 html, http api(rest api) 등을 제공할 수 있습니다
  • 서블릿, jsp, 스프링 mvc 모두 실행 가능합니다.

3) 이 둘의 차이

  • 웹 서버 - 정적 리소스 파일 VS was는 웹 애플리케이션 로직이라고 보면 됩니다.
  • 사실 이 둘의 경계는 모호하지만, 자바는 서블릿 컨테이너 기능을 제공하면 was 라고 하며, was 는 애플리케이션 코드를 실행하는데 더 특화되어있다고 구분하면 됩니다.

4) 웹 시스템 구성 - was, db

최소한으로 보면 이 둘로 구분할 수 있습니다.

  • 하지만 was 가 너무 많은 일은 하나로 수행하게 되면 서버 과부화가 될 수 있습니다.
  • html/css/js 같은 건 서빙하면 되어서 단순하지만, 애플리케이션 로직은 이들보다 매우 비쌉니다.
    • 파일을 불러다 보여주면 되지만 애플리케이션 로직은 비즈니스 로직이 들어가 있어서 가장 비쌉니다.
  • 따라서, 정적 리소스 때문에 애플리케이션 로직이 수행이 어려울 수도 있습니다.
  • was 장애시 오류 화면도 노출이 불가능하게 됩니다.

5) 그래서 웹 시스템 구성하는 방법?

웹 시스템 구성 - web, was, DB

장점

  • 앞에 web server를 두고 정적 리소스를 처리 → 뒤에서 was 는 애플리케이션 로직만 담당하게 되어 중요 처리를 분담하게 됩니다.

  • 효율적인 리소스 관리가 가능해집니다.

    • 정적 리소스가 많아지면 web 서버 증설하면 되고 반대로 애플리케이션 로직이 많아지면 was 를 증설하면 되기 때문입니다.
  • 정적 리소스 제공하는 웹 서버는 잘 죽지 않지만,, was 서버는 잘 죽습니다.

    • was 또는 db가 제대로 응답을 못하면 web 서버에서 오류화면을 제공할 수 있습니다.
    • 데이터만 구축하게 될 경우에는 was 서버만 구축하면 됩니다.

II. 서블릿

1) HTML FORM 데이터 전송

  • METHOD = ‘POST’로 전송해 저장한다고 해봅시다.

  • “서블릿” 은 비즈니스 로직 실행을 제외한 모든 기능을 모두 수행합니다.
    • HTTP 요청 메시지 파싱
    • 원래 서버에서 처리해야 할 업무들을 모두 비즈니스 로직 제외한 내용들을 수행합니다.

2) 서블릿

특징

  • HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest 가 있습니다.

  • HTTP 응답 정보를 편리하게 제공하는 HttpServletResponse 가 있습니다.

  • 서블릿 컨테이너 : 서블릿 객체를 생성, 호출하며, WAS 가 내려갈 때 서블릿 객체도 같이 내려줍니다.

  • 톰캣처럼 서블릿 지원하는 WAS서블릿 컨테이너라고 합니다.

  • 서블릿 객체는 싱글톤으로 관리합니다. (모두 공유해서 사용)

    • 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용합니다.
    • 모든 고객 요청은 동일 서블릿 객체 인스턴스에 접근하여 로직을 실행하게 됩니다.
    • 공유 변수에 주의해야합니다. 싱글톤 객체는 멤버변수 사용할 때 주의해야 합니다.
    • 서블릿 컨테이너 종료할 때 서블릿 객체도 같이 종료됩니다.
  • JSP도 서블릿으로 변환되어 사용됩니다.

  • 동시 요청 위한 멀티 쓰레드 처리를 지원합니다.

    • WAS가 자동으로 해결을 해줍니다.

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

서블릿 객체는 누가 호출하는가?

  • 쓰레드가 호출합니다.
    • 애플리케이션 코드를 하나하나 내부에서 순차적으로 실행하는 것을 말합니다.
    • EX. 메인 메서드를 실행하면 MAIN 이름의 스레드가 실행되는 것입니다.
    • 스레드가 없으면 자바 애플리케이션 실행이 아예 불가능합니다.
    • 스레드는 한번에 하나의 코드 라인만 수행합니다.
    • 따라서, 동시처리가 필요하면 하나 이상이 필요합니다.

  • 요청1에서 스레드를 사용하고 있으니(처리가 지연되는 중), 요청2는 계속해서 대기해야 합니다.

→ 요청마다 스레드를 생성해야 합니다.

요청마다 스레드를 생성하는 것의 장단점

장점

  • 동시 요청 처리가 가능하다.
  • 하나의 쓰레드가 지연되어도, 나머지 스레드는 정상 동작합니다.

단점

  • 스레드는 생성비용이 매우 비쌉니다.

  • 스레드는 컨텍스트 스위칭 비용이 발생합니다.

    • cpu의 코어가 만약 하나라면, 코어 하나가 하나씩 수행, 전환할때 비용이 발생하는데 이를 ‘컨텍스트 스위칭 비용’ 이라고 합니다.
  • 스레드 생성 제한이 없습니다.

    • 고객 요청이 너무 많이 오면, 메모리 임계점을 넘게되어 서버가 죽을 수도 있습니다. 못버티고 서버가 다운됩니다.

→ 내부에 스레드 풀이 있습니다.

  • 스레드 풀에서 갖다 쓰고 사용이 다 되면 스레드 풀에 반납을 합니다. 이런 식으로 스레드를 빌려쓰고 가져다 놓는 방식을 수행합니다.
  • 스레드가 200개가 한계라고 한다면, 스레드가 없을 경우, 스레드를 대기하고, 거절합니다.
    • 너무 많이 밀리면 거절하게 됩니다.

3) 쓰레드 풀 (요청마다 생성되는 스레드의 단점 보완)

특징

  • 필요 스레드를 스레드 풀에 보관하고 관리합니다.
  • 톰캣은 최대 200개 기본으로 설정합니다.

사용

  • 스레드가 필요하면 스레드 풀에서 가져다 사용하게 됩니다.
  • 사용 종료시 해당 스레드를 스레드 풀에 반납합니다.
  • 만약 스레드 풀에 스레드가 없다면 특정 숫자만큼 대기하도록 설정하게 됩니다.

4) 쓰레드 풀 - 실무팁

  • was 의 주요 튜닝 포인트는 최대 쓰레드 수입니다.
  • 너무 낮게 설정하게 되면,,
    • 만약, 10개를 스레드 풀에 세팅을 한다고 하면, 동시 요청이 많게 되면 클라이언트는 응답 지연이 되게 됩니다.
  • 너무 높게 설정하게 되면
    • 동시 요청이 많으면 임계점 초과되어 서버가 다운될 수 있습니다.

5) 쓰레드 풀 - 적정 숫자

  • 상황에 따라 모두 다르기 때문에 성능 테스트를 해봐야합니다.
  • 가급적이면 실제 서비스와 유사하게 성능 테스트를 시도하는 것도 좋습니다.
    • 툴 : 아파치 ab, 제이미터, nGrinder

6) WAS 의 멀티 쓰레드 지원(핵심)

  • WAS가 멀티스레드를 지원한다는 것입니다. 개발자가 스레드 관련 코드를 신경쓰지 않아도 됩니다.
  • 개발자는 비즈니스 로직만 작성하면 됩니다. 마치 싱글 쓰레드 프로그래밍하듯 편리하게 소스코드를 개발하면 됩니다.
  • 대신, 어찌돼었든 멀티 쓰레드 환경이므로, 싱글톤(서블릿, 스프링 빈)은 주의해서 사용해야 합니다.
    • 멤버변수(공유변수)는 주의하기만 하면 잘 애플리케이션 개발할 수 있습니다.

IV. HTML, HTTP API, CSR, SSR

백엔드 개발자가 다음의 세 가지를 고민해야 합니다.(정적 리소스, html, http api)

1) 정적 리소스

2) HTML 페이지(동적)

  • was가 db를 통해 주문정보를 조회 후 동적으로 html를 생성합니다.(jsp, 타임리프를 통해) 이후 웹 브라우저에 올려줍니다.

3) HTTP API

  • html이 아니라 데이터를 전달합니다.

  • 주로 거의 대부분 JSON형식을 사용합니다.

  • 다양한 시스템에서 사용하게 됩니다. 다음과 같이

  • 사용되는 상황

    • 데이터만 주고받는 경우에 사용합니다.
    • UI 화면이 필요한 경우에는 클라이언트가 별도로 처리합니다.
    • 웹 브라우저에서 HTML 렌더링을 위해 자바스크립트를 통해 AJAX, PATCH를 사용해서 API를 호출할 수 있습니다. WAS에서 필요한 내용을 보내줍니다.
  • 웹 클라이언트 → 서버/ 서버 → 서버/ 앱 클라이언트 → 서버에서 사용됩니다.

4) 서버사이드 레더링 SSR

  • 서버에서 동적 html까지 모두 생성해서 웹브라우저에서 보여주는 것입니다. 웹 브라우저는 보여주는 역할만 합니다.
  • 서버에서 html까지 모두 생성해 렌더링하는 것을 말합니다.

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

  • html 결과를 자바스크립트로 웹브라우저에서 동적으로 생성해서 적용하는 것을 말합니다.
  • DOM 구조에 HTML 넣도록 하여 HTML를 건드는 것으로, 클라이언트쪽에서 HTML를 만진다고 하여 ‘클라이언트 사이드 렌더링’이라고 합니다.
  • 필요 부분만 변경할 수 있습니다.
    • 구글 지도, 구글 캘린더 등

  • 웹 브라우저에서 서버에 요청

→ HTML 내용이 없이 응답(자바스크립트 링크를 내려준다)

→ 자바스크립트 링크를 요청합니다.(클라이언트 로직 + HTML 렌더링 코드가 포함되어 있습니다.)

→ HTTP API로 데이터를 요청합니다.

6) 정리(백엔드 개발자 입장에서 UI 기술 어디까지 알아야 하는가)

백엔드-SSR

  • 주로 정적 화면에 사용하며, HTML 최종 결과를 서버에서 만들어 웹브라우저에 전달합니다.
  • JSP보다는, 타임리프를 공부하는 것을 권장합니다.
  • 화면이 정적이고 복잡하지 않을 때 사용합니다.
  • 백엔드 개발자는 서버 사이드 렌더링 기술 학습이 필수적입니다.

프론트엔드-CSR

  • HTML 결과를 자바스크립트를 사용해 웹 브라우저에서 동적 생성하여 적용합니다.
  • 필요 부분만 변경할 수 있고, 이 기술은 웹 프론트엔드 기술자들이 사용합니다.
  • React, Vue.js를 사용하며 프론트엔드 개발자의 전문 분야입니다.

선택과 집중

  • 웹 프론트엔드 기술 학습은 옵션입니다.
  • 백엔드 개발은 서버, DB, 인프라 등등 배워야 할 기술이 많기 때문입니다.

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

  • 서블릿 …html 생성의 어려움 발견
  • JSP … HTML 생성은 편하지만 비즈니스 로직까지 너무 많은 역할을 담당하게 됩니다.
  • 서블릿, JSP 조합 MVC 패턴을 사용합니다..모델, 뷰, 컨트롤러로 나누어 개발합니다.

→ 비즈니스로직 부분(서블릿, 자바), 화면 렌더링 부분(JSP)을 나누게 됩니다.

이후 애노테이션 기반 스프링 MVC가 등장하게 됩니다.

  • 스프링 부트 등장
    • 스프링 부트에는 서버를 내장하고 있고, 빌드 결과에 was 서버를 포함시켜 빌드 배포를 단순화시킵니다.

1) 최신기술(스프링 웹 플럭스)

  • 최소 스레드로 최대 성능을 냅니다. 이는 컨텍스트 스위칭 비용을 효율화시킵니다.
  • 함수형 스타일로, 동시처리 코드를 효율화시킵니다.
  • 다만, 스프링 웹 플럭스는 기술적 난이도도 높으며 실무에서 많이 사용하지 않습니다.

2) 자바 뷰 템플릿 역사

jsp → 속도가 느리고 기능이 부족합니다.

타임리프 →

내추럴 템플릿(html모양을 유지하면서 뷰 템플릿 적용이 가능합니다.) 되게 깔끔합니다.

최선의 선택이라고 볼 수 있습니다.

스프링 mvc와 강력하게 기능 통합이 가능합니다.

0개의 댓글