데이터베이스를 다룰 때 순수 SQL 쿼리 문자열을 작성하는 방식(PDO)은 직관적이지만 코드가 길어지고 유지보수가 어렵습니다. PHP 진영(특히 Laravel)에서 가장 강력하고 사랑받는 Eloquent ORM 패키지를 Slim 프레임워크에 독립적으로 연동하여, DB 테이블을 우아한 객체 지향(Object-Oriented) 방식으로 제어하는 기술을 배웁니다.
1. ORM(Object-Relational Mapping)이란?
데이터베이스의 테이블을 프로그래밍 언어의 클래스(Class)에, 테이블의 레코드(Row)를 객체(Object) 인스턴스에 매핑하는 기술입니다. 복잡한 SQL 쿼리문을 몰라도 순수한 PHP 코드의 메서드 호출만으로 CRUD 작업을 수행할 수 있게 해줍니다.
2. 패키지 설치 및 Capsule 설정 (전역 부트스트랩)
illuminate/database 패키지를 설치한 뒤, index.php 최상단에서 DB 연결 정보 배열을 세팅합니다. Capsule Manager를 통해 정적(Static)으로 어디서든 접근할 수 있도록 setAsGlobal()을 호출하는 것이 핵심입니다.
bootstrap.php
<?php
use Illuminate\Database\Capsule\Manager as Capsule;
$capsule = new Capsule;
$capsule->addConnection([
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'minstudio_db',
'username' => 'root',
'password' => 'secret_pass',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
]);
// 어디서든 전역 정적(Static) 메서드로 ORM을 사용할 수 있게 설정
$capsule->setAsGlobal();
// Eloquent ORM 부팅
$capsule->bootEloquent();
?>
3. 모델(Model) 클래스 생성과 쿼리 빌더
IlluminateDatabaseEloquentModel을 상속받는 클래스만 만들어주면 끝납니다. Eloquent는 클래스명의 복수형(예: User -> users)을 자동으로 테이블 이름으로 매핑합니다.
index.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model {
// 💡 별도의 필드 선언 없이도 DB 컬럼이 동적으로 매핑됩니다!
// protected $table = 'my_custom_users';
// protected $fillable = ['name', 'email'];
}
// ----------------------------------------
// 라우트 내부 비즈니스 로직에서의 활용 예시
// ----------------------------------------
$app->get('/users', function ($request, $response) {
// ❌ 기존 PDO 방식 (하드코딩된 SQL 문자열)
// $stmt = $pdo->query("SELECT * FROM users WHERE active = 1 ORDER BY created_at DESC");
// $users = $stmt->fetchAll();
// ✅ Eloquent ORM 쿼리 빌더 방식 (직관적인 메서드 체이닝)
$users = \App\Models\User::where('active', 1)->orderBy('created_at', 'desc')->get();
// 객체 컬렉션을 JSON으로 자동 직렬화
$response->getBody()->write($users->toJson());
return $response->withHeader('Content-Type', 'application/json');
});
?>
Eloquent ORM -> Raw SQL Translation Log
[DB Query Builder] Executing translated SQL:
SELECT * FROM `users`
WHERE `active` = ?
ORDER BY `created_at` DESC
> PDO Bindings: [1]
Execution Time: 2.1ms
✅ SQL Injection 완벽 방어
Eloquent ORM의 모든 메서드(where, create 등)는 백그라운드에서 PDO Parameter Binding(Prepared Statements)을 사용하도록 설계되어 있습니다. 즉 User::where('email', $_POST['email']) 처럼 유저의 입력값을 바로 넣어도 악의적인 SQL 문법이 삽입(Injection)되는 것을 원천적으로 차단합니다.
ORM ➡️ SQL 변환 로그 확인
위의 코드 블록 하단 콘솔 목업에서 볼 수 있듯, 우리가 작성한 직관적인 체이닝 코드(where(...)->orderBy(...))가 백그라운드에서 실제 어떤 형태의 안전한 Raw SQL 구문으로 번역되는지를 확인할 수 있습니다. 인자값(1)은 ? 로 대체되어 PDO 바인딩 처리되므로 SQL 인젝션 공격으로부터 매우 안전합니다.