개발 기초

개발 기초

M 소주6잔 3 380 6 0

개발 기초

플러그인 로딩 흐름


  1. SJVA 시작

  2. framwork 로딩, 시스템 플러그인(system) 로딩

  3. root/plugin 폴더, root/data/custom 폴더, 사용자가 개발용으로 설정한 폴더에서 플러그인 로딩

  4. 개발 플러그인

    1. 패키지 import. (__init__.py 파일 로딩)

    2. model 에 따라 DB 파일이 없을 경우 DB Table 생성

    3. blueprint 변수 flask app에 등록

    4. plugin_load 함수 호출

    5. menu 등록

  5. SJVA 구동

    1. 설정 - 플러그인에서 plugin_info dict 사용

  6. 재시작, 종료시 plugin_unload 함수 호출



 

필수 항목


위의 흐름에 따라 framework 에서 참조하는 항목은 6개입니다.


  • blueprint : Flask 에 등록하는 blueprint instance. 보통 package 이름을 subpath로 사용.


  • menu : 웹 매뉴 구성 정보를 담고있는 dict. 


  • plugin_info : 시스템 - 설정 - 플러그인에 사용자들에서 보여주는 기본 정보를 가지고 있는 dict. 


  • plugin_load : 시작시 호출. 

사용하는 third-party 패키지를 설치하거나 스케쥴러 등록


  • plugin_unload : 종료나 재시작시 호출. 일반적으로 사용하는 자원을 모두 반환하는 코드가 들어가야합니다. 특히 내부에서 subprocess 실행한게 있다면 반드시 종료시켜줘야 전체 SJVA 가 종료나 재시작을 할 수 있습니다.


  • process_telegram_data : 텔레그램 메시지 수신 타겟 플러그인 일 경우 framework 는 이 함수에 data를 담아 이 함수를 호출합니다.


process_telegram_data은 텔레그램 봇 메시지를 사용하지 않는다면 없어도 상관없으며 보통 5가지는 항상 있어야 합니다.  이 5가지 항목만 있으면 플러그인이 로딩되어, 메뉴에 붙고 웹 라우팅을 할 수 있게 됩니다.


개발환경


SJVA는 python 2.7 환경에서 구동됩니다. 


이미 SJVA 설치가 완료되고 실행되는 상태라면 따로 개발 환경을 세팅할 필요는 없고 익숙한  편집기만 있으면 됩니다. 


일반적인 python 개발 환경과 다른점이 있다면, 패키지 파일을 단독으로 실행하여 Breakpoint 를 활용한 디버깅이 불가능하다는 점입니다. 이는 SJVA가 실행되면서 순차적으로 플러그인을 로딩하는 구조이기 떄문이고 따라서 기본적인 로직은 따로 만든 후 SJVA 붙이시는 걸 권장합니다. 붙여서 테스트할 경우에는 logging 을 이용하는 방법이 최선입니다.



 

Hello World


저는 윈도우에서 플러그인을 개발하는 환경으로 설명드리겠습니다. 


어느 환경이든 상관이 없고 개발용 플러그인 경로만 설정해주면 됩니다. SJVA는 리눅스에서 돌고, 플러그인 파일은 윈도우에 있더라도 리눅스에서 윈도운 마운트 폴더에 접근만 할 수 있으면(경로만 지정할 수 있으면) 됩니다.


먼저 SJVA2를 설치하고 실행하는 환경입니다.




 

TitQxDNORfV7jQteRGou2kt422IPthX4gpLpE6XbPuXAwW29sIcwNupPFZ-wZVKcxruo7ZwgSb9dsYqKHcgaEctMClzSifR9qb3OvroC4Oo-EjAhBv_0ZcEN3E-turBfcSzZ4S-R


초기 화면입니다.  메뉴에 아무 것도 없는 상태입니다.



 

anNbqPAw-5-SKs0Q1r1ASUOY34Q-oD5xmFzjD1mZMabsx7t9HHHFyBcvZ1TrJJsqk_qDP2cc5eOetMKnSURY19Nz3UFVLiHr5cxteoI2JfViupcuiMC421nVPf196tWrjnzDExMS


시스템 - 플러그인 - 일반에서 개발용 플러그인 경로를 지정합니다.

아무 위치나 상관없습니다. 


이제 자신이 사용하는 편집기로 플러그인을 작성합니다.



 

cFfCMn3x3KjaDIK_xuhK03d8Zl3nDvwc236gMZkaGk_WgLb735kJ0gowoOfYmRQEFAVA_85BPhSeDcY3ZarNDefsKcUkLjadLziCVFkbXefHF5NjEtrsjMsjfUICzpvNG0TzoM0v


 

hello_world 폴더를 생성합니다. 파이썬는 폴더 안에 __init__.py 이 있으면 패키지로 인식하는게 규칙이므로 __init__.py 파일을 만들어 간단히 코드를 작성합니다.


이제 SJVA를 다시 재시작합니다.


BHQyQm_3wYf4L8q-RAGO2maOl6iWXBOj8GirFb7JxpfTSJnivuObuDg5Kn1huAs53mXdGIjjaXnY8Hty2HdUx6a30ujgdcTzzO6M14e9o4cs4dGwmudU74QQ62XbY5vEIfi_c0VI


로그를 잘 보시면 모든 print 문이 출력한 것을 확인 할 수 있습니다. 

저 의미는 import가 잘 되었다는 것을 의미합니다. 


물론 그 후 문장에서 blueprint 가 없어서 UI 등록시 예외가 발생하지만, 저 자체로 이미 package 는 import 가 끝났고, 타 패키지나 플러그인에서

import hello_world
hello_world.hello()


처럼 hello()함수를 사용할 수 있게 됩니다.


hello world 만 할수 있으면 언어의 절반은 정복했다고 생각하시면 됩니다.


 


 



 

플러그인 템플릿


hello world 에서 framework 에서 호출하는 필수항목 6개만 구현하면 그 자체로 웹에 붙는 일반적인 플러그인이 될 수 있습니다.

하지만 코딩의 기본은 Ctrl+c, Ctrl+v로 타 플러그인을 가져와서 일부 수정하여 구현하는게 바람직합니다. 그럼 대충 어떤 파일이 어떤 역할을 하는정도는 알고 시작해야합니다. 


SJVA는 일정한 플러그인 템플릿이 있습니다. 가급적 최근 구현된 플러그인을 공통된 5개의 파일이 존재합니다.


  1. __init__.py : 패키지(플러그인) 초기화 파일.  보통 외부에 export 할 모듈 목록만 존재..


  1. plugin.py 

    • 실제 플러그인 초기화 관련 코드

    • blueprint routing 코드

    • socket-io 처리 코드


  1. model.py : DB 관련


  1. logic.py : SJVA 스케쥴링 및 모든 플러그인들에서 공통적으로 포함되는 로직 관련 코드


  1. logic_normal.py : 해당 플러그인에만 특화된 기능을 구현하는 시작점


각 파일의 의미와 기능입니다.
거의 모든 플러그인들이 1~4 번 파일을 가지고 있고 5번은 최근 것부터 적용했는데 굳이 저 이름을 따를 필요는 없습니다. (매 플러그인마다 이름 정하기가 힘들어서… 일반적인 기능구현 정도로 정했습니다.)

이 구조를 권장하는 거지 각자 마음껏 구현하면 됩니다.  

3 Comments
7 arkx 03.12 17:33  
현재 제 미디어 폴더 구조 때문에
하나 생각하고 있는게 있었는데.. 고민중입니다..ㅎㅎ
참고해서 꼭 만들어보도록 하겠습니다. :D
7 기뚜리 03.16 10:12  
소주님 고맙습니다..늘 궁금햇던부분인데...
3 브루스홍 03.18 15:52  
와.. 이걸 읽어보니까 하나 만들고 싶은 기능이 있는데
15년전 손놓은 프로그래밍을 다시 잡아야 하나 싶네요.
Category
State
  • 현재 접속자 13(8) 명
  • 오늘 방문자 727 명
  • 어제 방문자 995 명
  • 최대 방문자 1,331 명
  • 전체 방문자 85,429 명
  • 전체 게시물 46,507 개
  • 전체 댓글수 5,954 개
  • 전체 회원수 2,798 명
Facebook Twitter GooglePlus KakaoStory NaverBand