Spring MVC 컨트롤러는 스레드풀에서 동작하는가..?

백엔드&인프라 추종자·2025년 3월 20일

스프링 공부

목록 보기
31/35

네, @GetMapping과 같은 Spring MVC 컨트롤러 메서드는 기본적으로 Spring의 서블릿 컨테이너에서 관리하는 스레드에서 실행됩니다. 즉, 요청이 들어올 때마다 Spring이 관리하는 스레드 풀에서 작업이 처리됩니다.

스프링의 기본 동작 방식

  1. 서블릿 컨테이너:

    • @GetMapping 같은 HTTP 요청을 처리하는 메서드는 서블릿 컨테이너(예: Tomcat, Jetty)에서 실행됩니다.
    • 이 요청은 서블릿 컨테이너의 스레드 풀에서 관리되는 스레드에서 처리됩니다.
  2. 기본 스레드 풀:

    • 스프링에서 HTTP 요청을 처리하는 기본 방식은 서블릿 컨테이너의 스레드 풀을 사용하는 것입니다. 따라서 기본적으로 각 요청은 각각 별도의 스레드에서 처리됩니다.
    • 스프링의 DispatcherServlet은 들어오는 HTTP 요청을 받아서 해당 요청을 처리할 적절한 컨트롤러 메서드로 전달하는 역할을 합니다.
  3. 멀티스레딩:

    • 동시에 여러 요청이 들어오면, 스프링은 서블릿 컨테이너의 스레드 풀에서 각각 요청을 처리하는 스레드를 할당합니다. 기본적으로 이 스레드들은 동기적으로 처리됩니다.

비동기 처리: @Async@GetMapping

  • @GetMapping기본적으로 동기적인 요청 처리입니다. 즉, 요청을 처리하는 스레드는 요청이 끝날 때까지 해당 메서드에서 대기하며, 그 동안 다른 요청을 처리할 수 없습니다.
  • 비동기 처리가 필요한 경우 @Async를 사용하거나, 스레드 풀을 별도로 관리하여 비동기 작업을 처리할 수 있습니다.
  • @Async를 사용하면, 비동기적으로 실행할 메서드가 별도의 스레드에서 실행되므로, HTTP 요청을 처리하는 스레드는 차단되지 않고, 다른 요청을 처리할 수 있게 됩니다.

스프링 비동기 처리 예시

  1. 스프링의 기본 스레드풀에서 실행되는 예시:

    @GetMapping("/sync-process")
    public String processRequest() {
        // 이 메서드는 기본적으로 동기적으로 실행
        // 요청을 처리하는 스레드는 해당 작업이 완료될 때까지 대기
        return "Request processed synchronously";
    }
  2. @Async로 비동기 처리하는 예시:

    @Async
    @GetMapping("/async-process")
    public CompletableFuture<String> processAsyncRequest() {
        // 비동기적으로 처리되며, 요청을 처리하는 스레드는 다른 요청을 처리할 수 있음
        return CompletableFuture.completedFuture("Request processed asynchronously");
    }
    • 이 경우, @Async가 붙은 메서드는 별도의 스레드에서 실행되므로, HTTP 요청을 처리하는 스레드는 비동기 작업이 완료될 때까지 대기하지 않습니다.
    • 비동기 작업이 완료되면 CompletableFuture를 통해 결과가 반환됩니다.

@Async@GetMapping의 관계

  • @Async를 사용하면 새로운 스레드에서 비동기 작업을 실행할 수 있습니다.
  • @GetMapping으로 요청을 받는 메서드는 기본적으로 동기적으로 실행되지만, 그 안에서 비동기 작업을 처리하려면 @Async를 활용해야 합니다.

결론

  • 기본적으로 @GetMapping 메서드는 Spring의 서블릿 컨테이너 스레드 풀에서 실행됩니다. 즉, 기본적으로 동기적인 방식으로 처리됩니다.
  • 비동기 처리를 위해서는 @Async를 사용하거나, 별도의 스레드 풀을 설정하여 비동기 작업을 관리할 수 있습니다.
profile
AI 답변 글을 주로 올립니다.

0개의 댓글