CI 묻고 답하기

제목 다중 게시판 생성에 따른 uri 규칙을 어떻게 하는게 좋을까요?
글쓴이 으아아 작성시각 2012/11/30 10:49:20
댓글 : 19 추천 : 0 스크랩 : 0 조회수 : 19162   RSS
질문 이라기 보단 일종에 고민입니다.

자유게시판에 쓰기에도 조금 뭐해서 말이죠.



CI의 URI 규칙은 기본적으로 

1차 / 2차/  를 기본으로 하고  추가로 3차를 받습니다.

1차는 클래스 / 2차는 함수 / 3차는 받는값 [흔히 페이지 넘버]

자! 게시판을 생성 하려고 합니다.


1차는 그냥 파일명 아무렇게 지어봅니다.

예를 들면 ci_bbs



그리고 나면 그 뒤는 비디오 처럼 나옵니다.

ci_bbs / bbs_insert / 
ci_bbs / member_insert / 
ci_bbs / list / 1 


즉 1차는 사실상 주제를 의미하고

2차는 행동할 액션 을 의미 하게 됩니다.

3차부터는 받고 싶은 값을 넣게 되죠.
안넣어도 상관없습니다.


처음엔 간단히 생각 했는데 문제가 생겼습니다!!

똑같은 구조의 게시판... 마치 파일 복사로 생성 되는데 구분이 되는 게시판을 만들고 싶었습니다.


아예 구분을 짓기 위해 이번엔 1차를 구분 지었습니다.

new_bbs / list / 1

뭐 이런식으로 말이죠.

그랬더니...

데이터베이스야 설정으로 새로 만들고 설정하고 테이블 이름도 동일 하게 만들었습니다.

그런데 문제가 생기네요.


네. 

ci_bbs  와 new_bbs 는 아무리 동일 하게 해도 똑같을 수가 없었습니다.

이는 단순 복사가 아니라 다른 기능이 조금이라도 들어가면 동일성을 강조 할수도 없구요.

링크 라는 부분이라든가... 확실히 지명된 하드코드된 링크가 박히다 보니 결국 다 찾아다니며 수정 하니

이건 복사가 아니라 하나 만드는 작업이 되었습니다.


더 많은 복사된 게시판 생성? 아.. 싫어요. 그런거 아니아니 안돼요. 
[솔직히 일일이 찾아다니며 테스트 하기도 귀찮습니다]



그래서 이번엔 CI 포럼을 연구 했습니다.

1차                 /  2차    / 3차
액션의 주제  / 액션   / 받는 값
/ qna              /  write / 0

이렇게 말이죠.



그런데 저는 복사된 게시판만 아니라 다른 기능도 넣고 싶었습니다.

예를들어 게시판만 아니라 이미지 검색 업로드 라든지. 채팅 이라든지.

예 ] /chat / login




하아... 점점 요구가 스스로 생각 해도 복잡하네요.

요약해 봅니다.

1. uri 규칙을 사전에 정해서 어떤 대상이 무엇을 할건지 분명히 한다.

2. 1차 2차 를 규정 하고 3차 는 있든 없든 자유로워야 한다.

3. 게시판을 테이블만 늘리면 동일한 쿼리 내에서 처리 하게 하여 아주 간략화 한다. [즉 소스를 늘리지 않는다]
[공동으로 처리되는 모델을 만들거나 아니면 똑같이 복사 붙여서 파일 이름만 바꾸면 기능 하도록 만든다.]


그래서 컨트롤러에 앞에 폴더별로 구분 하는건 어떨까?! 1차는 폴더 명으로 하고 2차는 클래스 명으로!

하지만 이것도 흔퀘한 해답이라고는 하기 어렵더군요.


그래서 내린 저의 결론입니다.


1차 대주제
bbs [게시판. 모든 게시판은 bbs로 통일 하는 것입니다!]

2차 테이블 네임
네. function 을 테이블 네임으로 정합니다.
그럼 타겟은 언제나 테이블 네임으로 됩니다.

테이블 생성에는
ci_bbs
new_bbs
ci_bbs_replay
new_bbs_replay

이렇게 생성하고 함수도 같게 만들어야 겠지요?

3차 행동 주체... 액션! [가변]
무엇을 할지를 정합니다.

bbs / ci_bbs / insert

ci_bbs 테이블에 게시물을 넣을 속셈인가 봅니다.


4차. 추가로 넣을 파라메터. page 넘버등

bbs / ci_bbs/ list / 1

ci_bbs 의 리스트물중 1 번을 보여 달라는 이야기 인것 같네요.




한마디로 ... 2차 에서 3차 파라메터를 보고 조건 분기를 하겠다는 이야기 입니다.



잠시만요?! 저~기 시작에 bbs 로 시작 하는거... 뭔가 의미없지 않나요?

의미는 있다고 봅니다.

1. 눈으로 딱 보기에 이건 게시판을 위한 클래스다.

2. 해당 파일 클래스 내에서 한번에 모든 게시판을 컨트롤 한다.

즉 대명제를 둠으로서 구분을 하고 한곳에서 해결 하려는 속셈입니다.


이러면 생기는 문제는 그것이죠.

네. 컨트롤러가 약간 복잡해질 분위기 입니다?


즉 조건분기에 의해서 뷰를 불러올지 안불러 올지 구분을 정해 줘야 되는 상태가 되었는데...


시뮬레이션을 해보죠.




예1 ] /bbs/ci_bbs_replay / insert
예2 ] /bbs/ci_bbs/list/1


이경우...

예1은 인서트인 만큼 post 체크를 해야 합니다.
기타 세션여부 체크와 어디서 날라왔는지도 한번 체크해볼 필요성이 느껴집니다.

이상태로 

예2로 돌입...

해당 게시물을 뿌려라!

즉  uri 3번째 파라메터를 조건문으로 무엇을 할지 결정 하게 됩니다.



아 좋아요! 그럼 이걸 복사! 한다면... 신경써야 할건?

네 . ci_bbs_replay   이냐 new_bbs_replay 이냐. 맨 처음 네임 차이와

별 필요성 없으면 해당 테이블을 똑같이 만들고 테이블 네임만 바꾸면 된다는 이야기가 됩니다.


그러면 하나의 데이터베이스에서 여러개의 구분된 게시판 테이블을 주르륵 만들고

한번에 컨트롤 하겠다! 라는 속셈입니다.

단점은 하나 변경 하면 전부 변경 된다.

장점은 전부 바꾸고 싶으면 한번에 전부 바꿀수 있다.


.... 잠시만요?!

uri 2차를 기준으로 쿼리를 직접 따오겠다고?!

그거 위험하지 않을까요?

라는 걱정에 일단 설정은  노 쿼리스트링 을 설정 했고


애초에 2차 uri 는 틀리면 해당 페이지가 없다는 메세지가 먼저 뜹니다.

없는 페이지에 접근 해서 뭐할 건가요 ( ..)


이게 테이블 네임을 2차에 넣은 목적 이었습니다.



마지막 요약 합니다.


1차 대 주제 및 클래스 파일
2차 해당 테이블 
3차 액션의 주체
4차 추가 파라메터

bbs/ [target table name] / [action methode] / [parameter]

이렇게 uri 규칙을 정해놓고 게시판을 만들면 앞으로 여러개의 게시판을 동시에 쉽게 관리 할것 같다는 저의 얄팍한 수...

어디 지적 당할 부분은 없을까요?


혹은 여러개의 동일 한 게시판을 아주 쉽게 만들어 내는 별다른 방법은 없을까요?

조언을 구합니다.

 다음글 PHP(no 프레임워크) 날코딩으로 작업하다가 CI로 ... (9)
 이전글 CI로 작성된 서버를 서비스 중인데 자꾸 먹통이 되네요... (1)

댓글

헛발이2 / 2012/11/30 11:01:50 / 추천 0
좀 성의없는 답변이긴 하지만....

포럼 소스나 혹은 마냐님 게시판을 보시면 다중게시판으로 만들어져 있는걸로 알고 있습니다...

그 소스의 라우팅이나 _remap() 같은게 어떻게 되어 있는지 확인 해보시면 좋을듯 싶네요..
으아아 / 2012/11/30 11:32:22 / 추천 0
 넵. 마냐님 보드는 오래전에도 한번 훌어 봣습니다.

그런데 구현 방식이 너무 복잡 하셔요 흑흑.

_remap() 기능은 결국 파라메터를 기준으로 어디로 날려 보낼까? 를 정하는 기능 인데...

case 'lists' : $this->lists($seg1, $seg2); break;
case 'view'  : $this->view($seg1, $seg2); break;
case 'write' : $this->write($seg1, $seg2); break;

이런식으로 되어 있으시니..

세그멘트 4번째와 5번째를 기준으로

대상과 액션의 주체를 결정 하는게 아닐지 추측 이 됩니다.

저의 경우엔 사실상 최대 4개의 uri 세그멘트를 사용하고

2번째 uri 로 해당 테이블을 지적 하겠다는 좀더 명확한 규칙을 내세운것 입니다.



전부 면밀히 본것도 이해한것도 아니라서 그런지.. 마냐님 보드는 

복붙 으로 붙여서 쉽게 늘려가는 다중 게시판 구조는 아닌것으로 알고 있습니다.

[아니라면 제가 이해를 못했거나 어디 제대로 안봣다는 이야기겠죠.]


_remap()을 사용해도 결국 해당 함수 내에서 해당 파라메터를 가지고 무언가를 해야 한다.

라는 주체성이 필요하게 됩니다.


결과적으로 어떻게 좀더 간단하고 효율적으로 게시판을 다중으로 만들어 내느냐?

좀더 간단하게. 좀더 쉽게.

이 2가지 명제로 접근 하고 있어요.



조언 감사합니다.
 
milosz / 2012/11/30 11:34:43 / 추천 0
복붙으로 늘린다는 말은 각각의 게시판을 DB로 관리하는게 아니라
실제 파일로 만들어서 사용하신다는 의미 같네요. 제가 바르게 이해한게 맞나요? /ㅅ/
으아아 / 2012/11/30 11:43:10 / 추천 0
아니요.

복붙 이란 의미는 이런 의미 입니다.

파일을 늘리면 결국 관리가 엄청 불편하며 파일을 늘어난다는건 하나의 파일에서

전체 게시판을 컨트롤 한다는 명제에 위반 하게 됩니다.


즉 이런 이야기입니다.


먼저 베이스가 되는 함수들을 만듭니다.

/* function 은 2번째 uri 와 동일 */
function ci_bbs {
//리스트 & 검색

$target_table_name = $this->uri->segment(2);
//해당 테이블 이름
$action = $this->uri->segment(3);
//3번째 액션 메소드

if($action == "insert"){
// 게시물 생성
$this->bbs_model->bbs_insert($target_table_name,$p1,$p2,$p3);

} //end insert
elseif ($action == "list") {
 //생략 
}


}

/* bbs models */
function bbs_insert($target_table_name,$p1,$p2,$p3){
$query = "insert $target_table_name ......"

)

컨트롤러에선 처음에 3번째 uri 를 기준으로 행동 분기하고

동일한 쿼리에 테이블 명만 2번째 uri 를 집어 넣어서 쿼리를 사용하자~

라는게 주 목적 입니다.


으아아 / 2012/11/30 11:45:32 / 추천 0
 그리고나서


function new_bbs {  // <- 네임만 바꿈
//리스트 & 검색

$target_table_name = $this->uri->segment(2);
//해당 테이블 이름
$action = $this->uri->segment(3);
//3번째 액션 메소드

if($action == "insert"){
// 게시물 생성
$this->bbs_model->bbs_insert($target_table_name,$p1,$p2,$p3);

} //end insert
elseif ($action == "list") {
 //생략 
}


}

/* bbs models */
function bbs_insert($target_table_name,$p1,$p2,$p3){
$query = "insert $target_table_name ......"

)


즉 동일한 모델을 바라보고 다른 이름으로한 2차 uri 페이지 에서 파라메터만 던져서 처리 하겠단 소리입니다.

행동은 동일한 쿼리를 날리는데... 적용하는 대상은 table 만 다르게 하겠다는 얄팍한 수작 입니다 ;_; 


으아아 / 2012/11/30 11:48:44 / 추천 0
 물론 뷰도 페이지 설정도 완전히 동일하게 가져오고 

insert
delete
update
select

4가지 행동 주체 및 기타 모든 

ci_bbs 로 만들어진 함수를

복사 해서 붙여 넣습니다.
function ci_bbs {
//생략
}

function ci_bbs {
//생략
} // 붙여서 만든 함수


붙여진 함수들은 new_bbs

로만 바꾸면 동일 하게 행동 합니다.
function ci_bbs {
//생략
}

function new_bbs{
//생략
}


물론 동일한 테이블도 생성 해야 겠지요!!


이런 꼼수를 하려는게 저의 목적입니다.

milosz / 2012/11/30 12:15:32 / 추천 0
기존 게시판 컨트롤러인 ci_bbs를 복사해서 new_bbs를 만들어 다른 게시판 타입(가령 지식인 게시판 이라든가..)을 만들고 싶다는 얘기신거죠?
 
게시판의 정보를 저장하는 곳에 필드를 하나 더 생성해서 각각 타입에 따라 컨트롤러를 불러오는 방식은 어떨까요? 각 타입 컨트롤러에 function이 선언되어 있으면 그걸 실행하고 없다면 기본 게시판 컨트롤러의 function을 실행하는 식으로...

만연체로 글 잘쓰시네요 ;ㅅ;
으아아 / 2012/11/30 12:24:25 / 추천 0
 답변 감사합니다.

흠.. 필드 추가로 구분이라...


아직 게시판의 형태 분류는 생각 안했는데 앞서 나가시네요!


제가 하고 싶은건 정말로 완전히 동등한 기능을 하는 게시판을 늘리는 것입니다.

그냥 복사 하듯이요.


게시판1 과 동일한 게시판2 를 만드는데 걸리는 시간이 뜨거운 커피를 원샷 때리기도 전에

만들정도의 속도감! 이랄까요?


게시판1 함수 복사 붙여넣고 이름 변경.

게시판1 sql 따와서 테이블 네임만  수정하고 한번에 테이블 생성.


여기까지 핫커피가 식기 전에 해결 하려는... 뭐 그런 것입니다.
[제가 워낙 날로 먹을려고 하는 습성을 지녔거든요!]


게시판 필드에 해당 게시판의 다른 타입이라는 구분 분류 필드를 두고

형태체인지라... 뭔가 변신 하는것 같아서 멋진데요?!
milosz / 2012/11/30 12:36:56 / 추천 0
동일한 게시판이면 위 올려주신 부분으로 모두 처리가 되는데
테이블을 추가해주는 것이라면 모를까 동일한 컨트롤러를 늘릴 이유를 잘 모르겠네요.
 
소스로 보면 2번째 세그먼트 값으로 테이블을 로드하게 되어 있는데
동일한 기능이라면 디비에 테이블만 추가해주면 되지 않을까요?
으아아 / 2012/11/30 12:46:47 / 추천 0
아...?! 했었는데 다시 생각해보니 안그렇습니다.

2번째 세그먼트는 함수 잔아요?

지금 저것의 상태는 요약 하면 이렇습니다.


<?  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class  Bbs extends CI_Controller {
 function Bbs() {
  parent::__construct();
 }
 function index(){
  redirect("/bbs/main");
  }//end index
 function ci_bbs(){ 
 }
 function new_bbs(){
        }
 function lol_bbs(){
        }

}
보시면 아시겠지만 2번째는 함수 이름 입니다.

당연히 해당 함수를 가져오게 됩니다.

/bbs/lol_bbs/list/1

이렇게 접근 하면 어디로 떨어질까요?

당연히

function lol_bbs (){ } <- 여기로 가게 됩니다.


그럼 왜 굳이 2번째 세그멘트에 넣었냐?

3번째에 넣어도 돼는거 아니냐?


가장큰 이유는 DB 에러를 내뱉기 전에 페이지 에러를 먼저 내뱉는 다는것입니다.

3번째는 값이 틀리다고 해서 페이지 에러를 딱히 뱉지 않습니다.

그러나 2번째는 반드시 해당 테이블을 정확히 지목 해야 합니다.


그리고 지목한 페이지는 해당 함수 이름과 동일 합니다.

그런고로 컨트롤러가 늘어나게 되어있습니다.


그렇네요.

막상 이렇게 놓고 보니 컨트롤러가 좀 반복적으로 늘어나는 부분은 미관상 보기 안좋네요.

그리고 _remap()를 도입해서 

3번째 파라매터에 대한 접근을 한곳에서 처리 해야 겠네요.

문제는 늘어나는 컨트롤러 인가.. 흠...





milosz / 2012/11/30 12:52:11 / 추천 0
 라우팅을 통해 세그먼트의 순서를 변경할 수 있습니다.
 
포럼 소스나 마나님 게시판 소스를 잘 분석해보세요. 포럼 각 게시판의 qna, free, notice가 각각 컨트롤러로 존재하는게 아니라 라우팅을 통해 하나의 컨트롤러에서 제어가 됩니다.
으아아 / 2012/11/30 13:02:57 / 추천 0
답변 감사합니다.

라우팅에 그런 기능이 숨겨져 있다니! 이런 깍쟁이 라우팅 ㅠㅠ

그렇다는건...

1. uri 규칙을 변경할수 있다. 
[이는 2번째가 반드시 함수명이 아니여도 된다.]

2. 해당 파라메터를 기준으로 리맵핑을 할수 있다.

3. uri 를 파라메터로 (타겟 테이블네임, 액션) 을 기준으로 리맵을 시켜 던져준다.

4. 1종류씩의 함수들에 파라메터를 받아와 쿼리에 그대로 넣어주면 동일 하게 작동하게 설계한다.


요컨데 
/bbs /  lol_bbs / insert 

접근시

2번째가 무엇이든 간에   3번째를 기준으로 해당 함수로 접근.

그리고 받아온 파라메터로 공용화된 쿼리를 실행 한다.



이로서 딱히 컨트롤러를 늘릴 필요도 없으며 테이블만 생성 하면 된다.


라는 셈이 되는군요.

단지 2번째가 임의 테이블을 넣을경우 DB 쿼리 에러는 어쩔수가 없게 되는셈이 되는군요.

이러면 테이블을 늘릴때마다 해당 테이블 네임을 관리 해주는 테이블 체크가 추가로 필요하겠군요.


아... 다좋은데 테이블 체크 함수 추가... 추가할때마다 늘려주기... 

아직 뭔가 더 쉬운게 있지 않을가? 하고 전 기도해 봅니다.



으아아 / 2012/11/30 13:14:21 / 추천 0
 아... 문득 들은 생각인데...

라우터의 조건이 클래스 명에 따라 다르게 설정 되나요?

위에도 나왓듯이

전 다중 게시판만 아니라 전혀 다른 서비스도 넣을거고

분류를 2번째는 반드시 함수명으로 할 예정입니다.


다중 게시판 때매 다른걸 복잡하게 룰을 꼬으고 싶지 않아요 ㅠㅠ

클래스명을 기준으로 멀티 라우팅 가능 할까요?
꾸숑 / 2013/02/02 04:59:18 / 추천 0
글을 모두 읽어 보았습니다.
저도 으아아 님과 같은 고민을 하였습니다.

마지막 댓글을 보고 다시한번 생각해 보고 있습니다.
다중 게시판만 만들것이라면 뭐 쉽게 생각할수 있지만...

게시판도 만들고 쇼핑몰도 만들고 일반 html 페이지등 많은 기능이 들어 가는 웹사이트를 만든다면...
일관적이고 규칙적인(순차적) url이 필요해 보이네요... 두번째 세그먼트?는 함수명으로 해야 일관성이 있어 보이네요...

저는 다중게시판 기준으로 이렇게 한번 시도해 볼 생각입니다.

도메인/디렉토리/컨트롤러/함수/테이블명/num값/page값/검색어/

위의 예는 필수 요소가 앞쪽에 있고 옵션이 뒷쪽에 있는 형태라서... 일관성과 확장성이 있을것 같네요...

예를 들어 함수/테이블명/num값/page값/검색어/ 가 필요하지 않은경우에는 순차적으로 뒷쪽부터 출력하지 않으면 될뜻합니다.

주소체계가 기존과 달라서 이것 저것 머리가 아프군요

하지만 이번 고비를 넘기면 즐거운 프로그램밍이 될걸로 믿고 해보고 있습니다.

이게 성공하면 초보 딱지 뗄수도 있을것 같습니다.^^

열공!!!
변종원(웅파) / 2013/02/02 15:44:07 / 추천 0
머리 아프시면 섞어쓰세요 /컨트롤러/함수/?a=a&b=b 팁게시판 보시면 제가 올린 것중에 관련함수 있습니다