Header

  1. View current page

    CakePHP 매뉴얼 - CakePHP.co.kr

Profile_img_60x60_06
1 23

04. 설정 (Configuration)

 

4. 설정 (Configuration)#

 

4.1. 데이터베이스의 설정#

app/config/database.php 파일에서 모든 데이터베이스 설정을 한다. 처음 설치를 하면, database.php 는 존재 하지 않기 때문에, database.php.default 를 복사하여 작성하고, 파일명을 변경한다. 다음과 같이 나타날 것이다 :

 

예 4.1. app/config/database.php

 

  1. var $default = array('driver'   => 'mysql',
                         'connect'  => 'mysql_connect',
                         'host'     => 'localhost',
                         'login'    => 'user',
                         'password' => 'password',
                         'database' => 'project_name',
                         'prefix'   => '');

 

기본값의 데이터베이스 접속 정보를 자신의 애플리케이션용으로 고친다.

 

'prefix' (접두사) 키에 대해 : 여기에 설정한 문자열이, 어떠한 SQL 호출의 테이블명 앞에 추가된다. 이 하나의 설정이 모든 곳에서 사용된다. 데이터베이스가 하나 밖에 없는 호스팅을 이용하는 경우에서도 이렇게 쓰는 것으로 Cake 의 테이블 규약을 따를 수 있다. 주의 : HABTM 조인 테이블은 한번만 접두사가 붙는다 : prefix_apples_bananas (O), prefix_apples_prefix_bananas (X).

 

CakePHP 는, 다음 데이터베이스 드라이버를 지원한다 :

 

  • mysql

  • postgres

  • sqlite

  • pear-드라이버명 (예를 들면, pear-mysql 등.)

  • adodb-드라이버명

 

$default 접속 중에 있는 'connect' 키로, 데이타베이스 접속을 지속적으로 할것인지 정할 수 있다. database.php.default 파일내에 있는 주석을 참고하여 데이타베이스의 셋업의 타입을 지정한다.

 

또한 데이터베이스 테이블은 다음 규약을 따를 필요가 있다 :

 

  • Cake 에서 사용하는 테이블명은, 영어의 복수형으로 한다. "users", "authors"  또는 "articles" 등이다. 주의 : 대응하는 모델의 이름은 단수형이다.

  • 테이블에는 'id' 라는 이름의 주요키 (primary key) 가 반드시 있어야 한다.

  • 테이블끼리 관련 지을 경우, 외부키 (foreign key) 는 'article_id' 와 같이 한다. 테이블명의 단수형으로 언더바를 붙이고, 맨마지막에 'id' 를 붙인다.

  • 테이블에 'created' (작성) 와/또는 'modified' (수정) 이라는 컬럼이 있으면, Cake 는 적절한 시기에 필드에 데이터를 자동으로 넣는다.

 

database.php 파일내에는 $test 접속 설정도 포함된다. 여기에 설정을 입력(또는 같은 포맷에 설정을 추가)하고 애플리케이션의 model 중에 다음과 같이 설정해 이용한다.

 

  1. var $useDbConfig = 'test';

 

이 방법으로 임의의 접속 설정을 추가할 수 있다.

 

4.2. 전역 설정#

CakePHP 의 전역 설정은 app/config/core.php 에서 한다. 설정 파일이라는 것을 정말 좋아하지 않지만, 작성할 수 밖에 없었다. 여기에서 몇가지를 변경할 수 있다. core.php 의 주석중에 각각의 설정에 관한 주의사항이 기재되어 있다.

 

DEBUG : 애플리케이션을 만들 때의 디버그 설정을 지정한다. 0 이 아닌 값이면 Cake 는 pr()과 debug() 함수를 호출하여 결과를 출력하고, flash 메시지에 의한 페이지 전송을 자동으로 멈춘다. 값을 2 이상으로 설정하면 페이지의 맨 마지막 부분에 SQL 명령문의 결과가 표시된다.

 

또한 디버그 모드(DEBUG의 값이 1 이상)일 때, Cake 는 "Missing Controller" (컨트롤러가 존재하지 않습니다) "Missing Action" (액션이 존재하지 않습니다) 라고 하는 에러 페이지를 생성하게 된다. 그러나 공개모드 (DEBUG의 값이 0)일 때, Cake 는 app/views/errors/error404.thtml 에 있는 "페이지가 존재하지 않습니다" 라고 하는 페이지를 표시한다.

 

CAKE_SESSION_COOKIE : Cake 애플리케이션에 세션을 사용할 때, 쿠키의 이름을 지정한다.

 

CAKE_SECURITY : 세션 체크 레벨을 지정할 수 있다. 설정에 따라 세션의 타임 아웃, 새로운 세션 ID의 생성, 오래된 세션의 파일의 삭제등을 한다. 설정값은 다음과 같다.

 

  • high : 10초 동안 아무것도 하지 않으면 세션 타임 아웃. 세션 ID를 요청할 때마다 재생성한다.
  • medium : 20분 동안 아무것도 하지 않으면 세션 타임 아웃.
  • low : 30분 동안 아무것도 하지 않으면 세션 타임 아웃.

 

CAKE_SESSION_SAVE : 세션 데이터의 저장 방법을 지정한다. 설정 가능한 값은 다음과 같다.

 

  • cake : 세션 데이터는 Cake 를 인스톨한 디렉토리내 tmp/ 에 저장된다.
  • php : 세션 데이터는 php.ini 에 저장된 경로에 저장된다.
  • database : 세션 데이터는 'default' 키로 정의된 데이터베이스에 접속해서 저장된다.

 

4.3. 라우트 설정#

"라우팅" 은 PHP 로 구현되는 mod_rewrite 의 축소판 비슷한 것이다. URL로부터 컨트롤러/액션/파라미터를 매핑하고 역으로도 실행한다. 보기좋은 URL(pretty URLs)을 좀 더 설정하기 쉽게 하고, mod_rewrite 가 없이 작동하기 위해 Cake 에 추가되었다. 그러나, mod_rewrite 를 사용하면 주소창은 훨씬 깔끔해진다.

 

라우트에서는 적합한 URL을 특정한 컨트롤러와 액션에 결부시키는 개별적인 룰이다. 라우트는 app/config/routes.php 파일내에 설정되며, 아래와 같이 설정한다.

 

예 4.2. 라우트 패턴 예제

 

  1. <?php
  2. $Route->connect (
        'URL',
        array('controller'=>'컨트롤러명',
        'action'=>'액션명', '최초의 파라미터')
    );
  3. ?>

 

  • URL 은 매핑하는 Cake URL 의 정규표현식이다.
  • 컨트롤러명은 호출되는 컨트롤러이다.
  • 액션명은 호출되는 컨트롤러의 액션명이다.
  • 그리고 최초의 파라미터는 임의의 액션 파라미터 값을 설정할 수 있다.

 

최초의 파라미터 이후의 이은 파라미터도 컨트롤러의 액션에 파라미터로 넘겨 받는다.

 

다음의 예에서는 /blog 의 모든 URL을 BlogController 에 접속한다. 기본 액션은 BlogController::index() 가 된다.

 

예 4.3. 라우트 예제

 

  1. <?php
  2. $Route->connect ('/blog/:action/*', array('controller'=>'Blog', 'action'=>'index'));
  3. ?>

 

/blog/history/05/june 이라는 URL 은 다음과 같이 조작된다.

 

예 4.4. 컨트롤러에서의 라우트 핸들링

 

  1. <?php
    class BlogController extends AppController
    {
     function history ($year, $month=null)
     {
       // .. 적절한 내용 표시
     }
    }
    ?>

 

URL 의 'history' 는 Blog 의 라우트의 :action 에 적합하다. * 에 적합한 URL 의 요소는 작동중인 컨트롤러가 다루고 있는 메소드에 파라미터로서 넘겨 받는다. 즉 $year 와 $month 가 된다. /blog/history/05 라는 URL이 호출된 경우 history() 에는 05 라는 하나의 파라미터만 넘겨 받는다.

 

다음 예는 PagesController::display('home') 를 사용하기 위한 CakePHP 의 기본 라우트 설정이다. Home 은 /app/views/pages/home.thtml 이라는 파일을 작성하는 것으로 이것을 표현하는 뷰가 된다

 

예 4.5. 라우트 초기 설정

 

  1. <?php
  2. connect ('/', array('controller'=>'Pages', 'action'=>'display', 'home'));
  3. ?>

 

4.4 고급 라우팅 설정 : 어드민 라우팅과 웹서비스#

/app/config/core.php 의 설정중에는 애플리케이션을 체계화 하고 개발자와 유저에 있어서 알기 쉬운 URL을 만들기 위해 도움이 되는 것이 있다.

 

먼저, 어드민 라우팅 (admin routing) 이 있다. 애플리케이션으로 ProductController 와 NewsController 가 있는 경우, 관리자 권한이 있는 사람만 접근 가능한 특별한 URL 을 준비하고, 컨트롤러가 특별한 액션으로 접근할 수 있도록 하고 싶은 경우가 있다. URL 을 이해하기 쉬운 좋은 상태로 하기 위해, 어떤 사람은 /admin/products/add 와 /admin/news/post 와 같은 것을 준비할 수 있겠지만, /product/adminAdd 와 /news/adminPost 와 같이 하고 싶은 사람도 있을 수 있다.

 

이와 같이 구현하려면, 우선 /app/config/core.php 파일에 있는 CAKE_ADMIN 의 아래행의 주석을 삭제한다. CAKE_ADMIN 의 기본값은 'admin' 이지만 원하는 대로 변경할 수 있다. 컨트롤러내에서의 관리자 액션을 추가할 때 필요하기 때문에, 이 문자열을 기억해 두어야 한다. 이 경우의 관리 액션은 admin_actinoName() 이라는 이름이 된다. 바람직한 URL 과 가능한 CAKE_ADMIN 과 컨트롤 액션의 설정의 예는 다음과 같다.

 

  1. /admin/products/add            CAKE_ADMIN = 'admin'

                                   ProductsController 의 액션명은 = 'admin_add()'

     

    /superuser/news/post           CAKE_ADMIN = 'superuser'

                                   NewsController 의 액션명은 = 'superuser_post()'

     

    /admin/posts/delete            CAKE_ADMIN = 'admin'
                                   PostsController 의 액션명은 = 'admin_delete()'

 

어드민 라우팅을 사용하면, 로직을 지저분하게 하는 일 없이 라우팅을 아주 간단히 구현할 수 있다. 가능할 경우, 어드민 라우팅을 다음과 같이 사용한다면 쉽게 컨트롤러를 정의할 수 있다 :

 

  1. $this->params[CAKE_ADMIN];

 

또는

 

  1. $this->params['admin'];

 

('admin' 은 CAKE_ADMIN 의 값이라고 가정한다)

 

어드민 라우팅을 유효하게 하거나 이것을 사용하는 것은 어떤 인증이나 보안등이 실행될 수 없다는 점을 주의하라. 그것은 자신이 직접 이행해야 한다.

 

동일하게, Cake 의 웹서비스 라우팅을 쓸 수 있도록 하고, 간략화할 수 있다. 컨트롤러의 액션을 웹서비스로 공개하고 싶은가? 우선, /app/config/core.php 의 WEBSERVICES 를 'on' 으로 고친다. 루트 어드민 라우팅과 같은 방식으로 자동으로 라우팅되게 된다. 단 이미 정의된 몇가지 셋팅이 있다 :

 

  • rss
  • xml
  • rest
  • soap
  • xmlrpc

 

이것에 의해 /rss/컨트롤러명/액션명 이나, /soap/컨트롤러명/액션명 으로 사용할 수 있다. 다른 뷰를 준비할 수도 있다. 즉 두개의 뷰를 가진 하나의 액션을 만들 수 있다. 하나는 일반적인 HTML 을 보여주는 인용의 뷰, 다른 하나는 웹서비스를 이용하는 사람을 위한 뷰이다. 이렇게 하면, 애플리케이션의 많은 기능을 웹서비스로 공개할 수 있게 된다.

 

예를 들면, 애플리케이션 중에 사무실의 누가 전화중인가를 표시하는 로직이 있다고 하자. 이 데이터를 표시하는 HTML 의 뷰는 이미 있지만, XML로도 제공할 수 있도록 데스크톱 위젯이나 PDA의 애플리케이션 등에서도 사용할 수 있도록 하고 싶다. 우선, Cake 의 웹서비스를 사용할 수 있게 한다.

 

예 4.6. /app/config/core.php (일부)

 

  1. /**
     *  The define below is used to turn cake built webservices
     *  on or off. Default setting is off.
     */
        define('WEBSERVICES', 'on');

 

다음, 컨트롤러의 로직을 다음과 같이 구성한다 :

 

예 4.7. messages_controller.php

 

  1. <?php
    class PhonesController extends AppController
    {
        function doWhosOnline()
        {
            // 이 액션은, 누가 전화중인가 조사하는 모든 작업을 행하는 곳...

            // Cake 의 xml 웹서비스 라우트를 통해 이 액션을 공개하고 싶은 경우
            // /app/views/posts/xml/do_whos_online.thtml 내에 뷰를 포함시킨다.
            // 주의 : 여기서 사용하는 기본 view 는 /app/views/layouts/xml/default.thtml 이다.

            // 유저가 /phones/doWhosOnline 를 요청하면, HTML 버전의 데이터를 받게 된다.
            // 유저가 /xml/phones/doWhosOnline 를 요청하면, XML 버전의 데이터를 받게 된다.
        }
    }
    ?>

 

 

4.5. (옵션) 커스텀 인플렉션(어형 변화) 설정#

Cake 의 네이밍 규약은 꽤 편리하다. 모델 Box (단수) 에 이름을 붙여 컨트롤러 Boxes (복수) 가 되며, 모두 잘 작동한다. 하지만, Cake 의 인플렉터 (복수형, 단수형, 낙타표기법, 언더바를 만드는 클래스) 가 자신이 원하는대로 작동하지 않는 경우 (특히 영어외의 언어를 이용하고 있는 경우) 도 있다. 만일, Foci (fish) 를 인식해 주지 않는 경우, 커스텀 인플렉션 설정 파일을 수정한다.

 

/app/config/inflections.php 에는 Cake 의 클래스명에 사용된다. 수정 가능한 복수형, 단수형의 변수 목록이 있다. 또 불규칙형과 함께, 전혀 변화하지 않는 단어 (야외 스포츠 애호가인 Caker 들을 위한 Fish 나 Deer 와 같이) 도 정의된다.

 

파일 내에 있는 주의사항을 따르거나, 파일 내에 있는 예제들의 주석을 지우고 사용할 수 있다. 수정 전에 정규 표현을 알아 두는 것이 좋다.

Tags

History

Last edited on 11/01/2007 14:59 by cakephp

Comments (0)

You must log in to leave a comment. Please sign in.