티스토리 뷰
애플리케이션 팩토리(Application Factory)는 Flask와 같은 웹 프레임워크에서 애플리케이션 인스턴스(Flask 앱 객체)를 생성하는 함수를 말합니다. 이 패턴은 Flask 애플리케이션을 모듈화하고, 설정을 유연하게 관리하며, 확장 가능하게 만들기 위한 중요한 설계 방법 중 하나입니다.
애플리케이션 팩토리 패턴을 사용하면 Flask 애플리케이션을 동적으로 생성할 수 있습니다. 즉, Flask 애플리케이션 인스턴스(보통 app 객체)를 필요할 때마다 만들어 사용합니다. 이 방식은 특히 테스트와 다중 환경(개발, 테스트, 운영) 관리에서 유용합니다.
왜 애플리케이션 팩토리를 사용하는가?
애플리케이션 팩토리 패턴은 여러 장점을 제공합니다:
- 테스트 용이성: 애플리케이션을 팩토리로 만들면 여러 인스턴스를 생성할 수 있어, 서로 독립적인 테스트를 할 수 있습니다.
- 구성 관리: 개발, 테스트, 운영 환경에 따라 다른 구성을 쉽게 적용할 수 있습니다.
- 확장 가능성: 애플리케이션의 확장을 도와주며, 여러 모듈을 개별적으로 관리하고 결합할 수 있습니다.
애플리케이션 팩토리 패턴의 예시
애플리케이션 팩토리를 사용하지 않으면, 보통 아래와 같은 방식으로 Flask 애플리케이션을 생성합니다:
전통적인 방식 (애플리케이션 팩토리 사용하지 않음)
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "Hello, World!"
if __name__ == "__main__":
app.run()
이 코드에서는 app 객체가 파일이 실행될 때 전역적으로 한 번 생성됩니다. 그러나 이렇게 하면 애플리케이션 인스턴스가 고정되므로, 환경에 따라 유연하게 설정을 다르게 적용하거나, 독립적인 인스턴스를 생성하는 것이 어렵습니다.
애플리케이션 팩토리를 사용한 방식
애플리케이션 팩토리 패턴을 사용하면, 애플리케이션을 생성하는 함수를 작성하고 그 함수를 호출할 때마다 새로운 애플리케이션 인스턴스를 반환할 수 있습니다.
# app.py
from flask import Flask
def create_app():
app = Flask(__name__)
@app.route('/')
def index():
return "Hello, World!"
return app
create_app() 함수가 애플리케이션 팩토리입니다. 이제 Flask 애플리케이션 객체는 이 함수를 호출할 때마다 생성됩니다.
# main.py
from app import create_app
app = create_app()
if __name__ == "__main__":
app.run()
애플리케이션 팩토리의 주요 특징
- 애플리케이션 생성 지연: 앱 객체가 파일이 로드될 때 자동으로 생성되는 것이 아니라, create_app() 함수가 호출될 때 비로소 생성됩니다. 이를 통해 여러 앱 인스턴스를 독립적으로 생성할 수 있습니다.
- 구성(환경)에 따른 설정 가능: 애플리케이션 팩토리 함수에 매개변수를 전달함으로써 다양한 환경(개발, 테스트, 운영)에 맞게 설정을 다르게 적용할 수 있습니다.
설정 예시
애플리케이션 팩토리를 사용하면 다양한 환경에 맞게 애플리케이션 설정을 다르게 할 수 있습니다.
# config.py
class Config:
SECRET_KEY = 'default-secret-key'
class DevelopmentConfig(Config):
DEBUG = True
class ProductionConfig(Config):
DEBUG = False
# app.py
from flask import Flask
from config import DevelopmentConfig, ProductionConfig
def create_app(config_class=DevelopmentConfig):
app = Flask(__name__)
app.config.from_object(config_class) # 환경 설정 로드
@app.route('/')
def index():
return "Hello, World!"
return app
위 코드는 환경 설정을 위한 클래스를 만들고, create_app() 함수가 실행될 때 어떤 환경 설정을 사용할지 선택할 수 있게 합니다. 예를 들어, 개발 환경에서는 DevelopmentConfig, 운영 환경에서는 ProductionConfig를 사용할 수 있습니다.
플라스크 확장 및 블루프린트와 함께 사용
애플리케이션 팩토리는 Flask의 블루프린트(Blueprints)와 같은 기능들과도 함께 사용됩니다. 블루프린트를 사용하면 애플리케이션의 라우트와 기능을 모듈화할 수 있는데, 이를 애플리케이션 팩토리 패턴과 결합하면 더 나은 구조를 만들 수 있습니다.
예시: 블루프린트와 애플리케이션 팩토리 함께 사용
# routes.py
from flask import Blueprint
main = Blueprint('main', __name__)
@main.route('/')
def index():
return "Hello, World!"
# app.py
from flask import Flask
from routes import main
def create_app():
app = Flask(__name__)
app.register_blueprint(main) # 블루프린트 등록
return app
이 방식은 애플리케이션을 모듈화하여 유지보수성을 높이고, 더 복잡한 프로젝트에서도 구조적으로 깔끔하게 관리할 수 있습니다.
요약
애플리케이션 팩토리(Application Factory)는 Flask 애플리케이션을 동적으로 생성하는 패턴으로, 애플리케이션 객체를 함수 내부에서 생성합니다. 이를 통해 다양한 환경에 맞춘 설정을 적용하고, 테스트나 여러 인스턴스를 독립적으로 관리할 수 있습니다. Flask 프로젝트가 커질수록, 애플리케이션 팩토리를 사용하는 것이 좋은 설계 패턴입니다.
주요 장점:
- 유연한 설정 관리: 환경에 따라 설정을 쉽게 변경 가능.
- 테스트 용이성: 서로 독립된 애플리케이션 인스턴스를 생성하여 테스트에 유리.
- 프로젝트 구조 관리: 블루프린트와 함께 사용하여 프로젝트를 모듈화하고 유지보수성을 높일 수 있음.
'Study > Flask' 카테고리의 다른 글
flask-wtf란? (0) | 2024.09.19 |
---|---|
Flask-Migrate란? (0) | 2024.09.18 |
블루프린트(Blueprint)란? (0) | 2024.09.18 |
- Total
- Today
- Yesterday
- Collections
- jackson 라이브러리
- inp
- 시맨틱 버전(semantic versioning
- chrome extension 자동 배포
- 중첩 함수(nested function)
- 소프트웨어 버전 관리
- react router
- structuredclone()
- Jest
- stdlib.h
- core web vitals
- counter
- 원시값(primitive)
- public vs assets
- math.h
- named export vs default export
- pwa(progressive web app)
- 프로세스 강제 종료
- ajax (asynchronous javascript and xml)
- semver)
- react
- styled-components
- x.y.z (메이저.마이너.패치)
- javascript 필수 문법
- json.parse(json.stringify())
- 쉽게 풀어쓴 C언어 Express
- mermaid-cli
- defaultdict
- useEffect
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |