녕의 학습 기록

[Spring MVC 1] 웹 애플리케이션의 이해 본문

Dev/Spring

[Spring MVC 1] 웹 애플리케이션의 이해

kjyyjk 2023. 1. 7. 21:22

 학습 내용 

WAS / 서블릿(컨테이너) / 멀티쓰레드 / HTTP API / SSR / CSR 등 간단한 개념


* 웹 애플리케이션 서버(WAS)

 

웹 서버는 정적 리소스를, WAS(웹 애플리케이션 서버)는 애플리케이션 로직을 수행한다.

 

물론 웹 애플리케이션 서버에서도 웹 서버의 기능을 제공하기에 둘의 경계는 모호하다.

 

하지만 애플리케이션 코드를 실행하는데 특화되어 있는 것이 WAS.

 

웹 시스템은 최소한으로는 WAS와 DB로 구성되어있다.

 

이때 WAS에 많은 역할이 부여되어 과부하될 우려가 있어, 웹 서버를 따로 두어 정적 리소스를 처리하게끔!

 

만약 동적인 처리가 필요하다 -> 웹 서버가 WAS에 요청 위임

 

 이렇게 웹 시스템을 구성하면 WAS나 DB에 장애가 나도 웹 서버가 오류화면을 제공할 수 있다.

 

* 서블릿(Servlet)

 

만약 우리가 WAS를 직접 구현하려면 비즈니스 로직을 포함해서 전후 단계로 구현할 게 너무 많다.

 

하지만 서블릿을 지원하는 WAS를 사용하면, 비즈니스 로직을 제외한 모든 것을 자동으로 지원해준다.

 

그러면 우리는 비즈니스 로직만 구현하면 된다.

비즈니스 로직을 제외하고는 서블릿이 지원

서블릿의 구조는 다음과 같다.

HttpServlet을 상속받는 HelloServlet은 "/hello" url이 들어오면 내부의 애플리케이션 로직을 실행한다.

 

이 로직에는 파라미터로 HttpServletRequest와 HttpServletResponse 객체를 가진다.

 

 

 

실제로 HTTP요청이 들어오면 WAS가 이 Request, Response 객체를 만들고 서블릿 객체를 호출.

 

해당 서블릿 객체의 로직 내에서는 Request 객체에서 필요한 정보를 얻고, Response 객체에 필요한 정보 입력 가능.

편리하다!!

 

그리고 Response 객체의 내용으로 HTTP 응답을 생성 후에 웹 브라우저에게 전달하면 끝! 

 

서블릿을 지원하는 WAS 내부에 서블릿 컨테이너

이처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.

 

서블릿 컨테이너는 서블릿 객체를 싱글톤으로 관리(마치 스프링 컨테이너처럼)한다.

 

당연히 고객별로 요청과 응답이 달라야하므로 reqeust와 response 객체는 매 요청마다 생성하지만,

이들을 파라미터로 가져다 쓰는 서블릿은 1개!! 로 관리한다는 뜻이다.

 

싱글톤이기에 공용 변수 사용에 있어서는 주의가 필요하다.

 

 

추가로 서블릿은 멀티 쓰레드를 지원한다는 중요한 특징이 있다.

 

* 멀티쓰레드

 

백엔드 개발자에게 멀티 쓰레드는 정말로 중요한 개념이다.

 

쓰레드는 애플리케이션 코드를 하나하나 순차적으로 실행하는 것이다.

 

따라서 자바 메인 메서드를 실행하면 main이라는 이름의 쓰레드가 실행된다.

 

서블릿 객체를 호출하는 것도 바로 이 쓰레드다.

 

쓰레드는 한번에 하나의 코드만 수행하기 때문에 동시 처리가 필요하면 쓰레드를 추가해야한다.

 

만약 여러 요청이 들어오는데 쓰레드를 하나만 사용한다고 가정했을 때.

 

첫번째 요청에서 처리가 지연된다면 해당 쓰레드를 기다리는 다른 요청도 저절로 지연된다.

 

두 요청 모두 지연되어버리고 결국은 죽어버리는 것. 이러면 안되겠지?

 

이를 해결하기 위해 매 요청마다 쓰레드를 생성한다면.

 

처음 요청의 처리가 지연된 상태여도, 새로운 요청은 쓰레드를 새로 생성해서 바로 처리 가능!

 

 

이렇게 매 요청마다 쓰레드를 생성하면 동시 요청을 처리할 수 있다는 장점을 지닌다.

 

하지만 쓰레드의 생성에 있어서는 여러 비용이 발생하고, 생성 시간만큼 응답이 늦어진다는 단점!

 

무엇보다도 요청이 수만개가 들어와도 생성에 제한이 없기에 과부하되어 서버가 죽을 수도 있다.

 

-> 쓰레드 풀을 통해 보완

 

쓰레드 풀은 쓰레드를 설정한 최대치로 미리 생성하고 보관한다.

 

요청이 들어와 쓰레드가 필요하다면? 쓰레드 풀에서 쓰레드를 꺼내 사용.

-> 생성 시간 및 응답 시간 절약

 

쓰레드가 모두 사용중이라면? 요청을 거절하거나 대기하도록 설정.

-> 아무리 많은 요청이 들어와도 기존 요청은 안전하게 처리 가능.

 

 

중요한 것은 WAS가 이런 멀티 쓰레드를 지원한다는 것

 

* HTTP API

 

HTTP API는 HTML이 아닌 데이터를 전달한다.

 

주로 JSON 형식으로 데이터를 전달.

 

HTML을 전달하지 않기에 데이터만 주고 받고, UI는 클라이언트가 별도로 처리해야한다.

 

 

백엔드 개발자라면 다음 3가지를 고민해야한다.

 

1. 정적 리소스를 어떻게 제공할 것인지(주로 웹브라우저)

2. 동적 HTML 페이지를 어떻게 제공할 것인지(주로 jsp, 타임리프)

3. HTTP API를 어떻게 제공할 것인지.

 

* SSR(서버 사이드 렌더링) / CSR(클라이언트 사이드 렌더링)

 

SSR 서버 사이드 렌더링이란 HTML 최종 결과를 서버에서 만들어서 웹 브라우저에 전달하는 방식이다.

 

주로 백엔드 개발자가 jsp, 타임리프를 이용하여 정적인 화면을 서버에서 동적으로 구현.

 

CSR 클라이언트 사이드 렌더링이란 HTML 결과를 자바 스크립트를 사용해 웹 브라우저에서 동적 생성

(innerHTML 등등 이용)

 

주로 프론트엔드 개발자가 React, Vue.js 를 이용하여 동적인 화면 구현.

 

SSR

 

백엔드 개발자에게 있어서 웹 프론트엔드 기술은 옵션이다.

 

옵션보다는 일단 수많은 백엔드 기술을 공부해야한다.

 


 다음 학습 내용 

서블릿 심화

 

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com

 

'Dev > Spring' 카테고리의 다른 글

[Spring MVC 1] 서블릿 (2)  (0) 2023.01.13
[Spring MVC 1] 서블릿 (1)  (0) 2023.01.11
[Spring 기본] 빈 스코프 (3)  (0) 2022.12.18
[Spring 기본] 빈 스코프 (2)  (0) 2022.11.28
[Spring 기본] 빈 스코프 (1)  (0) 2022.11.25