04. 설정 (Configuration)
4. 설정 (Configuration)#
4.1. 데이터베이스의 설정#
app/config/database.php 파일에서 모든 데이터베이스 설정을 한다. 처음 설치를 하면, database.php 는 존재 하지 않기 때문에, database.php.default 를 복사하여 작성하고, 파일명을 변경한다. 다음과 같이 나타날 것이다 :
예 4.1. app/config/database.php
- 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 중에 다음과 같이 설정해 이용한다.
- 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. 라우트 패턴 예제
- <?php
- $Route->connect (
'URL',
array('controller'=>'컨트롤러명',
'action'=>'액션명', '최초의 파라미터')
); - ?>
- URL 은 매핑하는 Cake URL 의 정규표현식이다.
- 컨트롤러명은 호출되는 컨트롤러이다.
- 액션명은 호출되는 컨트롤러의 액션명이다.
- 그리고 최초의 파라미터는 임의의 액션 파라미터 값을 설정할 수 있다.
최초의 파라미터 이후의 이은 파라미터도 컨트롤러의 액션에 파라미터로 넘겨 받는다.
다음의 예에서는 /blog 의 모든 URL을 BlogController 에 접속한다. 기본 액션은 BlogController::index() 가 된다.
예 4.3. 라우트 예제
- <?php
- $Route->connect ('/blog/:action/*', array('controller'=>'Blog', 'action'=>'index'));
- ?>
/blog/history/05/june 이라는 URL 은 다음과 같이 조작된다.
예 4.4. 컨트롤러에서의 라우트 핸들링
- <?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. 라우트 초기 설정
- <?php
- connect ('/', array('controller'=>'Pages', 'action'=>'display', 'home'));
- ?>
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 과 컨트롤 액션의 설정의 예는 다음과 같다.
-
/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()'
어드민 라우팅을 사용하면, 로직을 지저분하게 하는 일 없이 라우팅을 아주 간단히 구현할 수 있다. 가능할 경우, 어드민 라우팅을 다음과 같이 사용한다면 쉽게 컨트롤러를 정의할 수 있다 :
- $this->params[CAKE_ADMIN];
또는
-
$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 (일부)
- /**
* 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
- <?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 와 같이) 도 정의된다.
파일 내에 있는 주의사항을 따르거나, 파일 내에 있는 예제들의 주석을 지우고 사용할 수 있다. 수정 전에 정규 표현을 알아 두는 것이 좋다.
Comments (0)