Laravel 13.20.0 업데이트
릴리스: 2026년 7월 14일
평가: 2026년 8월 28일
13.20.0은 정기 minor 릴리스로, 신규 기능(Image 처리 1st-party 지원, QueueFake 훅, Storage assertEmpty 등)과 다수의 버그 수정이 포함되어 있습니다. 하위 호환성을 깨는 변경은 명시되어 있지 않지만, Number 포맷팅·Str::containsAll·incrementEachQuietly·TrustProxies·BelongsToMany::touch() 등 실제 동작이 달라지는 버그 수정이 여러 건 있어 해당 기능을 사용 중이라면 동작 변화를 확인할 필요가 있습니다.
패키지 관리자가 확인할 것
- Image (intervention/image)위험도 낮음
Laravel에 image 처리에 대한 1st-party 지원이 추가되었습니다(PR #59276). Intervention Image를 직접 사용 중이라면 프레임워크 자체 이미지 기능과의 중복/연동 여부를 검토해볼 만하지만, 노트상 기존 API를 깨는 내용은 없습니다.
대응 체크리스트
- Number::forHumans()/abbreviate() 사용처 재검증가까운 시일
매우 작은 음수·소수 값에서 '-0' 반환 및 스케일링 오류가 수정되었습니다(#60736, #60768). 해당 헬퍼로 통화/수치 표시를 하는 화면이 있다면 결과값을 다시 확인하세요.
- Str::containsAll() 빈 배열 처리 확인가까운 시일
빈 needles 배열을 전달했을 때 true를 잘못 반환하던 버그가 수정되었습니다(#60746). 빈 배열을 조건으로 사용하는 로직이 있다면 결과가 바뀔 수 있으니 점검하세요.
- TrustProxies 다중 프록시 설정 재확인가까운 시일
여러 프록시가 설정된 경우 at:* 헬퍼 동작이 수정되었습니다(#60726). 로드밸런서/CDN 뒤에서 다중 프록시를 신뢰하도록 설정한 앱은 IP/프로토콜 감지가 정상인지 확인하세요.
- BelongsToMany::touch() 커스텀 PK 모델 점검선택
related 모델의 키가 id가 아닐 때 touch()가 오동작하던 버그가 수정되었습니다(#60708). 커스텀 primary key를 쓰는 다대다 관계가 있다면 동작을 재확인하세요.
- incrementEachQuietly/decrementEachQuietly 동적 호출 확인선택
새로 추가된 메서드(#60720)의 동적 호출 버그가 바로 다음 PR(#60737)에서 수정되었습니다. 이 버전에서 이 기능을 새로 도입한다면 최신 패치 포함 여부를 확인하세요.
자동 생성상세 평가
요약
13.20.0은 13.x 라인의 정기 minor 릴리스로, 새로운 기능 추가와 다수의 버그 수정으로 구성되어 있습니다. 릴리스 노트 전반에 공개 API를 깨뜨리는 변경은 명시되어 있지 않으며, 즉시 조치가 필요한 보안 이슈도 언급되지 않았습니다.
주요 변경
- Image 처리에 대한 1st-party 지원 추가 (#59276)
QueueFake에beforePushing/afterPushing훅 추가 (#60689)WorkerStopping이벤트에 메모리 사용량 추가 (#60613)- Storage 파사드에
assertEmpty추가 (#60658) - Eloquent 모델에
incrementEachQuietly/decrementEachQuietly추가 및 동적 호출 버그 수정 (#60720, #60737) - 컨트롤러 미들웨어 속성
WithoutMiddleware추가 (#60709) - Redis 세션에 prefix 설정 기능 추가 (#60700)
- 비밀값을 담는 파라미터에
#[SensitiveParameter]적용 (#60753)
하위 호환성
릴리스 노트에 공개 API의 시그니처나 동작이 의도적으로 깨졌다는 언급은 없습니다. 다만 다음 버그 수정들은 실제 동작 결과값이 달라지므로 사실상 동작 변경으로 취급해야 합니다: Number::forHumans()/abbreviate()의 음수·소수 스케일링(#60736, #60768), Str::containsAll()의 빈 배열 처리(#60746), TrustProxies의 다중 프록시 처리(#60726), BelongsToMany::touch()의 커스텀 키 처리(#60708), S3 드라이버의 providesTemporaryUploadUrls가 true를 반환하도록 수정(#60755).
패키지 관리자가 확인할 것
등록된 패키지 목록 기준으로 직접적인 영향은 크지 않습니다. intervention/image(Image)를 사용 중이라면 프레임워크에 새로 추가된 1st-party 이미지 지원(#59276)과의 관계를 참고 삼아 검토할 수 있으나, 이번 노트에는 통합이나 충돌에 대한 구체적 언급은 없습니다. 그 외 등록 패키지(Http, Scout, Socialite 계열, Inertia 등)에 대한 직접적 변경 사항은 노트에 없습니다.
대응 체크리스트
-
Number::forHumans()/abbreviate()를 화폐·통계 표시에 쓰는 화면 재확인 - 빈 배열을
Str::containsAll()에 전달하는 로직이 있는지 확인 - 다중 프록시(로드밸런서/CDN) 환경에서
TrustProxies동작 재확인 - 커스텀 primary key를 사용하는 BelongsToMany 관계의
touch()동작 확인 - S3 임시 업로드 URL 기능(
providesTemporaryUploadUrls)을 사용 중이라면 정상 동작 확인 - 새 기능(
assertEmpty,beforePushing/afterPushing,incrementEachQuietly등) 도입 여부는 선택 사항으로 검토
GitHub 릴리스 노트를 근거로 언어 모델 (claude-sonnet-5)이 작성했으며, 사람이 검수하지 않았습니다. 실제 적용 전에는 공식 릴리스 노트와 업그레이드 가이드를 함께 확인하세요.
GitHub 원문 릴리스 노트 보기
- [13.x] Add missing $separator parameter to Storage facade append/prepend docblocks by @ferhatolmez in https://github.com/laravel/framework/pull/60693
- [13.x]
beforePushingandafterPushingmethods onQueueFakeclass by @gdebrauwer in https://github.com/laravel/framework/pull/60689 - [13.x] Add memory usage to WorkerStopping by @jackbayliss in https://github.com/laravel/framework/pull/60613
- [13.x] Add
assertEmptyto the Storage facade by @jackbayliss in https://github.com/laravel/framework/pull/60658 - [13.x] Adds first-party support for
imageprocessing by @nunomaduro in https://github.com/laravel/framework/pull/59276 - [13.x] Fix operator precedence in SqsQueue size fallbacks by @daffa-aditya-p in https://github.com/laravel/framework/pull/60702
- Add separator params to Storage facade docblocks by @Muhtasim-Munif-Fahim in https://github.com/laravel/framework/pull/60703
- [13.x] Add test for the scheduler's quarterlyOn method by @dfinchenko in https://github.com/laravel/framework/pull/60712
- Make MailFake::assertQueuedTimes() public by @Tresor-Kasenda in https://github.com/laravel/framework/pull/60710
- [13.x] Sync more getter return types with their property generics by @dfinchenko in https://github.com/laravel/framework/pull/60699
- [13.x] Fix guessResourceName() namespace collision when class name is a substring of a parent namespace segment by @Rubrasum in https://github.com/laravel/framework/pull/60707
- [13.x] Add WithoutMiddleware controller middleware attribute by @JurianArie in https://github.com/laravel/framework/pull/60709
- [13.x] Add incrementEachQuietly and decrementEachQuietly to Eloquent models by @shanerbaner82 in https://github.com/laravel/framework/pull/60720
- [13.x] Normalize HTTP client request header lookups by @Button99 in https://github.com/laravel/framework/pull/60734
- [12.x] Enum as queue overlap key by @finagin in https://github.com/laravel/framework/pull/60722
- [13.x] Support null for shortcut field in return type array for HasParameters::getOptions (#60723) by @wimski in https://github.com/laravel/framework/pull/60728
- [13.x] Ability to set session prefix for Redis by @jackbayliss in https://github.com/laravel/framework/pull/60700
- [13.x] Add
#[SensitiveParameter]to parameters carrying secrets by @axlon in https://github.com/laravel/framework/pull/60753 - [13.x] Optimize by using contains or doesntContain by @lucasmichot in https://github.com/laravel/framework/pull/60745
- [13.x] Remove redundant Mockery::close() calls by @lucasmichot in https://github.com/laravel/framework/pull/60743
- [13.x] Only register pail in DevCommands when
pcntl_forkis available by @jackbayliss in https://github.com/laravel/framework/pull/60749 - [13.x] Use PHPUnit rector sets instead of individual rules by @lucasmichot in https://github.com/laravel/framework/pull/60744
- [13.x] Replace manual all/any foreach loops with array_all/array_any by @lucasmichot in https://github.com/laravel/framework/pull/60742
- [13.x] Add test for the Uri toStringable method by @dfinchenko in https://github.com/laravel/framework/pull/60739
- [13.x] Fix Str::containsAll() returning true for an empty needles array by @lucasmichot in https://github.com/laravel/framework/pull/60746
- [13.x] Fix stale transformations being reapplied when branching an Image after toBytes() by @lucasmichot in https://github.com/laravel/framework/pull/60748
- [13.x] Fix Number::forHumans() and abbreviate() returning "-0" for tiny negative values by @semx in https://github.com/laravel/framework/pull/60736
- [13.x] Add test for the Email rule's strict method by @dfinchenko in https://github.com/laravel/framework/pull/60740
- [13.x] fix: providesTemporaryUploadUrls should return true for s3 driver by @joostdebruijn in https://github.com/laravel/framework/pull/60755
- [12.x] Add capitalize parameter to Stringable::initials() by @irabbi360 in https://github.com/laravel/framework/pull/60741
- [13.x] Fix dynamic calls to incrementEachQuietly and decrementEachQuietly by @daffa-aditya-p in https://github.com/laravel/framework/pull/60737
- Fix BelongsToMany::touch() when related key is not
idby @Peeterush in https://github.com/laravel/framework/pull/60708 - Merge branch '12.x' into 13.x by @crynobone in https://github.com/laravel/framework/pull/60773
- [13.x] Fix Number::forHumans() and abbreviate() scaling tiny decimals by @daffa-aditya-p in https://github.com/laravel/framework/pull/60768
- [13.x] Reset fake time globally after each test, drop redundant Carbon::setTestNow() cleanup by @lucasmichot in https://github.com/laravel/framework/pull/60761
- [13.x] Ensure
make:migrationgenerates collision-free, ordered timestamps prefixes by @NickSdot in https://github.com/laravel/framework/pull/60771 - [13.x] Fix JsonApiResource relationships resolved through a closure by @markwalet in https://github.com/laravel/framework/pull/60752
- [13.x] Fix TrustProxies at:* when multiple proxies are used by @mattford in https://github.com/laravel/framework/pull/60726