CI 묻고 답하기

제목 CI 모델 구조와 쿼리 방식에 대해서 문의드리겠습니다.
글쓴이 가내수공업개발자 작성시각 2013/11/14 04:05:25
댓글 : 8 추천 : 0 스크랩 : 0 조회수 : 14308   RSS
 
CI를 이용해볼까해서 메뉴얼을 1독하고 질문하는 것이니 너무 멍청하다고 욕하지 말아주세요.

1. MODEL 은 꼭 필요할까요?
DB에 데이터는 이미 있고, 그 데이터를 가져와서 보여주는 사이트입니다. MODEL 이 꼭 필요할까요?

2. Query는 어떤 방식으로 날리는게 효과적인가요? 특히 select.
메뉴얼에 보면 

$this->db->query('YOUR QUERY HERE');
이렇게 직접 쿼리를 날리는 방식이 있고,

$query = $this->db->get('mytable');
이렇게 get 으로 가져오는 방식이 있던데 어떤 방식이 좋은가요?

위에껀 디테일하게 제가 컨트롤 할 수 있을 것 같은데, 코드가 좀 지저분해질것 같고,
아래껀 세밀하게 컨트롤 할려면 CI 메뉴얼을 더 뒤적 겨려야 할것 같습니다만, 일반적으로 어떤 방식이 선호되나요?

3. MODEL은 어느 부분까지 말들어야 합니까?
예를 들어서 다른 플랫폼처럼 MODEL 부분에 레코드와 필드타입까지 다 지정해서 model에서 데이터베이스 생성, 삽입, 조회 다 가능하고 꼭 model을 통해서만 데이터에 접근이 가능한것인가요?
아니면 그냥 일반 MVC 모델처럼 비즈니스 모델만 model  에서 처리하나요?
즉, Controller 에서 데이터를 가져와서 view에 뿌려도 되지만, 코드가 난잡해지니 model 에서 데이터를 가져오는 코드를 작성해놓고
controller 에서 호출해서 view에 뿌리는 것인가요?



감사합니다.
태그 쿼리,MVC
 다음글 초보가 시작할 수 있는 방법 ?? (4)
 이전글 route 설정 한번만 더 질문드립니다 ㅠ (5)

댓글

헛발이 / 2013/11/14 08:39:20 / 추천 0
1.
MVC방식을 이용하겠따는건 MVC방식으로 코딩하겠따는 의미가 되죠..
꼭이란 말은 CI에선 불필요하겠지만(뷰에서도 DB를 불러올수 있으니깐요..)
가능하면 MVC코딩기법에 마춰서 코딩하는게 좋구요~
이유는 코드의 재사용(똑같은 퀴리를 2,3번 사용하게 된다던가..),
코드의 통일화(MVC를 아는 프로그래머라면 쉽게 어디에 뭐가 있는지 알수 있는...)
를 들수 있겠쬬...

2.
가능하면 get방식을 사용하는게 좋습니다.
이유는 직접퀴리는 복잡한 퀴리를 사용할때 사용하겠지만 직접 작성하게 되면
잘못된 쿼리문이나 인젝션공격에 취약해질 우려가 있기 때문이죠..
get방식(액티브레코드)을 가능하면 사용하시는게 좋습니다..

3.
URL로 접근 하면 콘트롤러로 접근하게 됩니다. 즉 기준은 콘트롤러가 되는것이죠...
집속이 되면 콘트롤러에서 잠깐 모델로 가서 데이터를 가져오고
가져온 데이터를 라이브러리에 가서 그 데이터를 가공시켜서 원하는 모양으로 변경한 다음에
다시 콘트롤러에서 그 조작된 데이터를 뷰에 전달 해 주는것이 되겠죠.
그러면 뷰에선 그냥 단순히 조작된 데이터를 echo 하는것이 고요...

가내수공업개발자 / 2013/11/14 08:49:40 / 추천 0
 @헛발이// 감사합니다. 그러면 Django 처럼 Model 이랑 DB랑 꼭 동기화할 필요는 없다는 말씀이시군요. 감사합니다.
헛발이 / 2013/11/14 08:52:23 / 추천 0
코드이그나이터의 부제목이 [빠르고, 유연한 PHP Framework!] 이죠..

유연하다는건 그때그때 상황에 맞게 코딩 하시면 되구요~
다른 프레임워크 처럼 규약이 강제규약은 아니니깐요...

하지만 가능하면 MVC에 맞게 코딩하시는게 차후에 유지보수나
다른 코더가 수정할 경우 수월할거라 생각이 듭니다..
가내수공업개발자 / 2013/11/14 11:04:42 / 추천 0
 @헛발이 감사합니다.
들국화 / 2013/11/14 11:43:16 / 추천 0
2. 저는  AR안씁니다. 복잡하고 다른 디비로 옮기기 쉽다는데... 100%되는것도 아니고 쿼리문이 자유롭지도 않습니다.
그리고 무엇보다 쿼리 짜기 힘들고 쿼리가 복잡해지면 사용불가 합니다. 그리고 메뉴얼을 게속 찾고 뒤져야 하는 불편함이...
인젝션 공격도 바인딩 쿼리시에 처리해 주는걸로 알고 있고요..

AR을 off만해도 속도가 빨라집니다. 이유야 당연히 변환을 하나라도 덜하니 그렇켔죠... 그래서 database.php 에서 $active_recorde를 off 해 주면 되는데 했더니 뭐였더라 프레임워크 시작할때 초기화에 문제가 있었던거 같은데... 아마 디비 접속부분이었던거 같네요... 그것만 아니면 전 오프...

바쁘고 귀찮아서 안하지만 인붓값은 항상 validation으로 검증을 하는게 우선이지 않을까 합니다.

뭐 개인적인 생각 입니다. ^^
가내수공업개발자 / 2013/11/14 12:31:22 / 추천 0
 @들국화 저도 고민이긴 합니다... 매뉴얼을 뒤저가면서 CI 스럽게 하느냐, 아니면 그냥 내 편하게 하느냐 ㅎㅎ

그러게요. 어차피 인젝션도 바인딩해서 stmt 쿼리시에만 해주는것 같고...
변종원(웅파) / 2013/11/14 13:07:44 / 추천 0
AR 쓰시면 오라클에서 하나는 정말 편합니다. 페이징. ㅎㅎㅎ

$this->db->limit(1,10); 쓰시면 알아서 numrow 쿼리로 변환해서 값을 넘겨줍니다.
태양이 / 2013/11/15 15:48:09 / 추천 0
저는 서브쿼리 사용할 때 외에는 액티브레코드 사용해요
가독성이 좋아서 유지보수가 편하더라구요..물론 일반쿼리도 가독성 좋게 작성하면 되지만요..

ex)
$this->db->select('*')
->from('table') // 주석도 넣을 수 있어요
->where(array('id'=>'test'));
 
$o_result = $this->db->get();
$a_data = $o_result->row_array();


ex) left 조인
$this->db->select('a.*, b.*')
->from('member a') // 주석도 넣을 수 있어요
->join('member_extend b', 'a.id = b.member_id', 'left') // 두번째파라미터 생략하면 일반조인
->where(array('a.id'=>'test')) // 회원id가 test인 사람 구하기
->where(array('b.zipcode'=>'123-456')); // 우편번호가 123-456인사람 구하기
 
$o_result = $this->db->get();
$a_data = $o_result->row_array();