Erzsamatory Weblog


※ 외국 문서 번역 자료입니다.

원문: Fundamentals - Path Alias and Namespace (http://goo.gl/2FfPqE)


Yii 에서는 광범위하게 경로 별칭을 사용합니다. 경로 별칭은 디렉터리와 파일 경로에 의해서 만들어집니다. 경로 별칭은 점(.)으로 그 사이를 구분하고 다음과 같은 형태로 만들어집니다.

RootAlias.path.to.target


RootAlias는 실제로 존재하는 디렉터리의 경로를 의미합니다.

YiiBase::getPathOfAlias() 메소드를 사용함으로써 Yii 에서 사용되는 경로 별칭을 시스템에서 실제로 사용되는 경로로 변환할 수 있습니다. 예를 들어, system.web.CController 는 이 메소드를 통해서 다음과 같이 변경됩니다. ㅡ yii/framework/web/CController

또한 개발자는 YiiBase::setPathOfAlias() 메소드를 사용하여 실제의 시스템 경로를 Yii 에서 사용되는 경로 별칭으로 변환할 수도 있습니다.


사용자 삽입 이미지


1. 기본 루트 경로 별칭


편의를 위하여, Yii 에서는 기본적으로 정의되는 경로 별칭이 있습니다. 기본적으로 정의되는 경로 별칭은 다음과 같습니다.
  • system: Yii Framework가 설치된 디렉터리 경로
  • zii: Zii 라이브러리 디렉터리 경로
  • application: 실행되고 있는 어플리케이션의 루트 디렉터리 경로
  • webroot: 엔트리 스크립트가 위치해 있는 디렉터리 경로
  • ext: 확장 스크립트가 위치해 있는 디렉터리 경로

추가적으로, 어플리케이션에서 모듈을 사용할 때에는, 해당 모듈의 스크립트 파일이 위치해 있는 디렉터리의 경로가 위와 같은 방법으로 미리 정의됩니다. 예를 들어, 어플리케이션에서 users 모듈을 사용하는 경우, 루트 경로 별칭에 users 가 미리 정의됩니다.


2. 클래스 불러오기


경로 별칭을 사용하면, 클래스를 불러오는 작업이 아주 쉬워집니다. 예를 들어, CController 클래스를 불러오고자 할 때에는 다음과 같은 방법을 사용하면 됩니다.

Yii::import('system.web.CController');

import 메소드를 이용하는 것은 include나 require를 사용하는 것보다 효율적입니다. 왜냐하면 import 메소드를 통해서 로드된 클래스는 실제로는 스크립트 문서에 곧바로 포함되는 것이 아니기 때문입니다. 다만, 클래스의 목록만 만들어질 뿐이며, 개발자가 처음으로 해당 클래스를 사용할 때, 해당 클래스의 실행 소스코드가 스크립트 문서에 정식으로 포함됩니다. 이는 PHP 오토로딩 매커니즘을 따르는 것입니다. 하지만 import 메소드는 지정된 디렉터리의 하위 디렉터리에 있는 클래스는 불러오지 않는다는 점을 반드시 기억해야 합니다.

Yii 에서 기본적으로 필요로 하는 클래스는 개발자가 직접 불러올 필요가 없습니다. 왜냐하면 Yii의 모든 코어 클래스는 자동으로 프리로드되기 때문입니다.


클래스 맵 사용하기


1.1.5 버전부터는 사용자가 직접 정의한 클래스에 대하여, Yii 코어 클래스에서 그랬던 것과 같이, 클래스 매핑 매커니즘을 이용한 클래스 프리로드를 공식적으로 지원합니다. 프리로드된 클래스는 Yii 어플리케이션 모든 곳에서 따로 불러올 필요 없이 곧바로 사용이 가능합니다. 이 기능은 Yii 보다 상위에서 작동해야 하는 기능을 구현할 때 아주 유용하게 사용될 수 있을 것입니다.

클래스를 프리로드하기 위해서는 CWebApplication::run() 메소드가 실행되기 전에 반드시 다음 코드가 먼저 실행되어야 합니다.

Yii::$classMap=array(
    'ClassName1' => 'path/to/ClassName1.php',
    'ClassName2' => 'path/to/ClassName2.php',
    ......
);


3. 디렉터리 포함시키기


개발자는 디렉터리 내부에 있는 모든 클래스 스크립트를 불러오고자 할 때에는 다음과 같은 방법을 사용할 수 있습니다. 물론 이 방법 역시 프리로드하는 것이기 때문에 실제로 해당 클래스가 문서에 포함되는 시점은 처음으로 해당 클래스가 사용될 때입니다.

Yii::import('system.web.*');


import 메소드 외에도, 경로 별칭은 클래스의 경로를 나타낼 때 아주 다양한 곳에서 사용됩니다. 예를 들어, 개발자는 Yii::createComponent() 메소드에 클래스 경로 별칭을 전달함으로써 이에 대응하는 클래스의 인스턴스를 획득할 수 있습니다. 물론 이 방법은 클래스가 프리로드되지 않았을 때에도 가능합니다.


4. 네임스페이스


네임스페이스는 몇 개의 클래스를 하나의 그룹으로 묶는 로직상의 정의입니다. 네임스페이스를 이용하면 클래스 이름이 중복되더라도 네임스페이스가 다르다면 오류가 발생하는 것을 방지할 수 있기 때문에, 클래스 모듈화를 할 때 주로 사용됩니다. 네임스페이스는 가상의 로직 정의이기 때문에 원칙적으로 경로 별칭을 사용하지 않습니다. 경로 별칭은 파일이나 디렉터리의 복잡한 시스템 경로를 개발자가 사용하기 편하도록 해주는 것이기 때문입니다.

PHP 5.3.0 미만 버전에서는 네임스페이스를 지원하지 않기 때문에, 개발자는 동시에 같은 이름을 가지는 클래스를 로드할 수가 없습니다. 다만 Yii 에서는 사용자가 정의한 클래스와의 차별성을 위하여 자체 코어 클래스에는 클래스를 의미하는 C 접두어를 사용합니다. C 접두어는 Yii 코어 클래스에서만 사용되어야 하는 것이므로, 자신이 개발한 클래스에 접두어를 넣고자 한다면 C가 아닌 다른 알파벳을 접두어로 사용해야 합니다.


5. 네임스페이스가 적용된 클래스


Yii 에 포함되어 있는 모든 클래스는 기본적으로 비 전역 (Non-Global) 네임스페이스 내부에 한 개의 클래스로서 정의됩니다. 예를 들어, application\components\GoogleMap 클래스는 application\components 네임스페이스 내부에 인스턴스가 생성됩니다. 네임스페이스가 적용된 클래스는 PHP 5.3.0 이상의 버전부터 사용이 가능합니다.

Yii 1.1.5 버전부터는, 따로 사용하고자 하는 클래스를 스크립트에 포함시키지 않더라도, 개발자는 네임스페이스가 적용된 클래스를 사용할 수가 있습니다. 예를 들어, 개발자가 application\components\GoogleMap 클래스의 새로운 인스턴스를 생성할 때, 해당 클래스 파일을 로드하지 않아도 됩니다. 왜냐하면 Yii 는 향상된 PHP 오토로딩 매커니즘을 지원하기 때문입니다.

네임스페이스가 적용된 클래스를 오토로드하기 위해서는, 경로 별칭을 사용해야 하는데, 이 경로 별칭은 앞서 설명했던 클래스의 그것과 동일한 방법으로 사용됩니다. 예를 들어, application\components\GoogleMap 클래스는 반드시 application.components.GoogleMap 경로 별칭을 사용하여 로드되어야 합니다.

만약, /var/www/common/mynamespace/ 에 저장된 클래스를 \mynamespace 네임스페이스에 포함시키고자 하는 경우에는, 개발자는 다음과 같은 방법으로 새로운 네임스페이스를 생성할 수 있습니다.

Yii::setPathOfAlias('mynamespace', '/var/www/common/mynamespace/');


6. 네임스페이스가 적용된 컨트롤러


기본적으로 Yii 에서 컨트롤러는 전역 네임스페이스 내부에 저장됩니다. 모든 컨트롤러 클래스는 protected/controllers 에 저장됩니다. 개발자는 다음 두 가지 방법 중 하나를 사용하여 컨트롤러 네임스페이스를 변경할 수 있습니다. ㅡ 컨트롤러 맵을 사용하거나 컨트롤러네임스페이스를 사용하여 컨트롤러 네임스페이스를 제어할 수 있습니다.

컨트롤러맵 사용하기


컨트롤러 맵을 변경하는 가장 좋은 방법은 Yii 어플리케이션 설정 파일 (protected/config/main.php) 을 사용하는 것입니다.

// adding "mynamespace" namespace
Yii::setPathOfAlias('mynamespace', '/var/www/common/mynamespace/');
   
return array(
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
    'name'=>'My Web Application',
    
    'controllerMap' => array(
        'test' => '\mynamespace\controllers\TestController',
    ),

개발자가 컨트롤러맵에 정의된 컨트롤러를 불러오고자 할 때, Yii 는 기본 컨트롤러 클래스를 로드하는 것과 같은 방법으로 해당 컴포넌트의 클래스를 불러옵니다. 예를 들어, 위 설정 파일에서 컨트롤러맵에 정의된 test 컨트롤러를 사용하고자 할때에는, Yii는 \mynamespace\controllers\TestController 컨트롤러 클래스를 /var/www/common/mynamespace/controllers/TestController.php 에서 불러올 것입니다.

해당 컨트롤러 클래스는 반드시 적당한 네임스페이스 내에 있어야 함을 잊어서는 안 됩니다.

// define namespace:
namespace mynamespace\controllers;
  
// since class is now under namespace, global namespace
// should be referenced explicitly using "\":
class TestController extends \CController
{
    public function actionIndex()
    {
        echo 'This is TestController from \mynamespace\controllers';
    }
}


 컨트롤러네임스페이스 사용하기


어플리케이션은 모듈 그 자체이기 때문에, 개발자는 네임스페이스가 적용된 모듈과 같은 방법으로 원하는 컨트롤러에 네임스페이스를 부여할 수가 있습니다.


7. 네임스페이스가 적용된 모듈


때때로 사용하는 모든 모듈에 대하여 네임스페이스를 적용시키는 것이 유용할 수도 있습니다. 예를 들어, /var/www/common/mynamespace/modules/testmodule 에 대응되는 \mynamespace\modules\testmodule 에 위치하고 있는 testModule를 사용하고자 할 때, 개발자는 먼저 다음과 같은 파일 구조를 만들어야 합니다.

/var/www/common/mynamespace/modules
  testmodule
    controllers
      DefaultController.php
    views
      default
        index.php
    TestmoduleModule.php

index.php 뷰는 일반적인 모듈의 그것과 동일합니다. TestmoduleModule.phpDefaultController.php는 네임스페이스가 적용된 클래스 파일입니다.

TestmoduleModule.php


// define namespace:
namespace mynamespace\modules\testmodule;
 
// since class is now under namespace, global namespace
// should be referenced explicitly using "\":
class TestmoduleModule extends \CWebModule
{
    // setting non-global controllers namespace (also can be done via config)
    public $controllerNamespace = '\mynamespace\modules\testmodule\controllers';
 
    // usual module code
}


DefaultController.php


<?php
// define namespace:
namespace mynamespace\modules\testmodule\controllers;
 
// since class is now under namespace, global namespace
// should be referenced explicitly using "\":
class DefaultController extends \Controller
{
    public function actionIndex()
    {
        $this->render('index');
    }
}


여기까지 설명한 것과 같이 모듈과 관련된 모든 파일을 구성했다면, 모듈을 실제로 사용하기 위해서는 어플리케이션에 이 모듈을 등록해야 합니다. 어플리케이션에 모듈을 등록하는 가장 좋은 방법은 설정 파일 (protected/config/main.php) 을 사용하는 것입니다.

// adding "mynamespace" namespace
Yii::setPathOfAlias('mynamespace', '/var/www/common/mynamespace/');
 
return array(
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
    'name'=>'My Web Application',
 
    'modules'=>array(
        'testmodule' => array(
            'class' => '\mynamespace\modules\testmodule\TestModuleModule',
        ),
    ),

목차
1. 시작하기
     1-1. Yii란 무엇인가?
     1-2. 설치
     1-3. 아파치 웹서버와 Nginx 설정
     1-4. 첫 Yii 어플리케이션 생성

2. 기본 개념
     2-1. 모델-뷰-컨트롤러 (MVC)
     2-2. 엔트리 스크립트
     2-3. 어플리케이션
     2-4. 컨트롤러
     2-5. 모델
     2-6.
     2-7. 컴포넌트
     2-8. 모듈
     2-9. 경로 별칭과 네임스페이스 (현재 페이지)
     2-10. 일반 규칙
     2-11. 개발 흐름 (Workflow)
     2-12. MVC 예제

3. 양식(Form) 사용 연습
     3-1. 개요
     3-2. 모델 생성
     3-3. 액션 생성
     3-4. 양식 생성
     3-5. 테이블 추출
     3-6. 양식 생성기 사용하기

4. 데이터베이스 사용 연습
     4-1. 개요
     4-2. DB 액세스 객체
     4-3. 쿼리 빌더
     4-4. 동적 레코드
     4-5. Relational Active Record
     4-6. 데이터베이스 변환

5. 캐싱
     5-1. 개요
     5-2. 데이터 캐시
     5-3. 부분 캐시
     5-4. 페이지 캐시
     5-5. 동적 컨텐츠

6. Yii 확장
     6-1. 개요
     6-2. 확장 사용하기
     6-3. 확장 생성하기
     6-4. 써드파티 라이브러리 사용하기

7. 테스트
     7-1. 개요
     7-2. Defining Fixtures
     7-3. Unit Testing
     7-4. Functional Testing

원문: http://www.yiiframework.com/doc/guide/
http://www.erzsamatory.net/trackback/65

건전한 댓글 문화를 만들어주시기 바랍니다 ^^
불건전한 댓글이 등록되는 경우 관리자의 임의적 판단으로 삭제될 수 있음을 미리 공지드립니다.

비밀글로 작성하기
  1. 2014/02/27 10:45
    잘 모르는 내용이라 인사만 드리고 갑니다. 좋은 하루 되세요...^^
    • Walter E.
      Walter E.
      2014/05/06 09:56
      PHP를 이용해서 웹을 개발할 때 아주 유용하게 사용될 수 있는 프레임워크입니다.

      자바스크립트의 jQuery와 비슷하다고 보시면 됩니다.

      벙커쟁이님께서도 좋은 하루 되세요 ^^