오늘의 삽질은 사용자 인증을 위해 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 는 뭔가 미리 약속한 듯한 코드일 뿐 나머지 것들은 다 숨겨져 있기 때문입니다.