CodeIgniter 프로젝트 생성 및 실행하기
CodeIgniter란 무엇인가요?
CodeIgniter는 경량이면서도 고성능의 PHP 웹 애플리케이션 개발 프레임워크입니다. Model-View-Controller(MVC) 디자인 패턴을 따르며, 개발자가 신속하게 기능이 풍부한 웹 애플리케이션을 구축할 수 있도록 설계되었습니다. CodeIgniter는 간결한 구조, 우수한 성능, 그리고 쉬운 학습 곡선을 제공하여 많은 PHP 개발자들에게 선호되는 프레임워크입니다.
CodeIgniter의 주요 특징 및 장점
- 경량화된 코어: CodeIgniter의 코어 시스템은 필수적인 기능만을 포함해 매우 가볍고, 로딩 속도가 빠릅니다.
- 탁월한 성능: 프레임워크 설계가 효율성에 중점을 두고 있어, 높은 동시 요청 처리와 뛰어난 애플리케이션 성능을 제공합니다.
- 쉬운 접근성: 명확한 문서와 직관적인 API를 제공하여, 개발자가 빠르게 익숙해질 수 있습니다.
- 높은 유연성: 프로젝트 요구에 따라 자유롭게 서드파티 라이브러리를 선택 및 통합할 수 있어, 기능 확장과 커스터마이징이 용이합니다.
- 활발한 커뮤니티 지원: 대규모이면서 활발한 개발자 커뮤니티가 풍부한 자료와 지원을 제공합니다.
CodeIgniter는 소규모 프로젝트부터 대규모 엔터프라이즈급 애플리케이션까지 다양한 개발 니즈에 적합하며, 개발자가 고품질의 웹 솔루션을 효율적으로 구현할 수 있도록 돕습니다.
ServBay를 활용한 CodeIgniter 개발환경 구축
ServBay는 macOS를 위해 설계된 로컬 웹 개발환경 통합 도구로, PHP, 데이터베이스(MySQL, PostgreSQL, MongoDB), 캐시(Redis, Memcached), 웹서버(Caddy, Nginx, Apache) 등 다양한 패키지를 제공하며, 편리한 관리 인터페이스를 갖추고 있습니다. ServBay를 이용하면 CodeIgniter에 필요한 개발환경을 손쉽게 세팅하고 관리할 수 있습니다.
이 문서에서는 ServBay의 PHP 환경 및 웹사이트 기능을 이용해 CodeIgniter 프로젝트를 생성, 구성, 실행하는 방법과 다양한 데이터베이스 및 캐시 서비스 통합 방법을 안내합니다.
사전 준비사항
시작하기 전에 아래의 준비가 완료되어 있는지 확인하세요:
- macOS에 ServBay를 성공적으로 설치 및 실행함
- ServBay에서 사용할 PHP 버전(예: PHP 8.3)을 활성화함
- ServBay에서 사용할 데이터베이스 및 캐시 패키지(예: MySQL, PostgreSQL, Redis, Memcached)를 활성화함
CodeIgniter 프로젝트 생성
ServBay에서는 웹사이트 프로젝트를 /Applications/ServBay/www
디렉터리에 통일하여 보관하는 것을 권장합니다. 이는 ServBay가 로컬 웹사이트를 효율적으로 관리하는 데 도움이 됩니다.
Composer 설치
ServBay에는 Composer가 기본 포함되어 있습니다. 별도의 수동 설치 없이 터미널에서 바로
composer
명령을 사용할 수 있습니다.웹사이트 루트 디렉터리로 이동
터미널을 열고, ServBay 권장 웹사이트 루트 디렉터리로 이동합니다:
bashcd /Applications/ServBay/www
1CodeIgniter 프로젝트 생성
Composer를 이용해 새로운 CodeIgniter 4 프로젝트를 만듭니다. 여기서는 프로젝트 디렉터리를
servbay-codeigniter-app
으로 지정합니다:bashcomposer create-project codeigniter4/appstarter servbay-codeigniter-app
1Composer가 CodeIgniter의 기본 애플리케이션 및 의존성을
servbay-codeigniter-app
디렉터리로 다운로드합니다.프로젝트 디렉터리로 이동
새로 생성한 CodeIgniter 프로젝트 디렉터리로 이동합니다:
bashcd /Applications/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의 기본 데이터베이스 사용자명과 비밀번호는 일반적으로 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
폴더에 있으므로, 사이트 루트는 반드시/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();
// 캐시에 값 쓰기 시도 (60초 캐시)
$success = $cache->save('servbay_memcached_key', 'Hello Memcached from CodeIgniter!', 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();
// 캐시에 값 쓰기 시도 (60초 캐시)
$success = $cache->save('servbay_redis_key', 'Hello Redis from CodeIgniter!', 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
정의에 추가하되, 기존 내용을 덮어쓰면 안 됩니다.
웹사이트 접속하기
이제 ServBay를 통해 CodeIgniter 프로젝트가 정상적으로 설정 및 실행되었습니다. 웹 브라우저를 열고, 앞서 지정한 도메인으로 접속해보세요:
홈페이지 접속:
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
1app/Database/Migrations
디렉터리에 새 PHP 파일이 생성됩니다.마이그레이션 파일 수정: 새롭게 생성된 마이그레이션 파일(예:
YYYY-MM-DD-HHMMSS_CreateUsersTable.php
)의up()
메서드를 열고,users
테이블 구조와 인덱스를 정의합니다. MySQL과 PostgreSQL의 자동 타임스탬프 기본값 표현이 약간 다름에 주의하세요(CURRENT_TIMESTAMP vs NOW()). 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 등)로
servbay_codeigniter_app
DB에users
테이블이 생성됐는지 확인해보세요.
데이터베이스 예시 기능 접속
app/Config/Database.php
파일에서 데이터베이스 접속 정보를 정확히 설정하고, 마이그레이션을 통해 users
테이블이 생성된 것을 꼭 확인하세요.
사용자 추가:
https://servbay-codeigniter-test.local/add-user
이 URL에 접근할 때마다users
테이블에 새 사용자 레코드가 추가됩니다. 성공 시,User added successfully: [email protected]
와 비슷한 메시지가 출력됩니다.사용자 목록 출력:
https://servbay-codeigniter-test.local/list-users
users
테이블의 모든 레코드를 JSON 배열 형태로 출력합니다.
요약
지금까지의 절차를 따라 macOS의 ServBay 환경에서 CodeIgniter 프로젝트를 성공적으로 생성, 설정, 실행할 수 있었습니다. 이 과정에서 Composer로 프로젝트 생성, ServBay의 웹사이트 기능을 통한 올바른 디렉터리 지정, CodeIgniter의 데이터베이스와 캐시 연결 설정, 그리고 예제 코드를 통한 데이터베이스/캐시 통합 테스트까지 경험했습니다. ServBay는 로컬 환경 구축과 관리를 매우 간단하게 하여, 개발자가 오직 CodeIgniter 애플리케이션 개발에 집중할 수 있도록 도와줍니다.