[Spring] MVC 1편 - 01. 웹 애플리케이션의 이해

somyeong·2022년 4월 12일
1

Spring

목록 보기
11/17
post-thumbnail

이 글은 스프링 [스프링 MVC 1편]을 듣고 정리한 내용입니다

  • 내용이 많으니, MVC편 부터는 최대한 간단하게 배운 내용을 정리해야겠다....
  • 개념 부분은 중요한 부분 위주로 정리하고(살짝 자세히), 실습 강의는 실습 잘 이해하고, 키워드 정도만 간단하게 정리!!
  • 한 섹션 끝나고, 내 정리글 & 강노 보면서 복습하고 다음 섹션 듣기!!!

📌 웹 서버, 웹 애플리케이션

🌱 웹 서버 (Web Server)

  • 웹 서버는 HTTP 기반으로 동작한다
  • 정적리소스를 제공하고, 기타 부가기능도 있다.
    ex) NGINX, APACHE

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

  • 웹 애플리케이션 서버도 HTTP 기반으로 동작한다 (모든것이 HTTP 라는말 기억!)
  • 웹 서버 기능을 포함하고 추가로 애플리케이션 로직도 수행한다.
    ex) 톰캣, Jetty, Undertow

비슷한데 뭐가 다르지 ?

  • 둘의 용어 경계가 모호하긴 하다 (웹 서버도 애플리케이션 기능을 어느정도 하고, 웹 애플리케이션 서버도 웹 서버의 기능을 어느정도 하기 때문)
  • 웹서버는 정적 리소스(파일), WAS는 애플리케이션 로직 이라고 생각하자
  • 거기에 추가로, WAS는 애플리케이션 코드를 실행하는데 더 특화되었다고 생각하면 된다.

웹 시스템 구성 - WAS, DB

  • WAS는 정적 리소스, 애플리케이션 로직 모드 제공 가능하므로 WAS,DB 만으로 시스템 구성이 가능하긴 하다.
  • 그러나, WAS가 너무 많은 역할을 담당해서, 서버 과부하가 우려된다.
  • 그래서 아래와 같이 구성한다.

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

1. 구성

  • 정적 리소스는 웹 서버가 처리하고, 애플리케이션 로직같은 동적인 처리가 필요하면 WAS에 요청을 위임한다.
    • WAS는 중요한 애플리케이션 로직 처리를 전담한다.

2. 리소스 관리

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

3. 오류 나면?

  • 웹 서버는 잘 죽지 않고, WAS 서버는 잘 죽는다
  • WAS,DB 장애가 나면 웹서버가 오류 화면을 제공한다.

📌 서블릿

  • 웹 애플리케이션 서버를 직접 구현하면, 다음과 같은 일들을 전부 해야 한다.
  • 서블릿을 지원하는 웹 애플리케이션 서버(WAS)를 사용하면 비즈니스 로직 실행을 제외한 나머지를 알아서 해준다.

HTTP 요청 및 응답 흐름

  • HTTP 요청시
    • WAS는 Request, Response객체를 새로 만들어서 서블릿 객체를 호출한다
    • 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용하면 된다
    • 또한 Response 객체에 HTTP 응답 정보를 편리하게 입력한다.
    • WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성해준다.!

서블릿 컨테이너

서블릿 컨테이너란?

톰캣처럼 서블릿을 지원하는 WAS

  • 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리해준다.
  • 서블릿 객체는 싱글톤으로 관리한다
  • JSP도 서블릿으로 변환 되어서 사용한다
  • 동시 요청을 멀티 쓰레디 처리를 지원한다.

📌 동시 요청 - 멀티 쓰레드

쓰레드란?

  • 애플리케이션 코드를 하나하나 순차적으로 실행한는것은 쓰레드이다.
  • 쓰레드가 없다면 자바 애플리케이션 실행이 불가능하다
  • 동시처리가 필요하면 쓰레드를 추가로 생성한다.

요청마다 쓰레드 생성

  • 요청이 올때마다 쓰레드를 생성하면 동시 요청을 처리 할 수 있다.
  • 그러나 쓰레드 생성 비용은 매우 비싸다
  • 또한 쓰레드 생성에 제한이 없어서 고객 요청이 너무 많이오면 CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있다.
  • 그래서 쓰레드 풀을 이용해 단점을 보완한다.

쓰레드 풀


  • 필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다
  • 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다
    ex) 톰캣은 최대 200개 기본 설정 (변경 가능)

쓰레드 풀의 적정 숫자

  • 애플리케이션의 로직도 복잡도, CPU, 메모리, IO 리소스 상황 등을 고려하여 적정 숫자를 찾아 지정해야한다.
  • 최대한 실제 서비스와 유사하게 성능 테스트를 시도하면서 적정 숫자를 적한다

WAS의 멀티 쓰레드 지원의 핵심

  • WAS가 멀티 쓰레드에 대한 부분을 알아서 처리한다.
  • 개발자가 멀티 쓰레드 관련 코드는 신경 안써도 된다. 싱글쓰레드 프로그래밍 하듯이 편리하게 개발 하면 된다.
  • 멀티쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)은 주의해서 사용해야 한다.

📌 HTML, HTTP API, SSR, CSR

정적 리소스

  • 고정된 html파일, css, js, 이미지, 영상 등을 제공
  • 주로 웹 브라우저

HTML 페이지

  • 동적으로 필요한 HTML 파일을 생성해서 전달한다
    ex) 방법은 JSP, 타임리프 등
  • 웹 브라우저: 전달받은 HTML 파일을 해석하여 화면에 띄운다.

HTTP API

  • 이전 방법처럼 HTML 파일 자체를 보내는게 아니라 데이터만 전달한다
  • 주로 JSON 형식 사용
  • HTTP API 방식은 다양한 시스템에서 사용한다.

SSR - 서버 사이드 렌더링

  • 서버에서 최종 HTML을 생성해서 클라이언트에 전달하는 방식을 뜻한다.
  • 주로 정적인 화면에 사용
  • 사용 기술: JSP, 타임리프 등 -> 백엔드 개발자가 하는일!

CSR - 클라이언트 사이드 렌더링

  • HTML 결과를 자바스크립트를 사용해 웹 브라우저에서 동적으로 생성해서 적용한다.
  • 주로 동적인 화면에 사용하고, 웹 환경을 마치 앱 처럼 필요한 부분부분씩 변경할 수 있다.
    ex) 구글지도, Gmail, 구글 캘린더
  • 사용 기술: React, Vue.js -> 웹 프론트엔드 개발자가 하는일!

😱 백엔드 개발자, UI기술 어디까지 알아야 하나?

  • 선택과 집중
  • 서버 사이드 랜더링 기술은 필수 학습하여, admin 페이지 개발 시 활용
  • 백엔드 개발자는 서버, DB, 인프라 등등 많은 기술 알아야 하니 프론트쪽은 선택 ....

📌 자바 백엔드 웹 기술 역사

과거 기술

  • 서블릿 -> JSP -> 서블릿, JSP 조합 MVC 패턴 사용 -> MVC 프레임워크 춘추 전국 시대

현재 사용 기술

  • 어노테이션 기반의 스프링 MVC 등장
    ex) @Controller
    - MVC 프레임워크의 춘추 전국 시대 마무리
  • 스프링 부트의 등장
    • 스프링 부트는 서버를 내장한다.
    • 과거에는 서버에 WAS를 직접 설치하고, 소스는 War 파일을 만들어서 설치한 WAS에 배포하곤 했다.
    • 스프링 부트는 빌드 결과(Jar)에 WAS 서버를 포함하므로써 빌드 배포를 단순화 시킨다.

최신 기술

  • Web Servelt - Spring MVC (이거 사용)
  • Web Reactive - Spring WebFlux (어려움)

자바 뷰 템플릿 - HTML을 편리하게 생성하는 뷰 기능

  • 타임리프(Thymeleaf)를 쓰자!!!!
    • HTML의 모양을 유지하면서 뷰 템플릿 적용 가능하다 (내추럴 템플릿)
    • 스프링 MVC와 강력한 기능 통합
  • JSP - 속도 느림, 기능 부족
  • 프리마커(Freemarker), 벨로시티(Velocity): 성능 빠르긴 함
profile
공부한 내용 잊어버리지 않게 기록하는 공간!

0개의 댓글