자유게시판

제목 CI도 서비스 레이어가 필요합니다.
글쓴이 1 작성시각 2012/12/04 20:58:15
댓글 : 10 추천 : 0 스크랩 : 0 조회수 : 13772   RSS
빠른 개발에 가볍고 자바처럼 컴파일도 없고 -_- 해서 CI로 이것저것 취미삼아 하는데
그럼에도 스프링이 생각나는건 딱 하나 @Service 때문입니다.
최근 비즈니스 로직이 복잡해지면서 다양한 테이블로 액션이나 트랜잭션을 담보해야하는 기능등이 다양하게 필요한데
컨트롤러에서 하기에는 재활용성이 떨어지고 모델에서 하기에는 모델이 모델같지가 않고 별도로 라이브러리를 만들지나 CI와 끈끈함이 사라지는거 같아서 고민입니다.
모델 폴더에 model 과 service 폴더를 하나씩 만들어서 나름 분리하고 있긴한데
코드의 재활용때문이라도 서비스는 분명히 필요한것 같습니다.
이것만은 꼭 됬으면 좋겠습니다.



 다음글 아주 가볍고 유연한 프레임웤이네요........ (3)
 이전글 여러분이 일하는 곳에서 (3)

댓글

한대승(불의회상) / 2012/12/04 21:37:55 / 추천 0
@Service에 대해 설명 부탁 드립니다. ^^
변종원(웅파) / 2012/12/04 21:50:43 / 추천 0
저도 궁금. ^^ (only phper라....)
1 / 2012/12/05 00:04:04 / 추천 0
 @Service는 스프링에서 MVC 객체를 표현과동시에BEAN등록을 시켜주는 어노테이션입니다.
어노테이션이 중요한건 아니고.. 흠흠;;

이전 MVC 모델과 다르게 스프링은 Controller Service Dao View 의 구조를 제시합니다.
다들 코드쟁이들이니;;

만약 SMS를 보내고 로그를 저장하고 남은 카운트에서 -1을 한다 라고 가정.
그럴경우기존 mvc2 모델에서는

//controller
function insert(){

    //sms 문자보내기
    $this->sms->send('from','to','message','reserve');

    //문자 로그 기록하기
    $this->sms_history->initialize($this->input->post());
    $this->sms_history->save();

    //남은 sms 카운트에서 차감하기
    $this->apiinfo->usesms();

}

요렇게 나옵니다. Controller가 문자를 보내고 데이터를 저장하고 카운팅을 동시에 처리하는거지요

컨트롤러에 들어가있다 보니 코드 재활용이 불가능해집니다.


해서 저 역활을 모델한테 던질경우는 다음처럼 나옵니다.
//model
class model(){

    function sendmessagewithlog(){...
        $this->send()
        $this->savehistory();
        $this->countup();
    }
    function send(){...}
    function savehistory(){...}
    function countup(){...}

}

하나의 모델에서
1. SMS 발송모델에서 API를 핸들링하고
2. 로그테이블에 로그를 기록하고
3. 남은 SMS 카운트값을 내려주는

뭔가 광범위한 모델이 나와버립니다.

그리고 가장 중요한건 모델간에 의존성이 생겨서 저 코드는 다른 프로젝트에 가면 다시 수정해야 합니다.

그래서 스프링에서는 모델이나 컴포넌트 사이에 서비스 레이어를 둬서 다음과 같이 만듭니다.

//controller
function controller(){

    $this->smsservice->sendmessagewithlog();

}


//service
class smsservice(){

    function sendmessagewithlog(){
         ....
         $this->smshistory->save();
         $this->sendmessage();
    }
    function sendmessage(){
         $this->sms->send('');
    }

}

//dao (data access object)
class smshistory(){
    function save(){...}
}
class apiinfo(){
    function usesms(){...}
}

//component (library)
class sms{
     function send(){...}
}

이렇게 하면 재활용이 불가능한 Controller 나 광범위해져가는 모델 없이
모델이나 라이브러리는 각자의 역활에 충실하고 각 모델이나 라이브러리들이 서로 의존하지 않으며 재활용 가능한 코드가 나옵니다.


물론 지지고 복고 해서 저런 형태를 유지할 수 있겠지만 아무래도 프래임웍에서 정식으로 지원하는것보다 좋을리는 없겠지요.

아무튼.. 그렇습니다....


쓰다보니 길어졌네요;


1 / 2012/12/05 00:20:47 / 추천 0
 참고로 자기전에 팁하나 던지면 모델에 폴더를 나누고 

model/dao/sms_model.php 와
model/service/sms_service.php 를 만들어서 위와 비슷하게 사용합니다.

둘다 모델을 상속하고 폴더가 하나씩 들어가 로드할때 좀 짜증나지만...

코드재활용은 참 중요한거 아니겠습니까?  :D
한대승(불의회상) / 2012/12/05 02:23:26 / 추천 0
새벽에 깨서 모하는 짓인지..... 느낌은 웬지.....
CI의 library 느낌 이네요

$this->load->library('smsservice');
$this->smsservice->sendmessagewithlog(); 


ㅎㅎㅎ ^^
milosz / 2012/12/05 09:07:00 / 추천 0
 라이브러리로 가능할 듯도 싶은데 한번 확인해보세요~
1 / 2012/12/05 09:19:01 / 추천 0
 라이브러리는 스프링에서는 컴포넌트입니다. 넣을수는 있겠지만 안자연스럽죠;
변종원(웅파) / 2012/12/05 09:51:54 / 추천 0
tank_auth의 구조가 그렇습니다. 

라이브러리지만 내부에서 모델을 로딩하여 처리합니다.
그래서 tank_auth 라이브러리가 독립적으로 작동을 합니다.

컨트롤러에서 $this->tank_auth->login()(라이브러리) 호출,
라이브러리 내부에서 $this->user->login() (tank_autn 모델) 처리하여
로그인 처리 

저도 처음엔 왜 저런 구조로 만들었을까 했었는데 사용해보니 독립적으로 움직일 수 있는게
큰 장점이더군요.

milosz / 2012/12/05 10:29:48 / 추천 0
스프링과 같이 어노테이션이 되면 좋겠지만 라이브러리를 사용하셔야 할 것 같네요.
stackoverflow에서 검색해보면 코어 클래스를 확장해서 서비스 레이어와 같이 구현하라고 하는군요.

안되는건 안되는듯 ;ㅅ;
 http://vschart.com/compare/spring-framework/vs/codeigniter
 
나이유미 / 2015/02/28 21:48:53 / 추천 0
자주쓰게되는 라이브러리는 Controller Service Dao View 구조를 취하면 괜찮고
간략한건 날코딩으로 ...;;
service dao분리는 넘 복잡한거같습니다. ㅠㅠ;