CI 묻고 답하기

제목 다중 데이타 베이스 사용법?
글쓴이 Jeremy 작성시각 2011/10/08 12:58:54
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 17824   RSS
안녕하세요.

여기저기 외국 사이트 포럼과 여기 문답 포럼 까지 다 뒤져봤는데 제가 초보라서 그런건지 이해가 안되는 것도 있었고, 다 옛날 버젼 인거 같아서 다시 질문합니다.

한 서버 안에 데이타베이스 그룹이 여러개 있습니다.
동시에 이 데이타베이스 그룹들에 접근하려고 하는데요.

$this->db_name = $this->load->database('db_name',TRUE);
을 이용하면 소스코드 내에서 동시에 그 그룹에 접근할 수 있다는 것을 알게 되었습니다만,
$this->db_name->get('table_name');
이렇게  말이죠.

그런데 제가 알고 싶은건 매번 컨트롤러나 모델에서 저 명령어를 타이핑하지 않고,
글로벌 하게 자동적으로 저 명령이 수행되게 셋팅하는 법은 없나요?
session.php 코드 수정하는 법, 모델이나 라이브러리로 만들어서 부르는 법 다 시도 해봤는데 잘 안되서요.
참고로 전 CI 최신 버젼을 사용중입니다.
자세히 설명해 주실 분 안계신가요?

감사합니다.

 다음글 업로드 저장폴더를 각각 지정하는 방법을 알고 싶습니다. (3)
 이전글 CI 2버전에서.... (14)

댓글

변종원(웅파) / 2011/10/08 15:51:56 / 추천 0
 ci core에 대한 내용이라기 보다는 활용에 관한 부분이라 없었을지도 모르겠네요.

db 종류에 따라 선언을 하지 않고 알아서 해주길 바라시는거죠?

어떤 테이블이 mysql인지 오라클인지 알수있게 정의를 해 놓고 
(또는 선언되어 있는 각 db에서 테이블을 검색하여 가져오거나..)

예) table a -> mysql,
      table b -> oracle

ci core에 보면 선언된 각 db에 따라 driver를 로딩하는 부분이 있습니다.
그 앞단에 테이블에 따라 자동으로 드라이버를 로딩하도록 해주면 될 것 같네요.

그런데 코어를 직접 건드려야 하고 
저렇게 개발해 놓으면 나중에 수정 못합니다. (아니 못하지는 않지만 수정하려면 어느 테이블이
어디에 있는지 일일이 다 열어봐야 합니다.) 초기 개발자 혼자 계속 유지보수를 한다면 모르겠지만
나중에 소스를 보는 사람은.... ^^;;;;

프레임워크라는 것이 개발속도를 빠르게 해주는 면도 있지만 유지보수에 큰 비중을 두고
적용을 하곤 합니다. 그런 측면에서는 비추입니다.
일단 코어를 건드려야 하는데 DB쪽은 확장이 안되는걸로 알고 있습니다.
나중에 버전업 할때 해당 부분을 다시 수정해줘야하구요.
한대승(불의회상) / 2011/10/09 23:42:03 / 추천 0
원하시는 답변과 약간 다른 답변이지만, 그냥 나름 이해 한대로 설명해 보죠.
1.7.x로 설명 합니다.

1. config/database.php 에 여러 DB를 설정 합니다.

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "user1";
$db['default']['password'] = "userpw1";
$db['default']['database'] = "user1";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = TRUE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "euckr";
$db['default']['dbcollat'] = "euckr_korean_ci";

$db['mysql2']['hostname'] = "localhost";
$db['mysql2']['username'] = "user2";
$db['mysql2']['password'] = "userpw1";
$db['mysql2']['database'] = "user2";
$db['mysql2']['dbdriver'] = "mysql";
$db['mysql2']['dbprefix'] = "";
$db['mysql2']['pconnect'] = TRUE;
$db['mysql2']['db_debug'] = TRUE;
$db['mysql2']['cache_on'] = TRUE;
$db['mysql2']['cachedir'] = "";
$db['mysql2']['char_set'] = "euckr";
$db['mysql2']['dbcollat'] = "euckr_korean_ci";

2. php 파일을 하나 만듭니다. 방법이야 여러가지지만 모델쪽에서 DB를 자주쓰니까 모델 폴더에  common_db.inc.php 파일을 만들도록 하죠.
<?php
$this->load->database();
$this->db2 = $this->load->database('mysql2', TRUE);
?>

3. 모델을 코딩 할때 include를 시킵니다.

<?php
class Member_model extends Model {

 function Member_model()
 {
  parent::Model();

  include('common_db.inc.php');
 }

 function get_member1()
 {
  $rs = $this->db->get('member');
  return $rs->result_array();
 }

 function get_member2()
 {
  $rs = $this->db2->get('member');
  return $rs->result_array();
 }

}

4. CI 의 autoload 기능을 이용하여 자주쓰는 모델을 등록 합니다.

※ CI는 MVC를 지향하므로 가급적이면 컨트롤러에서 DB에 직접 접근하지 않는것이 좋습니다.