동시성
번역일: 2026년 6월 20일
동시성
소개
서로 의존하지 않는 여러 개의 느린 작업을 처리해야 할 때가 있습니다. 이런 경우 작업을 동시에 실행하면 성능을 크게 향상시킬 수 있습니다. Laravel의 Concurrency 파사드는 클로저를 동시에 실행할 수 있는 간단하고 편리한 API를 제공합니다.
동작 원리
Laravel은 전달된 클로저를 직렬화(serialize)한 뒤, 숨겨진 Artisan CLI 명령어로 전달하는 방식으로 동시성을 구현합니다. 각 명령어는 별도의 PHP 프로세스에서 클로저를 역직렬화하여 실행하고, 실행 결과를 다시 직렬화해 부모 프로세스로 반환합니다.
Concurrency 파사드는 세 가지 드라이버를 지원합니다: process(기본값), fork, sync.
process드라이버: 기본 드라이버로, 웹 요청과 CLI 환경 모두에서 사용할 수 있습니다.fork드라이버:process보다 성능이 뛰어나지만, PHP는 웹 요청 중 포킹(forking)을 지원하지 않으므로 CLI 환경에서만 사용할 수 있습니다. 이 드라이버를 사용하려면 먼저spatie/fork패키지를 설치해야 합니다.
composer require spatie/forksync드라이버: 동시성을 비활성화하고 부모 프로세스에서 클로저를 순차적으로 실행합니다. 주로 테스트 환경에서 유용합니다.
동시 작업 실행
동시 작업을 실행하려면 Concurrency 파사드의 run 메서드를 호출합니다. run 메서드는 자식 PHP 프로세스에서 동시에 실행할 클로저 배열을 인수로 받습니다.
use Illuminate\Support\Facades\Concurrency;
use Illuminate\Support\Facades\DB;
[$userCount, $orderCount] = Concurrency::run([
fn () => DB::table('users')->count(),
fn () => DB::table('orders')->count(),
]);반환값은 전달한 클로저 배열의 순서와 동일하게 결과 배열로 반환되므로, 구조 분해 할당으로 바로 받아쓸 수 있습니다.
특정 드라이버를 사용하고 싶다면 driver 메서드를 체이닝하면 됩니다.
$results = Concurrency::driver('fork')->run(...);기본 동시성 드라이버를 변경하려면 config:publish Artisan 명령어로 concurrency 설정 파일을 퍼블리시한 뒤, 파일 내 default 옵션을 수정하세요.
php artisan config:publish concurrency동시 작업 지연 실행
클로저를 동시에 실행하되, 그 반환값이 필요하지 않다면 defer 메서드를 활용하세요. defer를 호출하면 클로저가 즉시 실행되지 않고, HTTP 응답이 사용자에게 전송된 이후에 동시에 실행됩니다.
use App\Services\Metrics;
use Illuminate\Support\Facades\Concurrency;
Concurrency::defer([
fn () => Metrics::report('users'),
fn () => Metrics::report('orders'),
]);NOTE
defer는 응답 후 처리할 통계 수집, 로그 기록 등 사용자 응답 시간에 영향을 주지 않아야 하는 부가 작업에 특히 유용합니다.