- Published on
모던 PHP 2026 — PHP 8.4 / Laravel 12 / Symfony 7.3 / FrankenPHP / Octane / Livewire / Filament 심층 가이드
- Authors

- Name
- Youngju Kim
- @fjvbn20031
1장 · 2026년의 PHP — “죽었다”고 한 사람들에게 (다시)
매년 “PHP는 죽었다”는 글이 트렌딩에 오른다. 그리고 매년 그 글을 받친 서버는 PHP로 돌아간다. Wikipedia, Slack의 일부, Facebook의 PHP 변종 Hack, 워드프레스가 만든 웹의 약 43%, Shopify의 일부 결제 흐름, 그리고 한국과 일본의 수많은 커머스 백오피스가 그렇다.
2026년의 PHP는 사용자 수만으로 살아남은 언어가 아니다. 언어 자체가 다시 매력적이다.
- PHP 8.4 (2024.11) — Property Hooks(getter/setter 1급), 비대칭 가시성, Lazy Objects,
new MyClass()->method()체이닝 가능 - Laravel 12 (2025.2) — Reverb 웹소켓 서버, Folio 파일 라우팅, Volt SFC, Pennant 피처 플래그
- Symfony 7.3 — Doctrine 3, Mercure 푸시, AssetMapper, 새 Scheduler
- FrankenPHP — Caddy 기반 단일 바이너리, 워커 모드 + Early Hints + 동시성
- Octane — Laravel을 long-running 프로세스로 (Swoole / RoadRunner / FrankenPHP 어댑터)
- Livewire 3 / Inertia.js — “Vue/React 안 쓰고도 리액티브”
- Filament 3 / 4 — Laravel 어드민의 사실상 표준
- Pest 3 / PHPUnit 11 / PHPStan 2 / Rector — 테스트와 정적 분석, 자동 마이그레이션
이 글의 입장은 명확하다. 2026년에 PHP를 고르는 것은 “과거를 답습”하는 선택이 아니라, 풀스택 생산성을 가장 짧은 경로로 얻는 합리적 선택이다. 한국과 일본의 레거시와 신규 프로젝트 양쪽에서 그렇다.
이 글에 등장하는 모든 코드는 PHP 8.4 + Laravel 12 / Symfony 7.3 기준으로 작성했다. 8.3 호환이 필요한 부분은 별도로 표시한다.
2장 · PHP 8.4 (2024.11) — Property Hooks, 비대칭 가시성, Lazy Objects
PHP 8.4는 2024년 11월 21일 GA되었다. “언어가 끝났다”는 평을 가장 빠르게 뒤집은 버전이다.
2.1 Property Hooks — getter/setter가 1급 시민으로
자바, C#, Kotlin이 수십 년 전부터 가졌던 기능이 마침내 PHP에 도착했다.
class User
{
public string $firstName;
public string $lastName;
// 가상 프로퍼티 — 호출 시점에 계산
public string $fullName {
get => "{$this->firstName} {$this->lastName}";
set(string $value) {
[$this->firstName, $this->lastName] = explode(' ', $value, 2);
}
}
}
$u = new User();
$u->fullName = 'Ada Lovelace';
echo $u->fullName; // "Ada Lovelace"
echo $u->firstName; // "Ada"
기존에는 __get / __set 매직 메서드로 우회했는데, IDE 자동완성도 안 되고 정적 분석도 어려웠다. 이제는 진짜 프로퍼티처럼 보이고, 진짜 프로퍼티처럼 PHPStan/Psalm이 추론한다.
2.2 비대칭 가시성 (Asymmetric Visibility)
“읽기는 public, 쓰기는 private”를 한 줄로 표현할 수 있다.
class Account
{
// public 읽기 + private 쓰기
public private(set) int $balance = 0;
public function deposit(int $amount): void {
$this->balance += $amount;
}
}
$a = new Account();
$a->deposit(100);
echo $a->balance; // 100 OK
$a->balance = 9999; // Error: 외부에서 set 불가
Java의 “final 필드 + getter” 보일러플레이트가 통째로 사라진다.
2.3 Lazy Objects (지연 객체)
ORM과 DI 컨테이너가 가장 갈증을 느낀 기능이다. 객체를 “껍데기”로 만들어 두고, 실제 사용 시점에 초기화한다.
$reflector = new ReflectionClass(HeavyService::class);
$lazy = $reflector->newLazyGhost(function (HeavyService $instance): void {
$instance->__construct(/* expensive deps */);
});
// $lazy는 아직 초기화되지 않은 상태
$lazy->doSomething(); // 이 순간 초기화 콜백이 실행
Doctrine, Symfony DI, Laravel 컨테이너는 모두 8.4의 Lazy Objects 위에서 자체 프록시 코드를 줄이는 중이다.
2.4 new MyClass()->method() — 괄호 한 쌍이 사라진다
// PHP 8.3까지
$dt = (new DateTime('now'))->format('Y-m-d');
// PHP 8.4
$dt = new DateTime('now')->format('Y-m-d');
작은 변화지만 코드가 눈에 띄게 깔끔해진다.
2.5 새 배열 함수와 HTML5 파서
array_find($users, fn($u) => $u->isAdmin());
array_find_key($users, fn($u) => $u->name === 'Ada');
array_any($users, fn($u) => $u->isActive());
array_all($users, fn($u) => $u->isVerified());
$dom = Dom\HTMLDocument::createFromString('<p>Hello</p>');
PHP 8.4는 “언어 자체에 또 한 번 큰 한 걸음”을 더했다. 8.0(JIT/Union types)·8.1(enum/readonly)·8.2(readonly class)·8.3(typed const)을 잇는 가장 큰 업데이트다.
3장 · Laravel 12 (2025.2) — Reverb / Folio / Volt / Pennant
Laravel 12는 2025년 2월 24일 릴리스되었다. “프레임워크에 더 무엇을 더할 수 있을까”에 답한 버전이다.
3.1 Reverb — Laravel의 1급 WebSocket 서버
Pusher와 Soketi를 거쳐, Laravel은 마침내 자체 웹소켓 서버 Reverb를 가졌다. ReactPHP 기반으로, FrankenPHP·Octane과 결합하면 단일 서버에서 수만 동시 연결을 처리한다.
composer require laravel/reverb
php artisan reverb:install
php artisan reverb:start
// app/Events/MessageSent.php
class MessageSent implements ShouldBroadcast
{
public function __construct(public Message $message) {}
public function broadcastOn(): array {
return [new PrivateChannel("chat.{$this->message->room_id}")];
}
}
프론트에서는 Laravel Echo로 한 줄.
Echo.private(`chat.${roomId}`).listen('MessageSent', (e) => {
appendMessage(e.message);
});
3.2 Folio — 파일 시스템 기반 라우팅
Next.js / Nuxt의 파일 라우팅이 Laravel에 들어왔다. resources/views/pages/ 하위 파일이 곧 라우트다.
resources/views/pages/
├── index.blade.php → /
├── dashboard.blade.php → /dashboard
└── users/
├── index.blade.php → /users
└── [id].blade.php → /users/{id}
// resources/views/pages/users/[id].blade.php
<?php
use function Laravel\Folio\name;
use App\Models\User;
name('users.show');
$user = User::findOrFail($id);
?>
<h1>{{ $user->name }}</h1>
web.php를 안 만져도 라우트가 늘어난다. 작은 사이드 프로젝트와 어드민에 특히 잘 맞는다.
3.3 Volt — Livewire 3 단일 파일 컴포넌트
Vue SFC를 닮은 Livewire 컴포넌트. PHP 로직과 Blade 템플릿이 한 파일에 산다.
<?php
use function Livewire\Volt\{state, computed};
state(['count' => 0]);
$increment = fn () => $this->count++;
?>
<div>
<button wire:click="increment">+</button>
<span>{{ $count }}</span>
</div>
Folio + Volt 조합은 “Laravel에서 가장 빠르게 화면 한 장을 만드는 방법”의 새 답이다.
3.4 Pennant — 1급 피처 플래그
use Laravel\Pennant\Feature;
Feature::define('new-checkout', fn (User $user) => $user->isInternal());
if (Feature::active('new-checkout')) {
return view('checkout.v2');
}
LaunchDarkly 같은 SaaS 없이 DB 기반 피처 플래그를 1주일 만에 도입할 수 있다.
3.5 그 외 — 새 스타터 킷, Workflows, Vite 6
Laravel 12는 React/Vue/Livewire 별 공식 스타터 킷을 제공하고, Workflows(공식 워크플로 엔진), Vite 6, Tailwind 4를 기본으로 끼워 준다. laravel new 한 번이면 인증·관리자·요금제까지 도달하는 시대다.
4장 · Symfony 7.3 — Doctrine 3 + Mercure + AssetMapper
Symfony는 “Laravel처럼 보이지 않으려는” 또 다른 정답이다. 더 명시적이고, 더 컴포넌트 지향이며, “엔터프라이즈 PHP의 사실상 표준”이다.
4.1 7.x 라인업
- 7.0 (2023.11) — PHP 8.2+ 요구
- 7.1 (2024.5) — 새 Asset Mapper 통합
- 7.2 (2024.11) — JSON Streamer, Profiler 개선
- 7.3 (2025.5) — Doctrine 3 안정 지원, Mercure 1급 어댑터
4.2 Doctrine ORM 3 + DBAL 4
#[ORM\Entity]
class Product
{
#[ORM\Id, ORM\Column, ORM\GeneratedValue]
public int $id;
#[ORM\Column(length: 200)]
public string $name;
#[ORM\Column(type: 'decimal', precision: 10, scale: 2)]
public string $price;
}
Doctrine 3는 enum, readonly, 비대칭 가시성을 1급으로 지원한다. PHP 8.4의 Property Hooks와도 매끄럽게 맞물린다.
4.3 Mercure — 서버 → 브라우저 푸시
WebSocket이 무거울 때 Server-Sent Events 기반 Mercure 허브를 쓴다. Symfony 7은 1급 통합이다.
public function publish(HubInterface $hub): Response {
$hub->publish(new Update(
'/orders/42',
json_encode(['status' => 'shipped']),
));
return new Response();
}
4.4 AssetMapper — “Node 없는 프론트”
php bin/console importmap:require bootstrap
Webpack/Vite를 안 깔고도 importmap + 브라우저 ES 모듈로 SPA-급 프론트를 만들 수 있다. 어드민과 사내 도구에 특히 맞는다.
4.5 Scheduler & Messenger
#[AsSchedule('default')]
class MainSchedule implements ScheduleProviderInterface
{
public function getSchedule(): Schedule {
return (new Schedule())->add(
RecurringMessage::cron('0 3 * * *', new DailyReport()),
);
}
}
크론 + 큐 + 워크플로가 한 컴포넌트로 묶였다. Laravel의 schedule:run + Horizon에 대응한다.
5장 · FrankenPHP — Caddy 기반 단일 바이너리 PHP 런타임
FrankenPHP는 2022년 Kévin Dunglas(API Platform / Mercure 저자)가 시작한 프로젝트로, Caddy 웹 서버 위에 PHP 인터프리터를 내장한 Go 바이너리다. 2024년 1.0 GA, 2026년 현재 Laravel·Symfony 양쪽 공식 지원.
5.1 왜 충격적인가
전통적 PHP 스택:
nginx → php-fpm → PHP
3개 프로세스, 3개 설정 파일
FrankenPHP:
frankenphp 단일 바이너리 → PHP
HTTPS, HTTP/3, 메트릭, 정적 파일, PHP 실행 모두 한 프로세스
5.2 워커 모드 — long-running PHP
FrankenPHP의 핵심은 워커 모드다. 요청마다 PHP를 부팅하지 않고, 부트스트랩한 워커가 요청 루프를 돌린다.
// public/worker.php
require __DIR__ . '/../vendor/autoload.php';
$kernel = (require __DIR__ . '/../bootstrap/app.php')
->handleRequest(Request::capture());
$handler = static function () use ($kernel) {
// 요청별 핸들러 — Octane이 내부적으로 호출
return $kernel->handle(Request::capture());
};
\frankenphp_handle_request($handler);
# Caddyfile
{
frankenphp {
worker ./public/worker.php
}
}
example.com {
root * public/
php_server
}
요청당 부트 비용이 사라지면서 Laravel 평균 응답 시간이 50–80% 줄어드는 사례가 흔하다.
5.3 Early Hints (103) — 진짜로 빨라지는 트릭
// 본문 처리 전에 103 Early Hints로 CSS/JS 프리로드 지시
return response()
->withHeaders(['Link' => '</css/app.css>; rel=preload; as=style'])
->earlyHints();
브라우저는 본문이 오기 전부터 CSS를 받는다. LCP가 200–400ms 빨라지는 게 보통이다.
5.4 임베드 모드 — 단일 바이너리 배포
frankenphp build 한 번이면 PHP 인터프리터 + 앱 코드 + Caddy가 한 바이너리에 들어간다. scp 한 번으로 배포 끝. Docker도 굳이 안 써도 된다.
frankenphp build --output ./myapp
scp ./myapp user@server:/srv/myapp
ssh user@server './myapp run'
6장 · Laravel Octane — Swoole / RoadRunner / FrankenPHP
Octane은 “Laravel을 long-running 프로세스로 띄우는 공식 어댑터”다. PHP 워커 풀이 부팅 한 번으로 메모리에 머무르고, 요청마다 컨테이너를 재사용한다.
6.1 세 가지 백엔드
| 백엔드 | 기반 | 강점 | 주의점 |
|---|---|---|---|
| Swoole | C 확장 | 코루틴, 최고 성능 | 메모리 누수 디버깅 까다로움 |
| RoadRunner | Go | 안정성, 명시적 워커 모델 | 코루틴 없음 |
| FrankenPHP | Caddy/Go | 단일 바이너리, Early Hints | 가장 새것 |
composer require laravel/octane
php artisan octane:install --server=frankenphp
php artisan octane:start --workers=8
6.2 Octane이 바꾸는 두 가지
- 부트 시간 — Laravel 평균 부트가 80ms라면, 워커 1번 부트 후 0ms.
- 싱글톤 라이프타임 — 컨테이너에 등록한 싱글톤이 요청 사이 살아 있다. 이 점이 함정이다. 요청 상태가 싱글톤에 끼면 다음 요청으로 새서 보안 사고가 난다.
// 위험 — 사용자 요청 객체를 싱글톤에 박지 마라
$this->app->singleton('user', fn () => Auth::user()); // BAD
// 안전 — 매 요청 새로 만들기
$this->app->scoped('user', fn () => Auth::user()); // GOOD
Octane은 php artisan octane:reload로 워커를 무중단 재시작한다. 코드 배포 후 한 줄이면 된다.
7장 · RoadRunner + Spiral — Go 기반 런너와 그 위의 프레임워크
RoadRunner는 Spiral Scout가 만든 Go 기반 PHP 애플리케이션 서버다. 2018년에 시작했고, 2026년에는 v2025 라인이 안정 운영된다.
7.1 RoadRunner의 차별점
- 워커 풀은 Go가 관리, 요청은 gRPC로 PHP 워커에 분배
- HTTP, gRPC, 큐(Beanstalk/SQS/AMQP/NATS), 잡 스케줄러, KV가 한 프로세스
- 메트릭은 OpenTelemetry로 1급 export
# .rr.yaml
version: '3'
server:
command: 'php worker.php'
http:
address: '0.0.0.0:8080'
pool:
num_workers: 8
jobs:
pipelines:
high:
driver: memory
config:
priority: 1
7.2 Spiral — PHP의 “Go 스타일” 프레임워크
Spiral은 RoadRunner를 만든 팀의 자체 프레임워크다. Laravel/Symfony와 달리 처음부터 long-running PHP를 전제로 설계되었다.
- DI는 PSR-11
- ORM은 Cycle ORM(DataMapper, Doctrine 대안)
- 라우팅은 어트리뷰트
- 큐, gRPC 서비스, 워크플로(Temporal과 1급 통합)가 빌트인
#[Route(route: '/users/<id:int>', methods: 'GET')]
public function show(int $id, ORM $orm): array {
return $orm->getRepository(User::class)->findByPK($id)->toArray();
}
“Laravel은 너무 매직, Symfony는 너무 무거움”이라는 사람들에게 매력적이다.
7.3 Hyperf — 중국발 코루틴 프레임워크
Hyperf는 Swoole 코루틴 기반의 비동기 프레임워크다. 중국 본토에서 Laravel을 능가하는 인지도를 가졌고, 일본·한국 일부 게임 서버 백엔드에서도 채택되었다.
#[AutoController]
class UserController {
#[GetMapping(path: '/users/{id}')]
public function show(int $id): array {
return User::find($id)->toArray();
}
}
코루틴 기반이라 Node.js처럼 Promise.all 패턴이 자연스럽다.
8장 · Livewire 3 + Inertia.js — Laravel 리액티브 / SPA
“React/Vue 안 쓰고도 SPA 같은 UX”를 만드는 두 갈래의 답.
8.1 Livewire 3 — 서버 컴포넌트의 PHP 버전
Livewire 3은 2023년에 큰 폭으로 다시 쓰였다. Alpine.js와 깊게 통합되었고, 동작이 React Server Components와 비슷하다.
// app/Livewire/Counter.php
class Counter extends Component
{
public int $count = 0;
public function increment(): void {
$this->count++;
}
public function render(): View {
return view('livewire.counter');
}
}
{{-- resources/views/livewire/counter.blade.php --}}
<div>
<button wire:click="increment">+</button>
<span>{{ $count }}</span>
</div>
서버가 매 인터랙션마다 HTML 조각을 그려 보낸다. 네트워크는 살짝 더 쓰지만 JS 코드량이 거의 0이다. 어드민·내부 도구에 최강이다.
8.2 Inertia.js — Laravel/Rails 위의 SPA
Inertia는 “SPA를 위한 풀스택 어댑터”다. 백엔드(Laravel/Rails/Django) 컨트롤러가 Vue/React/Svelte 컴포넌트 + props를 반환한다.
// 컨트롤러
public function index() {
return Inertia::render('Users/Index', [
'users' => User::paginate(20),
]);
}
<!-- resources/js/Pages/Users/Index.vue -->
<script setup>
defineProps({ users: Object });
</script>
<template>
<ul>
<li v-for="u in users.data" :key="u.id">{{ u.name }}</li>
</ul>
</template>
REST API를 만들 필요가 없다. 라우터, 인증, 권한이 백엔드 그대로다.
8.3 어떻게 고를까
| 상황 | 추천 |
|---|---|
| 어드민, 내부 도구, 소규모 SaaS | Livewire 3 (또는 Filament) |
| 진짜 SPA, 풀 인터랙티브 UI | Inertia.js + Vue/React |
| 정적 사이트 + 작은 인터랙션 | Alpine.js만 |
9장 · Filament — Laravel 어드민의 사실상 표준
Filament는 Dan Harrin이 만든 “Laravel 어드민 패널 생성기”다. 2022년 v2 이후 폭발적으로 성장했고, 2024년 v3, 2025년 v4로 이어졌다. 2026년의 Laravel 어드민은 사실상 Filament다.
9.1 무엇을 주는가
- 리소스(CRUD) 생성기 —
php artisan make:filament-resource User - 테이블, 폼, 위젯, 알림이 컴포넌트
- 멀티 테넌시(서브도메인, 패스 프리픽스)
- Role/Permission (Spatie 패키지와 통합)
- 위에 Livewire 3로 동작
class UserResource extends Resource
{
protected static ?string $model = User::class;
public static function form(Form $form): Form {
return $form->schema([
TextInput::make('name')->required(),
TextInput::make('email')->email()->required(),
Select::make('role')->options([
'admin' => 'Admin',
'user' => 'User',
]),
]);
}
public static function table(Table $table): Table {
return $table
->columns([
TextColumn::make('name')->searchable(),
TextColumn::make('email')->copyable(),
TextColumn::make('created_at')->dateTime(),
])
->filters([
SelectFilter::make('role'),
])
->actions([
EditAction::make(),
DeleteAction::make(),
]);
}
}
20줄 안 되는 코드로 “검색 + 필터 + 페이지네이션 + 액션”까지 갖춘 어드민이 나온다. Django Admin과 자주 비교되는데, Filament 쪽이 디자인과 커스터마이즈 자유도가 더 높다.
9.2 어드민이 아니라 “앱 빌더”로
Filament는 더 이상 어드민 전용이 아니다. Panels라는 개념으로 고객용 대시보드, 파트너 포털, 내부 운영 도구까지 한 코드베이스에서 만들 수 있다.
| Panel | 대상 | URL |
|---|---|---|
admin | 사내 관리자 | /admin |
partner | B2B 파트너 | /partner |
customer | 고객 대시보드 | /app |
10장 · Statamic — 플랫 파일 CMS
Statamic은 “워드프레스에 신물난 Laravel 사람들”의 답이다. 콘텐츠를 DB가 아니라 Markdown + YAML 파일로 저장한다.
10.1 무엇이 좋은가
- 파일이 곧 콘텐츠 → Git에 올라간다 → 코드 리뷰가 콘텐츠 리뷰
- Laravel 기반 → 패키지, 큐, 인증 다 가져다 쓴다
- 빌트인 CP(Control Panel)가 깔끔
- Antlers 템플릿 엔진 + Blade 양쪽 지원
- Headless로 GraphQL/REST export 가능
# content/collections/articles/2026-05-16.hello.md
---
id: a1b2c3
title: 'Hello, Statamic'
author: youngju
---
# 본문 Markdown
Hello, world.
10.2 어울리는 곳
- 마케팅 사이트, 블로그, 도큐먼테이션 사이트
- 콘텐츠 변경 빈도가 낮고, 디자인 자유도가 높은 곳
- Git 기반 워크플로(PR로 글 검수)를 쓰고 싶은 팀
WordPress와의 차이는 명확하다. Statamic은 개발자 친화 + 코드 우선, WordPress는 에디터 친화 + UI 우선이다.
11장 · 도구 체인 — Pest / PHPUnit 11 / PHPStan 2 / Psalm / Rector
11.1 Pest 3 — 표현력 좋은 테스트 러너
Pest는 PHPUnit 위에 “Jest 같은 DSL”을 얹는다. 2024년 3.0, 2025년 4.x.
// tests/Feature/UserTest.php
use App\Models\User;
it('creates a user', function () {
$user = User::factory()->create(['name' => 'Ada']);
expect($user->name)->toBe('Ada');
});
test('admin can list users')
->actingAs(User::factory()->admin()->create())
->get('/admin/users')
->assertOk();
브라우저 테스트도 1급으로 들어갔다(pest --browser). Pest 4부터는 Playwright 위에서 동작한다.
11.2 PHPUnit 11
여전히 “업계 표준”. Pest도 내부적으로는 PHPUnit 위에서 돈다.
final class UserTest extends TestCase
{
public function testItCreatesUser(): void {
$user = User::factory()->create();
$this->assertNotNull($user->id);
}
}
11.x는 #[Test], #[DataProvider] 등 어트리뷰트 방식이 표준이 되었다.
11.3 PHPStan 2 vs Psalm
| 항목 | PHPStan 2 | Psalm |
|---|---|---|
| 만든 곳 | Ondřej Mirtes | Vimeo (지금은 커뮤니티) |
| 강점 | 빠른 분석, 큰 생태계 | 더 엄격한 추론, 보안 분석 |
| Laravel 친화 | 매우 (Larastan) | 보통 |
| 2026년 모멘텀 | 강함 | 다소 약화 |
대부분의 신규 Laravel/Symfony 프로젝트는 PHPStan 2 + Larastan으로 시작한다.
composer require --dev phpstan/phpstan larastan/larastan
vendor/bin/phpstan analyse --level=8 app/
레벨 8(최대)에서 깨끗하면 “타입 안전한 PHP”라고 부를 수 있다.
11.4 Rector — 자동 리팩터링
Rector는 “AST 기반 자동 마이그레이션 도구”다. PHP 7 → 8, Laravel 10 → 11 → 12, Symfony 6 → 7 같은 메이저 업그레이드를 한 번에 해 준다.
// rector.php
use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\LevelSetList;
return RectorConfig::configure()
->withPaths([__DIR__ . '/app'])
->withPhpSets(php84: true)
->withSets([LevelSetList::UP_TO_PHP_84]);
vendor/bin/rector process
“리팩터링이 두려워서 못 올리는 PHP 5/7 레거시”의 가장 큰 처방이다.
12장 · 호스팅 진영 — Forge / Vapor / Cloud
Laravel 진영은 “언어 → 프레임워크 → 도구 체인 → 호스팅”까지 수직 통합을 마쳤다.
12.1 Forge — VPS 프로비저닝 SaaS
- 2014년 출시, 가장 오래된 Laravel 호스팅 도구
- DigitalOcean / AWS / Linode / Vultr / Hetzner의 VPS를 자동 설정
- nginx + PHP-FPM + Redis + Supervisor + Let’s Encrypt가 자동 구성
- 2025년부터 FrankenPHP 1급 지원
12.2 Vapor — 서버리스 (AWS Lambda)
- Laravel을 AWS Lambda 위에 올린다 (PHP는 Bref 위에서 동작)
- 콜드 스타트는 평균 300–500ms
- 큐는 SQS, DB는 RDS Aurora, 큐는 Redis (ElastiCache)
- “트래픽 스파이크가 심한 서비스”에 잘 맞는다
12.3 Cloud — Laravel 11/12 시대의 매니지드 호스팅
Laravel Cloud는 2024년 발표, 2025년 GA된 “Vercel 스타일” 매니지드 호스팅이다.
- Git push → 자동 빌드 + 배포 + 도메인 + SSL
- FrankenPHP 워커 모드를 기본 런타임으로 채택
- Postgres / Redis / 큐 / 잡 스케줄러가 한 대시보드
- 리전: 미국 / EU / 아시아(싱가포르) / 그 외 추가 중
Vercel이 Next.js를 호스팅하는 방식 그대로, Laravel을 1급으로 호스팅한다.
| 상황 | 추천 |
|---|---|
| 트래픽이 비교적 일정, 비용 절감 우선 | Forge + VPS |
| 트래픽 스파이크, AWS 생태계와 깊이 통합 | Vapor |
| “신경 안 쓰고 그냥 띄우고 싶다” | Cloud |
13장 · 한국 / 일본 — 우아한형제들, 카카오, pixiv, Cookpad, 메르카리
“진짜 회사들은 PHP를 어디에 쓰는가”를 한·일 사례로 보자.
13.1 한국
- 우아한형제들(배민) — 초창기 백오피스가 PHP였고, 일부 어드민/내부 도구는 여전히 PHP. 신규는 Java/Kotlin이지만 사내 어드민 빌더로 Filament를 검토했다는 발표가 인프콘 2025에 있었다.
- 카카오 — 일부 광고/마케팅 LP, 사내 도구. 카카오 게임즈의 일부 백오피스도 PHP.
- GS샵, 이마트몰, 11번가 등 한국형 커머스 백오피스의 상당수가 여전히 PHP/CodeIgniter/CakePHP 위에서 동작 중.
- 신규 스타트업의 PHP 채택은 줄었지만, 에이전시 / 마케팅 / CMS 시장에서는 압도적이다.
13.2 일본
- ピクシブ(pixiv) — 일러스트 SNS, 창업 초기부터 PHP. 사내 도구와 본체 일부에 여전히 PHP가 살아 있다. 2024년 PHP 8.3, 2025년 PHP 8.4 마이그레이션 사례가 PHPerKaigi에 발표되었다.
- Cookpad — 오랫동안 Ruby on Rails로 알려졌지만, 인수한 자회사·실험 프로덕트에는 PHP가 살아 있다.
- メルカリ(Mercari) — 초창기 모놀리식은 PHP(Symfony). 마이크로서비스 전환 이후 Go 중심이지만, 일부 백오피스와 보조 시스템은 여전히 PHP.
- クックパッド株式会社, サイバーエージェント, GMOペパボ, ピクスタ — 다양한 PHP 사례가 PHPerKaigi / PHP Conference Japan에서 매년 발표된다.
- 일본은 한국보다 PHP 커뮤니티가 단단하고 컨퍼런스가 활발하다. PHPerKaigi와 PHP Conference Japan은 매년 수백 명이 모인다.
13.3 공통 패턴
- “신규는 Go / Kotlin / TypeScript, 어드민·CMS·마케팅·레거시는 PHP”
- 진짜 죽는 것은 PHP가 아니라 **레거시 프레임워크(CodeIgniter 3, CakePHP 2, Symfony 2/3)**다
- 8.4 + Laravel 12 + FrankenPHP는 이 레거시를 모더나이즈하는 가장 짧은 경로
14장 · 누가 PHP를 골라야 하나 — 2026년의 결정 가이드
“언어 자체”가 아니라 “상황”이 답을 결정한다.
14.1 PHP를 고르는 게 정답인 경우
- 풀스택 한 명 ~ 소규모 팀으로 SaaS를 빠르게 띄워야 할 때 → Laravel 12 + Filament + Forge
- 사내 어드민, 운영 도구, 백오피스 → Filament 단독
- 마케팅 사이트 + 블로그 → Statamic
- 레거시 PHP를 모더나이즈 → PHP 8.4 + Rector + Pest + Octane
- JS를 최소화하고 싶은 UI → Livewire 3 (또는 Inertia)
- 워드프레스 대안이 필요 → Statamic 또는 헤드리스 + Laravel API
14.2 PHP를 고르지 말아야 할 경우
- 초저지연 (1ms 미만), 수십만 동시 연결의 실시간 시스템 → Go / Rust / Elixir
- 데이터 사이언스, ML 학습 → Python
- 모바일 native, 게임 클라이언트 → Swift / Kotlin / C++ / C#
- AWS Lambda 콜드 스타트가 결정적인 곳 → Node.js / Rust
14.3 “모던 PHP” 스택 추천 — 2026년 풀스택 SaaS
PHP 8.4
Laravel 12
FrankenPHP (워커 모드) + Octane
Livewire 3 + Volt + Filament 4
Postgres 16 + Redis 7
Pest 3 + PHPStan 2 (level 8) + Rector
Laravel Cloud (또는 Forge + Hetzner)
이 스택이라면 “1인 개발자가 한 달 안에 결제까지 갖춘 SaaS를 띄울 수 있다”는 문장이 과장이 아니다.
14.4 마지막 한마디
2026년의 PHP는, 2016년의 PHP가 받았던 농담을 더 이상 듣지 않는다. 언어가 좋아졌고, 생태계가 단단해졌고, 호스팅이 매끄러워졌다. 한·일에서도 “레거시를 살리는 언어”인 동시에 “새 풀스택을 빠르게 띄우는 언어”로 자리 잡았다.
“PHP는 죽지 않는다”는 농담의 다음 줄은 이렇게 써야 한다. “PHP는 죽기는커녕, 다시 매력적이다.”
참고 / References
- PHP — PHP 8.4 Release Announcement
- PHP RFC — Property Hooks
- PHP RFC — Asymmetric Visibility v2
- PHP RFC — Lazy Objects
- Laravel — Laravel 12 Release Notes
- Laravel — Reverb (WebSockets)
- Laravel — Folio (Page-based routing)
- Laravel — Volt (Single-file Livewire)
- Laravel — Pennant (Feature flags)
- Symfony — Symfony 7.3 Release
- Symfony — AssetMapper Component
- Doctrine — Doctrine ORM 3
- Mercure — mercure.rocks
- FrankenPHP — frankenphp.dev
- FrankenPHP — Worker mode docs
- Caddy — caddyserver.com
- Laravel Octane — Octane docs
- RoadRunner — roadrunner.dev
- Spiral — spiral.dev
- Hyperf — hyperf.io
- Yii — yiiframework.com
- Phalcon — phalcon.io
- Livewire — livewire.laravel.com
- Inertia.js — inertiajs.com
- Filament — filamentphp.com
- Statamic — statamic.com
- Pest — pestphp.com
- PHPUnit — phpunit.de
- PHPStan — phpstan.org
- Larastan — GitHub larastan/larastan
- Psalm — psalm.dev
- Rector — getrector.com
- Laravel Sail — Sail docs
- Laravel Forge — forge.laravel.com
- Laravel Vapor — vapor.laravel.com
- Laravel Cloud — cloud.laravel.com
- AdminerEvo — adminerevo.org
- PHPerKaigi — phperkaigi.jp
- PHP Conference Japan — phpcon.php.gr.jp
- pixiv inside (PHP migration cases) — inside.pixiv.blog
- 우아한형제들 기술 블로그 — techblog.woowahan.com
- 카카오 테크 — tech.kakao.com
- Bref (PHP on AWS Lambda) — bref.sh
- 인프콘(INFCON) 2025 발표 자료 — infcon.kr