SpringMVC - 01. 웹 애플리케이션 이해
웹 애플리케이션 이해
웹 서버 (Web Server)
- HTTP 기반으로 동작
- 정적 리소스 + 기타 부가 기능 제공
- 정적 HTML, CSS, JS, 이미지, 영상
- ex) NGINX, APACHE
웹 애플리케이션 서버 (WAS - Web Application Server)
- HTTP 기반으로 동작
- 웹 서버의 기능을 대부분 포함 (정적 리소스 제공 가능)
- 프로그램 코드를 실행해서 애플리케이션 로직 수행
- 동적 HTML, HTTP API (JSON)
- 서블릿, JSP, Spring MVC
- ex) Tomcat, Jetty, Undertow
- 애플리케이션 코드를 실행하는데 더 특화돼있음
웹 시스템 구성 - WAS + DB
- WAS가 정적 + 동적 리소스 모두 담당
- 정작 중요하고 비싼 애플리케이션 로직이 정적 리소스에 방해 받을 수 있음
- WAS가 하는 일이 너무 많음 => 서버 과부화 우려 (WAS는 되게 잘 죽는다)
- WAS가 장애 발생시, 오류 화면 노출 불가능 (서버에 접근 자체가 불가능하므로)
- 데이터만 주고받은 API를 구축하는 경우엔 WAS + DB로만 구성해도 괜찮다
웹 시스템 구성 - Web Server + WAS + DB
- 정적 리소스는 웹 서버가 담당
- 애플리케이션 로직과 같은 동적인 처리는 WAS에 위임
- WAS가 중요한 애플리케이션 로직 처리를 전담
- 효율적인 리소스 관리 가능
- 정적 리소스 많이 사용 => Web 서버 증설
- 애플리케이션 리소스많이 사용 => WAS 증설
- Web Server는 잘 죽지 않음 => 오류 화면 제공 가능
서블릿 (Servlet)
- 개발자가 WAS를 매번 직접 구현하는 게 너무 비효율적이므로 이를 대체해주는 기능
- 비즈니스 로직 실행 및 DB에 저장 요청을 하는 과정을 제외한 모든 과정을 대신 해줌
- urlPatterns의 URL이 호출되면 서블릿 코드가 실행
- HttpServletRequest : HTTP 요청 정보를 편리하게 사용할 수 있음
- HttpServletResponse : HTTP 응답 정보를 편리하게 제공할 수 있음
HTTP 요청 시 흐름
- WAS가 Request, Response 객체를 새로 만든 후, 서블릿 객체 호출
- 개발자가 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용
- 개발자가 Response 객체에 HTTP 응답 정보를 편리하게 입력
- WAS가 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성
서블릿 컨테이너
- 서블릿을 지원하는 WAS를 의미
- WAS안에 있는 서블릿 컨테이너가 서블릿 객체의 생명주기 관리 (생성, 초기화, 호출, 종료)
- 서블릿 객체는 싱글톤으로 관리됨
- 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용
- 공유 변수 사용할 때 주의해서 작성
- 동시 요청을 위한 멀티 쓰레드 처리 지원
멀티 쓰레드
- 멀티 쓰레드에 대한 부분은 WAS가 처리해준다
- 개발자가 따로 신경쓰지 않아도 됨
- 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발할 수 있음
쓰레드
- 애플리케이션 코드를 하나하나 순차적으로 실행하는 것
- 쓰레드는 한 번에 하나의 코드 라인만 수행
- 동시 처리가 필요하면 쓰레드를 추가로 생성 => 멀티 쓰레드
- java의 경우 메인 메소드를 처음 실행하면 ‘main’이라는 이름의 쓰레드가 실행
- 쓰레드가 없다면 java 애플리케이션 실행 불가능
프로세스와 쓰레드
프로세스 : 프로그램이 메모리에 올라오고 CPU를 할당받고 프로그램이 동적으로 실행되고 있는 상태
쓰레드 : 프로세스 내에서 실행되는 흐름의 단위 (프로세스 안에 여러개 존재 가능)
동시 처리를 위한 멀티 쓰레드 생성
01. 요청시 마다 쓰레드 생성
- 장점
- 동시 요청 처리 가능
- 리소스(CPU, 메모리)가 허용할 때 까지 처리 가능
- 하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작함
- 단점
- 쓰레드 생성 비용은 비쌈 => 매번 생성하면 응답 속도가 당연히 늦어짐
- 컨텍스트 스위칭 비용이 발생
- 쓰레스 생성 개수에 제한이 없음 => CPU, 메모리 임계점 초과시 서버 다운
02. 쓰레드 풀을 활용
- 필요한 쓰레드를 쓰레드 풀에 보관하고 관리
- 생성 가능한 쓰레드의 최대치를 미리 담아둠 (톰캣 : 기본 200개)
- 사용
- 쓰레드 필요시, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼냄
- 사용 종료하면 쓰레드 풀에 반납
- 최대 쓰레드가 모두 사용 중인 경우, 요청을 거절하거나 대기하도록 설정
- 장점
- 미리 생성된 쓰레드를 사용하므로 생성, 종료 비용이 절약되고 응답 시간이 빠름
- 너무 많은 요청이 들어와도 기존 요청을 안전하게 처리 가능
- Tip
- WAS의 조유 튜닝 포인트 : 최대 쓰레드 수
- 장애 발생 시 => 클라우드 사용하면 서버부터 늘리고 튜닝하자
- 쓰레드 풀의 적정 숫자
- 성능 테스트를 최대한 실제 서비스와 유사하게 시도하자
- Tool: 아파치 ab, 제이미터, **nGrinder **
컨텍스트 스위칭 (Context Switching)
쓰레드(프로세스)를 하나 사용하고 다음 쓰레드(프로세스)로 넘어가는 과정
HTML, HTTP API, CSR, SSR
HTML
- 정적 리소스 & 동적 리소스 제공
HTTP API
- 다양한 시스템에서 하여 데이터만 주고 받는 방식 (format: JSON)
- UI 화면이 필요한 경우, 클라이언트가 별도 처리
- 앱, 웹 클라이언트(javascript 사용 => React, Vue.js로 발전), 서버 to 서버 간의 통신에 사용
SSR (서버 사이드 렌더링)
-
서버에서 최종 HTML을 생성하여 클라이언트에게 전달
- 주로 정적인 화면에 사용
- 관련 스택 : JSP, Thymeleaf
CSR (클라이언트 사이드 렌더링)
- HTML 결과를 javascript를 사용하여 웹 브라우저에서 동적으로 생성해서 적용
- 주로 동적인 화면에 사용 (웹을 마치 앱처럼 필요한 부분부분 변경할 수 있음)
- ex) 구글 지도, Gmail, 구글 캘린더
- 관련 스택 : React, Vue.js
댓글남기기