-
[스프링 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와 강력한 기능 통합
'INFLEARN > 스프링 MVC 1편' 카테고리의 다른 글
[스프링 MVC 1] 6. 스프링 MVC - 기본 기능 (0) 2021.11.05 [스프링 MVC 1] 5. 스프링 MVC - 구조 이해 (0) 2021.10.27 [스프링 MVC 1] 4. MVC 프레임워크 만들기 (0) 2021.10.23 [스프링 MVC 1] 3. 서블릿, JSP, MVC 패턴 (0) 2021.10.18 [스프링 MVC 1] 2. 서블릿 (0) 2021.10.16