처음 php로 웹 개발을 하였고 codeigniter3를 사용하였다.
codeigniter4가 RC버전이 나올 때부터 codeigniter4를 이용하였다.
codeigniter3와 4의 차이점 4의 장점 및 특징과 느낀 점을 잊기 전에 정리하려고 한다.
인스턴스 생성 방법
가장 처음 눈에 크게 띄는 차이점이다.
codeigniter 4부터 네임스페이스를 사용하게 되고 컴포넌트들을 불러오는데 큰 차이가 있다.
기존에는 싱글톤으로 인스턴스를 생성하여 사용하던 방식과는 많이 다르다.
// codeigniter 3
$this->load->library("message");
$this->message->action();
$this->load->model("user");
$user = $this->user->get();
// codeigniter 4
$messageLibrary = new /Libraries/Message();
$messageLibrary->action();
$userModel = new /Models/user();
$user = $userModel->get();
codeigniter는 뷰가 강조된(?) 프레임워크로 주로 가벼운 웹사이트 정도 구현하는데 적합하였다.
또한 php 5부터 클래스가 생기고 객체지향으로 사용할 수 있는 기능들이 생겨났기 때문에
codeigniter3는 객체지향으로 개발하지 않는다.
하지만 php가 점점 버전업이 되면서 객체지향을 위한 기능들이 생겨나고 있고,
php 7.2가 최소 버전인 codeigniter 4에는 객체를 사용하게 되어 인스턴스 생성 방법도 차이가 있는 것 같다.
객체지향
여기서 레거지 php와 모던 php 함수의 차이를 알아보면 다음과 같다.
두 함수 모두 같은 값을 반환한다.
과거 date_create()로 사용하던 것을 최근에는 new DateTime()으로 사용하면서
php의 패러다임 변화로 인하여 프레임워크에 많은 변화가 생긴 것으로 보인다.
타입
이것 역시 php의 변화로 인해 생긴 것 같다.
php 몇 버전부터 메서드의 파라미터와 반환 값에 타입을 명시할 수 있고, 7.4부터는 클래스의 멤버 변수에도 타입을 명시할 수 있다.
그래서 타입을 이제는 명시해서 사용한다.
하지만 codeigniter4가 php 7.2부터 지원하기 때문에 클래스 멤버 변수의 타입은 명시하지 않는다.
그리고 함수의 반환 타입 같은 경우는 주석으로 @return mixed로 되어있고 명시하지 않는 경우도 있었던것 같다.
(찾아서 pr 날려봐야겠다.) [codeigniter 4 contributer 되기]
표기법
codeigniter3은 스네이크 케이스, codeigniter4는 카멜 케이스를 사용한다.
이것 역시 php의 변화에 따라 프레임워크도 변하였다고 생각한다.
엔티티
영속성 컨텍스트인 엔티티를 지원하며, 공식 문서에서 기존 퍼시스턴스 레이어인 Models 디렉토리를 Repositories로 변경해서 사용하라고도 한다.
기존에 모델에서 데이터를 전송할때 php의 연관 배열을 사용하였다.
매우 편리한듯 하였으나 규모가 커짐에 따라 점차 난해 해지는 경험을 하였다.
엔티티를 사용하고 객체를 사용해서 이 부분을 많이 개선할 수 있었다.
하지만 테이블간 join을 하는 경우 스프링의 간편함과는 거리가 멀다.
스프링에서 어노테이션으로 제공하는 기능들을 구현해야 하는 덕분에(?) lazy loading도 구현하게 되었고 재밌었다.
RESTful 리소스 처리
공식 문서의 한 챕터명이다. 이 뜻은 rest api를 만드는데 도움을 주는 기능들이 생겼다 정도로 생각하면 될 듯하다.
기존에 codeigniter3는 rest api를 만들기 위해 외부 라이브러리를 적용하여 개발하였다.
http method로 함수를 매핑해주는 기능이 없어서 사용했던 것 같다.
스프링처럼 @GetMapping("/users"), @PostMapping,,, 이러한 역할을 하는 것이
라우터에서 가능하다.
$routes->resource('photos'); // 이 한 줄이 아래와 같은 역할을 함
// Equivalent to the following:
$routes->get('photos/new', 'Photos::new');
$routes->post('photos', 'Photos::create');
$routes->get('photos', 'Photos::index');
$routes->get('photos/(:segment)', 'Photos::show/$1');
$routes->get('photos/(:segment)/edit', 'Photos::edit/$1');
$routes->put('photos/(:segment)', 'Photos::update/$1');
$routes->patch('photos/(:segment)', 'Photos::update/$1');
$routes->delete('photos/(:segment)', 'Photos::delete/$1');
편리하게 자동 생성해주는 기능도 제공하지만 대규모 어플리케이션에서는 필요가 없을 것으로 보이며, codeigniter는 소규모 어플리케이션에 적합할 것 같다고 생각한다.
.env 파일
스프링에서 application.properties라고 생각하면 된다.
이 부분이 생겨서 운영서버와 테스트 서버, 개발 서버 간에 환경을 다르게 해 줄 때 좋았던 것 같다.
index.php의 위치
기본적으로 디렉토리가 약간씩 다른 것도 있지만
가장 큰 변화는 index.php의 위치가 달라졌고 큰 의미가 있다고 생각한다.
codeigniter3는 프로젝트 루트에 index.php 파일이 존재한다.
codeigniter4는 프로젝트 루트에 public이라는 디렉토리 안에 index.php가 존재한다.
이 뜻은 웹서버에서 바라보는 root 경로가 codeigniter3는 프로젝트 루트이고 codeigniter4는 public 디렉토리여야 한다는 것이다.
물론 일반적인 경우에서는 그렇지 않지만 잘못된 구현과 잘못된 접근으로 소스 파일이 접근되고 유출될 수가 있다...있었다..있었었다.
이 문제는 꼭 index.php 파일의 위치 때문만은 아니지만..
Composer
codeigniter4는 composer로 설치하고 의존성 관리가 가능하다.
codeigniter3는 composer로 프레임워크가 설치는 안되는 것 같고 의존성 관리도 아마 composer로 설치하고 따로 경로를 추가해 주어야 하는 것으로 알고 있다. (정확하지 않음)
따라서 codeigniter3에서는 composer를 사용하지 않았는데 codeigniter4에서 composer를 사용하여 편리하게 필요 라이브러리들을 사용할 수 있었다.
마무리
스프링으로 개발을 하면서 스프링의 방대함에 기존 코드이그나이터에 대한 지식이 오버라이딩 될 것 같아서 그전에 정리해 보았다.
codeigniter4가 나오면서 많이 모던해진 느낌은 있지만 충분히 php의 다른 좋은 프레임워크들도 많다.
slim php는 python의 flask 같았고, laravel은 php 계의 spring(?)이다.
개인적으로 가볍게 php로 웹 어플리케이션을 만들어야 한다면 slim php를 사용하는 것도 좋을 것 같고,
코드이그나이터는 러닝 커브가 짧은 게 큰 강점인 것 같다.
다음에는 php 프레임워크들에 대해 정리하여 포스팅해보면 좋을 것 같다.
'공부 > PHP' 카테고리의 다른 글
PHP 8.0 출시! 새로운 기능 알아보기 (2) | 2020.11.29 |
---|---|
내가 만든 PHP composer package를 packgist.org 에 등록하기 (0) | 2020.07.27 |
[PHP] APCu 프로세스 간 자원 공유 (0) | 2020.07.16 |
Alternative PHP Cache (APC) (0) | 2020.07.10 |
PHP에서 Closure로 Lazy loading 구현하기 (0) | 2020.05.29 |