스프링 입문을 위한 자바 객체 지향의 원리와 이해 (8)[책리뷰 & Book review]
본문 바로가기

컴퓨터공부/책리뷰 & book review

스프링 입문을 위한 자바 객체 지향의 원리와 이해 (8)[책리뷰 & Book review]

by Life & study 2024. 2. 11.
반응형

 

1

 





 

서블릿이란?

 

서블릿은 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램을 말하며, 

HttpServlet은 HTTP 프로토콜을 사용하는 서블릿입니다.
 HttpServlet 클래스는 javax.servlet.http 패키지에 포함되어 있으며, 

HTTP 요청을 처리하기 위한 다양한 메소드를 제공합니다.

서블릿에서 HttpServlet을 사용하는 방법은 다음과 같습니다:

먼저, HttpServlet 클래스를 상속받는 서블릿 클래스를 생성합니다.
java

public class MyServlet extends HttpServlet {
    // ...
}


이 서블릿 클래스에서는 HttpServlet 클래스가 제공하는 메서드를 오버라이드하여 HTTP 요청을 처리합니다. 

가장 기본적인 메소드는 doGet()와 doPost()입니다. 

doGet() 메소드는메서드는 GET 요청을, doPost() 메서드는 POST 요청을 처리합니다.


java

public class MyServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // GET 요청 처리 코드
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // POST 요청 처리 코드
    }
}


HttpServlet을 사용할 때는 웹 서버에 서블릿을 등록해야 합니다. 

이때 서블릿의 URL 패턴을 지정하며, 

이 URL 패턴은 클라이언트가 서블릿에 요청을 보낼 때 사용하는 URL의 일부입니다.


java

@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {
    // ...
}


위 코드는 "/myServlet" URL 패턴을 가진 요청이 오면

 MyServlet 서블릿이 그 요청을 처리하도록 웹 서버에 지시합니다.

이렇게 HttpServlet을 사용하면 클라이언트의 HTTP 요청(GET, POST 등)을 적절히 처리하고 응답을 반환할 수 있습니다.

 서블릿이 요청을 받으면 웹 서버는 새로운 스레드를 생성하여 그 요청을 처리하므로, 여러 클라이언트가 동시에 요청을 보내도 각 요청을 독립적으로 처리할 수 있습니다.

 

 

 

Java Servlet에서는 
HttpServletRequest와 HttpServletResponse 객체를 사용하여 HTTP 요청과 응답을 처리합니다.

 

Java Servlet에서는 

HttpServletRequest와 HttpServletResponse 객체를 사용하여 HTTP 요청과 응답을 처리합니다.

HttpServletRequest: 클라이언트로부터의 요청 정보를 담는 객체입니다. 

이 객체를 통해 요청 메소드(GET, POST 등), 요청 헤더, 요청 파라미터 등의 정보를 얻을 수 있습니다.


HttpServletResponse: 서버로부터의 응답 정보를 담는 객체입니다. 

이 객체를 통해 응답 상태 코드, 응답 헤더, 응답 본문 등을 설정할 수 있습니다.

 

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 요청 정보 처리
        String name = request.getParameter("name");
        if (name == null) {
            name = "Guest";
        }

        // 응답 정보 설정
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>Hello, " + name + "!</h1>");
        out.println("</body></html>");
    }
}


이 코드는 "/hello" URL로 GET 요청이 왔을 때 동작하는 서블릿입니다:

1. 클라이언트가 "/hello? name=John"과 같은 URL로 GET 요청을 보냅니다.
2.HttpServletRequest 객체의 getParameter() 메서드를 사용하여 "name" 파라미터 값을 얻습니다.
3.HttpServletResponse 객체를 사용하여 응답의 콘텐츠 타입을 "text/html"로 설정하고, 응답 본문에 HTML 코드를 작성합니다.
4. 작성된 HTML 코드는 클라이언트에게 응답으로 전송됩니다.


이렇게 HttpServletRequest와 HttpServletResponse 객체를 사용하면, 

서블릿에서 HTTP 요청을 처리하고 응답을 생성하는 과정을 쉽게 구현할 수 있습니다.

 

 

자바 쓰레드 풀이란 무엇인가? 

 

자바에서 쓰레드스레드 풀은 여러 스레드를 미리 생성해 두고, 이를 재사용하여 병렬 작업을 처리하는 방법을 제공하는 객체입니다. 스레드 풀을 사용하면 스레드 생성과 소멸에 드는 비용을 줄이고, 동시에 실행할 스레드의 최대 개수를 제한하여 자원을 효율적으로 관리할 수 있습니다.

자바에서는 java.util.concurrent.Executors 클래스를 통해 쓰레드 풀을 쉽게 생성할 수 있습니다. 

다음은 쓰레드 풀을 사용하는 간단한 예시입니다.

java

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
    public static void main(String[] args) {
        // 쓰레드 풀 생성
        ExecutorService executor = Executors.newFixedThreadPool(5);

        // 10개의 작업 제출
        for (int i = 0; i < 10; i++) {
            int finalI = i;
            executor.submit(() -> {
                System.out.println("Running task " + finalI + " in thread " + Thread.currentThread().getName());
            });
        }

        // 쓰레드 풀 종료
        executor.shutdown();
    }
}


위 코드에서 Executors.newFixedThreadPool(5)는 최대 5개의 스레드를 동시에 실행할 수 있는 스레드 풀을 생성합니다.

 

 executor.submit() 메소드를 통해 스레드 풀에 작업을 제출하면, 

스레드 풀은 이 작업을 빈 스레드가 있을 때까지 대기시킨 후 실행합니다.

 즉, 위 코드는 10개의 작업을 제출하지만, 이 중 5개의 작업만이 동시에 실행됩니다.

마지막으로, executor.shutdown() 메서드는 스레드 풀에 더 이상 새로운 작업을 제출하지 않도록 하고, 

모든 작업이 끝난 후에 쓰레드 풀을 종료합니다.

이렇게 쓰레드스레드 풀을 사용하면, 스레드 생성과 관리에 드는 비용을 줄이고,

여러 쓰레드를 효율적으로 활용하여 병렬 작업을 처리할 수 있습니다.

 

 

스레드와 대규모서비스의 관련성

 

**스레드 풀 (Thread Pool)**은 자원을 

효율적으로 관리하며, 작업을 병렬로 처리하기 위한 방법입니다.

 대규모 서비스에서 스레드 풀을 적용하는 과정

스레드 풀 생성:
Executors 클래스를 사용하여 스레드 풀을 생성합니다.
newFixedThreadPool(int nThreads) 메서드를 사용하면 고정 크기의 스레드 풀을 생성할 수 있습니다. 

 

이는 일정량의 업무가 발생할 때 적합합니다.

예시: ExecutorService service = Executors.newFixedThreadPool(5);


작업 제출:
submit() 메서드를 사용하여 작업을 쓰레드 풀에 제출합니다.
작업이 끝난 쓰레드는 종료되지 않고 다음 작업 요청이 들어올 때까지 대기합니다.

 

스레드 풀 크기 조절:
corePoolSize, maximumPoolSize, keepAliveTime 등의 파라미터를 설정합니다.
corePoolSize: 코어 스레드 개수 (최소한으로 유지할 스레드 수)
maximumPoolSize: 최대 쓰레드 개수
keepAliveTime: 유휴 상태로 대기할 시간
초과한 스레드는 유휴 상태가 오래 지속되면 제거됩니다.


스레드 풀 사용 시 주의점:
스레드 풀 크기를 적절히 설정해야 합니다. 

너무 많은 스레드는 메모리 낭비를 초래할 수 있습니다.
submit()을 사용하여 작업을 제출하는 것이 바람직합니다. 

예외 발생 시 스레드가 종료되지 않고 재사용됩니다.


대규모 서비스에서의 적용:
웹 서버와 같이 병렬 처리가 필요한 프로그램에서 스레드 풀을 사용합니다.
효율적인 리소스 관리를 위해 적절한 크기의 쓰레드 풀을 설정하고, 작업을 분산하여 처리합니다.
이와 같은 방식으로 쓰레드 풀을 적용하면 대규모 서비스에서 효율적인 멀티 쓰레딩을 구현할 수 있습니다. 

 

 

 

 

 

 

반응형

댓글