Skip to content

릴리스 노트

버전 관리 체계

Laravel과 다른 퍼스트 파티 패키지는 시맨틱 버전 관리를 따릅니다. 주요 프레임워크 릴리스는 매년 (~Q1) 출시되며, 마이너 및 패치 릴리스는 매주 출시될 수 있습니다. 마이너 및 패치 릴리스에는 절대 호환성이 깨지는 변경 사항이 포함되지 않아야 합니다.

애플리케이션 또는 패키지에서 Laravel 프레임워크 또는 해당 구성 요소를 참조할 때는 Laravel의 주요 릴리스에 호환성이 깨지는 변경 사항이 포함되므로 항상 ^11.0과 같은 버전 제약 조건을 사용해야 합니다. 그러나 새 주요 릴리스로 하루나 그 이하로 업데이트할 수 있도록 항상 노력하고 있습니다.

이름 있는 인자

이름 있는 인자는 Laravel의 이전 버전과의 호환성 지침에 포함되지 않습니다. Laravel 코드베이스를 개선하기 위해 필요할 때 함수 인자의 이름을 바꿀 수 있습니다. 따라서 Laravel 메서드를 호출할 때 이름 있는 인자를 사용하는 것은 신중하게 수행해야 하며, 매개변수 이름이 나중에 변경될 수 있음을 이해해야 합니다.

지원 정책

모든 Laravel 릴리스에 대해 버그 수정은 18개월 동안 제공되고 보안 수정은 2년 동안 제공됩니다. Lumen을 포함한 모든 추가 라이브러리의 경우 최신 주요 릴리스만 버그 수정을 받습니다. 또한 Laravel에서 지원하는 데이터베이스 버전을 검토하십시오.

버전 PHP (*) 릴리스 버그 수정 종료일 보안 수정 종료일
9 8.0 - 8.2 2022년 2월 8일 2023년 8월 8일 2024년 2월 6일
10 8.1 - 8.3 2023년 2월 14일 2024년 8월 6일 2025년 2월 4일
11 8.2 - 8.4 2024년 3월 12일 2025년 9월 3일 2026년 3월 12일
12 8.2 - 8.4 2025년 1분기 2026년 3분기 2027년 1분기
수명 종료
보안 수정만 제공

(*) 지원되는 PHP 버전

Laravel 11

Laravel 11은 간소화된 애플리케이션 구조, 초당 속도 제한, 상태 라우팅, 정상적인 암호화 키 회전, 큐 테스트 개선, Resend 메일 전송, 프롬프트 유효성 검사기 통합, 새로운 Artisan 명령어 등을 도입하여 Laravel 10.x에서 이루어진 개선 사항을 지속합니다. 또한, 애플리케이션에 강력한 실시간 기능을 제공하기 위해 확장 가능한 퍼스트 파티 WebSocket 서버인 Laravel Reverb가 도입되었습니다.

PHP 8.2

Laravel 11.x에는 최소 PHP 버전 8.2가 필요합니다.

간소화된 애플리케이션 구조

Laravel의 간소화된 애플리케이션 구조는 Taylor OtwellNuno Maduro에 의해 개발되었습니다.

Laravel 11은 기존 애플리케이션에 대한 변경 없이 새로운 Laravel 애플리케이션을 위한 간소화된 애플리케이션 구조를 도입합니다. 새로운 애플리케이션 구조는 Laravel 개발자에게 이미 친숙한 많은 개념을 유지하면서 더욱 간결하고 현대적인 경험을 제공하기 위한 것입니다. 아래에서는 Laravel의 새로운 애플리케이션 구조의 주요 내용에 대해 설명합니다.

애플리케이션 부트스트랩 파일

bootstrap/app.php 파일은 코드 우선 애플리케이션 구성 파일로 활성화되었습니다. 이 파일에서 이제 애플리케이션의 라우팅, 미들웨어, 서비스 공급자, 예외 처리 등을 사용자 정의할 수 있습니다. 이 파일은 이전에는 애플리케이션의 파일 구조 전체에 분산되어 있던 다양한 고수준 애플리케이션 동작 설정을 통합합니다.

return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
//
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();

서비스 제공자

기본적으로 5개의 서비스 제공자를 포함하는 Laravel 애플리케이션 구조 대신, Laravel 11은 단일 AppServiceProvider만 포함합니다. 이전 서비스 제공자의 기능은 bootstrap/app.php에 통합되었거나, 프레임워크에서 자동으로 처리되거나, 애플리케이션의 AppServiceProvider에 배치될 수 있습니다.

예를 들어, 이벤트 검색이 이제 기본적으로 활성화되어 있어 이벤트와 해당 리스너를 수동으로 등록할 필요가 거의 없습니다. 그러나 이벤트를 수동으로 등록해야 하는 경우, AppServiceProvider에서 간단히 수행할 수 있습니다. 마찬가지로, 이전에 AuthServiceProvider에 등록했을 수 있는 라우트 모델 바인딩 또는 권한 부여 게이트도 AppServiceProvider에 등록할 수 있습니다.

선택적 API 및 브로드캐스트 라우팅

많은 애플리케이션에서 이러한 파일이 필요하지 않으므로 api.phpchannels.php 라우트 파일은 더 이상 기본적으로 존재하지 않습니다. 대신 간단한 Artisan 명령어를 사용하여 생성할 수 있습니다.

php artisan install:api
 
php artisan install:broadcasting

미들웨어

이전에는 새로운 Laravel 애플리케이션에 9개의 미들웨어가 포함되어 있었습니다. 이 미들웨어들은 요청 인증, 입력 문자열 다듬기, CSRF 토큰 유효성 검사와 같은 다양한 작업을 수행했습니다.

Laravel 11에서는 이러한 미들웨어가 프레임워크 자체로 이동되어 애플리케이션 구조에 불필요한 부담을 주지 않도록 변경되었습니다. 이러한 미들웨어의 동작을 사용자 정의하는 새로운 방법이 프레임워크에 추가되었으며, 애플리케이션의 bootstrap/app.php 파일에서 호출할 수 있습니다:

->withMiddleware(function (Middleware $middleware) {
$middleware->validateCsrfTokens(
except: ['stripe/*']
);
 
$middleware->web(append: [
EnsureUserIsSubscribed::class,
])
})

이제 모든 미들웨어를 애플리케이션의 bootstrap/app.php를 통해 쉽게 사용자 정의할 수 있으므로 별도의 HTTP "커널" 클래스가 필요하지 않게 되었습니다.

스케줄링

새로운 Schedule 파사드를 사용하여 예약된 작업을 이제 애플리케이션의 routes/console.php 파일에서 직접 정의할 수 있으므로 별도의 콘솔 "커널" 클래스가 필요하지 않게 되었습니다:

use Illuminate\Support\Facades\Schedule;
 
Schedule::command('emails:send')->daily();

예외 처리

라우팅 및 미들웨어와 마찬가지로 예외 처리도 별도의 예외 처리기 클래스 대신 애플리케이션의 bootstrap/app.php 파일에서 사용자 정의할 수 있게 되어 새로운 Laravel 애플리케이션에 포함되는 전체 파일 수가 줄었습니다:

->withExceptions(function (Exceptions $exceptions) {
$exceptions->dontReport(MissedFlightException::class);
 
$exceptions->report(function (InvalidOrderException $e) {
// ...
});
})

기본 Controller 클래스

새로운 Laravel 애플리케이션에 포함된 기본 컨트롤러가 단순화되었습니다. 더 이상 Laravel의 내부 Controller 클래스를 상속하지 않으며, AuthorizesRequestsValidatesRequests 트레이트가 제거되었습니다. 이는 필요한 경우 애플리케이션의 개별 컨트롤러에 포함할 수 있습니다.

<?php
 
namespace App\Http\Controllers;
 
abstract class Controller
{
//
}

애플리케이션 기본값

기본적으로 새로운 Laravel 애플리케이션은 데이터베이스 스토리지에 SQLite를 사용하며, Laravel의 세션, 캐시 및 큐에 database 드라이버를 사용합니다. 이를 통해 추가 소프트웨어를 설치하거나 추가 데이터베이스 마이그레이션을 생성할 필요 없이 새로운 Laravel 애플리케이션을 생성한 직후에 애플리케이션 개발을 시작할 수 있습니다.

또한 시간이 지남에 따라 이러한 Laravel 서비스의 database 드라이버는 많은 애플리케이션 컨텍스트에서 프로덕션 환경에서 사용하기에 충분히 강력해졌습니다. 따라서 로컬 및 프로덕션 애플리케이션 모두에 대해 합리적이고 통합된 선택지를 제공합니다.

Laravel Reverb

Laravel Reverb는 Joe Dixon이 개발했습니다.

Laravel Reverb는 매우 빠르고 확장 가능한 실시간 WebSocket 통신을 Laravel 애플리케이션에 직접 제공하며, Laravel Echo와 같은 Laravel의 기존 이벤트 브로드캐스팅 도구와 원활하게 통합됩니다.

php artisan reverb:start

또한, Reverb는 Redis의 발행/구독 기능을 통해 수평적 확장을 지원하므로, 단일 고수요 애플리케이션을 지원하는 여러 백엔드 Reverb 서버에 WebSocket 트래픽을 분산할 수 있습니다.

Laravel Reverb에 대한 자세한 내용은 전체 Reverb 문서를 참조하십시오.

초당 속도 제한

초당 속도 제한은 Tim MacDonald 님이 기여했습니다.

이제 Laravel은 HTTP 요청 및 대기열 작업 등을 포함한 모든 속도 제한기에 대해 "초당" 속도 제한을 지원합니다. 이전에는 Laravel의 속도 제한기가 "분당" 세분성으로 제한되었습니다.

RateLimiter::for('invoices', function (Request $request) {
return Limit::perSecond(1);
});

Laravel의 속도 제한에 대한 자세한 내용은 속도 제한 문서를 확인하십시오.

상태 라우팅

상태 라우팅은 Taylor Otwell 님이 기여했습니다.

새로운 Laravel 11 애플리케이션에는 health 라우팅 지시어가 포함되어 있으며, 이는 Laravel에게 Kubernetes와 같은 타사 애플리케이션 상태 모니터링 서비스 또는 오케스트레이션 시스템에서 호출할 수 있는 간단한 상태 확인 엔드포인트를 정의하도록 지시합니다. 기본적으로 이 경로는 /up에서 제공됩니다.

->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)

이 경로로 HTTP 요청이 이루어지면 Laravel은 DiagnosingHealth 이벤트를 디스패치하여 애플리케이션과 관련된 추가적인 상태 점검을 수행할 수 있도록 합니다.

점진적 암호화 키 회전

점진적 암호화 키 회전은 Taylor Otwell님이 기여했습니다.

Laravel은 애플리케이션의 세션 쿠키를 포함한 모든 쿠키를 암호화하므로 기본적으로 Laravel 애플리케이션에 대한 모든 요청은 암호화에 의존합니다. 하지만 이 때문에 애플리케이션의 암호화 키를 회전하면 모든 사용자가 애플리케이션에서 로그아웃됩니다. 또한 이전 암호화 키로 암호화된 데이터를 해독하는 것이 불가능해집니다.

Laravel 11을 사용하면 APP_PREVIOUS_KEYS 환경 변수를 통해 쉼표로 구분된 목록으로 애플리케이션의 이전 암호화 키를 정의할 수 있습니다.

값을 암호화할 때 Laravel은 항상 APP_KEY 환경 변수 내에 있는 "현재" 암호화 키를 사용합니다. 값을 해독할 때 Laravel은 먼저 현재 키를 시도합니다. 현재 키를 사용하여 해독에 실패하면 Laravel은 값 해독이 가능한 키가 있을 때까지 모든 이전 키를 시도합니다.

이러한 점진적 해독 방식은 암호화 키가 회전된 경우에도 사용자가 중단 없이 애플리케이션을 계속 사용할 수 있도록 합니다.

Laravel의 암호화에 대한 자세한 내용은 암호화 문서를 확인하십시오.

자동 비밀번호 재해싱

자동 비밀번호 재해싱은 Stephen Rees-Carter님이 기여했습니다.

Laravel의 기본 비밀번호 해싱 알고리즘은 bcrypt입니다. bcrypt 해시의 "작업 요소"는 config/hashing.php 구성 파일 또는 BCRYPT_ROUNDS 환경 변수를 통해 조정할 수 있습니다.

일반적으로 CPU/GPU 처리 능력이 증가함에 따라 시간이 지남에 따라 bcrypt 작업 요소를 늘려야 합니다. 애플리케이션의 bcrypt 작업 요소를 늘리면 사용자가 애플리케이션으로 인증할 때 Laravel이 사용자 비밀번호를 자동으로 점진적으로 다시 해싱합니다.

프롬프트 유효성 검사

프롬프트 유효성 검사기 통합은 Andrea Marco Sartori님이 기여했습니다.

Laravel Prompts는 자리 표시자 텍스트 및 유효성 검사를 포함한 브라우저와 같은 기능을 갖춘 아름답고 사용자 친화적인 양식을 명령줄 애플리케이션에 추가하기 위한 PHP 패키지입니다.

Laravel Prompts는 클로저를 통해 입력 유효성 검사를 지원합니다.

$name = text(
label: 'What is your name?',
validate: fn (string $value) => match (true) {
strlen($value) < 3 => 'The name must be at least 3 characters.',
strlen($value) > 255 => 'The name must not exceed 255 characters.',
default => null
}
);

하지만, 이는 많은 입력 또는 복잡한 유효성 검사 시나리오를 처리할 때 번거로워질 수 있습니다. 따라서 Laravel 11에서는 프롬프트 입력을 검증할 때 Laravel의 validator의 모든 기능을 활용할 수 있습니다.

$name = text('What is your name?', validate: [
'name' => 'required|min:3|max:255',
]);

큐 상호 작용 테스트

큐 상호 작용 테스트는 Taylor Otwell 님이 기여했습니다.

이전에는 큐에 대기 중인 작업이 릴리스, 삭제 또는 수동으로 실패했는지 테스트하는 것이 번거로웠으며 사용자 정의 큐 페이크 및 스텁 정의가 필요했습니다. 그러나 Laravel 11에서는 withFakeQueueInteractions 메서드를 사용하여 이러한 큐 상호 작용을 쉽게 테스트할 수 있습니다.

use App\Jobs\ProcessPodcast;
 
$job = (new ProcessPodcast)->withFakeQueueInteractions();
 
$job->handle();
 
$job->assertReleased(delay: 30);

큐 작업 테스트에 대한 자세한 내용은 큐 문서를 확인하세요.

새로운 Artisan 명령어

클래스 생성 Artisan 명령어는 Taylor Otwell 님이 기여했습니다.

클래스, enum, 인터페이스 및 트레이트를 빠르게 생성할 수 있도록 새로운 Artisan 명령어가 추가되었습니다.

php artisan make:class
php artisan make:enum
php artisan make:interface
php artisan make:trait

모델 캐스트 개선

모델 캐스트 개선은 Nuno Maduro 님이 기여했습니다.

라라벨 11은 속성 대신 메서드를 사용하여 모델의 캐스트를 정의하는 것을 지원합니다. 이를 통해 특히 인수를 사용하는 캐스트를 사용할 때 간소화되고 유연한 캐스트 정의가 가능합니다.

/**
* 캐스팅되어야 하는 속성을 가져옵니다.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'options' => AsCollection::using(OptionCollection::class),
// AsEncryptedCollection::using(OptionCollection::class),
// AsEnumArrayObject::using(OptionEnum::class),
// AsEnumCollection::using(OptionEnum::class),
];
}

속성 캐스팅에 대한 자세한 내용은 Eloquent 문서를 참조하십시오.

once 함수

once 헬퍼는 Taylor Otwell 님과 Nuno Maduro 님이 기여했습니다.

once 헬퍼 함수는 주어진 콜백을 실행하고 요청 기간 동안 결과를 메모리에 캐시합니다. 동일한 콜백으로 once 함수를 후속 호출하면 이전에 캐시된 결과가 반환됩니다.

function random(): int
{
return once(function () {
return random_int(1, 1000);
});
}
 
random(); // 123
random(); // 123 (캐시된 결과)
random(); // 123 (캐시된 결과)

once 헬퍼에 대한 자세한 내용은 헬퍼 문서를 확인하십시오.

메모리 내 데이터베이스를 사용한 테스트 성능 향상

메모리 내 데이터베이스 테스트 성능 향상은 Anders Jenbo 님이 기여했습니다.

라라벨 11은 테스트 중 :memory: SQLite 데이터베이스를 사용할 때 상당한 속도 향상을 제공합니다. 이를 위해 라라벨은 이제 PHP의 PDO 객체에 대한 참조를 유지하고 연결 전반에 걸쳐 재사용하여 총 테스트 실행 시간을 절반으로 단축하는 경우가 많습니다.

MariaDB 지원 개선

MariaDB 지원 개선은 Jonas Staudenmeir 님과 Julius Kiekbusch 님이 기여했습니다.

라라벨 11에는 MariaDB에 대한 향상된 지원이 포함되어 있습니다. 이전 라라벨 릴리스에서는 라라벨의 MySQL 드라이버를 통해 MariaDB를 사용할 수 있었습니다. 그러나 라라벨 11에는 이제 이 데이터베이스 시스템에 더 나은 기본값을 제공하는 전용 MariaDB 드라이버가 포함되어 있습니다.

라라벨의 데이터베이스 드라이버에 대한 자세한 내용은 데이터베이스 문서를 확인하십시오.

데이터베이스 검사 및 스키마 작업 개선

스키마 작업 개선 및 데이터베이스 검사는 Hafez Divandari 님이 기여했습니다.

라라벨 11은 열의 기본 수정, 이름 바꾸기 및 삭제를 포함하여 추가 데이터베이스 스키마 작업 및 검사 메서드를 제공합니다. 또한 고급 공간 유형, 기본값이 아닌 스키마 이름 및 테이블, 뷰, 열, 인덱스 및 외래 키를 조작하기 위한 기본 스키마 메서드가 제공됩니다.

use Illuminate\Support\Facades\Schema;
 
$tables = Schema::getTables();
$views = Schema::getViews();
$columns = Schema::getColumns('users');
$indexes = Schema::getIndexes('users');
$foreignKeys = Schema::getForeignKeys('users');