CI 묻고 답하기

제목 CI 이제 시작했는데, 이렇게 하는게 맞는걸까요?
글쓴이 탁주나한잔 작성시각 2012/04/23 10:21:27
댓글 : 5 추천 : 0 스크랩 : 0 조회수 : 17819   RSS
지난주 부터 CI 시작했습니다. 간단한 Blog 만들어 보고있는데 이런식으로 하는게 맞는지 궁금해서 질문드립니다.

그냥 blog.php란 controller를 만들었고, 모델 파일도 하나 만들어 봤구요. blog.php에는 여러 메서드를 같이 너어놨습니다.

예를들어

class Blog extends CI_Controller
{
 public function __construct()
 {
  parent::__construct();
        
        session_start();

 }
 
 public function index()
 {
        $this->load->library(array('jsclass_util','jsclass_paging')); 
        $this->load->helper('url');
        $this->load->model('Blog_model');
        
        $this->load->view('blog_header');
        $this->load->view('blog_navi');
        
        $data['total_rows'] = $this->Blog_model->CountAll();
        $data['result'] = $this->Blog_model->GetLimit(50, 0);
        
        $this->load->view('blog_lists', $data);
        $this->load->view('blog_footer');
 } 
 
 public function view()
 {
        $this->load->library(array('jsclass_util','jsclass_paging'));
        $this->load->helper('url');
        $this->load->view('blog_header');
        $this->load->view('blog_navi');
  
  $this->load->database();
  $data['query'] = $this->db->get('posts');
  $this->load->view('blog_view', $data);
        $this->load->view('blog_footer');
 }
 
 public function post()
 {
        $this->load->library(array('jsclass_util','jsclass_paging'));
        $this->load->helper('url');
        $this->load->view('blog_header');
        $this->load->view('blog_navi');
            
  $this->load->view('blog_post');
        
        $this->load->view('blog_footer');        
 }
 
 public function postSubmit()
 {
  $this->load->model('Blog_model');
  $data['result'] = $this->Blog_model->WritePost();
 }
    
    public function login()
 {
        $this->load->library(array('jsclass_util','jsclass_paging'));
        $this->load->helper('url');
        $this->load->view('blog_header');
        $this->load->view('blog_navi');
            
  $this->load->view('blog_login');
        
        $this->load->view('blog_footer');  
 }
....
}
근데, 각 메서드마다 헤더, 메뉴, 푸터를 넣고, custom class도 같이 넣어사용하는데, 이게 맞는 방법인가요? 제가 CI사용하는 방향이 맞는지도 몰라서 질문드립니다.

 다음글 mysql의 password() 어떻게 사용하면 되나요... (4)
 이전글 DB에 입력하는 컨트롤러에서 post값 비어 있는지 체... (3)

댓글

배강민 / 2012/04/23 10:40:22 / 추천 0
 정답이란게 있을 수는 없겠고용..ㅋ

view단의 header, contents, footer 를 해도 무방하지만 layout으로 검색해보시면 껍데기 만들고 알맹이만 어싸인하게 용이한 라이브러리도 있고요. 

아니면 인클루드 방식으로 하시는 것도 본적 있고요..

library, helper 는 거의 모든 페이지(?)에서 이용되는 부분이라면 autoload에서 한방으로 호출해도 되겠고, 해당 컨트롤러에서만 거의 모든 함수에 이용되는거라면 상단 생성자부분에서 한방만 해줘도 될것 같고요.

제 개인적으로는 객체생성을 줄이기 위해서 아주아주 공용인거만 한방 선언하고 아니면 함수마다 선언하지만,

해당 컨트롤러에서 사용하는 라이브러리, 모델, 헬퍼등 생성자에서 몰아서 한방에 불러와도 됩니다.

즉, 정답이란 없지만.. 제 경험을 그냥 말씀드려봅니다. 결론은 탁주나한잔님 마음껏 소신껏이실듯합니당~ㅋ
변종원(웅파) / 2012/04/23 23:22:06 / 추천 0
처음엔 그렇게 씁니다. 쓰다보니 이거 중복인데 하고 뭔가 있지 않을까 하고
찾는 것. 당연한 수순입니다. 오히려 처음 그대로 쓰시는 분들이 발전이 없는거죠.

자주 쓰는 함수들을 라이브러리화 하는 것과 마찬가지로 헤더, 푸터, 공통 라이브러리들
편리하게 쓰는 방법이 있습니다. 강민님이 쓰신 방법처럼 layout이라는 것을 이용할 수도 있고
ci의 _remap()을 이용하는 방법도 있고(검색하시면 나옵니다)

통상적으로 ci의 클래스들은 사용하는 컨트롤러에서 로딩하여 쓰는 것이 맞습니다.
(메모리 효율상) 그런데 컨트롤러 내의 상당 수의 메소드에서 필요한 클래스라면
생성자에 선언하여 쓰는 것이고 경험상 메소드가 10개인데 그중 5개의 메소드에서
필요한 클래스라면 생성자에서 선언하여 쓸 수도 있고 그 갯수는 개인에 따라 다릅니다.

이것저것 다 귀찮고 서버가 빵빵하다면 모든 클래스들 autoload에 넣고 신경 안쓰는 것도
방법입니다. ^^;

결론은 강민님 말씀대로 정답은 없습니다.

프로파일러를 true로 선언하면 페이지 하단에 여러 정보가 표시되는데 그중에 현재 페이지의
메모리 사용량이 표시가 됩니다. 통상적으로 4메가를 넘지 않아야 하고 2-3메가 정도 유지하는게
좋습니다. 그러려면 쓰지도 않는 클래스가 로딩되어 있지는 않은지 필요없는 헬퍼가 항상
로딩되지는 않는지 구조적인 점검이 필요합니다.
탁주나한잔 / 2012/04/24 04:32:11 / 추천 0
 강민님, 웅파님 답변 감사합니다.

PHP로 프레임웍을 이제 막 시작했습니다. 그랬더니 웅파님 말씀처럼 뭔가 있지 않을까하고있었습니다. 

지금까지 autoload 아니면 필요한 class만 로드해 사용했었는데, CI는 뭔가 좋아 보이고 편해보이지만 막 손에 잡힐듯 하면서 않잡히고 있습니다. 열심히 하다보면 아, 이것이다 하면서 저만의 방법이 만들어 지겠지요.


감사합니다.
변종원(웅파) / 2012/04/24 12:53:30 / 추천 0
컨트롤러안에 아래 구문 삽입해서 사용하시면 헤더, 푸터 자동로딩됩니다.
참고하세요.

public function _remap($method)
    {


  if (strpos($method, '_popup') == false & strpos($method, '_ajax') == false)
  {
   $this->load->view('common/head_v');
  }

  if( method_exists($this, $method) )
  {
   $this->{"{$method}"}();
  }

  if (strpos($method, '_popup') == false & strpos($method, '_ajax') == false) $this->load->view('common/foot_v');
    }
if문이 있는 것은 헤더와 푸터가 모든 페이지에 필요한 것이 아니라서 메소드명에 _popup 또는 _ajax가 붙어있다면 헤더, 푸터를 붙이지 않습니다. ajax로 콜 했을 경우 헤더가 붙어 있다면 제대로 된 값 반환이 안되겠죠.
탁주나한잔 / 2012/04/26 22:08:10 / 추천 0
아, 오늘 답글 확인했습니다. 
포럼 에서 remap에 대한 글을 잠깐 봤었는데, 다시 찾아봐야겠습니다. 

웅파님 고맙습니다.