Skip to content

필사 모드: 모던 PHP 2026 — PHP 8.4 / Laravel 12 / Symfony 7.3 / FrankenPHP / Octane / Livewire / Filament 심층 가이드

한국어
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.
원문 렌더가 준비되기 전까지 텍스트 가이드로 표시합니다.

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);

?>

`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++;

?>

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이 바꾸는 두 가지

1. **부트 시간** — Laravel 평균 부트가 80ms라면, 워커 1번 부트 후 0ms.

2. **싱글톤 라이프타임** — 컨테이너에 등록한 싱글톤이 요청 사이 살아 있다. **이 점이 함정**이다. 요청 상태가 싱글톤에 끼면 다음 요청으로 새서 보안 사고가 난다.

// 위험 — 사용자 요청 객체를 싱글톤에 박지 마라

$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 --}}

서버가 매 인터랙션마다 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 -->

defineProps({ users: Object });

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](https://www.php.net/releases/8.4/en.php)

- PHP RFC — [Property Hooks](https://wiki.php.net/rfc/property-hooks)

- PHP RFC — [Asymmetric Visibility v2](https://wiki.php.net/rfc/asymmetric-visibility-v2)

- PHP RFC — [Lazy Objects](https://wiki.php.net/rfc/lazy-objects)

- Laravel — [Laravel 12 Release Notes](https://laravel.com/docs/12.x/releases)

- Laravel — [Reverb (WebSockets)](https://laravel.com/docs/12.x/reverb)

- Laravel — [Folio (Page-based routing)](https://laravel.com/docs/12.x/folio)

- Laravel — [Volt (Single-file Livewire)](https://livewire.laravel.com/docs/volt)

- Laravel — [Pennant (Feature flags)](https://laravel.com/docs/12.x/pennant)

- Symfony — [Symfony 7.3 Release](https://symfony.com/blog/category/releases)

- Symfony — [AssetMapper Component](https://symfony.com/doc/current/frontend/asset_mapper.html)

- Doctrine — [Doctrine ORM 3](https://www.doctrine-project.org/)

- Mercure — [mercure.rocks](https://mercure.rocks/)

- FrankenPHP — [frankenphp.dev](https://frankenphp.dev/)

- FrankenPHP — [Worker mode docs](https://frankenphp.dev/docs/worker/)

- Caddy — [caddyserver.com](https://caddyserver.com/)

- Laravel Octane — [Octane docs](https://laravel.com/docs/12.x/octane)

- RoadRunner — [roadrunner.dev](https://roadrunner.dev/)

- Spiral — [spiral.dev](https://spiral.dev/)

- Hyperf — [hyperf.io](https://hyperf.io/)

- Yii — [yiiframework.com](https://www.yiiframework.com/)

- Phalcon — [phalcon.io](https://phalcon.io/)

- Livewire — [livewire.laravel.com](https://livewire.laravel.com/)

- Inertia.js — [inertiajs.com](https://inertiajs.com/)

- Filament — [filamentphp.com](https://filamentphp.com/)

- Statamic — [statamic.com](https://statamic.com/)

- Pest — [pestphp.com](https://pestphp.com/)

- PHPUnit — [phpunit.de](https://phpunit.de/)

- PHPStan — [phpstan.org](https://phpstan.org/)

- Larastan — [GitHub larastan/larastan](https://github.com/larastan/larastan)

- Psalm — [psalm.dev](https://psalm.dev/)

- Rector — [getrector.com](https://getrector.com/)

- Laravel Sail — [Sail docs](https://laravel.com/docs/12.x/sail)

- Laravel Forge — [forge.laravel.com](https://forge.laravel.com/)

- Laravel Vapor — [vapor.laravel.com](https://vapor.laravel.com/)

- Laravel Cloud — [cloud.laravel.com](https://cloud.laravel.com/)

- AdminerEvo — [adminerevo.org](https://www.adminerevo.org/)

- PHPerKaigi — [phperkaigi.jp](https://phperkaigi.jp/)

- PHP Conference Japan — [phpcon.php.gr.jp](https://phpcon.php.gr.jp/)

- pixiv inside (PHP migration cases) — [inside.pixiv.blog](https://inside.pixiv.blog/)

- 우아한형제들 기술 블로그 — [techblog.woowahan.com](https://techblog.woowahan.com/)

- 카카오 테크 — [tech.kakao.com](https://tech.kakao.com/)

- Bref (PHP on AWS Lambda) — [bref.sh](https://bref.sh/)

- 인프콘(INFCON) 2025 발표 자료 — [infcon.kr](https://infcon.kr/)

현재 단락 (1/450)

매년 “PHP는 죽었다”는 글이 트렌딩에 오른다. 그리고 매년 그 글을 받친 서버는 PHP로 돌아간다. Wikipedia, Slack의 일부, Facebook의 PHP 변종 Hac...

작성 글자: 0원문 글자: 17,825작성 단락: 0/450