본문 바로가기

삽질

관례를 중시하는 웹 프레임워크와 삽질

오늘 CakePHP의 AuthComponent 덕분에 하루종일 삽질을 하게 되었습니다. CakePHP, Ruby on Rails 빠르게 웹 개발이 가능한 MVC 프레임워크는 관례를 중요시 하고 그 관례로 인해 빠르게 개발이 가능합니다. 하지만 관례만 따르기는 뭔가 답답한 감이 들기도 합니다. 그래서 오늘의 삽질이 시작되었습니다. CakePHP역시 Ruby on Rails 처럼 비슷한 관례가 있습니다. 예를 들어 CakePHP도 Rails처럼 Model은 단수 Controller는 복수입니다. CakePHP에서 맘에드는 점은 Table 즉 DB를 쓰지않는 Model을 사용할 수도있습니다. Model에 $useTable 변수를 변경하는 것만으로 Model을 데이터베이스가 아닌 다른 것들로 채울 수 있는 방법이 있습니다. 또 한 Controller를 단수로 만들 수도 있습니다. Controller에서 $uses 변수로 여러가지 모델을 한번에 컨트롤러에서 사용할 수 있는 방법도 있습니다. 제 생각에는 Rails 보다는 좀더 유연한 프레임워크 같습니다. ( 언어를 말하는 것이 아닙니다. ) 물론 Rails도 CakePHP보다 좋은 점이 많습니다.

오늘의 삽질은 사용자 인증을 위해 CakePHP의 AuthComponent를 사용하면서 발생 했습니다. CakePHP의 관례대로 데이터베이스의 테이블은 users, 모델은 user, 컨트롤러는 users로 이름을 짓고 로그인과 로그아웃을 간단하게 구현했습니다. users 컨트롤러에는 scaffold로 구현한 사용자 관리 로직도 있으므로 로그인을 따로 분리하기 위해 Login(단수입니다.) 컨트롤러를 만들어서 기존의 코드를 이용했습니다.
여기서 부터 로그인이 아무리 해도 안되는 것입니다. AuthComponent의 useModel 옵션으로 모델도 user로 잡았는 데도 값은 있는데 도무지 인증처리가 되지않아서 무려 5시간이나 삽질을 했습니다. 도저히 안되어서 AuthComponent의 소스를 뒤지기 시작했습니다.

소스를 10분정도 뒤지니 순간 멍해졌습니다. 

create('User', array('action' => 'login')); ?>
input('uid', array( 'label' => '로그인 ID')); ?>
input('password', array( 'label' => '로그인 암호')); ?>
end('Login'); ?>
CakePHP에서 Form 헬퍼로 이렇게 폼을 만들면 폼의 input 엘리먼트들이 컨트롤러에 넘어올때는 data[User][uid] 처럼 넘겨집니다. 이것이 관례 입니다. 즉 위의 코드는 Login 컨트롤러에서 부르더라도 Model에 해당하는 data[User][uid] 을 찾는 것입니다. 저는 data[Login][uid]으로 넘어갈 줄 알았는데 말입니다.  저는 이 관례를 깨트리고 좀더 유동적으로 만들고 싶었는데 말이지요.

이것이 관례를 따르는 프레임워크의 함정입니다. 처음 CakePHP로 scaffold 된 페이지들을 보았을때 아주 간단하게 CRUD 페이지와 로직이 모두 만들어 지는것이 정말 신기했고 정말 빠른 개발이 가능할 것이라고 생각했습니다. 하지만 정작 개발을 시작했을때 당황하지 않을 수 없었습니다. scaffold 는 뭔가 미리 약속한 듯한 코드일 뿐 나머지 것들은 다 숨겨져 있기 때문입니다.