Servlet
📌 Servlet은 자바(Java) 언어로 작성된 서버 측 프로그램으로, 주로 웹 애플리케이션에서 클라이언트의 요청을 처리하고 동적으로 응답을 생성하는 데 사용됩니다.
- JAVA에서 Sevlet은 HttpServlet 클래스를 상속받아 구현되며, Java EE (Enterprise Edition)**의 중요한 구성 요소로, 웹 서버나 웹 애플리케이션 서버에서 실행되며, HTTP 요청을 처리하는 동적 웹 애플리케이션을 만들 수 있게 해줍니다.
- Servlet은 HTTP 프로토콜 기반 요청(Request) 및 응답(Response)을 처리하는데 사용된다.
[1] Servlet의 주요 기능
- HTTP 요청 처리
- 클라이언트의 요청(GET, POST 등)을 받아들이고, 이를 처리하여 적절한 응답을 생성합니다.
- 웹 애플리케이션에서 사용자 요청에 따라 동적인 콘텐츠를 반환할 때 사용됩니다.
- 동적 콘텐츠 생성
- 사용자의 요청에 따라 데이터를 생성하거나 변경하고, 이를 동적으로 웹 페이지로 전달합니다.
- 예를 들어, 사용자 인증, 데이터베이스 질의 결과, 파일 처리 등을 동적으로 수행합니다.
- 세션 관리
- 웹 애플리케이션에서 클라이언트의 상태를 관리하는 데 도움을 줍니다.
- 클라이언트가 여러 페이지를 요청할 때, 같은 사용자로 인식하도록 세션을 관리합니다.
- 비즈니스 로직 처리
- 데이터베이스와의 상호작용이나 복잡한 계산을 수행하는 비즈니스 로직을 구현할 수 있습니다.
- 응답 처리
- 클라이언트에게 전달할 HTML, JSON, XML 등의 형식으로 응답을 생성합니다.
[2] Servlet의 작동 방식
- 클라이언트의 요청
클라이언트(보통 웹 브라우저)가 특정 URL을 요청합니다. 이 URL은 서버에 있는 Servlet을 호출합니다. - Servlet 컨테이너 처리
웹 서버 또는 애플리케이션 서버에서 Servlet 컨테이너가 요청을 받아 Servlet 클래스를 실행합니다.
이때, Servlet 컨테이너는 요청 정보를 HttpServletRequest 객체에 담아 Servlet으로 전달합니다. - 비즈니스 로직 실행
Servlet은 요청을 처리하기 위해 필요한 비즈니스 로직을 실행합니다. 이 과정에서 데이터베이스와 연동하거나 데이터를 가공할 수 있습니다. - 응답 생성
Servlet은 응답을 생성하여 클라이언트에게 반환합니다. 이는 HTML, JSON, XML 등 다양한 형식일 수 있습니다. - 클라이언트에 응답 반환
생성된 응답은 HttpServletResponse 객체를 통해 클라이언트에게 전달됩니다.
[3] Servlet의 주요 메서드
- doGet(HttpServletRequest request, HttpServletResponse response)
- GET 요청을 처리하는 메서드입니다. 웹 페이지 요청, 링크 클릭 등으로 자주 사용됩니다.
- doPost(HttpServletRequest request, HttpServletResponse response)
- POST 요청을 처리하는 메서드입니다. 일반적으로 사용자로부터 데이터를 제출받을 때 사용됩니다.
- init()
- Servlet이 처음 로딩될 때 호출되는 초기화 메서드입니다. 주로 Servlet 객체의 초기화 작업을 처리합니다.
- destroy()
- Servlet이 종료될 때 호출됩니다. 자원 해제 및 정리 작업을 수행하는 데 사용됩니다.
[4] Servlet의 예시
HTTP Request Message 예시
POST /api/users HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
userId=아이디&pssword=비밀번호
HTTP Response Message 예시
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3423
<html>
<body>
...
</body>
</html>
- 서버와 TCP/IP 연결
- HTTP Request Message 필요한 형태로 변환하여 읽기
- HTTP Method 및 URL 분석
- HTTP Header 분석
- HTTP Message Body 읽기 및 변환
- 분석한 결과를 통해 프로세스 실행
- 비지니스 로직 실행
- HTTP Response Message 생성
- HTTP Start Line 생성
- Header 생성
- HTTP Message Body에 응답 데이터를 요청한 형식에 맞춰 응답
- 처리가 불가하다면 예외처리
- 응답 전달
- 연결 종료
- Servlet을 지원하는 WAS를 사용한다면?
- 비지니스 로직 실행
@WebServlet("/hello") // 해당 URL에 매핑되는 Servlet
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 응답 콘텐츠 타입 설정
response.setContentType("text/html");
// 클라이언트에 응답 전송
PrintWriter out = response.getWriter();
out.println("<h1>Hello, Servlet!</h1>");
}
}
- 위의 코드에서 HelloServlet은 /hello URL로 들어오는 GET 요청을 처리하며, 간단한 HTML 메시지를 반환하는 Servlet입니다
[5] Servlet과 JSP의 차이
구분 | Servlet | JSP (Java Server Pages) |
구성 | Java 코드로 작성된 클래스 | HTML 코드 내에 Java 코드를 삽입하는 형식 |
주요 용도 | 비즈니스 로직 처리, HTTP 요청/응답 관리 | 사용자 인터페이스(HTML) 작성 및 동적 콘텐츠 생성 |
장점 | 강력한 제어 흐름과 비즈니스 로직 구현 가능 | HTML 기반으로 작성이 쉬우며, 동적 콘텐츠 생성에 유리 |
단점 | HTML 생성 시 복잡한 Java 코드 필요 | 비즈니스 로직과 UI가 혼합되어 있어 코드 관리가 어려울 수 있음 |
[6] Servlet의 배달 비유
- 웹 서버는 배달원이 단순히 포장을 해서 전달하는 역할이라면,
- Servlet은 배달원이 주문에 맞게 음식을 준비하고 포장하여 고객에게 전달하는 역할입니다.
- 정적 콘텐츠를 제공하는 웹 서버와 달리, Servlet은 고객이 주문한 대로 동적으로 음식을 만들고 제공하는 역할을 합니다.
- 엄연히 WAS와는 다르다. 오히려 WAS에서 서측에서 클라이언트 요청을 처리하고 응답을 생성하는 역활을 하는 자바 클래스이다. = WAS에서 사용되는 클래스이다
Servlet 동작 순서
1. WAS의 Servlet Container가 servlet 객체를 생성
2. 클라이언트가 해당 servlet을 사용하는 http 요청을 하면, Servlet Container에서 request,response 객체 생성
3. 이때, 쓰레드가 Servlet 객체 호출하고 request,response 객체를 Servlet 객체에 넘겨줌.
4. request 객체를 활용해 Servlet의 비즈니스 로직 실행.
5. 응답 결과를 response 객체에 담은 후, Servlet Container에 전달
6. Servlet Container가 http 응답 메시지 생성 후 클라이언트에게 전달
서블릿은 로딩 시점에 생성될 수도 있고, 최초 요청 시점에서 생성될 수도 있다고 합니다. 그래서 요청시 서블릿 인스턴스가 메모리에 존재하지 않는다면 서블릿 컨테이너는 해당 서블릿을 로드하고 init() 메서드를 통해 초기화한 후, 적재한다고 합니다. |
- 개발자가 하는 일
- Request 객체에 담겨져있는 HTTP 요청 정보를 꺼내서 사용한다.
- 요청 정보(URL, Method, Message Body)를 통해 필요한 기능(비지니스 로직)을 수행한다.
- 생선된 Response 객체에 HTTP 응답 정보를 입력한다.
- Request 객체에 담겨져있는 HTTP 요청 정보를 꺼내서 사용한다.
Servlet Container
📌 Servlet을 지원하는 WAS 내부에는 서블릿 컨테이너가 있다. 서블릿 컨테이너는 서블릿을 초기화, 생성, 관리, 호출, 종료하는 역할을 수행한다.
- Servlet 관리하고 jsp파일을 실행할 수 있게 해주는 것이 Servlet Container입니다.
- Servlet의 생명주기
- Servlet은 서블릿 컨테이너가 생성 및 관리한다.
- WAS(서블릿 컨테이너 포함)가 종료될 때 Servlet도 함께 종료된다.
- Servlet 객체 생성시점
- 개발자가 직접 인스턴스화 하여 사용하는것이 아닌, 코드만 작성하면 서블릿 컨테이너가 생성한다.
@WebServlet(name="ExampleServlet", urlPatterns = "/example")
public class ExampleServlet extends HttpServlet { // HttpServlet을 상속받아 구현한다.
@Override
protected void service(
HttpServletRequest request, // HTTP 요청 정보를 쉽게 사용할 수 있게 만드는 Servlet
HttpServletResponse response // HTTP 응답 정보를 쉽게 제공할 수 있게 만드는 Servlet
) {
// application logic
}
}
@WebServlet(name="Example2Servlet", urlPatterns = "/example2")
// 위와 같은 코드
@WebServlet(name="Example3Servlet", urlPatterns = "/example3")
// 위와 같은 코드
@WebServlet(name="Example4Servlet", urlPatterns = "/example4")
// 위와 같은 코드
- Servlet Container가 하는 일
- 서블릿을 초기화, 생성, 관리, 호출, 종료하는 역할을 수행한다.
- Servlet 객체를 싱글톤으로 관리한다.
- 동시 요청에 대한 처리를 위해 Multi Thread를 지원한다.
- 서블릿을 초기화, 생성, 관리, 호출, 종료하는 역할을 수행한다.
싱글톤은 객체를 하나만 생성하여 생성된 인스턴스를 공유하여 사용하는것을 의미합니다. 특정 클래스의 인스턴스가 여러개 생성되지 않도록 하여 자원의 낭비를 방지하고, 인스턴스를 공유함으로써 상태를 일관되게 유지하기 위함입니다. 하지만, 공유 변수 사용을 주의해야 합니다. |
Thread
📌 프로세스 내에서 실행되는 가벼운 작업 단위입니다. 프로세스는 프로그램이 실행되는 환경을 의미하고, 쓰레드는 프로세스 내에서 독립적으로 실행되는 코드의 흐름입니다. 여러 쓰레드는 하나의 프로세스 내에서 공유된 자원(메모리, 파일 등)을 사용하면서 동시에 실행될 수 있습니다.
- 애플리케이션 코드를 하나하나 순차적으로 실행하는 것, Java에서 main method를 실행하면 main이라는 이름을 가진 Thread가 실행되며 하나의 Thread는 한번에 하나의 코드 라인만 수행한다.
- 만약 동시 처리가 필요하다면 Thread를 추가적으로 생성 해야한다.
Servlet 객체의 호출
- 클라이언트에서 Request가 전달되면 Thread가 Servlet 객체를 호출한다.
[1] 단일 요청 - Single Thread
- 클라이언트 요청 및 TCP/IP 연결
- Thread 할당 후 Servlet 호출 ( Servlet도 쓰레드에 적재되어 실행하게 된다. 프로그램이 당연하지만)
- 응답 후 Thread 반환
[2] 동시 요청 - Single Thread
- 첫번째 요청의 작업을 Single Thread가 수행중이다.
- 두번째, 세번째 요청이 들어오고 연결을 완료했다.
- Thread를 사용하기 위해 작업이 끝날때 까지 대기한다.
- 요청이 모두 사라질 때 까지 (대기 → 작업 수행 → 스레드 반환)작업을 반복한다.
- 만약, 첫번째 요청의 작업이 지연되거나 Error가 발생한다면?
모든 요청이 Time out 오류가 발생한다.
[1] 요청마다 새로운 Thread 생성 - Multi Thread
- 요청이 들어올 때 마다 Thread를 생성한다.
- 요청 처리가 완료되면 Thread를 종료한다.
- 멀티 쓰레드는 수행 속도가 빨라 동시에 처리하는 것 같지만 사실 엄청나게 짧은 시간 안에 수십, 수천 번 실행할 프로세스를 교체하고 있는 것이다.
- 장점
- 동시 요청을 처리할 수 있다.
- 하나의 Thread에 지연등의 문제가 발생하여도 나머지 Thread는 정상적으로 동작한다.
- 단점
- Thread 생성에 제한이 없고 생성 비용이 높다.
- 수많은 동시 요청이 발생하면 리소스(Memory, CPU 등)부족으로 서버가 다운된다.
- Thread를 사용하면 Context Switching 비용이 발생한다.
- Thread 생성에 제한이 없고 생성 비용이 높다.
Context Switching Task1에서 Task2로 Task2에서 Task1로 교체되는 시점마다 Task1이 Ready 상태로 돌아간다는 정보, 진행정보, Task2는 어디부터 작업을 시작하면 되는지에 대한 정보들을 로딩할 시간이 필요하게 된다. 이 순간의 시점이 바로 Context Switching이다. |
[2] Thread Pool - Multi Thread
- 요청이 들어오면 Thread Pool에서 Thread를 받아 사용한다.
- 사용 완료된 Thread는 Thread Pool에 반납한다.
Q. Thread Pool에 존재하는 Thread가 모두 사용 중이라면?
A. Thread Pool에 Thread가 생길 때까지 대기하거나 거절할 수 있습니다.
정리
- WAS는 Multi Thread를 지원한다.
- 개발자가 Multi Thread 관련 코드는 고려하지 않아도 된다.
- Multi Thread 환경이므로 싱글톤 객체(Servlet, Spring Bean)는 주의해서 사용해야한다.
- Thread Pool
- Thread는 Thread Pool에 보관 및 관리한다.
- Thread Pool에 생성 가능한 Thread 최대치를 관리한다. Tomcat은 최대 200개 기본 설정이 되어있다.(변경 가능)
- 성능테스트를 통해 적정 Thread 수를 찾으면 된다.
- 장점
- 요청 마다 Thread를 생성하는 단점을 보완하였다.
- Thread가 미리 생성되어 있어서 Thread를 생성, 종료하는 비용이 절약된다. → 응답이 빠름
- 생성 가능한 Thread 최대치가 제한되어 있어서 많은 요청이 들어와도 안전하게 처리할 수 있다.
- 단점
- Thread Pool의 최대 Thread 수를 낮게 설정한다면 응답이 지연된다.
- 최대 Thread 수가 너무 높으면 즉, 요청이 많아지면 리소스 부족으로 서버가 다운된다.
'CS ( Computer Science ) > 네트워크 (Networking)' 카테고리의 다른 글
[Net] 네트워크 기본 요약 (1) | 2024.12.06 |
---|---|
[Net] Rendering (1) | 2024.12.05 |
[Net] Web Application (1) | 2024.12.03 |
[Net] Restful API (1) | 2024.12.02 |
[Net] HTTP 요청 데이터 (0) | 2024.12.02 |