> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# 2026년 10월 Laravel 업데이트

> 2026년 10월 Laravel 13과 공식 제품의 업데이트. QUERY 라우트, 레플리카의 오래된 읽기 대책, 스케줄의 단일 서버 실행, Fake 검증, Cloud의 Resend 연동, Forge의 PHP 업데이트 알림을 정리합니다.

2026년 10월에는 요청의 표현 방식, 데이터베이스의 읽기 대상, 여러 서버에서의 스케줄 실행을 제어하는 기능이 늘었습니다. Laravel Cloud에서는 메일 전송과 정기 실행 설정이 간단해졌고, Forge에서는 PHP 보안 업데이트와 프로비저닝 실패를 파악하기 쉬워졌습니다.

이 페이지는 11월 4일 공개된 공식 블로그 「Laravel October Product Updates」와 공식 Framework Changelog의 10월분을 바탕으로 한 월간 기록입니다. 2026년 11월 7일에 1차 정보를 확인했으며, Framework는 Laravel 13 계열만 대상으로 합니다. 11월 릴리스는 포함하지 않습니다.

참조원:

* [Laravel October Product Updates](https://laravel.com/blog/laravel-october-product-updates)
* [Laravel Framework changelog — October 2026](https://laravel.com/framework/docs/changelog#log-2026-10)
* [Laravel Framework changelog RSS](https://laravel.com/rss/oss-changelog)

## Laravel Framework

### 10월의 릴리스 범위

공식 Changelog의 주요 신기능에 더해, 릴리스 노트에서 날짜와 도입 버전을 확인했습니다.

| 릴리스 | 공개일 | 주요 변경 |
| - | - | - |
| [v13.35.0](https://github.com/laravel/framework/releases/tag/v13.35.0) | 10월 6일 | Fake의 속성 검증, 워커 메모리의 비율 지정, Markdown 응답, `alwaysOnOneServer()`, QUERY 라우트. |
| [v13.36.0](https://github.com/laravel/framework/releases/tag/v13.36.0) | 10월 13일 | Vitess의 OLAP 실행, 기존 유효성 검증 규칙의 Builder 추가. |
| [v13.37.0](https://github.com/laravel/framework/releases/tag/v13.37.0) | 10월 16일 | `Rule::numeric()`의 strict 옵션, `onOneServer()`와 `withoutOverlapping()` 병용 시의 경합 수정. |
| [v13.38.0](https://github.com/laravel/framework/releases/tag/v13.38.0) | 10월 20일 | `PreventStaleDatabaseReads`, `Connection::usingWritePdo()`. |
| [v13.39.0](https://github.com/laravel/framework/releases/tag/v13.39.0) | 10월 27일 | `RefreshDatabase`에서 테스트 후 모든 트랜잭션 계층을 롤백, `assertSeeText('0')`의 잘못된 성공을 수정. |

아래에서는 공식 Changelog에 게재된 9개 항목을 자세히 소개합니다. 세세한 수정이나 의존 관계 변경은 각 릴리스 노트를 참조하세요.

### QUERY 라우트로 요청 본문을 가진 검색 정의하기

v13.35.0에서 HTTP `QUERY` 메서드에 대응하는 `Route::query()`가 추가되었습니다. GET의 쿼리 문자열이 아니라 요청 본문으로 검색 조건을 받는 라우트를 정의할 수 있습니다.

```php theme={null}
use App\Http\Controllers\SearchProductsController;
use Illuminate\Support\Facades\Route;

Route::query('/products/search', SearchProductsController::class);
```

`Route::any()`도 QUERY 요청에 일치하며, 라우트 목록은 이 메서드를 인식합니다. 위의 `SearchProductsController`는 검색 처리를 구현한 애플리케이션 측 Invokable Controller를 가정합니다.

> [!WARNING]
>
> `web` 미들웨어 그룹의 QUERY 라우트는 CSRF 검증 대상입니다. 「검색이니까 GET처럼 검증을 생략할 수 있다」고 취급하지 말고, CSRF 토큰을 전송하세요.

1차 정보: [Register QUERY Routes](https://laravel.com/framework/docs/changelog#october-2026-register-query-routes), [Laravel 13 공식 routing.md](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/routing.md#available-router-methods). 관련 페이지: [라우팅](https://kawax.biz/ko/routing.md), [CSRF 보호](https://kawax.biz/ko/csrf.md)

### 쓰기 후의 다른 요청에서도 오래된 읽기 피하기

읽기와 쓰기를 분리한 데이터베이스에서는 갱신 직후의 읽기가 아직 동기화되지 않은 Read replica로 향할 수 있습니다. 기존 `sticky` 설정은 같은 요청 안만 대상으로 하는 반면, v13.38.0의 `PreventStaleDatabaseReads`는 같은 세션의 후속 요청에도 보호 기간을 둡니다.

`bootstrap/app.php`에서 `Illuminate\Foundation\Http\Middleware\PreventStaleDatabaseReads`를 import하고, `withMiddleware()`의 콜백 안에서 `$middleware->web(append: [PreventStaleDatabaseReads::class]);`로 추가합니다. 자동으로 활성화되는 기능은 아닙니다.

미들웨어는 기본 DB 연결에 대한 쓰기 시각을 세션에 기록하고, 기본적으로 쓰기 후 2초 동안 그 연결의 읽기를 Write DB로 보냅니다. 기간은 등록하는 클래스를 `PreventStaleDatabaseReads::for(5)` 등으로 바꿔서 변경할 수 있습니다.

```mermaid theme={null}
sequenceDiagram
    participant User as 사용자
    participant App as Laravel<br>앱
    participant Session as 세션
    participant Write as Write DB
    participant Read as Read replica
    User->>App: 갱신 요청
    App->>Write: 데이터 쓰기
    App->>Session: 쓰기 시각 기록
    User->>App: 같은 세션의 다음 요청
    App->>Session: 쓰기 후 경과 시간 확인
    alt 2초 보호 기간 내
        App->>Write: 데이터 읽기
    else 보호 기간 후
        App->>Read: 일반 읽기 대상 사용
    end
```

세션을 사용하므로 `StartSession`보다 뒤에 실행해야 합니다. 다른 세션이나 다른 DB 연결의 읽기까지 전환하는 기능이 아니며, 레플리카의 동기화 완료를 감지하는 것도 아닙니다.

1차 정보: [Avoid Stale Reads After Database Writes](https://laravel.com/framework/docs/changelog#october-2026-avoid-stale-reads-after-database-writes), [Laravel 13 공식 database.md](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/database.md#preventing-stale-database-reads). 관련 페이지: [데이터베이스](https://kawax.biz/ko/database.md), [세션](https://kawax.biz/ko/session.md)

### 특정 처리만 Write DB에서 읽기

같은 v13.38.0에서 추가된 `Connection::usingWritePdo()`는 콜백이 실행되는 동안에만 그 연결의 읽기 대상을 Write DB로 전환합니다. 세션 단위의 보호가 아니라, 애플리케이션 측에서 중요한 읽기의 범위를 명시하고 싶을 때 사용할 수 있습니다.

```php theme={null}
use Illuminate\Support\Facades\DB;

$users = DB::connection()->usingWritePdo(
    fn ($connection) => $connection->table('users')->get()
);
```

같은 연결을 사용하는 Eloquent 쿼리나 관계 쿼리에도 적용됩니다. 콜백의 결과를 반환하고, 예외가 발생해도 이전 읽기 설정을 복원하므로 이후 처리에 전환이 남지 않습니다.

1차 정보: [Temporarily Read from the Write Database Connection](https://laravel.com/framework/docs/changelog#october-2026-temporarily-read-from-the-write-database-connection), [Laravel 13 공식 database.md](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/database.md#using-the-write-connection-for-reads)

### 스케줄을 단일 서버 실행으로 일괄 설정하기

여러 서버에서 스케줄러를 실행할 때 태스크별 `onOneServer()` 지정 누락을 줄이기 위해, v13.35.0에서 `Schedule::alwaysOnOneServer()`가 추가되었습니다. `AppServiceProvider`의 `boot()`에서 호출하면 대상 스케줄에 일괄 적용할 수 있습니다.

```php theme={null}
use Illuminate\Support\Facades\Schedule;

Schedule::alwaysOnOneServer();
```

이는 설정을 호출해야 비로소 유효해지는 기본값입니다. 이름이 없는 스케줄된 클로저는 대상에서 제외되며, 계속 각 서버에서 실행됩니다.

> [!NOTE]
>
> `onOneServer()`에는 모든 서버가 공유하는 중앙 캐시가 필요합니다. 공식 문서가 드는 대응 드라이버는 `database`, `memcached`, `dynamodb`, `redis`입니다. 설정을 추가하는 것만으로 서버 간 잠금 기반이 마련되는 것은 아닙니다.

1차 정보: [Run Scheduled Tasks on One Server by Default](https://laravel.com/framework/docs/changelog#october-2026-run-scheduled-tasks-on-one-server-by-default), [Laravel 13 공식 scheduling.md](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/scheduling.md#running-tasks-on-one-server). 관련 페이지: [태스크 스케줄링](https://kawax.biz/ko/scheduling.md)

### Fake에서 속성을 지정해 디스패치 검증하기

v13.35.0에서 Queue·Bus·Event·Notification의 Fake에 기대하는 속성의 배열을 전달할 수 있게 되었습니다. 단순한 속성 비교를 위해 매번 콜백을 작성할 필요가 없어집니다.

예를 들어 공개 `order` 속성을 가진 `ShipOrder` 잡과 테스트에서 준비한 `$order`를 사용하는 경우, 다음과 같이 검증할 수 있습니다.

```php theme={null}
use App\Jobs\ShipOrder;
use Illuminate\Support\Facades\Queue;

Queue::fake();

ShipOrder::dispatch($order);

Queue::assertPushed(ShipOrder::class, ['order' => $order]);
```

지정한 속성은 모두 일치해야 합니다. 값은 엄격하게 비교되지만, Eloquent 모델은 `is()`로 비교되므로 같은 모델을 나타내는 다른 인스턴스도 다룰 수 있습니다. Fake는 디스패치의 검증이며, 잡 본체의 실행 결과를 검증하는 것은 아닙니다.

1차 정보: [Assert Fake Dispatches by Their Properties](https://laravel.com/framework/docs/changelog#october-2026-assert-fake-dispatches-by-their-properties), [Laravel 13 공식 queues.md](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/queues.md#testing). 관련 페이지: [큐](https://kawax.biz/ko/queues.md), [모킹](https://kawax.biz/ko/mocking.md)

### 워커의 메모리 상한을 비율로 지정하기

v13.35.0부터 `queue:work`의 `--memory`에 PHP의 `memory_limit`에 대한 비율을 지정할 수 있습니다. 환경마다 고정 MB 값을 다시 계산하지 않고, PHP 설정에 맞춰 워커의 종료 임계값을 조정할 수 있습니다.

```shell theme={null}
php artisan queue:work --memory=60%
```

호스트나 컨테이너 전체 메모리 양에 대한 비율이 아닙니다. PHP의 `memory_limit`가 무제한인 `-1`인 경우에는 비율이 아니라 MB 값을 사용하세요. 임계값에서 종료된 워커의 재시작은 Supervisor 등의 프로세스 감시에 맡깁니다.

1차 정보: [Set Queue Worker Memory Limits as Percentages](https://laravel.com/framework/docs/changelog#october-2026-set-queue-worker-memory-limits-as-percentages), [Laravel 13 공식 queues.md](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/queues.md#resource-considerations)

### Markdown을 전용 Content-Type으로 반환하기

v13.35.0에서 응답 팩토리에 `markdown()`이 추가되었습니다. Markdown 본문을 `text/markdown`으로 반환하며, 상태 코드와 추가 헤더도 지정할 수 있습니다.

```php theme={null}
return response()->markdown("# Report\n\nMonthly summary", 200, [
    'Cache-Control' => 'no-store',
]);
```

`wantsMarkdown()` 등으로 응답 형식을 고르는 처리와 조합할 수 있습니다. Markdown을 HTML로 변환해 반환하는 기능이 아니라, Markdown 자체를 응답으로 제공하기 위한 API입니다.

1차 정보: [Return Markdown Responses](https://laravel.com/framework/docs/changelog#october-2026-return-markdown-responses), [Laravel 13 공식 responses.md](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/responses.md#markdown-responses). 관련 페이지: [응답](https://kawax.biz/ko/responses.md)

### Vitess에서 분석 쿼리를 OLAP 모드로 실행하기

v13.36.0에서 MySQL 연결에 `isVitess()`와 `olap()`이 추가되었습니다. Vitess나 PlanetScale을 이용하고 있는지 판정하고, 분석 용도의 쿼리를 OLAP 워크로드로 실행할 수 있습니다.

```php theme={null}
use Illuminate\Support\Facades\DB;

$totals = DB::connection('mysql')->olap(
    fn ($connection) => $connection->table('orders')
        ->selectRaw('customer_id, sum(total) as total')
        ->groupBy('customer_id')
        ->get()
);
```

읽기·쓰기 양쪽 연결에 워크로드를 설정하고, 콜백 종료 시에는 OLTP로 되돌립니다. 예외 시에도 복원되며, Vitess가 아닌 일반 MySQL 연결에서는 워크로드를 바꾸지 않고 콜백을 실행합니다.

1차 정보: [Use OLAP Workloads with Vitess Connections](https://laravel.com/framework/docs/changelog#october-2026-use-olap-workloads-with-vitess-connections), [Laravel 13 공식 database.md](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/database.md#running-analytical-queries-on-vitess)

### 기존 유효성 검증 규칙을 Builder에서 찾기

v13.36.0에서 기존에는 문자열로 지정하던 많은 규칙에 `Rule`의 Builder 메서드가 추가되었습니다. `requiredWith()`, `acceptedIf()`, `regex()`, `timezone()` 등을 IDE 자동 완성으로 찾기 쉬워지고, 기존 검증 동작을 유지한 채 작성 방법을 선택할 수 있습니다.

```php theme={null}
use Illuminate\Validation\Rule;

$rules = [
    'nickname' => [Rule::requiredWith('email'), Rule::regex('/^[a-z]+$/i')],
    'terms' => [Rule::acceptedIf('account_type', 'business')],
    'timezone' => [Rule::timezone()],
];
```

메서드 이름은 camel case입니다. 문자열 규칙과 혼용도 가능하므로, 기존 규칙을 일괄로 다시 작성할 필요는 없습니다.

1차 정보: [Discover More Validation Rules Through Builders](https://laravel.com/framework/docs/changelog#october-2026-discover-more-validation-rules-through-builders), [Laravel 13 공식 validation.md](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/validation.md#rule-builders). 관련 페이지: [유효성 검증](https://kawax.biz/ko/validation.md)

## Laravel Cloud

공식 월간 블로그에서는 다음 3개 항목이 소개되었습니다.

| 기능 | 업데이트 내용 |
| - | - |
| Resend 연동 | 조직에 Resend 계정을 연결하면 발신 도메인을 가져와 필요한 DNS 레코드와 검증 상태를 표시합니다. 메일 리소스를 환경에 연결하면 Cloud가 API 키를 발급하고 `RESEND_API_KEY`, `MAIL_MAILER`, `MAIL_FROM_ADDRESS`, `MAIL_FROM_NAME`을 설정합니다. |
| Cloud scheduler | Cloud가 지원하는 각 언어의 애플리케이션에서 cron 설치나 스케줄러 프로세스 상주 없이 정기 명령어를 실행할 수 있습니다. 프리셋 또는 독자적인 cron 식을 사용하고, 실행 결과의 출력·종료 코드·소요 시간을 Logs에서 확인할 수 있습니다. |
| 도메인 헬스 체크 | 연결된 도메인의 DNS가 Cloud를 향하고 있는지와 SSL 인증서의 갱신 상태를 매시간 확인합니다. 문제는 환경 캔버스에 표시되며, 메일이나 Slack으로도 통지됩니다. |

1차 정보: [Laravel October Product Updates — Laravel Cloud](https://laravel.com/blog/laravel-october-product-updates#laravel-cloud), [Laravel Cloud changelog](https://laravel.com/cloud/docs/changelog). 관련 페이지: [Laravel Cloud 소개](https://kawax.biz/ko/blog/laravel-cloud.md)

## Laravel Forge

* **PHP 보안 업데이트 알림**: 10월의 PHP 보안 릴리스로 영향을 받는 버전을 서버별로 표시하고, 수정 버전의 제공 상황을 안내합니다. **Recheck versions**로 실제로 설치된 버전을 다시 확인할 수 있습니다. 표시의 재확인과 PHP 업데이트는 별개의 조작입니다.
* **프로비저닝 실패 처리**: 완료할 수 없는 서버를 실패 상태로 표시하고, 알림·다음 조작 안내·삭제 조작을 제공합니다. PHP와 Nginx 설치도 실패를 확정하기 전에 재시도합니다.

월간 블로그에서는 10월의 PHP·Node.js 보안 대응을 돌아보는 Post-mortem 공개에도 언급하고 있습니다. 대응 내용이나 업데이트 판단은 공식 안내를 참조하세요.

1차 정보: [Laravel October Product Updates — Laravel Forge](https://laravel.com/blog/laravel-october-product-updates#laravel-forge), [Laravel Forge changelog](https://laravel.com/forge/docs/changelog)

## 관련 기사

> [card] [2026년 9월 업데이트](https://kawax.biz/ko/blog/changelog/202609.md)
>
> AI 프로바이더의 런타임 구성, 검색 확장, Mercure, Cloud의 격리된 프리뷰 환경을 돌아봅니다.

> [card] [데이터베이스 가이드](https://kawax.biz/ko/database.md)
>
> 읽기·쓰기 분리와 DB 연결의 기본을 확인합니다.


## Related topics

- [2026년 9월 Laravel 업데이트](https://kawax.biz/ko/blog/changelog/202609.md)
- [2026년 3월 Laravel 업데이트](https://kawax.biz/ko/blog/changelog/202603.md)
- [2026년 4월 Laravel 업데이트](https://kawax.biz/ko/blog/changelog/202604.md)
- [2026년 6월 Laravel 업데이트](https://kawax.biz/ko/blog/changelog/202606.md)
- [2026년 5월 Laravel 업데이트](https://kawax.biz/ko/blog/changelog/202605.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.