Laravel 13.24.0 업데이트
릴리스: 2026년 8월 5일
평가: 2026년 8월 28일
이번 13.24.0은 마이너 릴리스로 새 기능(array_keys 검증 규칙, modelKeys(), HEIC/AVIF 이미지 지원, dominant color 감지 등)과 다수의 버그 수정이 포함되어 있습니다. 일부 항목은 기존 동작을 미묘하게 바꾸는 버그 수정(Arr::forget, 다국어 Str::replace/remove, Pivot Guarded, toArray 접근자 처리 등)이므로 해당 기능을 사용 중이면 확인이 필요하지만, 전반적으로 즉시 조치가 필요한 치명적 변경은 없습니다.
예상되는 하위 호환성 문제
- Arr::forget()이 잘못된 요소를 제거하던 버그 수정심각도 보통
PR #61023에서 Arr::forget()이 잘못된 요소를 제거하는 문제를 수정했습니다. 버그 수정이지만 기존에 이 잘못된 동작에 암묵적으로 의존한 코드가 있다면 동작이 달라질 수 있습니다.
영향 범위: Arr::forget()을 중첩 배열 키 삭제에 사용하는 코드
- Pivot 모델의 Guarded 속성 동작 불일치 수정심각도 보통
PR #60952에서 Pivot 모델의 guarded 속성 처리가 일관되지 않던 버그를 수정했습니다. Pivot 모델에서 fillable/guarded를 세밀하게 다루는 경우 동작 차이가 발생할 수 있습니다.
영향 범위: 커스텀 Pivot 모델의 guarded/fillable 설정
- toArray() 호출 시 appended accessor에 null이 전달되던 버그 수정심각도 낮음
PR #60921에서 appended accessor(append된 속성)가 toArray() 호출 시 null을 받던 문제를 수정했습니다. 해당 접근자 로직이 null을 전제로 작성되어 있다면 결과가 달라질 수 있습니다.
영향 범위: Eloquent 모델의 $appends에 정의된 커스텀 accessor
- Str::replace/Str::remove의 멀티바이트 대소문자 무시 매칭 수정심각도 낮음
PR #60882에서 멀티바이트 문자열에 대한 case-insensitive 매칭 버그가 수정되었습니다. 한글 등 멀티바이트 문자열에 대소문자 무시 옵션으로 replace/remove를 쓰던 코드는 결과가 달라질 수 있습니다.
영향 범위: Str::replace(), Str::remove()를 대소문자 무시 옵션과 함께 멀티바이트 문자열에 사용하는 코드
패키지 관리자가 확인할 것
- Image (intervention/image)위험도 낮음
이번 릴리스는 Laravel 프레임워크 자체의 이미지 드라이버에 HEIC/AVIF 추가 지원과 dominant color 감지 기능을 추가한 것으로(PR #60922, #60932), intervention/image 패키지 자체 변경은 아닙니다. 프레임워크의 이미지 관련 기능을 함께 사용하는 경우 참고하세요.
대응 체크리스트
- Arr::forget() 사용 코드 점검가까운 시일
중첩 배열 키 삭제에 Arr::forget()을 광범위하게 사용 중이라면 업그레이드 후 관련 테스트를 재실행해 예상대로 동작하는지 확인하세요.
- Pivot 모델 guarded/fillable 동작 확인가까운 시일
커스텀 Pivot 클래스에서 guarded 속성을 사용 중이라면 mass assignment 관련 테스트를 재확인하세요.
- 멀티바이트 문자열 대소문자 무시 치환 결과 확인선택
한글/일본어 등 멀티바이트 문자열에 Str::replace/Str::remove를 caseSensitive=false로 사용하는 부분이 있다면 결과를 다시 확인하세요.
- composer update 후 전체 테스트 스위트 실행선택
일반적인 마이너 업그레이드 절차로 composer update laravel/framework 후 CI 테스트를 돌려 회귀가 없는지 확인하세요.
자동 생성상세 평가
요약
13.24.0은 마이너 릴리스로, 새로운 기능 추가(array_keys 검증 규칙, modelKeys(), HEIC/AVIF 이미지 지원, dominant color 감지 등)와 다수의 버그 수정, 대규모 내부 리팩터링(rector 규칙 적용, 코드 스타일 정리)으로 구성되어 있습니다. 치명적인 보안 이슈나 공개 API의 심각한 하위 호환성 파괴는 노트에서 확인되지 않습니다.
주요 변경
array_keys검증 규칙 추가 (#60918)- Eloquent 쿼리 빌더에
modelKeys()추가 (#60924) - 이미지 드라이버에 dominant color 감지, HEIC/AVIF 지원 추가 (#60932, #60922)
- 대용량 배열 검증 시 발생하던 지연(stalling) 문제 수정 (#60908)
Arr::forget()이 잘못된 요소를 제거하던 버그 수정 (#61023)- Pivot 모델의 guarded 속성 동작 불일치 수정 (#60952)
toArray()호출 시 appended accessor가 null을 받던 버그 수정 (#60921)- 멀티바이트 문자열의 case-insensitive
Str::replace/Str::remove매칭 버그 수정 (#60882) - QueueFake, FailoverQueue에서 job delay를 무시하던 버그 수정 (#60916, #60950)
- PHP 8.5 관련 deprecation 대응 다수 (#60964, #60954, #60987)
하위 호환성
노트에 명시된 항목 중 공개 API의 시그니처나 계약을 깨는 변경은 없습니다. 다만 버그 수정 성격의 항목들(Arr::forget, Pivot guarded, Str 멀티바이트 매칭, appended accessor)은 기존의 잘못된 동작에 암묵적으로 의존하던 코드가 있다면 결과가 달라질 수 있어 패치 릴리스 수준의 주의가 필요합니다.
패키지 관리자가 확인할 것
등록된 패키지 목록 중 이번 릴리스 노트에서 직접적으로 언급되거나 영향을 받는 패키지는 확인되지 않았습니다. 이미지 처리 관련 기능(HEIC/AVIF, dominant color)은 프레임워크 자체 이미지 드라이버 변경이며, intervention/image 패키지의 별도 변경사항은 이번 노트에 없습니다.
대응 체크리스트
-
composer update laravel/framework로 13.24.0 반영 후 전체 테스트 스위트 실행 -
Arr::forget()을 중첩 키 삭제에 사용하는 코드가 있다면 결과 재검증 - 커스텀 Pivot 모델에서
$guarded/$fillable사용 시 mass assignment 테스트 재확인 - 멀티바이트(한글 등) 문자열에
Str::replace/Str::remove를 대소문자 무시 옵션으로 사용하는 부분 점검 -
$appends에 정의된 accessor가 null 입력을 전제로 작성되었는지 확인
GitHub 릴리스 노트를 근거로 언어 모델 (claude-sonnet-5)이 작성했으며, 사람이 검수하지 않았습니다. 실제 적용 전에는 공식 릴리스 노트와 업그레이드 가이드를 함께 확인하세요.
GitHub 원문 릴리스 노트 보기
- [13.x] Add
modelKeys()to Eloquent query builder by @ziadoz in https://github.com/laravel/framework/pull/60924 - [13.x] Add an array_keys validation rule by @nebarg in https://github.com/laravel/framework/pull/60918
- [13.x] Respect job delays when bulk pushing to QueueFake by @Faiyajz in https://github.com/laravel/framework/pull/60916
- [13.x] Use immutable timestamps in batch testing fakes by @alies-dev in https://github.com/laravel/framework/pull/60912
- [13.x] Avoid rebuilding every cached Route on CompiledRouteCollection lookups by @lucasmichot in https://github.com/laravel/framework/pull/60909
- [13.x] Fix
DumpCommandreturn type. by @KentarouTakeda in https://github.com/laravel/framework/pull/60934 - [13.x] Re-evaluate unmatched BindWhen attributes by @Faiyajz in https://github.com/laravel/framework/pull/60933
- [13.x] Add if-related rector rules by @lucasmichot in https://github.com/laravel/framework/pull/60930
- [13.x] Use self::SUCCESS/self::FAILURE in console commands by @lucasmichot in https://github.com/laravel/framework/pull/60928
- [13.x] Fake the pwnedpasswords API in ValidationPasswordRuleTest by @lucasmichot in https://github.com/laravel/framework/pull/60927
- fix typo by @theHocineSaad in https://github.com/laravel/framework/pull/60942
- [13.x] Memoize TestResponse::decodeResponseJson() by @lucasmichot in https://github.com/laravel/framework/pull/60929
- [13.x] Consolidate Artisan command $name/getArguments()/getOptions() into $signature by @lucasmichot in https://github.com/laravel/framework/pull/60926
- [13.x] Escape single quotes in Postgres JSON path attributes by @kpanuragh in https://github.com/laravel/framework/pull/60923
- [13.x] Preserve relation constraints when resolving attributes during noConstraints by @hamdyelbatal122 in https://github.com/laravel/framework/pull/60931
- [13.x] Replace throw_if/throw_unless with explicit if/throw in src/ by @lucasmichot in https://github.com/laravel/framework/pull/60944
- [13.x] Adds dominant color detection to image driver by @dr-codswallop in https://github.com/laravel/framework/pull/60932
- Fix PendingProcess losing falsy command strings on run()/start() by @lucasmichot in https://github.com/laravel/framework/pull/60947
- [13.x] Use Collection only()/diff() instead of filter()/reject() with in_array() by @lucasmichot in https://github.com/laravel/framework/pull/60945
- [13.x] Use enum_value() helper in a few more places by @lucasmichot in https://github.com/laravel/framework/pull/60983
- [13.x] Remove redundant m::close() by @lucasmichot in https://github.com/laravel/framework/pull/60981
- [13.x] Add missing conditionable, reflection, macroable requires by @lucasmichot in https://github.com/laravel/framework/pull/60980
- [13.x] Use Stringable::explode() instead of new Collection(explode()) by @lucasmichot in https://github.com/laravel/framework/pull/60979
- [13.x] Prefer isEmpty()/isNotEmpty()/contains() over count() checks by @lucasmichot in https://github.com/laravel/framework/pull/60978
- [13.x] Avoid redundant Collection passes in map/filter/reject chains by @lucasmichot in https://github.com/laravel/framework/pull/60977
- [13.x] Detect circular alias references in Container by @lucasmichot in https://github.com/laravel/framework/pull/60974
- [13.x] Fix pagination edge cases by @lucasmichot in https://github.com/laravel/framework/pull/60968
- [13.x] Solve another PHP 8.5 null index deprecation by @tontonsb in https://github.com/laravel/framework/pull/60964
- [13.x] Prevent TypeError in Validator::validateDistinct() by @theHocineSaad in https://github.com/laravel/framework/pull/60961
- [13.x] Fix Actions remove
imagedestroyfrom tests by @jackbayliss in https://github.com/laravel/framework/pull/60957 - [13.x] Add NumberPrompt fallback by @romain-mezghenna in https://github.com/laravel/framework/pull/60959
- [13.x] Fix PHP 8.5 null array offset deprecation in
Relation::getMorphedModel()by @mertasan in https://github.com/laravel/framework/pull/60954 - [13.x] Respect job delays when bulk pushing to FailoverQueue by @Faiyajz in https://github.com/laravel/framework/pull/60950
- bugfix: inconsistent Guarded attribute behaviour on Pivot by @Carnicero90 in https://github.com/laravel/framework/pull/60952
- [13.x] Fix the ModelMakeCommand handle return type by @dfinchenko in https://github.com/laravel/framework/pull/60989
- [13.x] Sort null-key deprecation in
LazyCollection::keyByby @jackbayliss in https://github.com/laravel/framework/pull/60987 - [13.x] Fix validation stalling for minutes on large arrays by @mariomka in https://github.com/laravel/framework/pull/60908
- [13.x] Adjust ImagickDriverTest by @jackbayliss in https://github.com/laravel/framework/pull/60990
- [13.x] Add HEIC and additional AVIF support by @riasvdv in https://github.com/laravel/framework/pull/60922
- [13.x] Fix multibyte case-insensitive matching in Str::replace and Str::remove by @marekmiklusek in https://github.com/laravel/framework/pull/60882
- [13.x] Fix appended accessors receiving null in toArray() by @lazerg in https://github.com/laravel/framework/pull/60921
- Attempt at lock fix by @taylorotwell in https://github.com/laravel/framework/pull/60906
- [13.x] Sync property docblocks with their parent declarations by @dfinchenko in https://github.com/laravel/framework/pull/60991
- [13.x] Add tests for the whereUuid and whereUlid route constraints by @dfinchenko in https://github.com/laravel/framework/pull/61013
- [13.x] Use strict comparisons for int-to-int checks by @lucasmichot in https://github.com/laravel/framework/pull/61005
- [13.x] Add test for the Request matchesType method by @dfinchenko in https://github.com/laravel/framework/pull/61012
- Adjust URL validation logic by @taylorotwell in https://github.com/laravel/framework/pull/61009
- [13.x] Sync FilesystemAdapter return types with the filesystem contract by @dfinchenko in https://github.com/laravel/framework/pull/61011
- [13.x] Use static instead of self in
LoadConfigurationby @cosmastech in https://github.com/laravel/framework/pull/61006 - [13.x] Remove unregistered skipped rector rule by @lucasmichot in https://github.com/laravel/framework/pull/60999
- [13.x] FIX flaky dominantColor() test by @lucasmichot in https://github.com/laravel/framework/pull/60997
- [13.x] Use PHPUnit requirement attributes instead of markTestSkipped() by @lucasmichot in https://github.com/laravel/framework/pull/60998
- [13.x] Use reduce() instead of foreach accumulator loops by @lucasmichot in https://github.com/laravel/framework/pull/61004
- [13.x] Remove dead parent::setUp()/tearDown() calls in tests by @lucasmichot in https://github.com/laravel/framework/pull/60994
- [13.x] Use Str::uuid()->toString() by @lucasmichot in https://github.com/laravel/framework/pull/60995
- [13.x] Check the class before calling relationLoaded in loadMissingRelationshipChain by @dxiiren in https://github.com/laravel/framework/pull/60993
- [13.x] Fix ReflectsClosures::firstClosureParameterTypes() returning wrong parameter's type by @lucasmichot in https://github.com/laravel/framework/pull/60976
- [13.x] Avoid repeated Redis prefix/connection lookups in tag-set loops by @lucasmichot in https://github.com/laravel/framework/pull/61002
- [13.x] early return by @lucasmichot in https://github.com/laravel/framework/pull/61014
- Revert "[13.x] Add if-related rector rules" by @taylorotwell in https://github.com/laravel/framework/pull/61027
- Revert "[13.x] Use Str::uuid()->toString()" by @taylorotwell in https://github.com/laravel/framework/pull/61028
- [13.x] Fix
Arr::forget()removing the wrong element by @AlessioGiacobbe in https://github.com/laravel/framework/pull/61023