개발 지식

개발 지식

PHP Laravel 없이 PSR-15 미들웨어 구현하기

페이지 정보

profile_image
영삼이
0건 164회 25-03-28 23:12

본문

✅ Laravel 없이 PSR-15 미들웨어 구현하기

PSR-15는 HTTP 요청/응답 처리 흐름에서 **미들웨어(Middleware)**를 표준화한 인터페이스입니다. PHP에서 PSR-15를 직접 구현하면, Laravel이나 Symfony 없이도 체계적인 요청 흐름 제어가 가능합니다. 이 글에서는 PSR-15 미들웨어를 직접 구현하는 과정을 소개합니다.


🧩 PSR-15 핵심 인터페이스

[code=php]
namespace Psr\Http\Server;

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;

interface MiddlewareInterface {
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface;
}

interface RequestHandlerInterface {
    public function handle(ServerRequestInterface $request): ResponseInterface;
}
[/code]

📦 필요한 패키지 설치

composer require psr/http-message nyholm/psr7
  • psr/http-message: PSR-7 요청/응답 인터페이스

  • nyholm/psr7: 가볍고 빠른 PSR-7 구현체


🧱 기본 미들웨어 구현

[code=php]
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class AuthMiddleware implements MiddlewareInterface {
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface {
        if (!$request->hasHeader('Authorization')) {
            return new \Nyholm\Psr7\Response(401, [], 'Unauthorized');
        }

        return $handler->handle($request);
    }
}
[/code]

🔁 미들웨어 체인 구성

[code=php]
class MiddlewareStack implements RequestHandlerInterface {
    private array $middlewares;
    private $controller;

    public function __construct(array $middlewares, callable $controller) {
        $this->middlewares = $middlewares;
        $this->controller = $controller;
    }

    public function handle(ServerRequestInterface $request): ResponseInterface {
        if (empty($this->middlewares)) {
            return call_user_func($this->controller, $request);
        }

        $middleware = array_shift($this->middlewares);

        return $middleware->process($request, $this);
    }
}
[/code]

🚀 사용 예시

[code=php]
use Nyholm\Psr7\ServerRequest;

$middlewares = [
    new AuthMiddleware(),
    new LoggingMiddleware(),
];

$controller = function ($request) {
    return new \Nyholm\Psr7\Response(200, [], 'Hello, world');
};

$stack = new MiddlewareStack($middlewares, $controller);
$request = ServerRequest::fromGlobals();
$response = $stack->handle($request);

echo $response->getBody();
[/code]

✅ 장점

  • 미들웨어 체인을 구성해 요청 흐름 제어 가능

  • 요청 전후 가로채기 로직 작성에 최적화

  • 프레임워크 없이도 PSR 표준에 맞춘 구조화 가능


⚠️ 주의사항

  • PSR-7/15 구조는 불변성(Immutable)이 전제 → 객체 수정 대신 복사

  • 에러/예외 미들웨어도 반드시 넣어야 안정적인 구조 완성

  • 체인 실행 흐름을 눈으로 파악할 수 있도록 구성 중요


🧠 요약

  • PSR-15는 요청을 체인 형태로 가공하는 구조

  • 미들웨어를 직접 구현하면 프레임워크 없는 경량 서버도 확장성 확보

  • 실전 프로젝트에도 충분히 적용 가능


댓글목록

등록된 댓글이 없습니다.