PHP 패키지 관리의 모든 것
현대적인 PHP 개발은 Composer와 PSR 표준 없이는 설명할 수 없습니다. 이 모듈에서는 외부 라이브러리를 안전하게 다운로드하고, include/require 지옥에서 벗어나 자동으로 클래스를 로드(Autoloading) 하는 생태계의 핵심 원리를 학습합니다.
👉 1. Composer: 현대 PHP의 심장
Composer와 Packagist 생태계
과거의 PHP는 외부 라이브러리를 사용하기 위해 파일을 직접 다운로드하고 복사해야 했습니다. 하지만 Composer 의 등장으로 현대 PHP는 완전히 달라졌습니다.
마치 Node.js의 npm이나 Python의 pip처럼, 필요한 라이브러리를 선언만 하면 자동으로 다운로드하고 의존성을 관리해줍니다. Packagist라는 방대한 패키지 저장소를 통해 수많은 오픈소스 도구를 손쉽게 내 프로젝트에 통합할 수 있습니다.
👉 2. PHP Standard Recommendation (PSR) 📊
PHP 생태계의 공통 표준
PHP Framework Interop Group(PHP-FIG)에서 제정한 PSR(PHP Standard Recommendation) 은 다양한 프레임워크 간의 상호운용성을 위한 표준입니다.
코딩 스타일(PSR-12), 로깅 인터페이스(PSR-3), HTTP 메시지(PSR-7) 등 공통의 규격을 따름으로써, Laravel, Symfony 등 어떤 환경에서도 호환되는 코드를 작성할 수 있게 해줍니다.
표준 번호
주제 (Topic)
설명 및 목적
PSR-4
오토로딩 (Autoloading)
파일 경로와 네임스페이스를 1:1로 매핑하여 클래스 파일을 자동으로 불러옵니다.
PSR-12
코딩 스타일 (Coding Style)
들여쓰기, 괄호 위치, 네이밍 규칙 등 통일된 PHP 코딩 컨벤션을 정의합니다.
PSR-3
로거 인터페이스 (Logger Interface)
모든 로깅 라이브러리가 공통으로 사용해야 하는 에러/경고 기록 규격을 제공합니다.
PSR-7
HTTP 메시지 (HTTP Message)
HTTP 요청(Request) 및 응답(Response)을 객체 지향적으로 처리하는 표준 인터페이스입니다.
👉 3. PSR-4 Autoloading
파일을 자동으로 불러오는 마법
기존에는 클래스 파일을 사용하기 위해 수많은 require_once를 작성해야 했습니다. PSR-4 는 네임스페이스와 폴더 구조를 매핑하여, 클래스를 사용할 때 해당 파일을 자동으로 로드하는 표준 프로토콜입니다.
Composer와 함께 사용되며, 코드를 훨씬 깔끔하게 만들고 파일 관리의 부담을 덜어줍니다. 이제 네임스페이스 규칙만 잘 지키면 파일 로드는 Composer가 알아서 처리합니다.
PSR-4 Autoloading 매핑 원리
코드상의 네임스페이스
App\Controllers\UserController
new App\Controllers\UserController();
Composer
물리적 파일 경로
src/Controllers/UserController.php
include_once(...) 자동 실행
⚠️ 주의: 오토로더 파일 포함 필수
모든 진입점 파일(주로 index.php)의 가장 첫 부분에는 반드시 require_once __DIR__ . '/vendor/autoload.php'; 코드가 선언되어야만 Composer의 Autoloading 기능이 작동합니다.
👉 4. 프로젝트 설정 및 설치 과정
실제 코드를 작성하기 전에, composer.json 파일을 통해 프로젝트 의존성을 설정하고 터미널에서 패키지를 설치하는 과정이 선행되어야 합니다.
{
"require": {
"monolog/monolog": "^3.0"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
$ composer install
Loading composer repositories with package information
Updating dependencies
Lock file operations: 2 installs, 0 updates, 0 removals
- Locking monolog/monolog (3.0.0)
- Locking psr/log (3.0.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
- Downloading monolog/monolog (3.0.0)
- Installing psr/log (3.0.0): Extracting archive
- Installing monolog/monolog (3.0.0): Extracting archive
Generating autoload files
👉 5. 작성 및 실행 결과
설치가 완료되면 PHP 코드를 작성하여 클래스가 자동으로 로딩되는 것을 확인합니다. 이제 클래스 생성 시 require를 일일이 적지 않아도 됩니다!
<?php
// composer가 자동으로 생성해준 오토로더를 단 한 번만 로드합니다.
// 이후에는 모든 클래스를 자동으로 찾아줍니다!
require_once __DIR__ . '/vendor/autoload.php';
use App\Controllers\UserController;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// 1. 외부 라이브러리(Monolog) 바로 사용하기
$log = new Logger('name');
$log->pushHandler(new StreamHandler('app.log', Logger::WARNING));
$log->warning('경고: 오토로딩이 너무 편리합니다!');
// 2. 내 프로젝트의 클래스 바로 사용하기 (include 없이!)
// Composer가 src/Controllers/UserController.php 파일을 알아서 로드해줍니다.
$user = new UserController();
$user->sayHello();
$ php index.php
[WARNING] app.log: 경고: 오토로딩이 너무 편리합니다!
App\Controllers\UserController: Hello! Modern PHP!