오늘은 파이썬의 웹앱 툴인 Flask Blueprint 기능에 대해 살펴보겠습니다. Flask 역시 파이썬에서 편리한 웹앱 개발 모듈이기는 하나 확장성이나 대규모 프로젝트에서는 뭔가 제한적인 상황이 있기도 한데요, 이를 극복하는 방법 중하나인 Blueprint에 대해 다뤄보겠습니다.
Flask Blueprint 사용 방법
파이썬의 Flask는 작은 규모의 애플리케이션을 간단하고 빠르게 개발할 수 있는 것이 가장 큰 장점입니다. 사실 streamlit이라는 더 강력한 웹앱 툴이 있기는 하나 이는 너무 제약이 많은 반면 상당히 자유롭게 HTML이나 javascript까지 구성할 수 있는 Flask는 상당히 수준 높은 파이썬의 웹앱 도구라 할 수 있을 거예요.
그러나 프로젝트 규모가 커지거나, 여러 기능이 뒤섞이는 상황이 닥치면 유지 보수가 까다로워지는 문제를 맞닥뜨리게 됩니다. 이때 필요한 것이 바로 Blueprint입니다. Blueprint는 Flask 애플리케이션 내에서 특정 기능이나 리소스 그룹을 별도의 모듈로 분리해 관리할 수 있도록 설계되었습니다.
웹 애플리케이션이 방대해질수록 라우팅(HTTP 경로), 템플릿, 정적 파일 등을 한데 모아놓으면 코드의 가독성이 떨어지고, 협업하기도 어려워지는 문제가 생깁니다. 이런 상황을 개선하기 위해 Flask v0.7부터 Blueprint이라는 기능이 도입되었습니다. Flask의 창시자인 Armin Ronacher는 대규모 애플리케이션의 구조화 문제를 해결하기 위해 이 기능을 고안했다고 합니다.
여기서 잠깐, 위에도 언급된 "라우팅(HTTP 경로)"이라는 단어가 생소한 분들도 계실 거예요. '네트워크 시스템에서 말하는 라우터의 라우팅인가?' 하는 분들도 계실 텐데요, 개념적으로 유사하나 Flask의 구조상에서 웹 애플리케이션의 URL 구조를 정의하고 각 URL에 대한 처리 로직을 연결하는 중요한 기능입니다.
라우터를 통해 특정 URL 패턴에 대해 어떤 함수가 실행되어야 하는지를 지정할 수 있습니다. 때문에 여기에서는 복잡하게 더 이야기하는 대신, 'Flask 웹앱의 지정된 URL이다.' 정도로 정의하고 다음 글에서 다뤄보도록 하겠습니다.
Blueprint의 주요 기능과 장점
Blueprint의 주요 기능은 크게 세 가지로 나눌 수 있습니다.
- 첫째, 코드의 모듈화입니다. 큰 프로그램을 여러 개의 작은 부분으로 나눌 수 있어요. 마치 레고 블록처럼 필요한 부분만 조립해서 사용할 수 있죠.
- 둘째, 재사용성이 높아집니다. 한 번 만든 Blueprint는 다른 프로젝트에서도 쉽게 사용할 수 있어요. 예를 들어, 회원 관리 기능을 Blueprint로 만들어두면 다른 프로젝트에서도 그대로 가져다 쓸 수 있습니다.
- 셋째, 유지보수가 쉬워집니다. 문제가 생겼을 때 전체 프로그램을 뒤지지 않고, 해당 Blueprint만 확인하면 되니까요.
이런 장점들 덕분에 Blueprint는 대규모 웹 애플리케이션 개발에서 필수적인 도구가 되었습니다.
Blueprint 사용 예시
자, 이제 Blueprint를 어떻게 사용하는지 간단한 예시를 통해 알아볼까요?
from flask import Blueprint, render_template
blog = Blueprint('blog', __name__)
@blog.route('/')
def index():
return render_template('blog/index.html')
@blog.route('/post/<int:post_id>')
def show_post(post_id):
return render_template('blog/post.html', post_id=post_id)
이 코드는 블로그 기능을 위한 Blueprint를 만드는 예시입니다. 'blog'라는 이름의 Blueprint를 만들고, 그 안에 블로그의 메인 페이지와 개별 포스트를 보여주는 기능을 넣었어요.
이렇게 만든 Blueprint는 메인 애플리케이션에 다음과 같이 등록할 수 있습니다:
from flask import Flask
from .blog import blog
app = Flask(__name__)
app.register_blueprint(blog, url_prefix='/blog')
이렇게 하면 '/blog' 주소로 시작하는 모든 요청이 blog Blueprint로 전달됩니다.
Flask를 다뤄보지 않으셨다면 위 코드가 무슨 의미인지 모를 수 있어요. 간단히 설명하자면,
- 첫 번째 보여드린 예시 코드는 일반적으로 Flask 앱의 메인을 구성할 때 작성하는 코드에서 "blog = Blueprint('blog', __name__)" 코드가 특별히 추가됐다고 보면 됩니다. 물론, Blueprint 기능을 위해 추가된 코드죠.
- 두 번째 예시 코드는 Flask 앱을 구성할 때 작성하는 코드에 첫 번째 예시 코드에서 작성된 앱을 등록하는 기능을 추가하는 코드예요. 이게 무슨 소리냐? 기본적으로 Flask 앱 구조를 따른다는 거예요. 여기에서 어떻게 Blueprint 기능을 등록하고 어떻게 받아서 실행하는 가만 다르다는 겁니다.
- 상식적으로 뭔가를 등록하는 부분이 상위 구조에 속하고 뭔가를 받아서 실행하는 부분이 하위 구조가 될 거라는 건 이제 바로 알 수 있을 겁니다.
다른 예시 코드를 한 개 더 볼까요?
이번에는 각각의 URL로 서비스해론 개별적인 두 개의 웹앱을 하나의 메인 도메인으로 통합할 때 Blueprint를 사용하는 예시예요. 위 예시 코드에서 봤듯 메인 도메인에 해당하는 main.py를 작성해 봅시다.
from flask import Flask, render_template
from A_app import A_app_blueprint # A_app.py A앱 메인
from B_app import B_app_blueprint # B_app.py B앱 메인
app = Flask(__name__)
app.register_blueprint(A_app_blueprint, url_prefix='/a_app')
app.register_blueprint(B_app_blueprint, url_prefix='/b_app')
@app.route('/')
def index():
return render_template('main.html')
if __name__ == '__main__':
...
이제 main.html에서 사용자가 A앱이나 B앱을 선택하여 실행할 수 있게 구성되어 있다면 다음과 같이 각각의 앱 메인을 구성할 수 있습니다.
from flask import Blueprint, render_template, request, jsonify
A_app_blueprint = Blueprint('a_app', __name__)
@A_app_blueprint.route('/')
# A 앱의 메인 페이지/기능
위와 같이 A앱의 메인을 구성하면 메인 화면에서 A 앱이 선택되면 위 코드 부분이 실행되는 거죠.
B앱도 같습니다.
from flask import Blueprint, render_template, request, jsonify
B_app_blueprint = Blueprint('b_app', __name__)
@B_app_blueprint.route('/')
# B 앱의 메인 페이지/기능
이제 이러면 앞서 원했던 두 개의 기존 앱을 하나의 메뉴로 통합하여 실행할 수 있도록 재구성하게 됩니다.
간단하죠.
Blueprint에 대한 유의 사항.
- Blueprint는 자체적으로 실행될 수 없습니다. 반드시 Flask 애플리케이션에 등록되어야 동작해요. 마치 레시피처럼 요리 방법은 알려주지만, 실제로 요리를 하려면 주방(Flask 앱)이 필요한 거죠.
- Blueprint는 중첩해서 사용할 수 있어요. Blueprint 안에 또 다른 Blueprint를 넣을 수 있다는 뜻이에요. 이를 통해 더욱 복잡한 구조의 애플리케이션도 깔끔하게 관리할 수 있습니다.
- Blueprint의 이름은 유일해야 합니다. 같은 이름의 Blueprint를 여러 개 만들면 오류가 발생해요. 마치 우리가 각자 다른 이름을 가지고 있는 것처럼요.
- Blueprint는 Flask뿐만 아니라 다른 파이썬 웹 프레임워크에서도 비슷한 개념으로 사용되고 있어요. 예를 들어, Django에서는 'app'이라는 개념이 Blueprint와 유사한 역할을 합니다.
최근에는 마이크로서비스 아키텍처가 인기를 끌면서, Blueprint의 개념이 더욱 확장되고 있어요. 독립적인 서비스들을 만들고 이들을 조합하는 방식이 Blueprint의 개념과 유사하기 때문인가 봅니다.