웹 개발할 때 주개발 환경으로 PHP의 Zend Framework(ZF)를 사용하고 있습니다. 대중적으로는 CodeIgniter가 많이 사용되는 PHP Framework이나 두 Framework를 테스트해본 경험으로는 ZF가 더 좋은 - 또는 PHP가 생존하기 위해서는 필요한 - Framework라고 생각하고 있습니다.
ZF2가 작년에 발표되었으나 초기 버전을 사용할 생각이 없어 계속 ZF1을 사용하다 이번에 개인적인 용도로 만든 안드로이드 앱 Viewzin의 웹서버 부분을 ZF2로 만들어 보았습니다. ZF2로 처음 만들어 본 단순한 웹 프로그램이기에 이야기할 것이 많지 않으나 개발하면서 느낀 기존 ZF1과의 몇가지 차이점을 간단하게 정리해볼까 합니다. 제목을 '간단 사용기'로 한 이유가 있죠 ^^;
개발에 사용한 버전은 2.2.1 입니다.
1. 프로젝트 생성
ZF2는 프로젝트의 초기 생성을 별도 서버에 있는 스켈톤 어플리케이션을 네트워크를 통해 가져오는 형태입니다. 가져올때는 Composer라는 프로그램을 이용하는 것을 권장하는데 이 Composer는 초기 프로젝트 셋업만이 아니라 프로젝트 안에 있는 서드파티 모듈들을 관리하는 역할도 하고 있습니다.
이런 구조는 ZF2부터는 서드파티 모듈 개발을 활성화시키기 위한 것이 아닌가 합니다. 실제로 ZF2 Module라는 별도 모듈 사이트를 운영하고 있습니다.
2. 개발 단계별 설정
ZF2가 아직 초기 버전이라서 그런지 최신 ZF1에도 있는 개발 단계별 - 개발, 테스팅, 실서비스 - 설정을 적용할 방법이 레퍼런스 문서에 명확하게 없습니다. ZF2의 구조를 파악하고 방법을 찾기는 했는데 ZF1 초기 버전처럼 개발자마다 구조에 차이가 생길 수 밖에 없는 형태같습니다.
프로그램 오류의 예외처리의 경우 제가 구현한 방법은 ZF1처럼 아파치에 환경 변수로 개발 단계를 표시하고 module.config.php에 환경별로 예외처리를 다르게 하는 방법을 선택했습니다.
이 문제만이 아니라 ZF2를 사용하면서 전반적으로 느껴지는 부분이 ZF1때보다 손이 많이 가는 것들이 있다라는 것입니다. 어떤 부분은 좀 JAVA스러운 부분도 있는 것 같고 어떤 부분은 이 '개발 단계별 설정'처럼 편리성면에서 이해가 힘든 부분도 있습니다.
3. View에서 Layout을 안쓰는 방법
역시 2번처럼 왜 이렇게 만들었을까 하는 생각이 들었던 부분입니다. ZF2에서는 기본적으로 layout 구조를 사용합니다. 그런데 이것을 어플리케이션 전체에서 사용하지 않게 하는 방법이 명확하지 않습니다. 설정에서 끄는 방법은 없고 각 액션에서 개별로 처리하거나 빈 layout 파일을 사용하는 꽁수같은 것만 있습니다. ZF2가 업데이트되면서 개선되었으면 하는 부분입니다.
4. DB 클래스 사용법
역시 ZF1때보다 복잡합니다. '복잡하다'라는 말을 반복하다보니 사용기가 아니라 '불평기' 같은 느낌입니다. ㅡ.ㅡ;
DB Adapter 클래스, Table 클래스 모두 ZF1 때와 사용 방법이 다릅니다. 특히 Select 객체를 사용할 때는 좀 복잡한 쿼리에는 PHP 5.3 부터 추가된 Closure라는 개념을 사용해 쿼리문을 생성해야 합니다. 예를 들면 아래와 같은 형태입니다.
$resultSet = $tableGateway->select(function(Select $select) use ($limit, $offset) {
$select->limit($limit)->offset($offset)
->order(new Expression("random()"))
->join('aaa', "bbb.data = aaa.idx",
array('data_name' => 'name'))
->where("aaa.view = 'Y'");
});
5. 콘트롤러에서 환경 설정에 접근
ZF2는 콘트롤러에서 어플리케이션 안의 리소스에 접근하는 방법으로 ServiceManaer 클래스를 사용합니다.
$conf = $this->getServiceLocator()->get('Config');
리턴된 값은 배열입니다. 이 ServiceManager 클래스는 일반 환경 설정만이 아니라 개발자가 작성한 데이타 모델 객체 등에도 접근할 수 있어 다양한 활용 방법이 있을 것 같으며 ZF2에서 필수적으로 이해해야하는 개념같습니다.
간단하게 5가지만 정리해 보았습니다. ZF2는 이름만 Zend Framework이지 기존 ZF1과는 여러가지 면에서 다르다라는 생각이 들었습니다. 소스 코드 호환도 되지 않고요.
아직 ZF를 사용해본 경험이 없다면 당연히 ZF2로 시작을 해야하겠지만 기존 서비스를 이미 ZF1으로 운영하고 계시는 분이라면 완전히 새로 개발해야하는 상황이라 작은 프로젝트부터 테스트 형태로 도입을 하는 것이 좋을 듯 합니다. 또한 ZF2는 PHP 5.3 이상부터 사용이 가능하고 네임스페이스 등 이전 버전에는 지원하지 않았던 개념들이 들어가 있기 때문에 5.3에 새롭게 추가된 기능들에 대해서도 사전 학습이 필요합니다.