2011.12.01 15:53

Cakephp 시작하기. 깔기 말고 뭔가 보이는 거 만들기.

내 생애 php 란걸 하게 될 날이 있을까 싶었는데... 이게 왠일인지 php 란 넘으로 사이트까지 만들어 버렸다. 초고속 속성반으로 1달 채 않되는 시간의 학습기간으로 두달간의 삽질 끝에 이런 허접한 글을 적을 정도까지 와 버렸다. 솔직히 두어달 동안 삽질하며 익힌 것들이 아까워서 좀 자랑질 하려는 마음에 몇 자 남겨 보는 것이다. 짧은 학습 기간만큼이나 실력은 미약하고 php 란 언어를 배웠다기 보다는 cakephp 란 MVC 프레임웍에 대해 조금 익숙해진 정도이다. MVC 란 프레임웍이 워낙에 명료 하다보니 PHP 생초짜인 나도 쉽게 따라 붙을 수 있었고 어느 정도 규모가 되는 사이트도 쉽게 이어갈 수 있었던 것 같다. 물론 같이 작업했던 동료들의 노고도 잊어선 않되겠지만, 그래두 내가 제일 잘 났어...ㅋㅋㅋ 내가 제일 잘 났어... 내가 제일 잘 났어...ㅋㅋㅋ
깔대기란게 그냥 되는 것이 아니구나... 참 민망하네...

일단 cakephp  란 것은 http://cakephp.org 란 곳에서 다운 받아 사용하면 되고 설치가 목적이 아니므로 설치는 알아서들 하시길. 현재 2.0.4 버젼이 올라와 있네요. 내가 사용한건 1.3 버젼이었는데 개발 중간에 버젼업이 되어서 그냥 1.3 만으로 만족하면 쓰기로 해버렸습니다. 다음에 또 사용하게 된다면 바로 2.0을 이용해서 만들면 될 것입니다. 이미 1.3 으로 서비스 사이트에서 2.0 으로 버젼을 올리는 건 그리 쉬운 일이 아닌 것 같아 아직은 고려하지 않고 있습니다. 2.0 에서 달라진 여러 규칙이 1.3 과 호환 되지 않을 것 같은 두려움과 더블어 폴더 구조가 바뀌어서 약간의 혼란이 있기도 합니다. php 를 앞으로 얼마나 사용하게 될지도 모르는 마당에 연구해가며 공부까지 할 생각은 없기에 당장은 1.3 으로 만족하며 잘 사용하려고 합니다.

MVC 프레임웍 하면 제일 먼저 떠오르는 건 ORM인데 ruby on rails 란 프레임웍에서 제공했던 디비 관련 일련의 작업을 객체화(?) 시켜주는 편리함 때문입니다. 웹 관련 개발을 하면서 데이타 전송이나 입출력 시 제일 골치 아픈 문제 중에 하나가 이름 맞추기 였는데 C#, Java 같은 컴파일 언어들은 미리 선언이라도 하고 개발 툴에서 인텔리센스라도 지원해 주지만(Java 는 없었나...) 스크립트 언어들은 그 지원이 너무 미약하여 변수명에 대한 오류가 나면 l, I 같은 눈에 잘 않보이는(대문자 i, 소문자 L) 같은게 잘못되기라도 하면 어쩌구 저쩌구 개발에 맞는 폰트 사용이 어쩌구 저쩌구 부터 타이핑 하지 말고 마우스 클릭으로 카피하라는 둥 머 이래 저래 많은 헛소리들을 하곤 했죠. 어쨌거나 디비 관련 변수의 이름 맞추기는 참으로 많은 문제를 일으키던 넘 중에 하나였습니다.(물론 내 허접함도 한몫 하긴 했겠지만...)
cakephp 란 놈도 php 로 구현된 것들 중 rails 란 프레임웍에 가장 가깝다는 놈이기 때문에 비슷한 ORM 기능을 제공하고 있습니다. 모델에서 find 란 method 를 제공하고 다양한 조건과 경우에 대비하여 데이타 출력을 용이하도록 도와 주고 있습니다. 단순한 형태의 Member 란 테이블을 생성하고 그 데이타를 가져오는 경우입니다. 내 생애 mySql 과 친해지는 것도 그다지 바라던 바는 아니었으나 이젠 나름 익숙해 지려고 합니다. 난 원래 MS SQL 이 주요 밥벌이 였는데...그립다. MS SQL
delimiter $$
CREATE TABLE `Member` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(128) NOT NULL COMMENT '회원이메일 주소',
  `name` varchar(32) NOT NULL,
  `password` varchar(45) NOT NULL COMMENT '회원 비밀 번호',
  `memberStatus` int(11) NOT NULL DEFAULT '1' COMMENT '회원상태(1:정상,10:탈퇴..)',
  `member_grade` int(11) DEFAULT '1' COMMENT '회원 등급\n1: guest(미인증)\n2: 일반 회원\n4:\n8:\n16:\n32: \n32768 : 관리자',
  `img_url` varchar(128) DEFAULT '/img/Common/guest.gif' COMMENT '회원 기본 이미지 URL',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`),
  UNIQUE KEY `MemberEmail_UNIQUE` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8 COMMENT='회원 기본 정보'$$
DB 의 테이블과 매칭하는 부분이 모델입니다.
<?php
class Member extends  AppModel
{
var $name = 'Member';
var $useTable = 'Member';
var $validate = array(
'MemberId' => array(
'notempty' , 
'email' => array('rule'=>array('email',true)  , 'message' => 'Email 형식이 아닙니다.' ))
);
}
?>
테이블 명과 일치하는 파일명으로 위와 같은 모델을 만들어 줍니다. php 란 것이 스크립트 언어다 보니 특정 폴더, 접미어, 대소문자 등에 민감(?)합니다. 되도록 테이블 설계 때 사용한 이름과 어긋나지 않도록 잘 매칭해 주는 것이 필요합니다. 모델은 app/models 폴더 밑으로 클래스명과 동일한 파일명으로 만들어 주는 것이 중요합니다.

모델을 만들었으면 그 데이타를 이용하는 컨트롤을 만들어 볼 차례입니다. 컨트롤 역시 app/controllers 폴더 밑으로 만들어 줘야 하며,  원하는 이름 뒤로 _controller.php 를 꼭 붙여 줘야 합니다. cakphp 가 정상적으로 설치되었다면 테스트 경로로 접근했을 때 아래 그림과 같은 오류 페이지를 확인 할 수 있습니다. 지금 저의 경우는 localhost 란 서버에서 Member 란 컨트롤로 연결을 시도한 경우가 되겠습니다. 친절하지 않은 디자인으로 Missing Controller 란 메시지를 보여주고 Error :  MemberController could not be found 라고 하네요.

에러 메시지에서 알려주는 데로 app/controllers/member_controller.php 란 파일을 만들어 줘야 합니다. 그러나 Member 란 이름이 아까 우리가 만들었던 Member 란 모델과 겹치게 되므로 MemberInfo 로 만들도록 하겠습니다. 궂이 MemberInfo 란 이상한 이름을 쓰는 까닭은 cakephp 란 넘의 작동 원리 때문에 그렇습니다. 처음에 무지하게 카멜 표기법을 사용하면서 고생을 심하게 했는지라... cakephp 에서 이름을 매칭할 때 대문자는 _소문자로 처리해 버립니다. 즉 우리가 MemberInfo 란 컨트롤을 만들게 된다면 실제 그 파일명은 member_info_controller.php 로 만들어야 한다는 뜻입니다. 아래 그림은 MemberInfo 란 컨트롤로 접근한 결과 화면입니다. 역시 아직 컨트롤이 만들어지기 전이므로 에러 화면이 나타나지만 두번째 빨간 네모의 내용을 유의해서 위의 에러 화면과 비교해 보시면 그 차이점을 아실 수 있을 것입니다. 대문자 스스로 변환시키는거 참 골치 아픕니다. 

자 그럼 에러 메시지가 시키는 데로 app\controllers\member_info_controller.php 파일을 생성합니다.
그 내용은 
<?php
class MemberInfoController extends AppController {
var $name = 'MemberInfo';
}
?>
보통 액션이 따로 없는 경우는 index 가 기본 액션이 됩니다. 따라서 다음과 같이 기본 액션을 생성해 줍니다. 기본 액션에 대해서는 app/config/routes.php 에서 라우팅을 설정해 주는 것으로 변경이 가능합니다.
<?php
class MemberInfoController extends AppController {
var $name = 'MemberInfo';

function index()
{
}
}
?>
여기까지 만들어졌다면 다시 브라우져를 확인해 봅니다. MemberInfo 란 테이블을 찾네요 헐. 컨트롤과 모델이 저런식으로 암묵적 관계를 가지고 있었다니. 내가 Member 란 이름으로 컨트롤을 만들었다면 Member 란 모델과 자동으로 연결되는게 아닌가라고 생각 할 수도 있으나, 지난 두어달의 삽질 결과 모델명과 겹치는 컨트롤명은 항상 좀 애매한 문제를 일으켰다. 그러니 분리 해서 사용하는게 좀더 현명한 방법이다.

자 이제 에러 메시지에 대한 수정 작업을 해보도록 하자.
<?php
class MemberInfoController extends AppController
{
var $name='MemberInfo';
var $helpers = array('Html','Form','Ajax','Paginator'=>array('html'=>'Html'));
var $components = array('RequestHandler','Session');
var $uses = array(
'Member'
);
function index()
{
}
}
?>
어떤 컨트롤이든 사용할 모델이 필요하니 $uses 를 이용해서 사용할 모델을 연결해 주자. 여기서 우리가 사용하는 php 란 언어가 거의 모든 대부분의 데이타 형태를 배열로 사용함을 알 수 있다.(다시 한번 주지 하자면 난 php 전문가가 아니다. 전문가 되고 싶지도 않다.)
두가지 사항이 늘었다. $helpers, $uses, $components 이 것들이 뭐하냐는 것이냐면 using, import, include 머 다양한 이름으로 소개 될 수 있는 것들이다. 즉 이 컨트롤에서 cakephp 에서 제공하는 여러가지 기능 중에 필요한 기능을 추가해 사용하려는 것이다. RequestHandler 는 get, post 등의 여러 방법으로 넘어온 데이타 처리 및 json 같은 데이타 형식 등 웹에서 일어나는 다양한 처리 형태를 처리 할 수 있도록 커버 해주는...Paginator 는 리스트이지의 페이징을 쉽게 해주는 머 그런 역할을 한다. 
컨트롤까지 만들어졌다면 위와 같은 화면을 보게 될 것이다. View 를 만들어 달라는 이야기다. 폴더 위치를 정확히 확인 하고 확장자에 유의 해서 파일을 생성하자. php 가 아니라 ctp 로 되어 있다.
이제 파일이 만들어 졌으면  아래 이미지와 같은 멋 없는 화면을 보게 될 것이다. index.ctp 파일에 "이제 만들어 졌습니다." 라고 썼을 경우에 말이다.


지금까지 만든 것은 그 흐름을 이해하기 위해 하나씩 적용해 본 것이다. 처음 cakephp 란 걸 사용하기로 했을 때 설치 부터 첫 페이지 만들기까지 너무 많은 고생을 해서 그 첫 시작을 줄여 주고자 간단한 안내 페이지를 만들어 봤다. 

이제 다음엔 이 촌스런 디자인을 벗어 버리도록 app/view/layout 에서 디자인 된 템플릿을 만들고 디자인이 적용된 웹사이트 답게 생긴 모습으로 바꿔 보도록 하자.
저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 0
2010.03.19 10:01

IIS 6.0 에서 asp.net MVC 적용하기


좀 아쉬운 일이긴 한데... mvc 를 이용하여 개발하고 로컬에서 잘 되었는데 막상 배포하고 나면 바보가 되는 경우가 있다... net 에서 제공하는 MVC 가 제대로 동작하는건 IIS7 부터다. 이전 버젼의 IIS 에서는 IIS 세팅이 필요하다.

mvc 모듈 설치는 microsoft 에서 다운 받은 모듈을 그대로 설치하기만 하면 끝나는 일이니 아래 url 을 이용해서 다운 받고 설치하면 된다.

AspNetMVC1.msi 다운 받는다.

(http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&displaylang=en)




IIS6.0 세팅 부분은 확장자 없는 라우팅에 대해 설정이 필요하다. 6.0에서는 확장자 없는 url 에 대해서는 이해하지 못하므로... 아래 그림 처럼 .mvc 라는 확장자를 가진 넘을 생성해 주고... global.asax, default.aspx 를 열어서 .mvc 에 대한 설정을 추가해준다.


저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'뭐하는데 > Dot 4(넷)' 카테고리의 다른 글

MySQL 과 함께하는 .net  (0) 2011.08.03
Visual Studio 2010  (0) 2010.04.12
IIS 6.0 에서 asp.net MVC 적용하기  (0) 2010.03.19
asp.net MVC 적용하기  (0) 2010.03.12
18일 PDC 개막  (0) 2009.11.20
C# 코드 자동 생성기  (0) 2009.10.06
Trackback 0 Comment 0
2010.03.12 12:09

asp.net MVC 적용하기

몇 해전 Ruby 란 언어에 관심을 가진적이 있다. 레일즈라는 막강한 기능에 혹해서 와 정말 좋다. 이거야 말로 정말 필요한 것이다. 꼭 알아야 겠다고 생각했었다... 물론 그 당시 내 사랑을 듬뿜 받고 있던 맥북이도 좋아라 했지...

그러나 ruby 라는 생경한 언어에 익숙해 지는데 필요한 시간이 너무 많이 필요했다. 레일즈에서 사용하는 의미적 프로그램 방법이 어색했다... 뭐 이래 저래 다양한 이유로 인해서 멋져 보이던 레일즈를 포기하고 말았다.

그 레일즈의 비슷한 기능을 MS 기반으로 보게 될 줄이야...ㅋㅋㅋ...
MS 기반의 윈폼을 버리고 MVC 작업을 하게 될 줄은 몰랐다...ㅋㅋㅋ...

일단 닷넷에서 사용하려면 ORM 에 대한 이해가 필요하다. ORM 을 컨트롤하기 위한 Repository 패턴에 대한 이해가 필요하다. 의미적 프로그래밍 방법에 대한 이해가 필요하다. 제어하려는 것은 객체, 객체 모델 이란 점을 잊으면 않된다. 더블어 그 객체 이름으로 자동으로 만들어지는 폴더, controller, view 등에 어색해 하지 말자. 모델, 컨트롤, 뷰로 이어지는 개발 순서를 잘 기억하자. URL 라우팅에 대한 이해가 필요하다.

디비 설계만 좀 세심히 한다면 언제고 쉽게 프로그램을 양산할 수 있다는게 MVC 의 매력인 것 같다. 결과는 개발자의 토사구팽...
저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'뭐하는데 > Dot 4(넷)' 카테고리의 다른 글

Visual Studio 2010  (0) 2010.04.12
IIS 6.0 에서 asp.net MVC 적용하기  (0) 2010.03.19
asp.net MVC 적용하기  (0) 2010.03.12
18일 PDC 개막  (0) 2009.11.20
C# 코드 자동 생성기  (0) 2009.10.06
C# 관련 좋은 글  (0) 2009.09.23
Trackback 0 Comment 0
2009.10.06 16:55

C# 코드 자동 생성기

작년에 MVC 패턴과 nHibernate, iBatis.Net을 이용한 ORM 이다 뭐다 말도 많고 그랬는데 정작 MVC 패턴을 적용한 닷넷 예를 찾아 보기는 쉽지가 않다. 누구 닷넷으로 MVC 작업 하시는 분...(뭐 짧은 식견에 보는 범위가 적어서 그렇겠지만, 대외적으로 알려진 프로젝트는 거의 전무하다 싶은게 현실인 듯 싶다.) 그렇다고 해도 MS 에서 그렇게 열심히 밀고 있는 까닭에 또 자바쪽에서 성공 사례로 올라오는 것들, 웹을 뜨겁게 달구었던 Ruby On Rails 를 보더라도 MVC 패턴이 앞으로의 새로운 희망이 될 것이란 것은 의심의 여지가 없어 보인다. 그 귀찮은 DB 입출력 작업을 미리 설정한 몇몇 파일로 다 해결이 가능하다 하니 이 어찌 놀랍지 않으리오... 닷넷에서도 그러한 기능을 필사적으로 지원하기 위해 ASP.NET MVC Web Application 을 지원하지 않는가 말이다. 물론 예전에도 Entity Framework 을 통해서 ORM 이 비슷하게나마 틀을 잡고는 있었지만, 스키마 변동에 둔한 그 무거움은 어깨를 누르고 무릎을 꿇게 하고 말았던 기억이... 이번 MVC 2.0 지원을 통해서 보다 말랑한 지원이 될 듯 보이는데 마침 재밌는 소식이 들려온다. SubSonic 이란 간편한 ORM(이라고 하기엔 뭣하지만, 관리 가능한 Entity 레이어 지원) 레이어가 있다는 야그를 들었다... 왠 뒷북... 슬적 검색해보니 빠른이들은 벌써 다 알아서들 쓰고 있더만... 나만 모르고 있었다는 젠장...(처음 알게되었던 msdn 기사 : http://msdn.microsoft.com/ko-kr/magazine/cc164246.aspx)
닷넷을 지원하는 ORM 툴은 http://c2.com/cgi/wiki?ObjectRelationalToolComparisonDotNet 에 잘 나와 있다 다만 대부분 생경한 이름이라는거...하긴 subsonic 역시 오늘 처음 들었으니 할말은 없다...ㅋㅋㅋ

Subsonic (http://subsonicproject.com) 에서 다운 받으면 되고 Linq 에 조금만 익숙하다면 정말 혁혁한 개발 생산성을 유도할 듯 하다. 언제간 DB 스키마 읽어서 테이블별로 입출력 자동으로 만들어주는 스크립트를 한참 생각했던 나에게 정말이지 혁신적인 도구 인 것 같다. 현재 3.0 버젼이 올라와 있고(6월 쯤 릴리즈된듯)... 위 기사에서 말하듯 subsonic 개발자 Rob Conery가 Microsft 에서 일하고 있다니 더 발전할 것은 틀림 없는 사실 일 것이다. 스캇 역시 mvc 에 전념하는 듯 보이고...어쨌거나 2010 이 나오게 되면 MVC 가 일반화 되지 않을까...지금 사용하고 있는 Enterprise Library 4.1 은 어찌 되려나...

http://subsonicproject.com/docs/The_5_Minute_Demo 를 통해서 제공하는 5분 동영상을 보면 아~~ 저렇게 간단히 사용되는거구나 할 것이다. .net MVC 에 적합한 ORM 모델을 고민하던 이에게는 정말이지 딱이다...딱! nHibernate, iBatis.Net 역시도 초기 접근의 어려움과 닷넷 모듈은 배타적인 분위기에 망설이던 분들은 지금이 바로 시작할 기회라 생각하고 도전해 보시길...


저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'뭐하는데 > Dot 4(넷)' 카테고리의 다른 글

asp.net MVC 적용하기  (0) 2010.03.12
18일 PDC 개막  (0) 2009.11.20
C# 코드 자동 생성기  (0) 2009.10.06
C# 관련 좋은 글  (0) 2009.09.23
Visual studio 2010 에서는 어떻게 바뀔까  (0) 2009.08.25
Ankh 버젼업  (0) 2009.08.12
Trackback 0 Comment 0


티스토리 툴바