ServBay에서 ThinkPHP 8 프로젝트 생성 및 실행 가이드
이 문서는 강력한 로컬 웹 개발환경인 ServBay를 활용하여, ThinkPHP 8 프레임워크 기반의 PHP 프로젝트를 빠르게 생성하고 구성 및 실행하는 방법을 안내합니다. ServBay는 사전 구성된 PHP 환경, 웹 서버(Caddy 또는 Nginx), 다양한 데이터베이스를 제공하여 ThinkPHP 프로젝트의 로컬 구축을 대폭 단순화해줍니다.
ThinkPHP란 무엇인가요?
ThinkPHP는 중국에서 개발된 오픈소스이자 빠르고 간결한 객체지향 PHP 개발 프레임워크입니다. 간결하며 효율적인 개발 원칙을 따르며, 개발자에게 현대적 웹 애플리케이션 구축에 필요한 다양하고 편리한 툴셋을 제공합니다. 강력한 ORM, 유연한 라우팅, 내장 템플릿 엔진 및 캐시 지원 등 풍부한 기능, 그리고 활발한 커뮤니티 덕분에 중국 내 PHP 개발 분야에서 널리 쓰이고 있습니다.
ThinkPHP의 주요 특징 및 장점
- 간결하고 효율적: 프레임워크 구조가 단순하고 코드가 명확하여 이해 및 유지보수가 쉽고, 개발 효율도 우수합니다.
- 기능 완비: MVC 구조, ORM, 템플릿 엔진, 캐시, 세션관리, 인증, 폼 토큰 등 웹 개발에 필요한 다양한 기능 내장.
- 강력한 ORM: 사용이 간편하면서도 강력한 객체관계매핑 기능을 제공, 데이터베이스 작업을 더욱 쉽게 처리할 수 있습니다.
- 유연한 라우팅: 복잡한 URL 구조에도 대응할 수 있도록 다양한 라우팅 방식 지원.
- 풍부한 생태계: 다양한 확장 라이브러리와 플러그인, 대규모 및 활발한 개발자 커뮤니티가 존재하여 자료가 풍부합니다.
- 지속적인 업데이트: 프레임워크 버전이 활발히 개선·배포되며, 최신 PHP 및 Web 트렌드를 빠르게 반영합니다.
ThinkPHP는 소규모 프로젝트부터 대규모 엔터프라이즈급 애플리케이션까지 다양한 웹 개발에 적합합니다.
ServBay로 ThinkPHP 8 프로젝트 구축하기
ServBay는 ThinkPHP 8 프로젝트의 로컬 개발에 최적화된 환경을 제공합니다.
- 다양한 버전의 PHP와 주요 확장 기능들이 미리 설치됨
- 내장 웹 서버(Caddy 또는 Nginx)로 쉽고 편리하게 웹사이트 설정 가능
- MySQL, PostgreSQL, MongoDB, Redis, Memcached 등 여러 데이터베이스 서비스 통합 제공
- Composer 패키지 관리 툴 내장
본 가이드에서는 ServBay의 이 기능들을 활용해 ThinkPHP 8 프로젝트를 빠르게 구축할 수 있습니다.
사전 준비사항
시작 전 아래 준비가 완료되었는지 확인하세요:
- macOS 환경에 ServBay를 다운로드·설치하셨나요?
- ServBay가 실행 중이고, ThinkPHP 8에 필요한 PHP 8.0 이상과 원하는 데이터베이스 서비스(MySQL, PostgreSQL, Redis, Memcached 등)가 실행되고 있나요? (ServBay 컨트롤판 > ‘패키지’ 탭에서 서비스 상태 확인 및 시작 가능)
ThinkPHP 프로젝트 생성
ServBay는 웹사이트 파일을 /Applications/ServBay/www
디렉토리에 관리할 것을 권장합니다. 통합 관리에 도움이 됩니다.
Composer 설치 확인
ServBay 설치 시 Composer가 기본 탑재되어 별도 설치가 필요 없습니다. ServBay 터미널에서
composer --version
명령어로 정상 동작 여부를 확인하세요.Composer로 ThinkPHP 프로젝트 생성
macOS 터미널을 열고 ServBay의 프로젝트 루트로 이동, 아래 명령어로 새로운 ThinkPHP 8 프로젝트를 생성합니다:
bashcd /Applications/ServBay/www composer create-project topthink/think servbay-thinkphp-app
1
2/Applications/ServBay/www
하위에servbay-thinkphp-app
이라는 새 폴더가 생성되고, ThinkPHP 8 코어 및 의존성들이 자동 다운로드됩니다.프로젝트 디렉토리로 진입
프로젝트 생성이 끝나면 다음과 같이 폴더로 이동합니다:
bashcd /Applications/ServBay/www/servbay-thinkphp-app
1
프로젝트 기본 설정 초기화
프로젝트 생성 후 몇 가지 필수 설정을 진행해야 합니다.
데이터베이스 연결정보 설정
ThinkPHP의 데이터베이스 설정은 보통
config/database.php
파일에서 관리합니다. ServBay에서 활성화한 데이터베이스 서비스에 맞게 해당 파일을 수정하세요.아래는 ServBay 기본 MySQL 서비스를 사용할 경우 예시입니다:
php<?php // config/database.php return [ // 기본 데이터베이스 연결 설정 'default' => env('database.driver', 'mysql'), // 데이터베이스 연결 설정 목록 'connections' => [ 'mysql' => [ // 데이터베이스 종류 'type' => 'mysql', // 서버 주소 'hostname' => env('database.hostname', '127.0.0.1'), // 데이터베이스 이름 'database' => env('database.database', 'servbay_thinkphp_app'), // 프로젝트별 별도 데이터베이스 권장 // 사용자명 'username' => env('database.username', 'root'), // 비밀번호 'password' => env('database.password', 'password'), // ServBay 기본 비밀번호, 로컬 전용! // 포트 'hostport' => env('database.hostport', '3306'), // ... 추가 설정 ... ], // ... 그 외 DB 연결 ... ], ];
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중요 안내:
database
값을 프로젝트용 실제 DB명(예: ServBay의 phpMyAdmin·Adminer 등에서 생성한servbay_thinkphp_app
등)으로 변경하세요.- ServBay의 기본
root
비밀번호는password
입니다. 로컬 개발 환경 외에는 절대로 사용하지 마세요! 운영 환경에서는 강력한 비밀번호 및 최소 권한 계정만 사용하세요. - 환경 변수 관리를 위한
.env
파일을 사용할 경우, 이 파일의 설정이config/database.php
의 기본값을 덮어씁니다.
웹 서버 설정
ThinkPHP의 진입 파일은 public/index.php
이고, URL Rewrite(라우팅 규칙 적용)이 필수입니다. 정적 파일 요청과 달리, ThinkPHP 라우팅을 위해서는 ServBay 내장 Rewrite 규칙이 필요합니다.
웹사이트 설정의 Rewrite 규칙 드롭다운에서 ThinkPHP
를 선택하고 저장하세요.
자세한 웹사이트 추가 방법은 첫 번째 웹사이트 추가 문서를 참고하세요.
샘플 코드 추가
설정이 정상적인지, ThinkPHP 기본 라우팅 및 기능 테스트를 위해 간단한 라우트와 컨트롤러를 추가해보겠습니다.
프로젝트 내 파일 /Applications/ServBay/www/servbay-thinkphp-app/route/app.php
를 열고, 다음 코드를 추가하여 GET 요청용 간단 라우트를 정의합니다:
php
<?php
// route/app.php
use think\facade\Route;
// servbay 라우트 정의, /servbay 접근 시 익명함수 실행
Route::get('servbay', function () {
return 'Hello ServBay!';
});
// ... 그 외 라우트 ...
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
웹사이트 접속
이제 웹 브라우저를 열고, 설정한 도메인과 예시 라우트 URL을 입력해봅니다:
https://thinkphp.servbay.demo/servbay
정상적으로 설정됐다면 브라우저에서 Hello ServBay!
결과를 볼 수 있습니다. 이는 ServBay 환경에서 ThinkPHP 8 프로젝트가 성공적으로 실행되고, 웹 서버 및 PHP-FPM 설정이 모두 적용된 것을 의미합니다.
NoSQL 데이터베이스 예제
ServBay는 Memcached, Redis 등 여러 NoSQL 데이터베이스를 미리 설치하여 제공합니다. ThinkPHP는 강력한 캐시 레이어를 통해 이들 NoSQL 서비스를 쉽게 캐시 드라이버로 연동할 수 있습니다.
Memcached 예제
Memcached 확장 확인
ServBay PHP 패키지에는 Memcached 확장이 기본 설치되어 있습니다. 컨트롤판 > ‘패키지’ 탭에서 Memcached 서비스가 실행중인지 확인하세요.
Memcached 캐시 설정
config/cache.php
파일을 수정하여 ThinkPHP 캐시 드라이버를 Memcached로 지정합니다:php<?php // config/cache.php return [ // 기본 캐시 드라이버 'default' => env('cache.driver', 'memcached'), // 상세 캐시 연결 설정 'stores' => [ 'memcached' => [ // 캐시 타입 'type' => 'memcached', // 서버 주소 목록 'host' => '127.0.0.1', // ServBay Memcached 기본주소 'port' => 11211, // ServBay Memcached 기본포트 'persistent' => false, 'expire' => 0, 'timeout' => 0, 'prefix' => '', ], // ... 기타 캐시 설정 ... ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23코드에서 Memcached 캐시 활용
컨트롤러나 라우트 콜백에서 ThinkPHP의
Cache
파사드를 활용해 Memcached를 사용합니다:php<?php use think\facade\Cache; use think\facade\Route; Route::get('/memcached-example', function () { // 캐시 저장(유효기간: 600초) Cache::set('my_memcached_key', 'This value is from Memcached!', 600); // 캐시 읽기 $value = Cache::get('my_memcached_key'); return 'Value from Memcached: ' . $value; });
1
2
3
4
5
6
7
8
9
10
11
12
13https://thinkphp.servbay.demo/memcached-example
에 접속해 동작을 확인하세요.
Redis 예제
Redis 확장 확인
ServBay PHP 패키지에 Redis 확장도 포함되어 있습니다. 컨트롤판 > ‘패키지’ 탭에서 Redis 서비스가 실행 중인지 확인하세요.
Redis 캐시 설정
config/cache.php
파일을 수정하여 ThinkPHP 캐시 드라이버를 Redis로 지정합니다:php<?php // config/cache.php return [ // 기본 캐시 드라이버 'default' => env('cache.driver', 'redis'), // 상세 캐시 연결 설정 'stores' => [ 'redis' => [ // 캐시 타입 'type' => 'redis', // 서버 주소 'host' => env('cache.host', '127.0.0.1'), // ServBay Redis 기본주소 // 포트 'port' => env('cache.port', 6379), // ServBay Redis 기본포트 // 비밀번호 (ServBay는 기본적으로 없음) 'password' => env('cache.password', ''), // 기본값: 빈 문자열 'select' => 0, 'timeout' => 0, 'expire' => 0, 'persistent' => false, 'prefix' => '', ], // ... 기타 캐시 설정 ... ], ];
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참고: ServBay 기본 Redis에는 비밀번호가 없습니다. 직접 비밀번호를 설정했다면 이 필드를 꼭 수정하세요.
코드에서 Redis 캐시 활용
컨트롤러나 라우트 콜백에서 ThinkPHP의
Cache
파사드를 사용합니다:php<?php use think\facade\Cache; use think\facade\Route; Route::get('/redis-example', function () { // 무기한 저장(3번째 파라미터로 유효기간 지정 가능) Cache::set('my_redis_key', 'Hello from Redis!'); // 캐시 읽기 $value = Cache::get('my_redis_key'); return 'Value from Redis: ' . $value; });
1
2
3
4
5
6
7
8
9
10
11
12
13https://thinkphp.servbay.demo/redis-example
에서 테스트할 수 있습니다.
관계형 데이터베이스 예제
ServBay는 MySQL, PostgreSQL 등 주요 관계형 데이터베이스를 통합 제공합니다. ThinkPHP ORM은 이들 DB와의 연동 및 쿼리를 간편하게 지원합니다.
ThinkPHP 데이터베이스 마이그레이션 도구 사용하기
팀 협업 및 버전 관리를 쉽게 하기 위해, DB 구조는 종종 마이그레이션 도구로 관리합니다.
마이그레이션 툴 설치
프로젝트 루트에서 Composer로 ThinkPHP 마이그레이션 확장 설치:
bashcd /Applications/ServBay/www/servbay-thinkphp-app composer require topthink/think-migration
1
2마이그레이션 파일 생성
아래 명령어로
users
테이블 생성을 위한 새로운 마이그레이션 파일을 만듭니다:bashphp think migrate:create CreateUserTable
1database/migrations
폴더에 타임스탬프와 입력한 이름이 결합된 PHP 파일이 생성됩니다(예:20231027100000_create_user_table.php
).마이그레이션 파일 편집
database/migrations
아래 새 파일의up()
함수에서users
테이블 구조를 정의합니다:php<?php // database/migrations/YYYYMMDDHHMMSS_create_user_table.php use think\migration\Migrator; use think\migration\db\Column; class CreateUserTable extends Migrator { /** * Change Method. * * Write your reversible migrations using this method. * * More information on writing migrations is available here: * http://docs.phinx.org/en/latest/migrations.html#the-change-method * * The following commands can be used in this method and Phinx will * automatically reverse them when rolling back: * * createTable * renameTable * addColumn * addCustomColumn * renameColumn * addIndex * addForeignKey * createDatabase * renameDatabase * dropTable * dropColumn * dropIndex * dropForeignKey */ public function change() { // createTable 메소드로 테이블 생성 $table = $this->table('users'); $table->addColumn('name', 'string', ['limit' => 50, 'comment' => '사용자 이름']) ->addColumn('email', 'string', ['limit' => 100, 'comment' => '이메일 주소']) ->addIndex(['email'], ['unique' => true]) // 유니크 인덱스 추가 ->addTimestamps() // created_at, updated_at 칼럼 추가 ->create(); // 실제 생성 실행 } // change 메소드를 사용하지 않을 경우 up()과 down()을 별도로 정의할 수 있습니다 /* public function up() { $table = $this->table('users'); $table->addColumn('name', 'string', ['limit' => 50, 'comment' => '사용자 이름']) ->addColumn('email', 'string', ['limit' => 100, 'comment' => '이메일 주소']) ->addIndex(['email'], ['unique' => true]) ->addTimestamps() ->create(); } public function down() { $this->dropTable('users'); } */ }
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62데이터베이스 마이그레이션 실행
ServBay 터미널에서 프로젝트 루트에 위치한 뒤 아래 명령어를 실행,
users
테이블을 생성합니다:bashphp think migrate:run
1정상 완료 시 데이터베이스에 새 테이블이 생성됩니다.
MySQL 예제
MySQL 서비스가 실행 중이고, config/database.php
에 MySQL 연결이 올바르게 설정되어 있다고 가정합니다.
MySQL 연결정보 확인
위 “프로젝트 기본 설정 초기화”의 MySQL 설정 예시대로,
config/database.php
의mysql
항목 정보를 올바르게 입력하세요.코드에서 사용자 데이터 쓰기
ThinkPHP의
Db
파사드 혹은 ORM 모델을 활용해 데이터 삽입이 가능합니다. 아래는Db
파사드 예시입니다:php<?php use think\facade\Db; use think\facade\Route; Route::get('/mysql-add-user', function () { try { Db::table('users')->insert([ 'name' => 'ServBay Demo User', 'email' => '[email protected]', // 브랜딩된 예시 이메일 'created_at' => date('Y-m-d H:i:s'), // 타임스탬프 직접 추가(자동입력이 아닐 경우) 'updated_at' => date('Y-m-d H:i:s'), ]); return 'User added successfully!'; } catch (\Exception $e) { return 'Error adding user: ' . $e->getMessage(); } });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17https://thinkphp.servbay.demo/mysql-add-user
에 접속해 데이터 삽입을 테스트할 수 있습니다.코드에서 사용자 데이터 읽기
역시
Db
파사드나 ORM 모델을 사용하여 전체 데이터를 조회할 수 있습니다:php<?php use think\facade\Db; use think\facade\Route; Route::get('/mysql-users', function () { $users = Db::table('users')->select(); // 모든 사용자 데이터 조회 return json($users); // JSON 형식으로 반환 });
1
2
3
4
5
6
7
8https://thinkphp.servbay.demo/mysql-users
에서 users 테이블 데이터를 확인할 수 있습니다.
PostgreSQL 예제
PostgreSQL 서비스가 활성화 상태이고, config/database.php
에 연결정보가 올바르게 입력되어 있다고 가정합니다.
PostgreSQL 연결정보 설정
config/database.php
에서 아래와 같은 PostgreSQL 구성을 추가(실제 환경에 맞게 조정):php<?php // config/database.php 일부 return [ // ... 기타 설정 ... 'connections' => [ // ... MySQL 설정 ... 'pgsql' => [ // 데이터베이스 종류 'type' => 'pgsql', // 서버 주소 'hostname' => env('database.hostname', '127.0.0.1'), // 데이터베이스 이름 'database' => env('database.database', 'servbay_thinkphp_app'), // 별도 데이터베이스 권장 // 사용자명 'username' => env('database.username', 'root'), // 비밀번호 'password' => env('database.password', 'password'), // ServBay 기본 비밀번호(로컬 전용!) // 포트 'hostport' => env('database.hostport', '5432'), // ... 기타 설정 ... ], // ... 기타 DB ... ], ];
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중요 안내:
- MySQL과 마찬가지로, 프로젝트 별도로 PostgreSQL DB를 생성하고 이 이름을 설정하세요.
- ServBay에서 PostgreSQL의
root
비밀번호 역시password
입니다(로컬 개발 용도 전용).
코드에서 사용자 데이터 쓰기 (PostgreSQL 사용 명시)
ThinkPHP의
Db
파사드 혹은 ORM을 활용해 데이터 삽입, 명시적으로pgsql
연결 지정:php<?php use think\facade\Db; use think\facade\Route; Route::get('/pgsql-add-user', function () { try { Db::connect('pgsql')->table('users')->insert([ // pgsql 연결 사용 'name' => 'ServBay PgSQL User', 'email' => '[email protected]', // 브랜딩된 예시 이메일 // PostgreSQL에서 타임스탬프 필드 설정 시 마이그레이션 및 TP 버전별 다를 수 있음 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ]); return 'PostgreSQL User added successfully!'; } catch (\Exception $e) { return 'Error adding PostgreSQL user: ' . $e->getMessage(); } });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18https://thinkphp.servbay.demo/pgsql-add-user
페이지 호출 시 데이터 입력 확인가능.코드에서 사용자 데이터 읽기 (PostgreSQL 명시)
아래처럼
pgsql
연결을 명시적으로 지정해 데이터 조회:php<?php use think\facade\Db; use think\facade\Route; Route::get('/pgsql-users', function () { $users = Db::connect('pgsql')->table('users')->select(); // pgsql 연결로 조회 return json($users); // JSON 형식으로 반환 });
1
2
3
4
5
6
7
8https://thinkphp.servbay.demo/pgsql-users
에서 PostgreSQL users 테이블 데이터를 확인할 수 있습니다.
정리
여기까지, ServBay 로컬 개발 환경을 통해 ThinkPHP 8 프로젝트를 생성하고, 주요 설정부터 Caddy 웹 서버를 활용한 라우팅, MySQL·PostgreSQL·Memcached·Redis 데이터베이스 연동까지 전 과정을 배웠습니다.
ServBay는 ThinkPHP와 같은 PHP 프레임워크 개발에 최적화된 로컬 환경 구축을 극도로 간소화하여, 개발자는 비즈니스 로직 구현에 더욱 집중할 수 있습니다. 이제 ServBay가 제공하는 다양한 패키지와 기능을 적극 활용해 여러분만의 ThinkPHP 애플리케이션 개발을 이어가실 수 있습니다.