[JAVA] 동시성 처리 (Concurrency)
in JAVA
동시성 처리에 관한 3가지 관점에 대해 이야기해보자.
JAVA에서 동시성
- 여러 작업을 동시에 겹쳐서 처리하는 것
- 한 번에 여러 일을 수행하며 일의 효율성을 높임
- 크게 3가지 관점에서 접근 가능하다.
- 스레드 (Thread)
- 비동기 (Async)
- 분산 (Distributed)
스레드 (Thread)
- 스레드는 프로세스 내에서 실제 작업을 수행하는 작업 단위
- 한 개의 프로그램(프로세스)은 여러 개의 스레드를 가질 수 있음
- 멀티 스레드 (Multi-thread)
- 하나의 프로세스에서 여러 스레드를 동시에 실행하는 방식
- 자바에서는 주로 JVM(Java Virtual Machine)이 여러 스레드를 관리해줌
- ex) 웹 서버(Servlet, Spring)에서는 사용자 요청마다 별도의 스레드를 생성해서 동시에 많은 요청을 처리할 수 있게 함
- 🔥 중요한 이유
- 효율성 향상
- CPU 자원을 최대한 활용할 수 있음
- 응답성 향상
- 동시에 여러 요청을 처리할 수 있음
- 효율성 향상
- 하지만 최근 자바 프레임워크(Spring)는 스레드를 자동으로 관리해주기 때문에 개발자가 직접 스레드를 관리할 일이 많지 않음
- JVM과 프레임워크가 이미 효율적으로 관리해줌
비동기 처리 (Async)
- 비동기란 “요청을 보낸 뒤 결과를 기다리지 않고 다음 작업을 진행”하는 방식
- 동기 (Synchronous)
- 하나의 요청이 끝날 때까지 기다림
- 비동기 (Asynchronous)
- 요청이 처리되는 동안 다른 작업 수행
- 동기 (Synchronous)
- 자바에서 비동기 처리를 지원하는 방법
CompletableFuture
: 자바 비동기 처리 클래스- 자바스크립트의 async/await와 비슷한 방식
- 🔥 중요한 이유
- 빠른 응답성
- 요청 처리 중에도 사용자가 대기하지 않고, 시스템의 다른 작업 수행 가능
- 높은 확장성
- 비동기 처리를 하면 서버가 많은 요청을 효율적으로 관리 가능
- 빠른 응답성
분산 처리 (Distributed)
- 분산처리는 “하나의 서버가 아닌, 여러 대의 서버가 나누어서 작업을 처리하는 방식”
- 서버 하나만 운영하는 것부다 작은 여러 서버(클러스터)를 운영하면 비용이 줄어듬
- 대규모 서비스나 성장한 서비스에서 자주 사용됨
- 분산 환경에서 자주 사용되는 기술
- Redis
- 메모리 기반 데이터 저장소로, 분산락(Distributed Lock)울 구현할 때 사용
- 예를 들어, 여러 서버가 하나의 데이터를 동시에 수정하지 못하게 관리하는 방식
- Kafka
- 메시지 큐(Message Queue)로, 서버간 메시지를 주고받고, 작업을 순차적으로 처리할 때 사용됨
- 클러스터(Cluster)
- 여러 대의 서버가 협력하여 요청을 나누어 처리 (MSA와 비슷한 개념)
- Redis
- 🔥 중요한 이유
- 비용 효율성
- 큰 서버 하나보다 여러 작은 서버가 경제적
- 안정성 및 확장성
- 한 서버가 문제가 생기더라도 서비스는 계속 운영됨
- 비용 효율성
핵심 키워드 및 정리
- 스레스 (Thread)
- 멀티 스레드 -> JVM, Servlet, Spring
- 스레드는 직원이다. 회사(JVM, Servlet, Spring)가 직원(스레드)을 잘 관리하면, 일(요청 처리)이 효율적이다.
- 비동기 (Async)
- CompletableFuture, async/await
- 비동기는 배달앱이다. 주문을 넣고 기다리지 않고, 다음 일을 진행한다.
- 분산처리 (Distributed)
- Redis, Kafka, 클러스터
- 분산처리는 프랜차이즈이다. 큰 가게 하나보다 작은 여러 가게가 효율적이고 비용도 절감된다.