Learning the Yii Framework 3 / 8
Yii 설정하기
이 글은 필자(저자인 Larry 입니다 저 아님여! - 역자 주)가 가장 좋아하는 PHP 프레임워크인 Yii 에 관한 세 번째 글입니다. 첫 번째 글에서는 Yii 를 다운로드하고 테스트하는 방법을 보여드렸습니다. 두 번째 글에서는 기본적인 웹 어플리케이션을 만드는 방법을 보여드렸죠. 그 포스트의 마지막 부분에서는 어플리케이션 디렉토리 내의 파일들과 폴더들에 대해서도 설명했습니다. 이번 글에서는, 어떻게 Yii 기반의 어플리케이션의 설정을 변경할 수 있는지, 오류를 어떻게 처리하는지, 컴포넌트들을 어떻게 추가하는지, 데이터 베이스 연결을 어떻게 수립하는 지 설명하겠습니다. 이 글은 작업을 하기 위한 어플리케이션이 이미 있다는 가정 하에 씌여졌습니다. 혹시 아직 어플리케이션을 만들지 않았다면 먼저 지난 두 개의 게시물을 읽고 어플리케이션을 생성하세요.
Yii 어플리케이션의 동작을 설정하는 데에는 크게 두 가지 방법이 있습니다. 대부분의 경우, protected/config/main.php 파일을 통해서 하게 됩니다. 하지만 먼저 어플리케이션 디렉토리에 있는 index.php 파일에 관해 이야기해야 할 것 샅습니다. 이 파일은 "부트 스트랩(이렇게 써놔도 다들 이해 하시겠죠? - 역자 주)" 파일입니다. 사용자의 모든 동작이 이 파일을 통해서 이루어집니다. 예를 들어 직원 정보를 보려면 www.example.com/index.php/employee/show/id/34 와 같은 URL 을 통해 접근하게 되고, 정보를 수정하려면 www.example.com/index.php/department/update/id/34 와 같은 URL 로 정보를 전송하는 폼을 통해 하게 됩니다. 두 URL 은 사실 실제로 같은 PHP 파일을 가리키고 있습니다.
index.php 파일은 yiic 명령을 실행할 때 생성됩니다. 단 일곱줄짜리 주석 없는 코드밖에 없는 파일이죠. Yii 프레임워크의 위치를 식별하는 부분이 첫 째 내용입니다.
$yii=dirname(__FILE__).'/../framework/yii.php'; |
아마 올바른 경로가 들어가 있을 겁니다. 왜냐면 프레임워크에서 어플리케이션을 생성할 때 만들어진 내용이기 때문이죠. 혹시 프레임워크의 위치를 옮기거나 index 파일의 위치를 이동하게 된다면 이 경로를 변경해도 괜찮습니다.
두 번째 줄은 설정 파일의 위치를 지정하고 있습니다.
$config=dirname(__FILE__).'/protected/config/main.php'; |
기본값으로 index 파일과 같은 디렉토리에 있는 protected 디렉토리가 지정되어 있습니다. 어플리케이션 파일이 모두 들어있는 디렉토리죠. 저는 이 디렉토리를 웹에서 접근할 수 없는 위치로 옮기는 것을 선호합니다. 예를 들면 아래와 같은 형태로요.
이런 경우에, index.php 파일을 아래와 같이 고치면 됩니다.
$config= '../protected/config/main.php'; |
어플리케이션의 파일을 옮기는 건 합리적인 일이지만(예컨데, protected 폴더 같은), 되도록이면 그 폴더 내의 폴더 이름이나 구조는 변경하지 않는 게 좋습니다.
팁 : protected 폴더를 웹 디렉토리 밖으로 옮기는 것은 추가적인 보안을 위한 조치입니다. 필수적인 일은 아니니까 위치를 변경하는 게 불안하다면 굳이 옮기지 않아도 괜찮습니다.
코드의 다음 줄은 디버깅 모드를 켜는 내용입니다.
defined('YII_DEBUG') or define('YII_DEBUG',true); |
사이트를 개발하는 중에는 디버깅이 유용할 수 있지만 실제 서비스중에는 디버깅을 끄는 게 좋습니다. 디버깅 모드를 끄기 위해서는 해당 라인을 제거하거나 주석처리하면 됩니다. 저는 보통 주석으로 처리하는 편입니다. 나중에 디버깅 모드를 다시 켜기 간편하도록 말이죠. 혹은 아래와 같이 변경해서 각각의 페이지에 임시적으로 디버깅모드를 켤 수 있도록 할 수도 있습니다.
if (isset($_GET['debug'])) define('YII_DEBUG', true); |
이렇게 해 놓으면 URL 을 다르게 접근하는 것만으로도 디버그 모드를 켤 수 있게 됩니다. 예를 들어서 www.example.com/index.php/site/contact 와 같은 경우 www.example.com/index.php/site/contact/d 로 바꾸어 접근하면 디버그모드가 활성화되는거죠.
그 다음 줄은 "콜 스택"을 몇 단계까지 메시지 로그에 보여줄 것인지 결정하는 부분입니다.
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3); |
"콜 스택"이란 어떤 파일이나 함수 등등이 포함, 실행되었는지를 나타내는 것입니다. 프레임워크를 사용하게 되면 단순히 홈페이지를 불러오기만 해도 실행되는 동작이 열 개는 가뿐히 넘게 됩니다. 저 줄을 통해서 이전에 수행된 동작에 대한 기록이 세 줄로 제한되게 됩니다.
부트 스트랩 파일의 마지막 두 줄은 프레임워크를 불러오고 어플리케이션을 실행하는 내용입니다. 이 내용을 건드려선 안됩니다!
require_once($yii);Yii::createWebApplication($config)->run(); |
이게 index.php 파일에서 하는 일의 전부입니다. Yii 1.1 버전 이후로 프레임워크는 또 다른 부트스트랩 파일을 생성합니다. 바로 index-test.php 파일인데요. 이 파일은 실제로 index.php 파일과 동일한 내용입니다. 환경설정 파일을 불러오는 부분이 protected/config/main.php 파일 대신에 protected/config/test.php 파일을 가져온다는 것만 빼구요. 어찌되었건, 테스트 설정 파일은 메인 환경설정 파일을 포함하고 있습니다. 그리고 단위 테스트를 위해 CDbFixtureManager 콤포넌트를 활성화합니다. index-test.php 파일은 호출 스택 제한을 생략하고 있습니다.
protected/config 디렉토리 안에 있는 main.php 파일 내에 대부분의 설정이 들어 있습니다. config 디렉토리 내에는 console.php 라는 설정 파일도 있는데, 이 파일은 콘솔용 어플리케이션에 사용됩니다. 이에 관해서는 여기서 설명하지 않겠지만, 혹시 어플리케이션에 콘솔용 스크립트가 있다면 이 파일을 수정해야 할 수도 있습니다.
환경 설정 파일은 다차원 배열을 반환합니다. 이 배열은 미리 정의된 정보들을 포함합니다. 이 파일을 적절하게 편집하기 위해서는 특히 괄호나 구두점을 사용하는 데 주의를 기울이세요.
처음 시작하는 경우에는 기본 HTML 디자인이나 페이지 제목, 혹은 그 외에도 계속해서 사용될 어플리케이션의 이름을 변경하고 싶을겁니다.
'name'=>'Wicked Cool Yii Site', |
다음으로, 모듈(modules) 섹션을 봅시다. 여기서 Gii 를 활성화시켜야 합니다. Gii 는 모델, 뷰, 컨트롤러 등을 생성하기 위해 사용하는 웹 기반의 도구입니다. Gii 를 활성화시키기 위해서는 아래 코드의 주석을 해제하기만 하면 됩니다.
'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'SECURE',), |
코드에 혼자만 알 수 있는 비밀번호를 적어 넣으세요. (SECURE 를 지우고 거기다 써 넣으면 됩니다 - 역자 주)
팁 : Gii 는 Yii 버전 1.1.2 이후로 추가되었습니다. Gii 를 이용하면 커맨드 라인 Yii 도구의 기능을 대체할 수 있습니다.
아래로 내려가서 콤포넌트(components) 섹션을 봅시다. 아마 urlManager 를 활성화시키고 싶을겁니다. 아래 코드의 주석을 제거합시다.
'urlManager'=>array( 'urlFormat'=>'path', 'rules'=>array( '<controller:w+>/<id:d+>'=>'<controller>/view', '<controller:w+>/<action:w+>/<id:d+>'=>'<controller>/<action>', '<controller:w+>/<action:w+>'=>'<controller>/<action>', ),), |
이 콤포넌트는 URL 을 사용자나 검색엔진이 접근하기에 좀 더 편리하게 바꿔줍니다. 예를 들어 기본적인 URL 은 www.example.com/index.php?r=site/contact 와 같은 형태지만, urlManager 는 이 주소를 www.example.com/index.php/site/contact 와 같은 형태로 바꿔줍니다. 추가로, urlManager 설정과 아파치 웹서버의 .htaccess 파일을 통해서 URL 에서 index.php 부분을 없앨 수도 있습니다.
다음으로, 대부분의 경우에 늘 데이터베이스 연결이 필요할겁니다. (물론 데이터베이스를 사용하지 않는다면 필요 없겠죠) 이를 위해서 연결을 위한 사용자 이름과 패스워드를 담고 있는 부분을 봅시다. 기본값은 SQLite 를 위한 설정이 들어있습니다.
'db'=>array( 'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',), |
SQLite 를 사용하고 싶다면 그냥 SQLite 데이터베이스 파일의 위치만 바꿔주면 됩니다. 하지만 SQLite 를 사용하지 않는다면 위 코드를 주석처리 하도록 합시다.
MySQL 을 사용하기 위해서는 아래와 같은 코드가 필요합니다.
'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=testdrive', 'emulatePrepare' => true, 'username' => 'username', 'password' => 'password', 'charset' => 'utf8',), |
connectionString 은 정확한 형식을 맞춘 DSN(Database Source Name) 입니다. 이 문자열은 사용하려는 데이터베이스를 나타내는 키워드로 시작해야 합니다. 예를 들면 mysql, pgsql(PostgreSQL), mssql(Microsoft's SQL Server), oci(Oracle) 등입니다. 이 키워드 뒤에는 콜론(:) 이 들어가고, 사용중인 데이터베이스나 서버 환경에 따라 몇개의 파라미터가 들어갑니다. 각 파라미터는 세미콜론(;)으로 구분합니다.
mysql:host=localhost;dbname=testmysql:port=8889;dbname=somedbmysql:unix_socket=path/to/mysql.sock;dbname=whatever
사용할 데이터베이스를 설정하는 것은 아주 중요합니다. 제 경우(Larry 입니다. 저 아님여! - 역자 주) Mac OS X 에서 MAMP 를 사용할 때는 포트 번호를 기본값(3306)과 다른 번호로 설정해야 했습니다. Mac OS X 서버에서는 기본값과는 다른 소켓을 지정해 줘야 했습니다. 다른 데이터 베이스를 사용할 때에는 그에 맞는 PHP 확장이 설치되어 있어야 한다는 것을 기억하세요. (PDO 와 PDO MySQL 처럼요). 기존 값을 데이터베이스에 맞는 사용자 이름과 패스워드로 변경하도록 합시다. 그 외에 인코딩이나 캐릭터셋을 변경할 수도 있습니다.
로그(log) 콤포넌트 섹션에서 저는 CWebLogRoute 를 활성화했습니다. 이건 굉장히 쓸모있는 디버깅툴로, 각 페이지들에 대해 아주 많은 정보를 제공해줍니다. 아래 코드가 해당 설정 부분입니다.
'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'error, warning', ), array ( 'class' => 'CWebLogRoute' ) ),), |
그리고 이건 출력 예제입니다.
마지막으로, 설정파일의 끝부분에서 adminEmail 부분을 찾을 수 있을겁니다. 이 부분을 자신의 메일 주소로 변경합니다. 이 주소로 에러 메시지나 의견 보내기 폼의 메시지나..뭐 그외 여러가지가 전달됩니다.
'params'=>array( 'adminEmail'=>'whatever@example.edu',), |
콤포넌트를 추가하고 편집하는 부분이 설정의 많은 부분을 차지하고 있습니다. 제가 강조해놓은 것들은 제 생각에 중요하다고 생각되는 부분들입니다. 하지만 그 외에도 캐싱, 보안, 테마 등등 중요한 부분들이 많이 있습니다. Yii 프레임워크의 멋진 점 중 하나는 모든 요청마다 모든 컴포넌트를 로딩하지 않는다는 점입니다. 로깅 같이 항상 로딩되는 컴포넌트도 있지만, 그 외에는 필요한 경우에만 컴포넌트가 로딩됩니다. 이를 통해 많은 컴포넌트를 사용할 때에도 퍼포먼스 낭비를 최소화할 수 있습니다.
또 환경설정 파일에서 중요하게 봐야 할 부분은 기본 컨트롤러를 설정하는 부분입니다. 다르게 말하면, URL 에서 특정한 컨트롤러가 지정되지 않았다면 어떤 컨트롤러가 호출된 거냐는 이야기죠. 추가적인 설정이 없다면, "site" 컨트롤러가 기본적으로 호출됩니다. 이 부분을 다른 컨트롤러로 바꿀 수 있습니다. 아래와 같은 라인을 추가합시다.
'defaultController' => 'login', |
이 설정은 해당하는 컨트롤러가 있을 경우에만 적용된다는 점을 기억합시다. 이렇게 변경하기 전에 protected/controllers/LoginController.php 파일을 먼저 만들어야 합니다. (혹은 다른 존재하는 파일을 기본 컨트롤러로 지정해도 괜찮습니다.) 마찬가지로 이 부분은 다른 섹션 아래에 존재하는 것이 아니라 다차원 배열의 가장 상위 단계에 넣어야 한다는 점도 기억해 둡시다. 간단히 "basePath" 와 "name" 항목 사이에 넣으면 확실하겠죠.
간단하게 Yii 어플리케이션을 설정하는 법을 소개해 봤습니다. 늘 제 글을(그러니까 누차 쓰지만 Larry 이야기입니다. - 역자 주) 읽어주셔서 감사합니다. 질문이나 하고 싶은 이야기가 있으시면 저에게 알려주세요. 다음 포스트에서는 이후 시리즈에서 사용될 데이터베이스를 디자인하는 방법을 설명하겠습니다. 그리고 나면 Yii 도구를 이용해서 자동으로 모델, 뷰, 컨트롤러가 생성되는 신기한 마술을 보여드리겠습니다.
This is a translation of a work originally written in English by Larry Ullman (www.LarryUllman.com). It is translated and republished with his permission.
이 글은 영어로 작성된 Larry Ullman 의 원본 글을 번역한 것입니다 ( http://www.LarryUllman.com ). 이 글은 저자의 허락을 받아 번역되었습니다.
