포럼

기술 지원 (Profiler 모듈 제작 일지)

안녕하세요. 저는 프로파일러 프로젝트 리더 BJ람보라고 합니다. 개인적으로 글 적어 나가고 있어요.. 하핫..

이번에 모듈 제작방식의 대해서 이야기를 드리고 싶어서 글을 적었습니다. /개인적으로 소식알리고 싶기도하고../

이 모듈의 첫 설계와 기능 추가에 대한 이야기를 여기서 이야기 드리고자 합니다.

슬로우 로그를 기록하기

모듈 설계 단계는 문서화를 통해서 이 모듈의 제작해야할 기능과 DB설계부터 시작해야 했습니다. 모듈을 새로 제작 한다는 것은 쉬운일이 아닌 것 임을 XE유저님들께서도 잘 아시리라 믿습니다. 정식 코어에 함께 배포될 수도 있고, XpressEngine 이름으로 배포되는 첫 관리 모듈이기에 처음 설계단계부터 아주 조심스럽게 다가갔습니다.

문서에서 처음필요한 기능으로, Addon 트리거의 속도 검사를 통해서 느린 트리거와 느린 애드온을 검출 해내자 였습니다. 애드온의 기능을 개발해주신 분은 @YJSoft 님이셨습니다. @YJSoft 님께서는 느린 애드온의 대한 제작 방식의 대한 설명을 @BNU님에게 전달 받으셨고, 제작방식을 토의 하던 중 한가지 깨닭은 소식이 있었습니다. XE에서는 이 값들을 바로바로 저장시켜줄 전달 요소가 없었다는 것 입니다.

이 기능을 개발하기 위한 가장 시급한 XE자체에 시간을 채크할 수 있는 기능이 없었습니다. 그래서 작업한 것이 다음 코드였습니다

xe/classes/module/ModuleHandler.class.php
파일과
xe/config/config.inc.php 
파일의 수정이 필요했습니다.

https://github.com/xpressengine/xe-core/pull/788/files

사실 커밋의 내용의 코드로 봐서는 config.inc.php 을 수정하지 않아도 사용이 가능 할 수 있었지만, 옵션을 위해서 추가 한 코드입니다.

트리거의 시간을 채크 하기 위해 Before, after 부근에 microtime 을 채크 하도록 하였습니다.(최소 0.0001초까지 채크하게 됩니다.)

이렇게 마치고보니... 어라? 애드온을 저장 시키는 방법이 없네요.. 단순히 트리거만 슬로우 로그 전체기록을 불러 들여왔지만, 애드온이나 다른 트리거의 호출에 대한 시간을 채크 하기위한 함수가 필요 했습니다.

이 항목은 @BNU 님께서 커밋 해주셨습니다.

xpressengine/xe-core@ba0a995

writeSlowlog 함수를 만들고, 이 함수에 쿼리 트리거, 애드온의 관한 캐시파일을 생성하도록 하고, 각각 시간을 저장하도록 했습니다. 그리고 이 전체적인 시간을 XE::writeSlowlog 라는 트리거를 생성하도록 하였지요.

이제부터 어떠한 모듈에 writeSlowlog('모듈이름', 시간, $slowlog); 이라는 간단한 코드만으로 DB에 기록할 수 있는 트리거를 profiler모듈에서 불러올 수 있도록 만든 것 입니다.

그러면 프로파일러에서 이 트리거가 실행이 되었을경우 모든 정보를 DATA로 받아 DB에 기록할 수 있도록 만들어야 합니다. 트리거를 통해서 정보를 쏴버리도록 만들어버리고, 그 정보를 profiler.controller.php파일에서 처리하도록 했습니다.

https://github.com/xpressengine/xe-module-profiler/blob/develop/profiler.controller.php

코드에 대한 설명은.. 복잡하므로 생략하도록 할께요 T^T. 간단하게, 재일 아래 수행시간을 기록 이라는 주석문 아래 코드를 통해서 실제 보여지는 기록을 저장하고 있습니다. 이렇게 해서 슬로우 로그에 대한 정보를 저장할 수 있도록 제작 했었습니다. 힘을 써주신 @BNU @YJSoft님께 감사드립니다.

간편 모듈설정, 애드온설정, 테이블 제거 기능 추가.

가장 XE를 사용하면서 불편하다면 불편한점이 따로 모듈 삭제기능이 없는 모듈에 대한 삭제를 할 경우 깨끗하게 삭제가 되지 않는 다는 점입니다. 특히, 애드온이 더 큽니다.

모듈을 삭제 할 경우 남아 있는 찌꺼기를 생각한다면

  • 트리거
  • 모듈의 설정
  • 모듈의 기록된 DB

애드온의 경우

  • 애드온의 설정

정도로 보시면 됩니다.

트리거와 모듈의 설정, 애드온의 설정 제거 기능은 @qw5414 인 제가 맡아서 진행했습니다. 우선 처음에는 무식하게 코드를 늘어가는 방식으로 제작 하였습니다. executeQuery 문을 통해서 전체 트리거의 목록을 불러오도록 하였고, 또 반복문을 통해서 전체적인 moduleClass()을 가져오도록 하였습니다. 그런다음ModuleClass가 하지 않는 모듈의 트리거를 검출하도록 만들었습니다. 그런데.. 이렇게 제작을 하고 보니 문제점이 있었습니다. 반복문이, 반복문을 낳고 또 반복이 반복을 하게 되며 낭비되는 힘이 너무 많아지는 것 입니다. 이를 최적화 시킬 필요가 분명히 있었습니다. 이를 최적화에 @izuzero 님께서 도와주셨습니다. 방식은 간단합니다.

ProfilerAdminModel::getModuleList 라는 함수를 만들어버리고, ModuleModel::getModuleList를 사용하여 모든 정보를 가져오도록 했습니다. 그리고 그 정보를 반복시켜버리고, $module_list[] 값안에 array 데이터로 저장 시켜버렸죠. 이렇게 하면 모든 모듈은 간단하게 불러올 수 있고, 이 정보와 트리거를 저장하는 DB데이터를 비교하도록 만들어 존재하는 모듈의 트리거는 놔두고 없는 모듈의 트리거를 제거 할 수 있도록 만들었습니다.

그런데, 이렇게 제작하고 보니 또 남는 데이터가 존재하게 되는 사실을 알았습니다. 설명드렸던 기능은 단순히 module의 존재여부를 확인후 트리거 DB와 모듈이름만 비교를 해버리니 존재하는 모듈중에서 없어진 트리거의 찌꺼기를 제거 할 수 없는 문제점이 생긴 것 이죠. 그렇다면 그 안에 존재하고 있는 함수들을 다 파악하여 그 모듈의 제거된 트리거를 검출할 수 있도록 만들어야 합니다. 그래서 우리는 "고급 삭제"라는 채크 버튼을 만들었고, 그 체크 박스를 체크하게 되면 그 값을 인식하여 새로운 조금의 더 섬세한 데이터를 불러 들이도록 했습니다.

@method_exists 함수를 통해서 모든 모듈의 정보를 구한 값을 가져오고, 반복문의 트리거정보에서 트리거의 $trigger->called_method와 비교를 하도록 만들었습니다. 만일 이 메소드에서 없는 값들이 나오면 그 트리거의 데이터를 지울 데이터로 나타나도록 하였지요.

애드온 설정, 모듈 설정 역시 비슷한 방식입니다. 다만 고급 삭제 옵션을 site_srl (가상 사이트입니다)존재 여부를 확인하여 제거 하도록 되어있습니다./간단하게는../

여기까지 현재 제작된 기능들의 간단하지 않은(?) 설명들입니다.

앞으로의 계획

곧 코어정식버전 1.7.9 버전이 배포될 예정으로 보여집니다. 프로파일러 모듈 개발진들도 XE1.7.9 버전을 기점으로 발빠르게 베타 버전을 땐, 정식버전 배포를 준비하고 있습니다. 곧, 쉬운설치를 통해서 여러분들을 만나 뵐지도 모르겠습니다. (하지만 쉬운설치는 정책에 의해 지원을 하지 않을 가능성도 있습니다.) 1.0 배포를 한다음 2.0정식버전을 준비하기 위한 기능을 제작할 예정입니다. ( 스포일러는 하지 않겠습니다. 하하하하하하하하하)

너무 소식이 없는 것 같아서.. 조금이라도 여러분들에게 알려드리고 싶은 정보를 저 혼자서 정리 해서 올려봅니다.
하핫. 두서없고 복잡할지라도 재밌게 읽어주셨으면 좋겠습니다.

글쓴이 제목 최종 글
YJSoft Xzet core 1.4.5.24.beta1(XE 1.4.x 보안패치)를 공개합니다 [7] 2015.01.04 by 맑은여름
이온디 소셜XE (socialXE) 이슈는 Github 프로젝트를 이용해주세요. [3] 2015.01.03 by jejetlag
도라미 여러분도 모바일에서 회원가입시 생일부분이 작동안하나요? [2] 2015.01.02 by I-JEX
죽방망이 사이트맵 이거 쓰시는분~  
lord 한글도메인을 사용중인데...요청합니다. [12] 2014.12.31 by 알피레이드
AJKJ jsdelivr에 나눔 웹폰트 전부 등록해 두었습니다. [11] 2014.12.30 by socialskyo
DingGGu 모듈 개발 시에 레이아웃 적용 [4] 2014.12.30 by DingGGu
꾸링 1.7.8 통합검색 첨부파일 mp3*오디오확장명 일경우 문제점  
BJ람보 프로파일러 개발 이야기 [8] 2014.12.30 by BJ람보
GG XE를 가지고 api 서비스를 처음 만들어 보았네요. [2] 2014.12.30 by 에비뉴
엔돌핀아솟아라 한글도메인, 로그인 글쓰기 오류 [4] file 2014.12.29 by 키스투엑스이
정도길 사이트 중 J쿼리관련 자료 판매하는 곳이 있는데요?  
가을풍경 php 5.6에서 memcache 설정에 관하여 file  
해운대살고싶다 xe에도 이런실시간위치확인이.. [2] file 2014.12.28 by 몽실아빠
꾸링 1.4.5.X -> 1.7.8 주소 사용 불가 문제 [2] 2014.12.27 by 꾸링
XE만세 기본 URL 설정이 안되어 있습니다. 뜨시는 분 계신지요? [10] 2014.12.26 by HSJI
가을풍경 구글 음성인식 기술(Web Speech API)을 에디터 컴포넌트로 !! [1] 2014.12.22 by 키스투엑스이
메테워 XE마켓 먹튀당했네요.. [9] 2014.12.22 by LAB_
BJ람보 출석부와 알림센터가 새롭게 바뀔예정입니다. [15] 2014.12.22 by LAB_
에비뉴 공개 SW 개발자 대회 대상에 XPUSH 팀 [2] 2014.12.21 by 톡플러스