> 요약: 2013년에 CodeIgniter 책을 쓰고 13년이 지났다. 그동안 CI는 전역 슈퍼 객체와 `load->` 호출 중심의 프레임워크에서, 네임스페이스·Composer·Spark를 갖춘 CI4로 바뀌었다. 프레임워크가 어떻게 달라졌고 무엇이 그대로인지, 한국 PHP 커뮤니티의 흐름과 함께 돌아본다.
2013년에 《만들면서 배우는 CodeIgniter》를 냈다. 올해로 13년이 지났다. 그 사이 PHP는 5.x에서 8.5까지 올라갔고, 지금 쓰는 CodeIgniter는 4.7.4다. 이 글은 책을 쓸 때의 CI와 지금의 CI4를 나란히 놓고, 책이 나오기까지 함께한 사람들과 한국 PHP 커뮤니티의 흐름을 돌아보는 회고다.
책이 나오기까지: 매뉴얼 번역과 포럼
책은 혼자 쓴 것이 아니라 커뮤니티에서 나왔다. 내가 CodeIgniter 한국 사용자 포럼(cikorea.net)을 운영하던 때, 한빛미디어 IT 서적 담당자에게서 연락이 왔고 "만들면서 배우는..." 시리즈로 출간하게 되었다.
그 포럼의 시작은 한글 매뉴얼이 없다는 불편이었다. 당시 CI 사용자들은 부족한 영어 실력으로 공식 매뉴얼을 번역해 가며 실무에 적용하고 있었다. 나도 그중 한 명이었다. 매뉴얼을 번역해 개인 블로그에 올린 분이 있었는데, 바로 최용운 님이다. 그 블로그 댓글에서 알게 된 여러 사람이 번개 모임을 열었고, 그 자리에서 "사이트를 만들자"는 이야기가 나왔다. 내가 가지고 있던 소스로 사이트를 열었고, 7명 남짓이 비용을 나눠 도메인을 샀다.
모임은 한 달에 한 번 오프라인 정모를 기본으로 이어졌다. 정모는 꽤 오랜 기간 계속되었고 포럼이 활성화되는 가장 큰 요소였다. 장소는 서울 곳곳을 돌았다. 신촌, 강남, 사당, 공덕, 신림, 마포처럼 지하철역 근처에서, 그달 정모를 맡은 운영진이 장소를 정했다. 많을 때는 40명 정도가 모였다. 공식 모임은 1차까지인데 2차에도 거의 모든 인원이 이동해서, 자리를 잡기가 어려울 정도였다. 정모에서는 개발 이야기를 하지 않는 것이 국룰이었다. 다양한 직군이 함께하는 자리라서 그랬다. 그래도 어쩌다 한번 개발 이야기가 터져 나오면 1시간씩 설전이 오가곤 했다. 나온 지 하루 만에 운영진이 된, 친화력이 엄청난 개발자도 있었다. 참석자는 개발자만이 아니었다. 기획자, 디자이너, 회사 대표, 외과 의사, 세무사까지 다양한 분야의 사람을 정모에서 만났다. 책의 바탕에는 이런 질문과 답이 오가던 자리가 있었다.

책을 쓸 때의 CodeIgniter
책에서 다룬 CI는 2.1.x대다. 예제 소스에 번들된 코어는 `todo`와 `bbs`가 2.1.0, `sns`가 2.1.3이다.
예제는 세 가지 프로젝트로 구성했다. 할 일 목록(`todo`), 게시판(`bbs`), SNS(`sns`)다. 소스와 DB 덤프를 압축해 두고, 압축을 풀어 Apache에 올린 뒤 `dump.sql`을 넣으면 바로 돌아가게 했다. Composer도 `.env`도 없던 시절이라 설치 설명이 이 정도로 끝났다.
2013년 무렵의 CI는 "가볍고 배우기 쉽다"가 가장 큰 장점이었다. 설치는 압축 파일을 풀어 서버에 올리면 끝이었고, 설정은 `application/config/` 아래 PHP 파일을 고치면 됐다. 컨트롤러에서 모델과 뷰를 불러오는 방식은 지금 보면 독특하다.
```php
// CI2 시절의 전형적인 컨트롤러
class Board extends CI_Controller {
function __construct()
{
parent::__construct();
// 모델·헬퍼는 전역 로더로 불러온다
$this->load->model('board_m');
$this->load->helper('form');
}
// 모든 요청의 앞뒤에 헤더·푸터 뷰를 붙인다
public function _remap($method)
{
$this->load->view('header_v');
if( method_exists($this, $method) )
{
$this->{"{$method}"}();
}
$this->load->view('footer_v');
}
}
```
위 코드는 책 예제의 게시판 컨트롤러에서 줄여 온 것이다. (파일 맨 위에는 `BASEPATH` 확인 줄이 있었다.)
특징을 정리하면 이렇다.
- 클래스는 전역 네임스페이스에 있고, `CI_` 접두사로 충돌을 피했다.
- `$this->load->...` 로 필요한 것을 런타임에 불러온다. 의존성이 코드에 드러나지 않는다.
- 타입 선언도, 반환 타입도 없었다. PHP 자체가 그런 시대였다.
- 외부 라이브러리는 `application/libraries/`에 파일을 직접 복사해 넣는 경우가 많았다.
단점이 분명했지만 그 단순함 덕분에 초보자가 "웹 요청이 어떻게 처리되는지"를 한눈에 볼 수 있었다. 책의 목표도 거기에 있었다.
같은 화면을 CI4로 만들면
CI4에서 같은 동작을 쓰면 이렇게 된다.
```php
declare(strict_types=1);
namespace App\Controllers;
use App\Models\BoardModel;
final class Board extends BaseController
{
public function view(int $id): string
{
$post = model(BoardModel::class)->find($id);
return view('board/view', ['post' => $post]);
}
}
```
겉모습은 비슷하다. 하지만 바뀐 것은 코드 모양이 아니라 전제다.

- 네임스페이스와 PSR-4 오토로딩. `$this->load->` 대신 `use`와 `model()` 헬퍼를 쓴다. 의존성이 파일 맨 위에 보인다.
- Composer가 기본이다. 프레임워크 설치부터 외부 패키지까지 `composer`로 관리한다. 파일을 복사해 넣던 습관과 작별했다.
- `public/` 분리. 웹 루트에는 `public/`만 노출한다. 설정 파일이나 소스가 URL로 닿을 일이 줄었다.
- `.env` 기반 설정. DB 계정 같은 비밀은 코드에 넣지 않고 환경 변수로 분리한다.
- Spark CLI. `php spark make:controller`, `php spark routes`, `php spark migrate`처럼 개발 도구가 명령줄에 있다.
- 필터와 마이그레이션, 엔티티. 인증 같은 공통 처리는 필터로, 스키마 변경은 마이그레이션으로 관리한다.
- PHP 요구 버전. 최근 4.x는 현대적인 PHP(8.1 이상)를 전제로 한다. 타입 선언, `readonly`, enum 같은 문법을 그대로 쓸 수 있다.
참고로 지금 내가 쓰는 환경은 CodeIgniter 4.7.4, PHP 8.5.12다.
무엇이 그대로인가
13년이 지나도 변하지 않은 것도 있다.
- MVC의 감각. 라우트 → 컨트롤러 → 모델/뷰라는 흐름은 같다. 책의 3~4장을 읽은 사람이 CI4 코드를 열어도 길을 잃지 않는다.
- 가볍다는 인상. 라라벨이나 심포니에 비해 CI4는 여전히 구조가 적고 눈에 보이는 마법이 적다.
- "프레임워크가 해주지 않는 것은 직접 쓴다"는 태도. 도메인 로직을 어디에 둘지는 여전히 개발자 몫이다. 나는 컨트롤러를 얇게 두고 서비스·모델에 로직을 모으는 방식을 선호한다.
바뀐 것은 프레임워크가 초보자에게 감춰주던 것들이다. 예전에는 감춰져 있던 의존성, 설정, 배포 경로가 이제는 코드와 도구로 드러난다. 처음에는 진입 장벽이 높아졌다고 느낄 수 있다. 그 대신 테스트, 정적 분석, CI 같은 현대적인 개발 습관을 얹기 쉬워졌다.
한국 PHP 커뮤니티의 변화
앞에서 적은 포럼 이야기가 내가 겪은 변화의 출발점이다. 한글 매뉴얼조차 없어서 사용자가 직접 번역하던 시절에서, 지금은 한국어로 된 자료와 도구가 넘치는 시절이 되었다. 체감한 변화를 몇 가지로 나눠 본다.
1. 프레임워크 선택지가 늘었다. 책을 쓸 때는 "PHP 프레임워크 = CodeIgniter"에 가까운 분위기였다. 이후 라라벨이 대세가 되고 심포니 컴포넌트가 널리 쓰이면서 선택지가 넓어졌다. CI는 "가볍고 빠르게 만드는 선택지" 중 하나가 되었다.
2. 개발 도구가 표준화됐다. Composer, PSR, PHPStan, PHPUnit 같은 도구가 자리 잡았다. 예전에는 "FTP로 올리고 끝"이던 배포가 CI/CD로 바뀐 곳이 많다.
3. 정보 공유 방식이 바뀌었다. 예전에는 포럼 게시판과 월 1회 오프라인 정모가 지식이 오가는 중심이었다. 지금은 블로그, 오픈소스 저장소, 온라인 채널로 분산되었다.
4. PHP 자체가 달라졌다. PHP 7에서 성능이 크게 오르고, 8에서 enum·`match`·속성(attribute) 같은 현대적 문법이 들어왔다. "PHP는 구식"이라는 인상은 많이 옅어졌다.
운영진과 MT
정모만 모이던 모임이 커지면서 MT도 다녀왔다. 포럼의 운영 포인트가 늘어나자 역할을 나누었다. 질문 답변만 맡는 운영진, 정모만 진행하는 운영진처럼 각자 잘하는 일을 나눠 맡았고, 많을 때는 운영진이 10명 정도였다. 한 사람이 다 하지 않아도 되는 구조가 포럼이 오래 간 이유 중 하나였다고 생각한다.
포럼이 가져다준 것들
포럼 덕분에 많은 일이 따라왔다. 책 출간이 시작이었고, 이어서 강의와 세미나, 개발자 행사 참여, 유료 교육까지 하게 되었다. "웅파"라는 필명이 알려지면서 개인적으로 프로젝트 의뢰도 들어왔다.
혼자 감당할 수 없는 일은 포럼 운영진과 개인적으로 친했던 회원 중 시간이 되는 사람들과 함께 진행했다. 어떤 때는 월급보다 많이 벌기도 했다. 오프라인 정모에서 얼굴을 익힌 사람들과 일하니 서로의 실력과 성격을 이미 알고 시작하는 셈이었다. 커뮤니티가 일자리와 동료를 만들어 준 것이다.
포럼을 닫으며
포럼은 올해(2026년) 대부분의 기능을 닫았다. 지금은 예전 글 아카이브, 매뉴얼 번역과 실제로 동작하는 예제, 연락처(info@cikorea.net)만 남아 있다.
포럼은 오랫동안 회원 기부로 유지되었다. 매년 12월에 일정 기간 기부를 받고, 그 금액만큼 가상 서버와 도메인을 연장하는 방식이었다. 그 덕분에 포럼을 닫은 뒤에도 도메인은 몇 년 더 유지된다. 남은 콘텐츠는 가장 저렴한 웹호스팅으로 옮기고, 그 비용은 남아 있는 운영진이 기부해 3년 더 연장할 계획이다. 그리고 남아 있던 회비는 [우분투 한국 커뮤니티](https://discourse.ubuntu-kr.org/t/topic/52267)에 기부했다. 커뮤니티가 모은 돈을 다른 커뮤니티로 돌려보낸 셈이다.
가장 크게 달라지지 않은 것은 사람이다. 개발자, 기획자, 디자이너, 대표, 의사, 세무사가 한 테이블에 앉아 같은 도구를 이야기하던 정모의 풍경은, 기술이 바뀌어도 커뮤니티가 왜 필요한지를 보여 준다.
13년 동안 배운 것
- 커뮤니티가 책보다 먼저다. 번역 블로그에 단 댓글이 번개가 되고, 번개가 포럼이 되고, 포럼이 책과 강의, 일거리가 되었다.
- 단순함은 출발점이지 종착점이 아니다. CI2의 단순함이 입문에 좋았다면, CI4의 구조는 오래 유지보수하기 좋다.
- 프레임워크보다 습관이 오래 간다. 얇은 컨트롤러, 서비스 계층, 테스트, 비밀 값 분리 같은 습관은 CI2든 CI4든 라라벨이든 똑같이 통한다.
- 오래 쓰는 도구는 변하면서 산다. 한때 멈춘 듯 보이던 프로젝트도 커뮤니티 손에서 다시 현대화될 수 있다는 것을 13년 사이에 봤다.
2013년의 독자가 지금 책을 다시 펼친다면 코드는 많이 낡았다고 느낄 것이다. 그래도 요청이 들어와서 응답이 나가기까지의 길을 눈으로 따라가는 연습은 여전히 유효하다고 생각한다. CI4에서 같은 길을 다시 걸어 보고 싶다면 `composer create-project codeigniter4/appstarter`로 시작해 `php spark serve`를 띄워 보기를 권한다.
```bash
composer create-project codeigniter4/appstarter my-app
cd my-app
php spark serve
```

댓글 0개