블로그 이미지
Flying Mr.Cheon youGom

Recent Comment»

Recent Post»

Recent Trackback»

« 2025/5 »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

 
 

[NodeJS] Express를 MVC로 활용

서버/NodeJS | 2013. 8. 27. 15:06 | Posted by youGom



'제대로 배우는 NodeJS p170. ' 에 관한 내용이다.

처음에 MVC라고 해서 무슨 말인가 했다.

express말고 다른 MVC 모델 프레임웍을 소개하는건가 했다.

확장하기 편하도록 한 것으로 보인다.

이걸 MVC라 하기에는.. 좀 억지가 있어 보였다. '뭐..보는 사람마다 이해하는 사람마다 다르겠지만..'

내가 볼때에는 그냥 Visitor 패턴을 활용한 확장성을 높여준 코드로 보였다.

좀 더 풀어 쓰면,

Visitor 패턴을 활용한 CRUD 코드 작성하는 예제 코드라 생각하면 좋겠다. 

나는 CRUD는 IO접근을 위한 CRUD로 생각하고 있었지.. 이걸 따로 MVC로 CRUD를 구현했다는건지 어떤 의도였는지는 잘모르겠다. 뭐 여튼 결론적으로 하는 말은 같은것 같다. 편하게 코드짜게 해준다? ^^;


// CRUD 연결 메소드

exports.mapRoute = function ( app. prefix ) {

prefix = '/' + prefix;

var prefixObj = require( './controller/' + prefix );


// CRUD 연결 해주는 부분 : 색인 / 추가 / 조회 / 편집 / 업데이트 / 제거

app.get( prefix, prefixObj.index );

app.get( prefix + '/new', prefixObj.new );

app.get( prefix + '/:id', prefixObj.show);

app.post( prefix + '/create'. prefixObj.create)

app.get( prefix + '/:id/edit', prefixObj.edit);

app.put( prefix + '/:id', prefix.update);

app.del( prex + '/:id', prefixObj.destroy);

};


// 서버구동 부분에서 등록

...

app.get('/', route.index);

var prefixes = ['widgets'];

prefixes.forEach( function( prefix) { 

map.mapRoute( app, prefix );

});

....


// Widgets.js의 CRUD하는 실체 부분

exports.new = function( req, res ) { ... }

exports.create = function( req, res ) { ... }

exports.show = function( req, res ) { ... }

exports.destroy = function( req, res ) { ... }

exports.edit = function( req, res ) { ... }

exports.update = function( req, res ) { ... }


이렇게 하면~ 기본 단계 완성이 된다~

여기서 어떻게 확장이 되냐고?


위에 굵게 해둔 부분에서 추가 확장할 route를 만들면된다.

var prefixes = ['widgets', 'pictures', 'musics' ]; 

이렇게 한 후, pictures.js와 musics.js파일을 만들어서 똑같은 template으로 CRUD를 제공해 주면 됨! ㅋㅋ


요약 해서 말하면,

 Controller

 CRUD 연결 컨트롤러 생성 

 mapRoute();

 Model

 CRUD 실체 ( ex; Widgets ) 구현

 widgets.exports.CRUD();

 View

 App Route에 연결

 prefixes.forEach();



cURL로 테스트가 된다~ ㅋㅋ

curl --request GET http://ip:3000/widgets/new

curl --request POST http://ip:3000/widgets/create --data 'widgetname=name&widgetprice=1.0'

요러케~


난 갠적으로 다른 테스트툴을 쓰는데~ 간편하게 curl로 확인하는 것도 괜찮은 듯 하다~


MVC 흉내 내기 끝.



:
그냥, 경함담..(?) ㅋ

딱 봐도, 나중에 모두 고생길로 가는 지시였다.
그럼에도 불구하고, 그냥 하는거다. ^^;

UI부분과 Network 리소스 관리에 대한 이야기다. 

UI에서 화면에 출력할 서버 데이터가 필요해 Data network 모듈에 Request를 호출한다.
너무 많이 호출( 100개 )하면 Request Queue가 Full나서 뻑난다.
그리하여, UI에서 Request 호출을 Pooling해서 Network 단에 하나씩 넘겨주라고 한다.
( 즉, 10개의 Request가 있으면, 1번 끝나면 2번 보내기 ... )

왜.. Network의 Sender( Request ) Pooling관리를 UI에서 하는지 모르겠다.
죽는 건 Network단인데, 고치는 건 UI다.

현재 1개의 UI에서 아랫단을 대신하여 만들고 있지만, 이거 하나로 모든 UI 페이지가 이 내용을 따라야 할 것이다.

약 30개 이상의 UI가 존재한다. Network에서 Pooling을 지원해주면 될 것을..
( 100줄에 끝날 내용을.. 200줄에서 최대 1만줄을 할애하는 것이다. )

이에 대한 건의는 하지 않는다. 윗분들은 제안을 좋아하지 않기 때문이다. 제안을 좋아하는 경우는 단 하나, 그 사람이 내고 싶어했던 제안을 내야 좋아한다.

그냥.. 닥치고 하라는 대로 한다.

위 지시에 대한 응답은 "알겠습니다"였다. 
나는..? 우리는..! 프로그래머가 아니라, 직장인이다.

ps. MVC보다는 Model2 Architecture와 가장 유사하다.
( 설계도는 없다. 그냥.. 아키텍쳐로 따지자면 그렇다는 것.. ^^;; 이해를 돕기 위해 비유했다. ^^; )


  


 























닥치고 정치를 하던가, 닥치고 하라는대로 하던가. 골라야 할듯 ^^;;


:

Bada App - FrameWork Concept

소프트웨어 공학/설계 | 2011. 9. 21. 13:20 | Posted by youGom

장점.
1. FrameWork의 일관성이 유지되어, 개발 시 상호간 인터페이스에 대해 오해의 소지가 사라진다.
 - 다른 모듈에 대해서 Request만 하면 된다. 다른 모듈에 대한 이해가 필요 없다.
2. Framework의 일관성에 대한 개념을 이해하면, 모든 Framework에 대해 이해가 가능해진다.
3. 최소한의 단위로 테스트가 가능하다. ( 모든 코드는 테스트 되어 진다. )
4. 검증팀에서 검증하기 전에, 버그에 대한 진단이 자동화 테스트에 의해 자동으로 감지 된다.
5. 컴파일 시간이 줄어든다. ( 기능 추가가 될수록 파일 추가 및 수정이 잦아지는데, h파일을 수정하더라도, 전체 컴파일을 하지 않는다. 즉, 코드 결합도가 굉장히 낮다. )

단점.
1. Framework에 맞추어 개발하기 위한 대한 기본 이해가 필요하다. ( 구현하기 위한 진입 장벽이 높으나, 타 모듈 개발자가 사용하기엔 편하다. )




현황.
아래 코드는 테스트완료된 코드이며, 실질적으로 사용가능하다.
이 Framework 코드는 Bada SDK 코드에 종속적이며, 다른 플랫폼에서는 사용이 불가하다.

[ 앱의 시작 ]
way 1. GetManager( _C( "ManageForms" ) )->Request( _C( "FormStartDevMode" );
way 2. GetFormMgr()->Request( _C( "FormStartDevMode" );

[ 데이터 요청 ]
way 1. GetManager( _C( "ManageDB" ) )->Request( _C( "CreateDB" ), 0, pCompleteListener );
way 2. GetDBMgr()->Request( _C( "CreateDB" ), 0, pCompleteListener );

[ 데이터 처리 ]
way 1.  GetManager( _C( "ManageFilter" ) )->Request( _C( "FilterMessage" ), FILTER_MESSAGE_NORLMAL, pCompleteListener );
way 2. GetFilterMgr()->Request( _C( "FilterMessage" ), FILTER_MESSAGE_NORLMAL, pCompleteListener );


'소프트웨어 공학 > 설계' 카테고리의 다른 글

[수강후기] CBD, Component Based SW Design  (0) 2012.09.02
[POSA1] Broker Architecture Pattern  (0) 2011.10.07
: