파이프라인 패턴이란
파이프라인 패턴은 처리 대상 오브젝트(passable)를 일련의 파이프(처리 단계)에 순서대로 통과시키는 디자인 패턴입니다. 각 파이프는 앞 단계의 출력을 받아 처리를 더한 뒤 다음 단계로 전달합니다. Laravel에서는Illuminate\Pipeline\Pipeline 클래스가 이 패턴을 구현하고 있으며, 미들웨어의 처리가 바로 이 구조로 동작합니다.
Laravel 코어에서의 사용 지점
파이프라인은 Laravel의 핵심에서 널리 사용됩니다.- HTTP 미들웨어 —
Illuminate\Foundation\Http\Kernel에서 요청을 미들웨어의 파이프라인에 통과시킴 - 콘솔 명령어 — Artisan 명령어의 전후 처리
- Router의 미들웨어 — 라우트 그룹의 미들웨어 적용
기본적인 사용법
send / through / thenReturn
가장 단순한 파이프라인의 구성입니다.send($passable)— 파이프라인에 통과시킬 오브젝트를 지정through($pipes)— 파이프의 배열을 지정thenReturn()— 파이프라인을 실행하여 결과를 반환
then
최종적인 처리를 클로저로 지정하고 싶은 경우에는then()을 사용합니다.
pipe
나중에 파이프를 추가하려면pipe()를 사용합니다.
클래스 기반의 파이프
클로저 대신 전용 클래스를 사용하면 재사용성이 높아집니다. 각 파이프 클래스는handle 메서드를 구현합니다.
via — 호출할 메서드를 변경하기
기본적으로 파이프의handle 메서드가 호출되지만, via()로 다른 메서드명을 지정할 수 있습니다.
파이프에의 파라미터 전달
클래스명에:와 ,를 사용하여 파이프에 파라미터를 전달할 수 있습니다. 이는 미들웨어의 throttle:60,1 같은 구문과 같은 구조입니다.
finally — 파이프라인 종료 후의 처리
finally() 메서드를 사용하면, 파이프라인 종료 후 반드시 실행되는 콜백을 등록할 수 있습니다. 성공·실패와 관계없이 실행됩니다.
withinTransaction — 트랜잭션 내에서 실행
Laravel 11 이후, 파이프라인 전체를 데이터베이스 트랜잭션 내에서 실행할 수 있습니다.실전 예: 주문 처리 파이프라인
EC 사이트의 주문 처리를 여러 파이프로 구성하는 예입니다.1
파이프 클래스 만들기
2
파이프라인 실행하기
Pipeline의 내부 구현
carry() 메서드가 파이프라인의 핵심 부분입니다. array_reduce를 사용해 파이프를 오른쪽에서 왼쪽으로 접어 클로저 체인을 구축합니다.
array_reverse로 파이프를 역순으로 하여 array_reduce에 전달함으로써, 호출 순서를 올바르게 유지합니다. 최초의 파이프가 최초로 실행되도록 클로저 스택을 안쪽에서부터 쌓아 올려 갑니다.
Macroable 트레이트의 병용
Pipeline 클래스는 Macroable 트레이트를 사용하고 있어, 고유의 메서드를 추가할 수 있습니다.
다음 단계
Macroable 트레이트
기존 클래스에 고유 메서드를 추가하는 Macroable 트레이트의 사용법을 배웁니다.