3-2학기에 운영체제 과목에서 배운 프로세스와 스레드 개념을 복습해 보고, 이를 Spring Boot에서 어떻게 활용하는지 알아볼게요.
프로세스란?
프로세스는 실행 중인 프로그램의 가장 작은 단위로, 하나의 실행 흐름을 가진 프로그램을 의미해요.
즉, 프로그램이 메모리에 로드되어 실행되고 있는 상태를 프로세스라고 부릅니다.
- 예를 들어, 실행 중인 카카오톡이나 크롬 브라우저는 각각 하나의 프로세스로 동작합니다.
- 각 프로세스는 자신이 소유한 자원을 보호하기 때문에, 다른 프로세스의 자원이나 메모리 영역에 접근할 수 없습니다.
실제 상용 시스템에서는 이러한 프로세스보다 더 작은 단위인 스레드 단위로 CPU 코어를 할당하여 스케줄링을 수행하고 있어요.
스레드란?
스레드는 프로세스 내에서 실행되는 흐름을 의미해요. 하나의 프로세스 내에서 여러 스레드가 동시에 실행될 수 있으며, 각각의 스레드는 서로 다른 CPU 코어에 할당되어 병렬적으로 작업을 수행할 수 있어요.
스레드와 프로세스의 차이
일반적으로 하나의 프로세스는 하나의 제어 흐름만 가지며 한 번에 한 가지 작업만 수행할 수 있어요. 따라서 단일 프로세스만 사용하면 동시에 여러 요청을 효율적으로 처리하기 어려워요.
이를 해결하기 위해 하나의 프로세스 내 작업을 여러 스레드로 분할하면 병렬적으로 작업을 처리할 수 있어요.
- 예를 들어, 웹 서버가 동시에 여러 클라이언트의 요청을 처리할 때, 각각의 요청을 별도의 스레드로 처리하면 응답 속도를 크게 향상할 수 있어요.
스레드의 특징
- 메모리 공유
- 이로 인해 스레드 간의 통신이나 자원 공유가 용이하지만, 잘못 관리하면 한 스레드의 문제로 전체 프로세스에 영향을 줄 수 있어요.
- 스레드는 같은 프로세스 내의 메모리를 공유하기 때문에 별도의 보호 영역(Protection Domain)이 존재하지 않아요.
- 프로세스 간 통신(IPC) 대비 효율적
- 프로세스 간 통신(IPC)은 각 프로세스가 독립된 보호 영역을 가지므로 OS(커널)를 거쳐야 하고, 이 과정에서 통신 비용이 높아질 수 있어요.
- 반면, 스레드는 같은 메모리를 공유하기 때문에 통신 비용이 낮고 더 빠르게 상호작용할 수 있는 장점이 있어요.
이처럼 스레드는 프로그램의 성능을 최적화하는 중요한 개념이에요. 다만, 동기화 문제를 주의해서 관리하지 않으면 경쟁 상태(Race Condition)나 데드락(Deadlock) 같은 문제가 발생할 수 있다는 점도 기억해야 해요.
SpringBoot에서의 활용 방식
그러면 이제 Spring에서 프로세스와 스레드를 어떻게 활용하는지 이야기해볼게요!
Spring Boot에서의 프로세스와 스레드 활용
Spring Boot 애플리케이션은 기본적으로 JVM 프로세스 내에서 실행되는 단일 프로세스 애플리케이션이에요. 이 프로세스는 내부적으로 여러 개의 스레드를 활용하여 웹 요청 처리, 데이터베이스 접근, 비동기 작업 처리 등을 수행해요.
Spring Boot 애플리케이션의 실행 방식
Spring Boot 애플리케이션을 실행하면 하나의 프로세스가 생성되며, 이 프로세스 내에서 여러 개의 스레드가 동작해요.
내장 웹 서버(Tomcat, Jetty 등)를 사용하면 기본적으로 하나의 메인 스레드와 요청을 처리하는 여러 워커 스레드(Thread Pool)를 활용하여 동작합니다.
📌 Spring Boot에서 톰캣과 서블릿이 어떻게 동작할까?
- 톰캣(Tomcat) : Spring Boot에서 기본으로 사용하는 웹 서버로, 브라우저의 요청을 받아줌.
- 서블릿(Servlet) : 요청을 받아서 처리하고, 응답을 돌려주는 자바 프로그램.
- 서블릿 컨테이너 : 서블릿을 실행할 수 있도록 관리하는 역할 (톰캣이 이 기능을 포함!).
- 내장 웹 서버 : Spring Boot에서는 톰캣이 내장되어 있어서 따로 웹 서버를 설치하지 않아도 됨.
Spring Boot 애플리케이션을 실행하면 내장 톰캣이 자동으로 실행되고, 브라우저의 요청을 받아 서블릿이 처리하는 구조!
웹 요청 처리 시 스레드 활용
Spring MVC는 요청이 들어올 때마다 새로운 스레드를 생성하여 요청을 처리하는 방식이에요.
그러나, Tomcat과 같은 서블릿 컨테이너는 스레드 풀을 사용하여 요청을 병렬로 처리하고, 일정 개수 이상의 요청이 들어오면 큐에 저장하여 순차적으로 처리합니다.
즉, Spring MVC는 요청이 들어올 때마다 스레드를 생성해서 처리하지만, Tomcat과 같은 서블릿 컨테이너는 Thread Pool을 사용해 성능을 최적화하고, 일정 개수 이상의 요청은 큐에 저장했다가 나중에 처리해요.
스레드 풀은 미리 일정 개수의 스레드를 생성해 두고, 요청이 들어오면 스레드를 재사용하는 방식을 말해요.
이걸 왜 쓰냐면...
- 새로운 스레드를 계속 생성하면 메모리와 CPU 부하가 커져서 성능이 떨어질 수 있어요.
- 미리 준비된 스레드를 재사용하면 성능을 최적화할 수 있어요.
- 일정 개수 이상의 요청이 들어오면 큐(queue)에 쌓아두었다가 여유가 생기면 처리해요.
server.tomcat.threads.max 등의 설정을 통해 워커 스레드의 개수를 조절할 수 있어요.
비동기 처리와 백그라운드 작업
@Async 를 활용하면 메인 스레드와 별개로 백그라운드에서 실행되는 스레드를 생성하여 긴 작업을 수행할 수 있어요.
이를 활용하면 사용자 요청을 블로킹하지 않고, 응답 속도를 향상할 수 있습니다.
이와 같이 Spring Boot에서의 프로세스와 스레드 개념을 이해하고 적절히 활용하면 성능을 최적화할 수 있을 거 같아요. 다음에는 이 스레드 개념을 적절히 활용하여 성능 최적화를 해볼게요
참고
스프링 부트의 스레드 처리와 커넥션 풀 최적화
이 블로그 포스트는 스프링 부트의 스레드 처리 방식과 커넥션 풀 최적화에 대해 다룹니다. 스레드 풀과 스레드 로컬을 사용한 효율적인 스레드 관리, HikariCP를 통한 커넥션 풀 최적화, 레이스
f-lab.kr
Spring에서의 프로세스와 스레드
프로세스와 스레드만약 프로세스와 스레드에 관한 지식이 부족하다면 아래 포스트를 참고해도 좋을 거 같습니다.https://yooooonshine.tistory.com/43Spring에서의 프로세스와 스레드Spring 서버는 서버 자
yooooonshine.tistory.com
[Spring Boot] Tomcat 알아보기 (1) Servlet 과 Servlet Container
스프링 부트는 어떻게 동시에 수많은 요청을 처리할까요? Tomcat 알아보기 첫 번째 포스팅으로 Servlet 과 Servlet Container 에 대해 알아보겠습니다. Servlet 자바 docs 에서 정의하는 서블릿은 다음과 같
e-una.tistory.com
Spring MVC와 서블릿 컨테이너의 기본 스레드 처리 방식
Spring MVC 기반 애플리케이션에서 서블릿 컨테이너를 사용하는 ==스레드 관리는 매우 중요하다==이는 Java 웹 애플리케이션이 동기적인 방식으로 HTTP 요청을 처리한다.Java 기반의 웹 애플리케이션
velog.io
'Dev > SpringBoot' 카테고리의 다른 글
Spring 멀티스레딩을 활용한 비동기 처리 (1) | 2025.02.18 |
---|---|
인기 게시글 조회 성능 최적화 (0) | 2025.02.11 |
동시성 제어 (0) | 2025.02.11 |
대량의 데이터 저장하기 - Bulk Insert (0) | 2025.02.11 |
Cotato 10th 백엔드 네트워킹 회고 1 (1) | 2025.02.10 |