CodeIgniter 프로젝트 생성 및 실행하기
CodeIgniter란 무엇인가요?
CodeIgniter는 경량이면서 높은 성능을 제공하는 PHP 웹 애플리케이션 개발 프레임워크입니다. Model-View-Controller(MVC) 디자인 패턴을 따르며, 개발자가 빠르고 쉽게 강력한 기능의 웹 앱을 구축할 수 있도록 설계되었습니다. 구조가 단순하고, 성능이 뛰어나며, 배우기가 쉬워 많은 PHP 개발자들이 선호하는 프레임워크 중 하나입니다.
CodeIgniter의 주요 특징 및 장점
- 경량 코어: 시스템의 핵심이 매우 간결해 필요한 구성 요소만 포함되어 있으므로 실행 속도가 매우 빠릅니다.
- 우수한 성능: 효율성에 집중한 설계로 높은 동시 요청 처리와 뛰어난 애플리케이션 성능을 제공합니다.
- 쉬운 학습 곡선: 명확한 공식 문서와 직관적인 API 제공으로 누구나 쉽게 익힐 수 있습니다.
- 높은 유연성: 프로젝트 요구에 따라 자유롭게 외부 라이브러리를 선택해 통합하고 기능을 확장 및 커스터마이징할 수 있습니다.
- 활발한 커뮤니티 지원: 방대한 개발자 커뮤니티가 활발히 활동하며 다양한 자료와 도움을 제공합니다.
CodeIgniter는 소규모 프로젝트부터 대기업용 앱까지 다양한 개발 요구에 적합하며, 고품질 웹 솔루션을 빠르고 효율적으로 만들어줍니다.
ServBay로 CodeIgniter 개발 환경 구축하기
ServBay는 macOS와 Windows에서 사용할 수 있는 로컬 웹 개발 환경 도구로, PHP, 데이터베이스(MySQL, PostgreSQL, MongoDB), 캐시(Redis, Memcached), 웹 서버(Caddy, Nginx, Apache) 등 다양한 패키지를 통합 제공합니다. 관리 페이지도 직관적으로 구성되어 있어 CodeIgniter에 필요한 개발 환경을 손쉽게 구축하고 관리할 수 있습니다.
이 안내서에서는 ServBay의 PHP 환경과 웹사이트 기능을 활용해 CodeIgniter 프로젝트를 만들고, 다양한 데이터베이스 및 캐시 서비스를 연동하는 과정을 설명합니다.
준비 사항
시작하기 전에 아래 사항을 미리 준비해야 합니다.
- macOS 또는 Windows에 ServBay가 정상적으로 설치 및 실행 중이어야 합니다.
- ServBay에서 사용할 PHP 버전(예: PHP 8.3)이 활성화되어야 합니다.
- ServBay에서 사용할 계획인 데이터베이스와 캐시 패키지(예: MySQL, PostgreSQL, Redis, Memcached)가 활성화되어야 합니다.
CodeIgniter 프로젝트 만들기
ServBay는 웹사이트 프로젝트를 아래 디렉터리에 통일해 저장하는 것을 권장합니다. 이로써 ServBay가 로컬 웹사이트를 더 효율적으로 관리합니다:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
Composer 설치
ServBay 설치 시 이미 Composer가 포함되어 있으므로 별도의 설치가 필요하지 않습니다. 터미널에서 바로
composer
명령어를 사용할 수 있습니다.웹사이트 루트 디렉터리로 이동
터미널을 열고 ServBay 권장 웹사이트 루트 디렉터리로 이동하세요.
macOS:
bashcd /Applications/ServBay/www
1Windows:
cmdcd C:\ServBay\www
1CodeIgniter 프로젝트 생성
Composer를 이용하여 새로운 CodeIgniter 4 프로젝트를 생성합니다. 프로젝트 폴더명은
servbay-codeigniter-app
으로 지정합니다.bashcomposer create-project codeigniter4/appstarter servbay-codeigniter-app
1Composer가 CodeIgniter 기본 앱과 의존성을
servbay-codeigniter-app
폴더에 설치합니다.프로젝트 폴더 이동
새로 생성한 CodeIgniter 프로젝트 디렉터리로 이동합니다.
macOS:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1Windows:
cmdcd C:\ServBay\www\servbay-codeigniter-app
1
초기 설정
데이터베이스 연결 설정
CodeIgniter의 데이터베이스 설정은 app/Config/Database.php
파일에서 진행합니다. 데이터베이스를 사용하려면 이 파일에서 연결 정보를 입력해야 합니다.
먼저, ServBay의 데이터베이스 관리 도구(Adminer 또는 phpMyAdmin - ServBay 앱 내에서 접속 가능)를 이용해 servbay_codeigniter_app
라는 데이터베이스를 생성해 주세요.
그다음, app/Config/Database.php
파일의 $default
배열을 ServBay에서 활성화한 데이터베이스 유형(예: MySQL, PostgreSQL)에 맞게 수정합니다. ServBay의 기본 DB 사용자명과 비밀번호는 일반적으로 root
와 password
입니다.
아래는 MySQL 설정 예시입니다.
php
public $default = [
'DSN' => '',
'hostname' => '127.0.0.1', // ServBay 데이터베이스는 보통 127.0.0.1에서 리스닝
'username' => 'root', // ServBay 기본 사용자명
'password' => 'password', // ServBay 기본 비밀번호
'database' => 'servbay_codeigniter_app', // 생성한 데이터베이스 이름
'DBDriver' => 'MySQLi', // 데이터베이스 유형: MySQL은 MySQLi 또는 Pdo
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306, // MySQL 기본 포트
];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PostgreSQL을 사용하는 경우에는 DBDriver
를 'Postgre'
로 설정하고, 포트 번호는 일반적으로 5432
입니다. 문자셋 관련 설정도 데이터베이스 특성에 맞게 조정해야 할 수 있습니다.
캐시 연결 설정 (Memcached/Redis)
Memcached나 Redis를 캐시로 사용할 경우 app/Config/Cache.php
에서 관련 설정을 진행합니다.
app/Config/Cache.php
파일을 수정하여 해당 패키지 설정 섹션을 찾아 입력합니다. ServBay의 Memcached 기본 포트는 11211
, Redis는 6379
이며, 보통 비밀번호는 필요하지 않습니다.
Memcached 예시:
php
public $memcached = [
'host' => '127.0.0.1', // ServBay의 Memcached는 127.0.0.1에서 리스닝
'port' => 11211, // Memcached 기본 포트
'weight' => 1,
];
1
2
3
4
5
2
3
4
5
Redis 예시:
php
public string $handler = 'redis'; // 기본 캐시 핸들러를 redis로 설정
public $default = [ // Redis 설정은 보통 default 배열에 입력
'host' => '127.0.0.1', // ServBay의 Redis는 127.0.0.1에서 리스닝
'password' => null, // ServBay의 Redis 기본은 비밀번호 없음
'port' => 6379, // Redis 기본 포트
'timeout' => 0,
'database' => 0,
];
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
활성화한 캐시 패키지에 따라 해당 부분을 알맞게 설정하세요.
웹 서버 설정 (ServBay 웹사이트 관리)
ServBay의 웹사이트 기능을 이용해 웹 서버를 설정하여 CodeIgniter 프로젝트를 연결합니다.
- ServBay 앱 인터페이스를 엽니다.
- 웹사이트(Websites) 탭으로 이동합니다.
- 좌측 하단의
+
아이콘을 클릭해 새 웹사이트를 추가합니다. - 웹사이트 정보 입력:
- 이름(Name):
My First CodeIgniter Dev Site
등 인식하기 쉬운 이름을 입력하세요. - 도메인(Domain): 로컬 브라우저에서 접근할 도메인(예:
servbay-codeigniter-test.local
). ServBay는.local
도메인을 자동으로 로컬에 연결합니다. - 사이트 유형(Site Type):
PHP
를 선택하세요. - PHP 버전(PHP Version): 원하는 PHP 버전(예:
8.3
)을 선택하세요. - 문서 루트(Document Root): 가장 중요한 단계입니다. CodeIgniter의 진입 파일(
index.php
)은 프로젝트 폴더의public
폴더에 있습니다. 따라서 사이트 루트를 프로젝트 폴더 내public
폴더로 지정해야 합니다:/Applications/ServBay/www/servbay-codeigniter-app/public
.
- 이름(Name):
- 추가(Add) 버튼을 클릭해 저장하세요.
- 변경사항 적용 안내가 뜨면 확인을 눌러줍니다.
자세한 웹사이트 설정 방법은 첫 웹사이트 추가하기를 참고하세요.
예제 코드 추가
프로젝트 동작 및 데이터베이스/캐시 연결 여부를 확인하기 위해 CodeIgniter의 기본 Home
컨트롤러에 예제 메서드를 추가합니다.
파일 app/Controllers/Home.php
를 열어 아래 코드로 내용을 교체하세요.
php
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use CodeIgniter\Database\Exceptions\DatabaseException; // 데이터베이스 예외 클래스 추가
use CodeIgniter\Cache\Exceptions\CacheException; // 캐시 예외 클래스 추가
class Home extends Controller
{
/**
* 기본 홈 페이지 메서드
*/
public function index(): string
{
// 간단한 환영 메시지 반환
return '<h1>Hello ServBay and CodeIgniter!</h1><p>Your CodeIgniter project is running on ServBay.</p>';
}
/**
* Memcached 예제 메서드
*/
public function memcached(): string
{
try {
$cache = \Config\Services::cache();
// 캐시 저장 시도
$success = $cache->save('servbay_memcached_key', 'Hello Memcached from CodeIgniter!', 60); // 60초 캐시
if (!$success) {
return 'Error: Failed to save data to Memcached. Check Memcached service and configuration.';
}
// 캐시 데이터 읽기 시도
$value = $cache->get('servbay_memcached_key');
if ($value === null) {
return 'Error: Failed to get data from Memcached. Cache might have expired or service is down.';
}
return 'Memcached Test Success: ' . $value;
} catch (CacheException $e) {
// 캐시 관련 예외 처리
return 'Cache Error: ' . $e->getMessage() . '. Ensure Memcached service is running and configured correctly.';
} catch (\Exception $e) {
// 기타 예외 처리
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* Redis 예제 메서드
*/
public function redis(): string
{
try {
$cache = \Config\Services::cache();
// 캐시 저장 시도
$success = $cache->save('servbay_redis_key', 'Hello Redis from CodeIgniter!', 60); // 60초 캐시
if (!$success) {
return 'Error: Failed to save data to Redis. Check Redis service and configuration.';
}
// 캐시 데이터 읽기 시도
$value = $cache->get('servbay_redis_key');
if ($value === null) {
return 'Error: Failed to get data from Redis. Cache might have expired or service is down.';
}
return 'Redis Test Success: ' . $value;
} catch (CacheException $e) {
// 캐시 관련 예외 처리
return 'Cache Error: ' . $e->getMessage() . '. Ensure Redis service is running and configured correctly.';
} catch (\Exception $e) {
// 기타 예외 처리
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* 사용자 데이터를 데이터베이스(MySQL/PostgreSQL)에 저장
*/
public function addUser(): string
{
try {
$db = \Config\Database::connect();
// 'users' 테이블 존재 여부 체크(간단 예방)
if (!$db->tableExists('users')) {
return 'Error: "users" table does not exist. Please run database migrations first.';
}
// 데이터 삽입
$data = [
'name' => 'ServBay Demo User',
'email' => 'user_' . time() . '@servbay.demo', // time()으로 유일 email 생성
];
$db->table('users')->insert($data);
// 삽입 성공여부 체크 (선택사항, insert()는 보통 true 반환)
// if ($db->affectedRows() > 0) {
return 'User added successfully: ' . $data['email'];
// } else {
// return 'Error: Failed to add user.';
// }
} catch (DatabaseException $e) {
// 데이터베이스 예외 처리
return 'Database Error: ' . $e->getMessage() . '. Check database connection and table structure.';
} catch (\Exception $e) {
// 기타 예외 처리
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* 데이터베이스에서 사용자 목록 조회 (MySQL/PostgreSQL)
*/
public function listUsers(): string
{
try {
$db = \Config\Database::connect();
// 'users' 테이블 존재 여부 체크
if (!$db->tableExists('users')) {
return 'Error: "users" table does not exist. Please run database migrations first.';
}
// 사용자 전체 조회
$users = $db->table('users')->get()->getResult();
if (empty($users)) {
return 'No users found in the database.';
}
// 사용자 목록 JSON 형식 반환
return json_encode($users);
} catch (DatabaseException $e) {
// 데이터베이스 예외 처리
return 'Database Error: ' . $e->getMessage() . '. Check database connection and table structure.';
} catch (\Exception $e) {
// 기타 예외 처리
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
}
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
업데이트된 컨트롤러는 더 명확한 출력과 기본적인 에러 처리를 포함해 문제를 진단하는 데 도움을 줍니다.
라우터 설정
방금 Home
컨트롤러에 추가한 예제 메서드를 URL로 접근하려면, CodeIgniter의 라우트 파일에서 관련 규칙을 추가해야 합니다.
app/Config/Routes.php
파일을 열고, $routes
정의 부분에서 아래와 같은 규칙을 추가하세요.
php
// ... 기존 라우터 규칙 ...
// Memcached 예제 라우트
$routes->get('/memcached', 'Home::memcached');
// Redis 예제 라우트
$routes->get('/redis', 'Home::redis');
// 데이터베이스 예제 라우트
$routes->get('/add-user', 'Home::addUser');
$routes->get('/list-users', 'Home::listUsers');
// ... 기존 라우터 규칙 ...
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
이 규칙들을 기존 $routes
정의 내에 추가해 기존 내용이 덮어쓰이지 않도록 주의하세요.
사이트 접근
CodeIgniter 프로젝트가 ServBay에서 정상적으로 실행 중입니다. 웹 브라우저를 열고 설정했던 도메인으로 접속하세요.
홈페이지 접속:
https://servbay-codeigniter-test.local
페이지에Hello ServBay and CodeIgniter!
문구가 보이면 프로젝트가 ServBay 웹 서버에서 정상 동작 중입니다.Memcached 예제 접속:
https://servbay-codeigniter-test.local/memcached
Memcached 서비스 및 설정이 올바르면Memcached Test Success: Hello Memcached from CodeIgniter!
와 같은 메시지가 표시됩니다.Redis 예제 접속:
https://servbay-codeigniter-test.local/redis
Redis 서비스가 정상 설정되었다면Redis Test Success: Hello Redis from CodeIgniter!
메시지를 확인할 수 있습니다.
데이터베이스 예제 (MySQL/PostgreSQL)
데이터베이스 예제를 사용하기 전에 CodeIgniter의 마이그레이션 명령을 실행하여 users
테이블을 생성해야 합니다.
데이터베이스 구조 생성(마이그레이션 실행)
터미널을 열고 CodeIgniter 프로젝트 폴더로 이동하세요.
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1마이그레이션 파일 생성: CodeIgniter CLI 도구를 이용해
users
테이블을 정의할 마이그레이션 파일을 생성합니다.bashphp spark make:migration create_users_table
1그럼
app/Database/Migrations
폴더에 새로운 PHP 파일이 생성됩니다.마이그레이션 파일 수정: 새로 생성된 마이그레이션 파일(예:
YYYY-MM-DD-HHMMSS_CreateUsersTable.php
)의up()
메서드를 열어users
테이블 구조와 인덱스를 정의하세요. MySQL과 PostgreSQL은 자동 타임스탬프 필드 기본값 문법이 다르므로(CURRENT_TIMESTAMP
vsNOW()
), CodeIgniter의RawSql
클래스를 활용할 수 있습니다. 아래는 예시입니다.php<?php namespace App\Database\Migrations; use CodeIgniter\Database\Migration; use CodeIgniter\Database\RawSql; // RawSql 클래스 인포트 class CreateUsersTable extends Migration { public function up() { $this->forge->addField([ 'id' => [ 'type' => 'INT', 'constraint' => 5, 'unsigned' => true, 'auto_increment' => true, ], 'name' => [ 'type' => 'VARCHAR', 'constraint' => '100', ], 'email' => [ 'type' => 'VARCHAR', 'constraint' => '100', 'unique' => true, // 이메일 필드는 유니크 지정 ], 'created_at' => [ 'type' => 'TIMESTAMP', // 데이터베이스 종류에 따라 기본값 표현식 선택 // MySQL: 'default' => new RawSql('CURRENT_TIMESTAMP'), // PostgreSQL: 'default' => new RawSql('NOW()'), 'default' => new RawSql($this->db->getPlatform() === 'MySQLi' ? 'CURRENT_TIMESTAMP' : 'NOW()'), // 동적 선택 ], 'updated_at' => [ 'type' => 'TIMESTAMP', // MySQL: 'default' => new RawSql('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), // PostgreSQL: 'default' => new RawSql('NOW()'), 'default' => new RawSql($this->db->getPlatform() === 'MySQLi' ? 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' : 'NOW()'), // 동적 선택 ], ]); $this->forge->addKey('id', true); // id를 기본키로 지정 $this->forge->createTable('users'); // users 테이블 생성 } public function down() { // 마이그레이션 롤백 시 users 테이블 삭제 $this->forge->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참고: 위 예시는 데이터베이스 플랫폼에 따라 타임스탬프 기본값 문법을 동적으로 선택합니다. 실제 프로젝트에서는 더 강력한 마이그레이션 전략이나, 각각 데이터베이스별로 별도 마이그레이션 파일을 둘 수도 있습니다.
마이그레이션 실행: 다음 명령으로 마이그레이션을 실행하여
users
테이블을 생성합니다.bashphp spark migrate
1성공하면 터미널에 성공 메시지가 출력되며 ServBay의 Adminer 등 DB 관리 도구로도
servbay_codeigniter_app
데이터베이스에users
테이블이 생성된 것을 확인할 수 있습니다.
데이터베이스 예제 접근
app/Config/Database.php
에서 DB 연결 정보를 정확히 입력하고, 마이그레이션으로 users
테이블을 만든 뒤 아래 URL로 각각 테스트하세요.
DB에 사용자 추가:
https://servbay-codeigniter-test.local/add-user
해당 URL 접속 시마다users
테이블에 새 유저가 추가됩니다.User added successfully: user_XXXXXXXXXX@servbay.demo
메시지를 확인할 수 있습니다.DB에 저장된 사용자 목록 조회:
https://servbay-codeigniter-test.local/list-users
이 URL은users
테이블 모든 레코드를 조회해 JSON 배열로 출력합니다.
요약
지금까지 macOS의 ServBay 환경에서 CodeIgniter 프로젝트의 생성, 초기 설정, 실행까지 모든 과정을 따라왔습니다. Composer로 프로젝트를 만들고, ServBay 웹사이트로 진입 디렉터리를 설정하며, 데이터베이스/캐시 연결 및 간단 예제를 통해 통합을 검증하는 방법까지 살펴봤습니다. ServBay를 활용하면 로컬 개발 환경 구축과 관리 절차가 크게 간소화되어, CodeIgniter 앱 개발에 더욱 집중할 수 있습니다.