[Spring] 스프링 MVC - 서블릿, 스레드,HTML

easyone·2025년 9월 21일
0

Spring

목록 보기
11/11

서블릿

서블릿은 서버 소켓 연결, 요청 메시지를 파싱해서 읽기, Post 방식인지 어떤 URL인지 읽기, Content-Type 확인, body 내용 파싱, 저장 프로세스 실행 .. 등을 하고,
의미있는 것은 '데이터베이스에 저장을 하는'비즈니스 로직인데, 비즈니스 로직을 실행 하고 응답 메시지를 생성하는 등의 과정을 거쳐야 하는게 서버에서 처리하는 업무다.
즉 비즈니스 로직 외에 나머지 과정은 매번 실행을 해줘야 하는데, 이러한 과정들을 자동화해주는 것이 서블릿이다.

@WebServlet(name = "helloServelt", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
	@Override
    protected void service(HttpServletRequest request, HttpServletResponse response) {
     //로직
     }

urlPatterns에 해당하는 URL이 호출되면, 서블릿 코드가 실행된다.
HttpServletRequest, HttpServletResponse 를 사용하면 HTTP 요청, 응답 정보를 사용할 수 있다. 즉 응답 메시지를 편리하게 사용할 수 있도록 해준다. 원하는 데이터를 Response 객체에 넣는 방식이고, HTTP 스펙을 매우 편리하게 사용 가능하다.

전체 흐름
HTTP 요청 시 WAS가 request, response 객체 생성
서블릿 컨테이너에 있는 서블릿 객체를 호출
개발자가 Request에서 HTTP 요청 정보를 꺼내서 사용, Response 객체에서 HTTP 응답 정보를 입력 WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 생성
응답 내용으로 html에 랜더링해서 보여줌

서블릿 컨테이너

서블릿을 지원하는 WAS 안에는 서블릿 컨테이너가 있는데, 서블릿 컨테이너가 서블릿 객체를 생성해준다. WAS가 종료될 때 서블릿도 종료해준다. 톰캣이 바로 서블릿 컨테이너이다.

  • 서블릿 컨테이너는 서블릿 객체를 생성,초기화,호출,종료하는 생명주기를 관리한다.
  • 서블릿 객체는 싱글톤으로 관리된다.
    고객의 요청마다 데이터가 달라야 하기 때문에, 요청에 따라 response,request 객체가 달라야 한다. 즉 이 객체들은 요청이 올 때마다 생성된다. 그렇지만 요청이 올 때마다 객체 생성하는 것은 비효율적이다. 즉 최초 로딩 시점에 서블릿 객체를 미리 생성해두고 모든 고객 요청은 하나의 서블릿 객체에 접근하게 된다.
    -> 공유 변수 사용을 주의해야한다. (하나의 객체를 모든 고객이 사용하기 때문)
  • 서블릿 컨테이너가 종료될 때 함께 종료된다.
  • JSP도 서블릿으로 변환되어서 사용된다.
  • 동시 요청을 위한 멀티 스레드 처리를 지원한다. 즉 개발자가 요청이 많이 오는 것에 대해 신경 쓰지 않아도, WAS가 알아서 처리를 해준다.

동시요청 멀티스레드

스레드

  • 스레드는 애플리케이션 코드를 하나하나 순차적으로 실행한다.
  • 자바 메인 메서드를 처음 실행하면 메인이라는 이름의 스레드가 실행되고, 스레드가 없다면 자바 애플리케이션 실행이 불가능하다.
  • 스레드는 한번에 하나의 코드 라인만 실행하므로, 동시 처리가 필요하면 스레드를 추가로 생성해야 한다.

단일 요청의 경우, 요청이 오면 스레드를 할당하고, 응답이 완료되면 스레드가 휴식을 하게 된다.
다중 요청의 경우, 서블릿 안에서 요청 1의 경우 처리가 지연될 수 있다. 스레드가 하나만 있다면, 이 상황에서 요청2가 오게 되면 요청1,요청2 둘 다 실행을 기다리기만 하게 된다.
요청마다 스레드를 생성한다면, 요청1이 처리가 지연되더라도, 요청2가 들어오면 새로운 스레드를 만들어서 요청을 처리하면 된다.

요청마다 스레드 생성

장점

  • 동시 요청을 처리할 수 있다.
  • CPU, 메모리가 허용할 때까지 처리가 가능하다.
    단점
  • 스레드 생성 비용은 매우 비싼데, 고객의 요청이 올 때마다 스레드를 생성하게 되면 응답 속도가 늦어진다.
  • 코어가 하나인데, 스레드가 두개일 경우 전환할 때, 컨텍스트 스위칭을 하게 된다. 이러면 컨텍스트 스위칭 비용이 발생하게 된다.
  • 스레드 생성에 제한이 없다. 고객 요청이 너무 많이 오면, CPU, 메모리 임계점을 넘어서 서버가 죽을 수도 있다.

스레드 풀

이러한 단점들을 해결하기 위해, WAS는 스레드 풀이라는 걸 활용한다.
필요한 스레드를 스레드 풀에 보관하고 관리하는 것이 스레드 풀의 역할이다. 스레드 풀에 생성 가능한 스레드의 최대치를 관리하고, 스레드 사용을 하고 반납하는 형식으로 활용한다. 톰캣은 최대 200개가 기본으로 설정되어 있으며, 변경 가능하다.

스레드 사용하기

  • 스레드의 사용 : 스레드가 필요하면 이미 생성되어 있는 스레드를 스레드 풀에서 꺼내서 사용한다.
  • 스레드 반납 : 사용을 종료하면 스레드 풀에 해당 스레드를 반납한다.
  • 스레드 대기, 거절: 최대 스레드가 모두 사용중이어서 스레드 풀에 스레드가 없을 경우, 기다리는 요청은 거절하거나 특정 숫자만큼만 대기하도록 설정 가능하다.

실무 팁
WAS의 주요 튜닝 포인트는 최대 스레드 수이다.

  • 너무 낮게 설정하면 ? 요청 수가 갑자기 많아지면, 스레드 수는 적기 때문에 나머지 요청들은 대기하게 된다. 그렇지만 스레드 수가 적으면 CPU 사용률이 매우 낮다. 즉 서버 리소스가 여유롭지만, 클라이언트는 금방 응답 지연이 발생한다.
  • 너무 높게 설정하면 ? 동시 요청이 많아지만 CPU, 메모리 리소스의 임계점 초과로 서버가 다운된다.
  • 장애 발생 시에, 클라우드일 경우 일단 서버부터 늘리고 이후에 튜닝하면 된다. 클라우드가 아니라면 평상시에 열심히 튜닝을 해야 한다.

스레드 풀의 적정 숫자

  • 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 모두 다르다.
  • 성능 테스트를 통해 찾아야 한다. 최대한 실제 서비스와 유사하게 성능 테스트를 시도하고, 툴은 아파치 ab, 제이미터, nGrinder를 사용한다. 개발 서버를 구축해놓고, 병목 포인트를 찾아서 튜닝을 하면 된다.

WAS의 멀티 스레드 지원

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

서버에서 알아야 할 HTML 관련 지식

HTML 페이지

웹 브라우저에서 정적 리소스를 요청할 경우, 고정된 HTML 파일, CSS, JS, 이미지, 영상 등을 제공한다.
웹 브라우저에서 요청을 하면, WAS에서 DB에서 조회를 해온 뒤에, 동적으로 필요한 HTML 파일을 생성해서 전달하면, 웹 브라우저는 HTML 파일을 해석해서 제공한다.

HTTP API

HTML이 아닌 데이터를 전달하는데, JSON 형태로 전달한다. 다양한 시스템에서 이를 호출하게 되는데, 데이터만 주고 받을 경우 활용한다. 앱 -> 서버, 서버 -> 서버, 웹 클라이언트 -> 서버 의 경우들이 있다.
React,Vue.js와 같은 웹 클라이언트나 웹 브라우저에서 자바스크립트을 이용하여 HTTP API를 호출하는 경우들이 있다.
서버와 서버 간의 통신의 경우 주문 서버와 결제 서버가 분리되어 있을 경우, json으로 통신할 수 있다.

SSR ( 서버 사이드 렌더링 )

서버에서 최종 결과, 즉 최종 HTML을 동적으로 만들어서, 클라이언트에 전달하는 것이다.

CSR

HTML 결과를 자바스크립트를 사용해서 웹 브라우저에서 동적으로 생성해서 적용하는 것이다.
주로 동적인 화면에 사용을 하는데, 관련 기술로는 React, Vue.js가 있다.
흐름은 다음과 같다.
내용이 없는 html을 요청하는데, 내부에는 자바스크립트 링크가 있다. 그러면 이 자바스크립트를 요청을 하게 되는데, 서버에서는 자바스크립트 내부에 있는 클라이언트 로직과 html 랜더링 코드를 응답을 하게 된다.
웹 브라우저는 이번에는 HTTP API로 서버를 호출한다. 즉 데이터를 요청하는 것이기 때문에, DB에서 정보를 조회하고 json 타입으로 웹 브라우저에 반환한다. 그러면 최종적으로 클라이언트,웹 브라우저에서 동적으로 HTML을 생성해서 반환을 해준다. 즉 클라이언트에서 동적으로 자바스크립트를 사용하여 HTML을 생성해주는 방법이다.

profile
백엔드 개발자 지망 대학생

0개의 댓글