본문 바로가기

기술

Codeigniter 4 버전 마이그레이션 기록

이번 포스팅에서는 Codeigniter 3.x 대비 4에서 달라진 점과 마이그레이션 history를 소개합니다.

 

Codeingiter 로고

1. 개발 초기 issue

오피스체크인 웹 개발 프로젝트를 시작할 때 PHP Framework로 Codeigniter 3 혹은 Laravel을 검토하였는데

당시 저희 개발팀 입장에서 다음과 같은 장/단점이 있었습니다.

 

  pros cons
Codeigniter 3.x 검증된 framework
익숙한 개발 환경
개발 속도 빠름
namespace 지원 안함
php 최신 버전 지원 안될 수 있음
출시된지 오래된 major 버전
Laravel 가장 인기있는 framework
잘 번역된 방대한 문서
다양한 기능의 library
진입장벽 있음
개발 속도 느림
(비교적) 잦은 업데이트

(표에 나온 장/단점은 당시 개발팀 입장으로 프레임워크 자체의 평가가 아닙니다.)

 

Codeigniter 3의 경우 개발팀에서 사용 경험도 많았고, 프레임워크에 대한 이해도나 재사용 가능한 코드도 많았지만

Laravel의 경우 컨셉부터 구조까지 상당히 달라 러닝커브가 높고 마감기한에 맞추기에는 무리가 있다 판단하였습니다.

 

초기 분할/합산 엔진이 들어간 시범 버전 개발이 필요하여 Codeigniter 3으로 개발을 시작하였습니다.

 

 

2. API Server에 Codeigniter 4 도입

2020년 2월에 Codeigniter 4.0.0 버전이 정식 릴리즈 되었습니다.

초기 버전은 검증되지 않은 터라 production 환경으로 사용하긴 어렵다고 판단하였으나 한 달 만에 patch 버전이 2번 나오는 등

빠른 업데이트로 인한 근거없는 신뢰감으로 관리자단에 먼저 도입하기로 결정하였습니다.

 

3점대 버전 대비 4 버전에서는 많은 것이 달라져 구조 파악에만 2~3일 소요되었습니다.

기본적인 컨셉은 달라지지 않았지만 namespace 지원을 시작으로 MVC 클래스의 구현 방법도 달라지고

router나 service 등 프레임워크 자체에 익숙해지는 데 시간이 걸렸던 거 같습니다.

 

관리자단에 먼저 도입을 결정한 건 API 서버가 필요했기 때문인데 codeigniter 4에서는

PUT, DELETE 같은 HTTP Method부터 URI 규칙까지 더 구조적인 방법으로 설정할 수 있으며

특히 RESTful 리소스 처리API Response Trait는 RESTful API 서버를 만드는데 빠르게 적용할 수 있었습니다.

 

Api Controller 소스코드 일부

 

프레임워크의 Validate 기능이 GET/POST 파라메터에서만 사용 가능하여 JSON 타입으로 주고받기 위해

파싱된 payload 데이터도 validate를 진행하도록 ApIController를 새로 만드는 등 추가 처리를 하였습니다.

 

3. 사용자단 Codeigniter 4로 마이그레이션

오피스체크인 PC 웹사이트에 해당하는 사용자단은 Codeigniter 3 버전으로 주요 기능 구현 중 이었습니다.

관리자단에 성공적인 도입 경험을 토대로, 모든 소스를 Codeigniter 4로 마이그레이션 시작하였습니다.

 

codeigniter 4로 프레임워크 변경 LOG

 

3 버전과 4 버전 모두 MVC(Model, View, Controller) 패턴에 기반하여 로직을 나누기를 권장하고 있어 해당 부분에 맞게 코드를 옮기는 데는 큰 구조적인 문제는 발생하지 않았습니다.

다만 프레임워크에서 지원하는 라이브러리의는 완전 새로 작성되어 기존과 호환되지 않았으므로 직접 구현하거나 교체하는데 시간이 소요되었습니다.

 

작업을 진행하면서 우려했던 프레임워크 자체의 문제도 지속적으로 발견되었는데 크고 작은 문제를 회피하거나

직접 core 쪽 소스를 수정하여 작업은 진행할 수 있었습니다.

발견된 문제는 3건중 2건은 직접 report 하여 차기 버전에서 버그 패치가 되었고 출시 시점에서는 버전 업그레이드로 해결할 수 있었습니다.

 

 

4.  Codeiginter 4에서 달라진 점

새로 작성된 만큼 여러 부분에서 차이가 있으며 특히 $this로 각 모듈에 접근하는 건 더 이상 사용하지 않습니다.

 

Codeigniter 4.0.x 주요 기능 관계도

 

프레임워크 주요 기능들의 차이점을 다음과 같이 정리해 보았습니다.

  기능 4.0.x 에서 달라진 점
Router URL 주소로 어떤 Controller와 Method를
호출할지 규칙 설정
배열에 규칙을 설정하지 않고 메소드 호출
namespace 단위로 중첩 가능
router에서 argument를 줄 수 있음
Controller 요청과 응답을 처리하는 주요 Class input 클래스가 사라지고 request 인자를 사용
view를 load하지 않고 echo로 표시
response 인스턴스를 반환해야 함 (오류코드 등)
View 데이터를 HTML 등 정해진 양식으로 표시 "<?= ?>" 형식 사용 권장
escape 처리를 위한 esc() 함수 제공
Model 데이터를 조작하기 위한 Class DB table명만 지정하면 CRUD 기능 제공
soft delete 지원
어디서든 model() 함수로 접근 가능
Filter Controller보다 먼저 요청을 받고 흐름 제어 가능. return 값(response)도 받아 추가 동작 수행 새로운 기능
Service 프레임워크의 기능 혹은 사용자 기능을 접근하기 위해 사용 CI3의 library를 대체하는 기능
어디서든 service() 함수로 접근 가능
(Controller에서만 사용 권장)

이 외에도 컨텐츠 협상이나 다국어 처리, 허니팟 같은 공격 수집 기능까지 다양한 기능이 추가되거나 개선되었습니다.

더 자세한 내용은 3.x에서 4.x로 업그레이드 문서를 참고하시기 바랍니다.

 

5. 참고 자료

한국어 번역 문서는 http://ci4doc.cikorea.net에서 볼 수 있으며, 특정 버전에서 마이그레이션이나 튜토리얼, 각 라이브러리 사용법까지 잘 정리되어 있습니다.

 

마지막으로 Codeigniter 2 부터 사용했던 개발자로서 국내 커뮤니티의 번역 노력으로 원활한 개발과 출시가 가능했음에 감사드립니다!