Skip to content

실행 절차

시스템 흐름

sequenceDiagram
    actor user

    user->>Uvicorn: 브라우저에서 요청
    critical: 미들웨어 실행
        Uvicorn->>+Middleware: 요청 검증 및 처리
    option: 정상 처리
        Middleware->>Controller: 요청 처리 결과 전송
    option: 오류 발생
        Middleware->>-Uvicorn: 예외 처리 전송
        Uvicorn->>user: 예외 처리 결과 전송
    end
    opt
        Controller->>+Model: 데이터베이스 조회
        Model->>-Controller: 데이터 전달
    end
    Controller->>View: 데이터 렌더링
    View->>Uvicorn: 렌더링 결과 전송
    Uvicorn->>user: 렌더링 결과 전송

그누보드 실행 과정

uvicorn 서버를 실행하면 main.py를 기준으로 core, lib, plugin, theme 등의 파일을 찾아서 실행합니다.

참고

기본적으로 FastAPI의 실행 단계를 따릅니다.

1. Import

첫번째로 FastAPI 클래스를 가져오는 것과 함께 그누보드6 실행에 필요한 파이썬 라이브러리를 가져와 실행합니다. 가져오는 패키지는 크게 3가지로 나눌 수 있습니다.

  1. Python 기본 및 써드파티 라이브러리

    import datetime
    
    from apscheduler.schedulers.background import BackgroundScheduler
    from fastapi import FastAPI, Path, Request, Response
    from fastapi.responses import HTMLResponse, JSONResponse, RedirectResponse
    from pydantic import TypeAdapter
    from sqlalchemy import select, insert, inspect
    from starlette.staticfiles import StaticFiles
    

  2. 그누보드6 Core

    import core.models as models
    from core.database import DBConnect, db_session
    from core.exception import (
        AlertException,
        regist_core_exception_handler,
        template_response
    )
    from core.middleware import should_run_middleware, regist_core_middleware
    from core.plugin import (
        cache_plugin_state, cache_plugin_menu, get_plugin_state_change_time,
        import_plugin_by_states, read_plugin_state, register_plugin,
        register_plugin_admin_menu, register_statics
    )
    from core.template import register_theme_statics, TemplateService, UserTemplates
    

  3. 그누보드6 유틸리티 함수 및 클래스

    from lib.common import *
    from lib.member_lib import is_super_admin, MemberService
    from lib.point import insert_point
    from lib.template_filters import default_if_none
    from lib.token import create_session_token
    

2. FastAPI 인스턴스 생성

먼저 FastAPI 인스턴스를 생성하고, 그누보드6 실행에 필요한 설정들을 추가합니다.

app = FastAPI(debug=APP_IS_DEBUG)

정적파일 경로 추가

  1. 각 테마의 static 경로를 추가합니다.

    main.py
    # 각 경로에 있는 파일들을 정적 파일로 등록합니다.
    register_theme_statics(app)
    app.mount("/static", StaticFiles(directory="static"), name="static")
    app.mount("/data", StaticFiles(directory="data"), name="data")
    

  2. 공용 static 경로를 추가합니다.

    main.py
    # 각 경로에 있는 파일들을 정적 파일로 등록합니다.
    register_theme_statics(app)
    app.mount("/static", StaticFiles(directory="static"), name="static")
    app.mount("/data", StaticFiles(directory="data"), name="data")
    

라우터 등록

사용자의 요청을 처리할 라우터를 등록합니다.

app.include_router(admin_router, prefix="/admin", tags=["admin"])
app.include_router(install_router, prefix="/install", tags=["install"])
app.include_router(board_router, prefix="/board", tags=["board"])
app.include_router(login_router, prefix="/bbs", tags=["login"])
...

Middleware

사용자의 특정 경로 작업을 처리하기 이전에 실행되고 사용자의 요청을 반환 하기 전 모든 응답에도 적용할 수 있는 기능입니다. 그누보드6의 미들웨어는 core/middleware.pymain.py 에서 정의합니다.

1. middleware.py

그누보드 실행에 필수적인 미들웨어를 정의합니다. regist_core_middleware 함수를 통해 등록합니다.

  • core_middleware
    • 플러그인, 접속환경(접속 기기, 반응형 등)을 처리하는 커스텀 미들웨어입니다.
  • SessionMiddleware
    • 세션을 처리하는 starlette의 미들웨어입니다.
  • BaseSchemeMiddleware
    • X-Forwarded-Proto 헤더를 통해 기본 스킴을 설정하는 커스텀 미들웨어입니다.
2. main.py
  • main_middleware
    • 설치 여부 확인, 로그인, 기본환경설정, 접속자 이력 등을 처리합니다.

3. 플러그인 추가

사용자가 설치한 플러그인을 추가하고 필요한 정보들을 캐시합니다.
플러그인 활성화 상태에 따라서 import, 관리자메뉴, static 경로 추가의 작업이 실행됩니다.
기본 라우터 등록 보다 먼저 실행됩니다.

main.py
# 플러그인 라우터 우선 등록
plugin_states = read_plugin_state()
import_plugin_by_states(plugin_states)
register_plugin(plugin_states)
register_statics(app, plugin_states)

cache_plugin_state.__setitem__('info', plugin_states)
cache_plugin_state.__setitem__('change_time', get_plugin_state_change_time())
cache_plugin_menu.__setitem__('admin_menus', register_plugin_admin_menu(plugin_states))

4. exception_handler 등록

오류 발생 시, 경고창 템플릿을 렌더링할 수 있는 예외처리 핸들러를 등록합니다. core/exception.py 에서 정의한 regist_core_exception_handler 함수를 통해 등록합니다.

5. scheduler 등록

정해진 시간 또는 일정 간격으로 실행되는 작업을 등록합니다.
기본적으로 매일 오전 10시, 최근게시물/쪽지/접속자로그/인기검색어/탈퇴회원 삭제 처리가 등록되어 있습니다.

# 예약 작업을 관리할 스케줄러 생성
# https://apscheduler.readthedocs.io/en/3.x/modules/triggers/cron.html
scheduler = BackgroundScheduler(timezone='Asia/Seoul')
@scheduler.scheduled_job('cron', hour=10, id='remove_data_by_config')
def job():
    delete_old_records()
# FastAPI 앱 시작 시 스케줄러 시작
scheduler.start()

참고

추후 코드가 변경/개선 될 수 있는 부분입니다.