[Spring] Servlet

늘보·2025년 2월 21일

Spring

목록 보기
12/24

Servlet

HTTP 프로토콜 기반 요청 및 응답을 처리하는데 사용된다. Java에서 Servlet은 HttpServlet을 상속받아 구현되며, 웹 애플리케이션 개발의 핵심 기술 중 하나이다.

➡︎ Servlet은 클라이언트의 요청에 맞춰 웹 서버가 동적인 페이지를 제공할 수 있도록 도와주는 어플리케이션이다.

💡 동적인 페이지란?

요청에 대해 사용자는 조건에 따라 다른 결과를 받게된다. 동적 웹페이지의 종류로는 CSR, SSR 등이 있다.
[WEB] 정적 웹 페이지와 동적 웹 페이지


요청과 응답 예시

[HTTP Request Message 예시]

POST /api/users HTTP/1.1  🟢 [start] 
Host: localhost:8080      🟢 [Header] 
Content-Type: application/x-www-form-urlencoded  

userId=아이디&password=비밀번호  🟢 [Message Body] 

[HTTP Response Message 예시]

HTTP/1.1 200 OK  🟢 [start] 
Content-Type: text/html;charset=UTF-8
Content-Length: 3423
 
<html>
   <body>
 	  ...
   </body>
</html>

서버에서 실제로 처리해야 하는 작업

1. 서버와 TCP/IP 연결

2. HTTP Request Message를 필요한 형태로 변환하여 읽기
➡︎ 요청을 서버에서 읽고 사용하기 위해

a. HTTP Method 및 URL 분석
b. HTTP Header 분석
c. HTTP Message Body 읽기 및 변환  

🚩3. 분석 결과를 통해 프로세스를 실행하고 비지니스 로직을 실행한다. Ex> 회원 가입으로 유저 생성

5. HTTP Request Message를 필요한 형태로 변환하여 읽기

a. HTTP Start Line 생성
b. Header 생성
c. HTTP Message Body에 응답 데이터를 요청한 형식에 맞춰 응답
d. 처리가 불가할 경우 예외 처리

6. 응답 전달 및 연결 종료


Servlet 동작 순서

  1. WAS는 HTTP 요청 메세지를 기반으로 새로운 Request, Response 객체 생성

  2. WAS는 만들어진 객체를 ➡︎ Servlet Container에 넘겨주며, Servlet 객체 생성

  3. Servlet에서 비지니스 로직 처리

  4. 응답에 필요한 정보를 개발자가 입력

  5. WAS는 Response 객체 정보로 HTTP 응답 메세지 생성


Servlet Container

WAS 내부에 Servlet Container가 항상 존재한다. Servlet Container는 Servlet 생성, 관리, 호출, 종료하는 역할을 수행한다.

Servlet의 생명 주기

  • Servlet은 Servlet Container가 생성 및 관리한다.
  • WAS가 종료될 때 Servlet도 함께 종료된다.

Servlet 객체 생성 시점

  • 개발자가 직접 인스턴화하여 사용 ❌
  • 코드만 작성하면 Servlet Container가 생성된다.

💡Servlet 객체를 ⭐싱글톤으로 관리⭐한다.

🚀 싱글톤이란?
➡︎ 싱글톤은 객체를 하나만 생성하여 생성된 인스턴스를 공유하여 사용하는 것을 의미한다.

특정 클래스의 인스턴스가 여러개 생성되지 않도록 하여 자원 낭비를 방지하고 인스턴스를 공유함으로써 상태를 일관되게 유지하기 위함입니다.

하지만, 🚨 공유 변수 사용을 주의 🚨해야 합니다.


Thread

애플리케이션 코드 하나하나 순차적으로 실행하는 것을 의미한다. Thread는 한번에 하나의 코드 라인만 수행한다.

➡︎ 동시 처리가 필요한 경우 Thread를 추가적으로 생성

💡요청을 Servlet으로 전달해주는 것이 Thread이다.


동시 요청 Single Thread

[대기 ➡︎ 작업 수행 ➡︎ 스레드 반환]

요청이 들어오면 Thread는 하나이기 때문에 대기해야 하는 문제가 생긴다. 따라서 Thread 1번째 일이 끝나면 다음 요청이 할당된다.

💭 만약 첫번째 요청의 작업이 지연되거나 Error가 발생한다면?
Time Out 오류 발생


Multi Thread

여러개의 Thread를 생성해서 사용한다. WAS는 동시 요청에 대한 처리를 위해 Multi Thread를 지원한다.

  • 장점

    • 동시 요청 처리를 할 수 있다.
    • 하나의 Thread에 지연 등의 문제가 발생해도 나머지 Thread는 정상적으로 동작 한다.
  • 단점

    • Thread 생성에 제한이 없고 생성 비용이 높다.
      ➡︎ 수 많은 동시 요청이 발생하면 리소스(Memory, CPU 등) 부족으로 서버가 다운된다.

    • Thread를 사용하면 Context Switching 비용이 발생한다.


💡 Context Switching

Task1 ➡︎ Task2 , Task2 ➡︎ Task1 교체 시점마다 Task1이 Ready 상태로 돌아간다는 정보 Task2는 어디부터 작업을 시작하면 되는지에 대한 정보들을 로딩할 시간이 필요하다! 해당 시점이 Context Switching


💡 Thread Pool

이미 생성된 여러개의 Thread가 존재한다.

➡︎ 요청이 들어오면 Thread Pool에서 Thread를 받아 사용하고 사용 완료된 ThreadThread Pool에 반납한다.

💭 Thread Pool에 존재하는 Thread가 모두 사용 중이라면?

Thread Pool에 Thread가 생길 때까지 대기 하거나 거절할 수 있다.
ex> 수강 신청 대기번호 1032번


📌 [Spring] 서블릿(Servlet)이란? 서블릿 컨테이너란?

📌 [Spring] 서블릿(Servlet) 이란?

profile
누워만 있지 말고 제발 뭐라도 하자.

0개의 댓글