ServBay에서 Slim 프로젝트 생성 및 실행하기
이 문서는 강력한 로컬 웹 개발 환경인 ServBay를 이용해 PHP 기반 Slim Framework 프로젝트를 신속하게 생성, 설정, 실행하는 과정을 안내합니다. ServBay는 PHP, 웹 서버(Caddy/Nginx/Apache), 다양한 데이터베이스 패키지를 통합 제공하여 Slim 개발에 매우 이상적입니다.
Slim이란?
Slim은 간단하면서도 강력한 웹 애플리케이션 및 API를 빠르게 구축하도록 설계된 PHP 경량 마이크로 프레임워크입니다. 핵심 라우팅, 요청 및 응답 처리 기능을 제공하여, 빠른 개발과 배포가 필요한 프로젝트, 또는 더 복잡한 애플리케이션 개발의 기반으로 최적화되어 있습니다.
Slim의 주요 특징과 장점
- 경량성: Slim 프레임워크는 본체 코드가 매우 작고 자원 소모가 적으며, 구동 속도도 빠릅니다. 소규모~중간 규모 애플리케이션이나 마이크로서비스 구축에 적합합니다.
- 유연성: Slim은 플러그인 방식으로 설계되어, 템플릿 엔진, ORM, 인증 라이브러리 등 타 서드파티 라이브러리와 손쉽게 통합할 수 있습니다. 프로젝트 요구에 맞는 도구를 자유롭게 선택해 사용할 수 있습니다.
- 쉬운 사용법: 직관적 API와 명확한 문서를 통해 개발자들이 빠르게 Slim의 핵심 개념을 익히고 개발에 착수할 수 있습니다.
- 강력한 라우팅: 여러 HTTP 메서드(GET, POST, PUT, DELETE 등)를 지원하며, 그룹 라우팅, 미들웨어, 파라미터 캡처 등 복잡한 라우팅 설정도 지원합니다.
- 미들웨어 지원: 인증, 로깅, CORS 처리 등 요청이 비즈니스 로직에 도달하거나 응답 전 처리가 필요한 작업을 미들웨어 계층에서 손쉽게 수행할 수 있습니다.
Slim은 RESTful API, 빠른 프로토타입 제작, 특정 목적의 독립 기능 개발에 최적화된 선택입니다.
ServBay에서 Slim 프로젝트 생성 및 실행
이 가이드는 ServBay에 미리 세팅된 PHP 환경과 웹사이트 기능을 활용해 Slim 프로젝트를 웹서버에 손쉽게 연결하는 방법을 다룹니다.
사전 준비
시작 전, 아래 사항을 완료했는지 확인하세요.
- ServBay 설치 및 실행: macOS에 ServBay가 올바르게 설치되어 실행 중인지 확인합니다.
- ServBay의 Composer 내장: ServBay에는 Composer가 기본 내장되어 있어 별도의 설치가 필요 없습니다.
Slim 프로젝트 생성
ServBay는 모든 웹사이트 프로젝트를 /Applications/ServBay/www
디렉터리에 통합해 관리할 것을 권장합니다. 이렇게 하면 프로젝트 관리와 설정이 수월해집니다.
- ServBay 웹사이트 루트 디렉터리로 이동:bash
cd /Applications/ServBay/www
1 - 프로젝트 디렉터리 생성: 새로운 Slim 프로젝트용 디렉터리를 만듭니다.bash
mkdir servbay-slim-app
1 - 프로젝트 디렉터리로 진입:bash
cd servbay-slim-app
1 - Composer로 Slim 설치: 프로젝트 디렉터리에서 Composer로 Slim 프레임워크와 PSR-7 구현체를 설치합니다.bash위 명령어는 Slim 프레임워크와
composer require slim/slim "^4.0" slim/psr7 -W
1slim/psr7
라이브러리를vendor
디렉터리에 설치하고,composer.json
및composer.lock
파일을 생성합니다.
Slim 애플리케이션 초기화
- 엔트리 파일 생성: Slim 프로젝트는 보통 모든 요청을 처리하는 단일 엔트리 파일(예:
public/index.php
)을 사용합니다. 프로젝트 루트에public
디렉터리를 만들고, 그 안에index.php
파일을 생성합니다.bashmkdir public touch public/index.php
1
2 - 엔트리 파일 코드 작성:
public/index.php
파일을 열어서 Slim의 기본 앱 코드를 추가하세요.php이 코드는 가장 단순한 Slim 앱 설정 예시로, 루트 URL(<?php // Composer 자동로더 파일 불러오기 require __DIR__ . '/../vendor/autoload.php'; // 필요한 PSR-7 인터페이스 및 Slim 팩토리 클래스 임포트 use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; // Slim 앱 인스턴스 생성 $app = AppFactory::create(); // 기본 라우트 추가: '/' 경로로의 GET 요청 처리 $app->get('/', function (Request $request, Response $response, $args) { // 응답 바디에 내용 쓰기 $response->getBody()->write("Hello ServBay!"); // 응답 객체 반환 return $response; }); // Slim 앱 실행 $app->run();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22/
)의 GET 요청을 처리하고 "Hello ServBay!"라는 텍스트가 반환됩니다.
ServBay 웹사이트 설정
브라우저로 Slim 프로젝트에 접근하려면, ServBay에서 웹사이트(구 버전에서는 "호스트")를 등록해야 합니다.
- ServBay 앱 인터페이스를 엽니다.
- 웹사이트(Websites) 모듈로 이동합니다.
- 새 웹사이트 추가를 눌러주세요.
- 아래와 같이 정보 입력:
- 이름(Name):
My First Slim Dev Site
(원하는 이름으로 변경 가능) - 도메인(Domain):
servbay-slim-test.local
(로컬 개발에는.local
혹은.test
도메인 추천) - 웹사이트 타입(Website Type):
PHP
- PHP 버전(PHP Version): 필요에 맞는 버전 선택(예:
8.3
) - 문서 루트(Document Root):
public
디렉터리(/Applications/ServBay/www/servbay-slim-app/public
)를 선택하세요. Slim의 엔트리 파일index.php
가 여기에 위치해 있으며, 웹서버가 이 경로를 문서 루트로 지정해야합니다.
- 이름(Name):
- 저장하면 ServBay가 웹서버 설정을 자동 업데이트하고 즉시 반영합니다.
자세한 ServBay 웹사이트 추가 과정은 첫 웹사이트 추가하기 문서를 참고하세요.
Slim 웹사이트 접속
설정이 끝나면 웹 브라우저에서 https://servbay-slim-test.local
에 접속하세요.
정상적으로 설정되었다면 Hello ServBay!
메시지가 웹에 출력됩니다. 이는 Slim 프로젝트가 ServBay 웹서버에서 성공적으로 구동되고 있음을 의미합니다.
데이터베이스 통합 예시
Slim 자체는 데이터베이스 추상화 계층이 없으나, 다양한 PHP 데이터베이스 라이브러리를 손쉽게 통합할 수 있습니다. 여기선 Laravel의 Eloquent ORM(즉, illuminate/database
)을 MySQL, PostgreSQL에 연결하는 방법과 Memcached, Redis 등 캐시 시스템 통합 예시도 안내합니다.
사전 준비: 데이터베이스 생성 및 마이그레이션
데이터베이스 통합에 앞서 ServBay에서 해당 데이터베이스를 생성하고, 앱에서 사용할 테이블 구조를 구축해야 합니다.
- 데이터베이스 생성:
- ServBay 앱을 열고 사용하려는 데이터베이스 패키지(예: MySQL, PostgreSQL)로 이동합니다.
- phpMyAdmin(MySQL/MariaDB) 또는 pgAdmin(PostgreSQL) 같은 관리자 툴이나 커맨드라인을 이용해
servbay_slim_app
등 원하는 데이터베이스를 생성하세요. - ServBay의 기본 root 패스워드는 대개
password
이며, ServBay 인터페이스에서 확인 및 변경 가능합니다.
- Phinx(데이터베이스 마이그레이션 툴) 설치/설정: Phinx는 PHP 데이터베이스 마이그레이션 관리 도구로, 데이터베이스 구조 버전 관리를 돕습니다.
- 프로젝트 루트(
/Applications/ServBay/www/servbay-slim-app
)에서 Composer로 Phinx 설치:bashcomposer require robmorgan/phinx
1 - Phinx 설정 파일 초기화:bash프로젝트 루트에
vendor/bin/phinx init
1phinx.yml
파일이 생성됩니다. 이 파일을 열어 데이터베이스 연결 정보를 다음과 같이 설정하세요:yamlpaths: migrations: '%%PHINX_CONFIG_DIR%%/db/migrations' seeds: '%%PHINX_CONFIG_DIR%%/db/seeds' environments: default_migration_table: phinxlog default_environment: development # 사용 환경명 development: # 데이터베이스 타입에 맞게 설정 adapter: mysql # 또는 pgsql host: 127.0.0.1 name: servbay_slim_app # 생성한 DB명 user: root pass: password # 비밀번호 port: 3306 # MySQL 기본, PostgreSQL은 5432 charset: utf8mb4 # MySQL 권장 collation: utf8mb4_unicode_ci # MySQL 권장 version_order: creation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 프로젝트 루트(
- 마이그레이션 파일 생성: Phinx로 새 마이그레이션 파일을 만듭니다.bash그러면
vendor/bin/phinx create CreateUsersTable
1db/migrations
디렉터리 아래에 새 PHP 파일이 생성됩니다. 해당 파일의change()
메서드에서users
테이블 레이아웃을 정의하세요:php<?php declare(strict_types=1); use Phinx\Migration\AbstractMigration; final class CreateUsersTable extends AbstractMigration { /** * Change Method. * * Write your reversible migrations using this method. * * More information on writing migrations is available here: * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method * * Remember to call "create()" or "update()" and NOT "save()" when working * with the Table class. */ public function change(): void { $table = $this->table('users'); $table->addColumn('name', 'string') ->addColumn('email', 'string', ['unique' => true]) ->addTimestamps() // created_at, updated_at 컬럼 추가 ->create(); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 - 마이그레이션 실행: 프로젝트 루트에서 Phinx로 실제 마이그레이션을 실행해
users
테이블을 생성합니다.bash중요: 아래 데이터베이스 예시 코드를 실행하기 전, 반드시 데이터베이스 생성과 마이그레이션을 끝마치세요.vendor/bin/phinx migrate
1
illuminate/database 컴포넌트 사용
Laravel ORM 및 쿼리 빌더인 illuminate/database
를 사용합니다.
illuminate/database 설치: 프로젝트 루트(
/Applications/ServBay/www/servbay-slim-app
)에서 다음 명령어 실행.bashcomposer require illuminate/database
1public/index.php
에서 DB 연결 초기화:require __DIR__ . '/../vendor/autoload.php';
코드 다음, Slim 앱($app = AppFactory::create();)
선언 이전에 아래 코드를 추가합니다.php// ... 기타 require 및 use 문 ... use Illuminate\Database\Capsule\Manager as Capsule; // Capsule 매니저 불러오기 // Eloquent ORM 초기화 $capsule = new Capsule; // 데이터베이스 연결 설정(사용 DB에 맞게 driver 등 수정) $capsule->addConnection([ 'driver' => 'mysql', // 또는 'pgsql' 'host' => '127.0.0.1', 'database' => 'servbay_slim_app', // DB 이름 'username' => 'root', // DB 사용자 'password' => 'password', // 패스워드 'charset' => 'utf8mb4', // MySQL 권장 'collation' => 'utf8mb4_unicode_ci', // MySQL 권장 'prefix' => '', // PostgreSQL의 경우 schema 추가 // 'schema' => 'public', ]); // 글로벌로 등록 $capsule->setAsGlobal(); // Eloquent 활성화 $capsule->bootEloquent(); // ... Slim 앱 인스턴스 생성($app = AppFactory::create();) ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
MySQL 예시
MySQL 패키지가 ServBay에서 실행 중이며, servbay_slim_app
데이터베이스와 users
테이블도 Phinx로 생성한 상태라 가정합니다.
public/index.php
에서 $app->run();
이전에 다음 라우트를 추가하세요:
php
// ... 앞의 초기화 코드 및 '/' 라우트 ...
use Illuminate\Database\Capsule\Manager as Capsule; // 이미 임포트되어야 함
// 사용자 추가 라우트
$app->get('/mysql-add-user', function (Request $request, Response $response, $args) {
try {
Capsule::table('users')->insert([
'name' => 'ServBay Demo User',
'email' => 'servbay-demo-' . time() . '@servbay.test', // time()으로 이메일 중복 방지
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
$response->getBody()->write('User added to MySQL');
} catch (\Exception $e) {
$response->getBody()->write('Error adding user: ' . $e->getMessage());
$response = $response->withStatus(500); // 에러시 코드 반환
}
return $response;
});
// 사용자 데이터 조회 라우트
$app->get('/mysql-get-users', function (Request $request, Response $response, $args) {
try {
$users = Capsule::table('users')->get();
$response->getBody()->write($users->toJson()); // JSON 변환
$response = $response->withHeader('Content-Type', 'application/json'); // Content-Type 설정
} catch (\Exception $e) {
$response->getBody()->write('Error fetching users: ' . $e->getMessage());
$response = $response->withStatus(500);
}
return $response;
});
// ... $app->run();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
접속 방법:
https://servbay-slim-test.local/mysql-add-user
로 접근하면users
테이블에 새 사용자가 추가됩니다.https://servbay-slim-test.local/mysql-get-users
로 접근하면 모든 사용자를 JSON 형태로 반환받을 수 있습니다.
PostgreSQL 예시
PostgreSQL 패키지가 ServBay에서 실행 중이며, servbay_slim_app
데이터베이스와 users
테이블이 프잉크스로 생성된 상태이고, Phinx config의 adapter
와 port
가 pgsql
, 5432
로 세팅되어 있는 상황을 가정합니다.
public/index.php
의 DB 연결 설정에서 driver
를 pgsql
로 바꾸고 schema
값을 추가하세요:
php
$capsule->addConnection([
'driver' => 'pgsql', // pgsql로 변경
'host' => '127.0.0.1',
'database' => 'servbay_slim_app',
'username' => 'root',
'password' => 'password',
'charset' => 'utf8', // PostgreSQL에 흔히 사용
'prefix' => '',
'schema' => 'public', // PostgreSQL은 스키마 필요
]);
// ... 나머지 Eloquent 초기화 코드는 동일 ...
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
그리고 $app->run();
이전에 아래 라우트를 추가합니다:
php
// ... 앞의 초기화 코드 및 '/' 라우트 ...
// ... MySQL 라우트(필요 시) ...
use Illuminate\Database\Capsule\Manager as Capsule; // 이미 임포트되어야 함
// 사용자 추가 라우트
$app->get('/pgsql-add-user', function (Request $request, Response $response, $args) {
try {
Capsule::table('users')->insert([
'name' => 'ServBay PG Demo User',
'email' => 'servbay-pg-demo-' . time() . '@servbay.test', // time()으로 이메일 중복 방지
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
$response->getBody()->write('User added to PostgreSQL');
} catch (\Exception $e) {
$response->getBody()->write('Error adding user: ' . $e->getMessage());
$response = $response->withStatus(500);
}
return $response;
});
// 사용자 데이터 조회 라우트
$app->get('/pgsql-get-users', function (Request $request, Response $response, $args) {
try {
$users = Capsule::table('users')->get();
$response->getBody()->write($users->toJson());
$response = $response->withHeader('Content-Type', 'application/json');
} catch (\Exception $e) {
$response->getBody()->write('Error fetching users: ' . $e->getMessage());
$response = $response->withStatus(500);
}
return $response;
});
// ... $app->run();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
접속 방법:
https://servbay-slim-test.local/pgsql-add-user
로 접근하면 PostgreSQL의users
테이블에 새 사용자가 추가됩니다.https://servbay-slim-test.local/pgsql-get-users
로 접근하면 모든 사용자를 JSON으로 반환받을 수 있습니다.
Memcached 예시
ServBay는 Memcached 패키지와 PHP의 ext-memcached
확장을 제공합니다. PHP 클라이언트 라이브러리만 추가로 설치하면 바로 사용할 수 있습니다. 여기서는 memcached/memcached
를 사용합니다.
Memcached 클라이언트 라이브러리 설치: 프로젝트 루트(
/Applications/ServBay/www/servbay-slim-app
)에서 아래 명령어 실행.bashcomposer require memcached/memcached
1public/index.php
에 Memcached 라우트 추가:$app->run();
전에 다음 코드를 삽입하세요.php// ... 앞의 초기화 코드 및 DB 라우트 ... // Memcached 예시 라우트 $app->get('/memcached-example', function (Request $request, Response $response, $args) { // Memcached 클라이언트 인스턴스 생성 $memcached = new Memcached(); // Memcached 서버 추가 (ServBay는 기본 127.0.0.1:11211에서 작동) $memcached->addServer('127.0.0.1', 11211); $cacheKey = 'my_servbay_cache_key'; // 캐시 데이터 가져오기 $cachedData = $memcached->get($cacheKey); if ($cachedData === false) { // 캐시에 데이터가 없으면 데이터 생성 후 저장 $cachedData = 'Hello Memcached from ServBay! This was not cached.'; // ttl 60초로 캐시에 저장 $memcached->set($cacheKey, $cachedData, 60); $response->getBody()->write($cachedData); } else { // 캐시에 데이터가 있으면 바로 반환 $response->getBody()->write('Hello Memcached from ServBay! This was served from cache.'); } return $response; }); // ... $app->run();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
접속: https://servbay-slim-test.local/memcached-example
를 처음 방문하면 "This was not cached."가, 이후(캐시 만료 전)엔 "This was served from cache."가 표시됩니다.
Redis 예시
ServBay는 Redis 패키지와 PHP ext-redis
확장도 제공합니다. PHP 클라이언트 라이브러리만 설치하면 사용가능하며, 여기서는 predis/predis
를 예로 듭니다.
Redis 클라이언트 라이브러리 설치: 프로젝트 루트(
/Applications/ServBay/www/servbay-slim-app
)에서 다음 실행.bashcomposer require predis/predis
1public/index.php
에 Redis 라우트 추가:$app->run();
전에 아래 코드를 추가.php// ... 앞의 초기화 코드 및 DB 라우트 ... // ... Memcached 라우트(필요시) ... use Predis\Client as RedisClient; // Predis 클라이언트 불러오기 // Redis 예시 라우트 $app->get('/redis-example', function (Request $request, Response $response, $args) { try { // Redis 클라이언트 인스턴스 생성(기본 127.0.0.1:6379) $redis = new RedisClient([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379, ]); $cacheKey = 'my_servbay_redis_cache_key'; // 캐시 데이터 가져오기 $cachedData = $redis->get($cacheKey); if ($cachedData === null) { // 캐시에 데이터가 없으면 생성 후 캐시에 저장 $cachedData = 'Hello Redis from ServBay! This was not cached.'; // 캐시에 60초 만료로 저장 $redis->setex($cacheKey, 60, $cachedData); // SETEX key seconds value $response->getBody()->write($cachedData); } else { // 캐시에 데이터 있으면 바로 반환 $response->getBody()->write('Hello Redis from ServBay! This was served from cache.'); } } catch (\Exception $e) { // 연결이나 작업 중 에러 핸들링 $response->getBody()->write('Error connecting to Redis or performing operation: ' . $e->getMessage()); $response = $response->withStatus(500); } return $response; }); // ... $app->run();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
접속: https://servbay-slim-test.local/redis-example
를 처음 방문하면 "This was not cached."가, 캐시 유효기간 내엔 "This was served from cache."가 출력됩니다.
마무리
여기까지 ServBay 로컬 개발환경에서 Slim Framework 프로젝트 생성 및 ServBay의 웹사이트 기능으로 호스팅, 접근하는 방법을 안내했습니다. 더불어 ServBay의 다양한 패키지(MySQL, PostgreSQL, Memcached, Redis)와 PHP 확장을 이용해 데이터베이스/캐시 통합을 손쉽게 구현하는 방법도 배웠습니다. ServBay는 로컬 환경 세팅과 관리를 간소화하여, Slim 애플리케이션 개발에 더욱 집중할 수 있도록 설계되었습니다.