이 글은 스프링 [스프링 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): 성능 빠르긴 함