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 설치 및 실행: ServBay가 macOS 또는 Windows에 성공적으로 설치되어 있고, 애플리케이션이 실행 중임을 확인하세요.
- Composer 내장: ServBay는 기본적으로 Composer를 통합하므로 별도 설치할 필요가 없습니다.
Slim 프로젝트 생성
ServBay는 웹사이트 프로젝트를 아래와 같은 통합 디렉터리에 저장할 것을 권장합니다. 이는 프로젝트 관리와 설정에 도움이 됩니다.
- macOS:
/Applications/ServBay/www - Windows:
C:\ServBay\www
ServBay 웹사이트 루트 디렉터리로 이동:
macOS:
bashcd /Applications/ServBay/www1Windows:
cmdcd C:\ServBay\www1프로젝트 폴더 생성: Slim 프로젝트를 위한 새 디렉터리 생성.
bashmkdir servbay-slim-app1프로젝트 폴더로 이동:
bashcd servbay-slim-app1Composer로 Slim 설치: 프로젝트 폴더 내에서 Composer로 Slim 프레임워크와 PSR-7 구현체 설치.
bashcomposer require slim/slim "^4.0" slim/psr7 -W1실행 시 Slim과
slim/psr7라이브러리가vendor폴더로 설치되고,composer.json및composer.lock파일이 생성됩니다.
Slim 애플리케이션 초기화
- 엔트리 파일 생성: Slim 프로젝트는 일반적으로 모든 요청을 처리하기 위해 단일 엔트리 파일(예:
public/index.php)을 사용합니다. 프로젝트 루트에public폴더를 생성하고, 그 안에index.php파일을 만듭니다.bashmkdir public touch public/index.php1
2 - 엔트리 파일 편집:
public/index.php파일에 아래와 같이 기본 Slim 코드 추가:php위 코드는<?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/루트 URL의 GET 요청을 처리하고 "Hello ServBay!"라는 텍스트를 반환하는 가장 기본적인 Slim App을 구성합니다.
ServBay 웹사이트 설정
브라우저에서 Slim 프로젝트에 접근하려면 ServBay에서 웹사이트(구 버전에서는 "호스트")를 설정해야 합니다.
- ServBay 애플리케이션 인터페이스 열기
- 웹사이트(Websites) 모듈로 이동
- 새 웹사이트 추가 클릭
- 프로젝트 정보에 맞게 설정 입력:
이름(Name):
My First Slim Dev Site(또는 원하는 이름)도메인(Domain):
servbay-slim-test.local(로컬 개발용으로는.local또는.test도메인 추천)웹사이트 유형(Website Type):
PHPPHP 버전(PHP Version): 원하는 버전(예:
8.3) 선택문서 루트(Document Root): 찾아보기 버튼 클릭 후 프로젝트의
public폴더 선택:- macOS:
/Applications/ServBay/www/servbay-slim-app/public - Windows:
C:\ServBay\www\servbay-slim-app\public
이는 Slim의 엔트리 파일
index.php가public폴더에 있으므로, 웹 서버의 루트를 이 폴더로 지정해야 합니다.- macOS:
- 웹사이트 설정 저장. ServBay가 웹 서버 구성을 자동으로 갱신하고 적용합니다.
자세한 웹사이트 설정 방법은 첫 웹사이트 추가 문서를 참고하세요.
Slim 웹사이트 접속
설정이 완료되면 웹 브라우저에서 https://servbay-slim-test.local 도메인으로 접속합니다.
문제가 없다면, 브라우저 화면에 Hello ServBay!가 표시됩니다. Slim 프로젝트가 ServBay의 웹 서버를 통해 성공적으로 실행된 것입니다.
데이터베이스 통합 예제
Slim 자체는 별도의 DB 추상화 레이어를 제공하지 않지만, 다양한 PHP DB 라이브러리와 쉽게 통합됩니다. 여기서는 Laravel의 Eloquent ORM(illuminate/database)을 예시로, MySQL과 PostgreSQL 연결, 그리고 Memcached와 Redis 통합 및 활용 방법을 소개합니다.
준비사항: 데이터베이스 생성 및 마이그레이션
DB 통합 전, ServBay에서 데이터베이스를 생성하고, 애플리케이션에 필요한 DB 테이블 구조를 만들어야 합니다.
- 데이터베이스 생성:
- ServBay 앱 인터페이스에서 사용하는 데이터베이스 패키지(MySQL 또는 PostgreSQL)로 이동합니다.
- ServBay가 제공하는 DB 관리자도구(phpMyAdmin for MySQL/MariaDB, pgAdmin for PostgreSQL)나 커맨드라인을 이용해, DB 이름을 예시처럼
servbay_slim_app으로 새로 만듭니다. - ServBay의 기본 DB root 사용자 비밀번호는
password입니다. 필요시 인터페이스에서 확인하거나 변경 가능합니다.
- Phinx(마이그레이션 툴) 설치 및 설정: Phinx는 DB 스키마 버전관리를 도와주는 인기 PHP 마이그레이션 툴입니다.
- Slim 프로젝트 루트 폴더에서 Composer로 Phinx 설치:
- macOS:
/Applications/ServBay/www/servbay-slim-app - Windows:
C:\ServBay\www\servbay-slim-app
bashcomposer require robmorgan/phinx1 - macOS:
- Phinx 설정 파일 초기화:bash위 명령어로 프로젝트 루트에
vendor/bin/phinx init1phinx.yml파일이 생성됩니다. 해당 파일을 열어 DB 연결 정보를 아래와 비슷하게 입력합니다.yamlpaths: migrations: '%%PHINX_CONFIG_DIR%%/db/migrations' seeds: '%%PHINX_CONFIG_DIR%%/db/seeds' environments: default_migration_table: phinxlog default_environment: development # 또는 환경 이름 development: # DB 타입에 맞게 설정 adapter: mysql # 또는 pgsql host: 127.0.0.1 name: servbay_slim_app # 생성한 DB명 user: root pass: password # DB 비밀번호 port: 3306 # MySQL 기본 포트, PostgreSQL은 5432 charset: utf8mb4 # MySQL 권장 collation: utf8mb4_unicode_ci # MySQL 권장 version_order: creation1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- Slim 프로젝트 루트 폴더에서 Composer로 Phinx 설치:
- 마이그레이션 파일 생성: Phinx 명령으로 새 마이그레이션 파일 생성.bash
vendor/bin/phinx create CreateUsersTable1db/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 명령으로 실제 DB에 테이블 생성.bash중요: 아래 DB 연동 샘플 코드를 실행하기 전에 반드시 데이터베이스 생성과 마이그레이션을 마쳐야 합니다.
vendor/bin/phinx migrate1
illuminate/database 컴포넌트 활용
Laravel의 DB 컴포넌트(illuminate/database)를 ORM/쿼리 빌더로 사용합니다.
illuminate/database 설치: 프로젝트 루트에서 의존성 설치
- macOS:
/Applications/ServBay/www/servbay-slim-app - Windows:
C:\ServBay\www\servbay-slim-app
bashcomposer require illuminate/database1- macOS:
public/index.php에 DB 연결 초기화 코드 추가:require __DIR__ . '/../vendor/autoload.php';뒤,$app = AppFactory::create();전에 아래 코드 삽입.php// ... 다른 require 및 use 구문 ... use Illuminate\Database\Capsule\Manager as Capsule; // Capsule 매니저 임포트 // Eloquent ORM 초기화 $capsule = new Capsule; // DB 연결 정보 추가 (사용 DB에 맞게 driver 및 옵션 수정) $capsule->addConnection([ 'driver' => 'mysql', // 또는 'pgsql' 'host' => '127.0.0.1', 'database' => 'servbay_slim_app', // DB명 'username' => 'root', // DB 사용자명 'password' => 'password', // DB 비밀번호 '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 예제
ServBay에 MySQL 패키지가 실행 중이고, servbay_slim_app 데이터베이스와 users 테이블(마이그레이션 완료)이 준비된 상태를 가정합니다.
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 예제
ServBay에 PostgreSQL 패키지가 실행 중이고, 데이터베이스 및 테이블과 마이그레이션이 준비된 상태를 가정합니다(Phinx 설정의 adapter와 port가 pgsql과 5432로 올바르게 지정되어야 함).
public/index.php의 DB 연결 config에서 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은 주로 utf8 사용
'prefix' => '',
'schema' => 'public', // schema 명시
]);
// ... 나머지 Eloquent 초기화 코드는 동일 ...1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
public/index.php에서 $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접속 시 PostgreSQLusers테이블에 사용자 추가https://servbay-slim-test.local/pgsql-get-users접속 시 모든 사용자 정보 JSON 출력
Memcached 예제
ServBay는 Memcached 패키지와 PHP ext-memcached 확장 기능을 제공합니다. 여기에 PHP용 클라이언트 라이브러리만 추가 설치하면 됩니다(memcached/memcached 예시).
Memcached 클라이언트 라이브러리 설치: 프로젝트 루트에서 설치
- macOS:
/Applications/ServBay/www/servbay-slim-app - Windows:
C:\ServBay\www\servbay-slim-app
bashcomposer require memcached/memcached1- macOS:
public/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(Time To Live) 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 클라이언트 라이브러리 설치: 프로젝트 루트에서 설치
- macOS:
/Applications/ServBay/www/servbay-slim-app - Windows:
C:\ServBay\www\servbay-slim-app
bashcomposer require predis/predis1- macOS:
public/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 클라이언트 인스턴스 생성 (ServBay 기본: 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
접속: 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 확장 기능을 활용해 데이터베이스·캐시를 Slim 애플리케이션에 통합하는 방법도 배웠습니다. ServBay 덕분에 복잡한 로컬 환경 설정과 관리를 최소화할 수 있어, Slim 개발 그 자체에 더욱 집중할 수 있습니다.
