티스토리 뷰

728x90

애플리케이션 팩토리(Application Factory)는 Flask와 같은 웹 프레임워크에서 애플리케이션 인스턴스(Flask 앱 객체)를 생성하는 함수를 말합니다. 이 패턴은 Flask 애플리케이션을 모듈화하고, 설정을 유연하게 관리하며, 확장 가능하게 만들기 위한 중요한 설계 방법 중 하나입니다.

애플리케이션 팩토리 패턴을 사용하면 Flask 애플리케이션을 동적으로 생성할 수 있습니다. 즉, Flask 애플리케이션 인스턴스(보통 app 객체)를 필요할 때마다 만들어 사용합니다. 이 방식은 특히 테스트다중 환경(개발, 테스트, 운영) 관리에서 유용합니다.

왜 애플리케이션 팩토리를 사용하는가?

애플리케이션 팩토리 패턴은 여러 장점을 제공합니다:

  1. 테스트 용이성: 애플리케이션을 팩토리로 만들면 여러 인스턴스를 생성할 수 있어, 서로 독립적인 테스트를 할 수 있습니다.
  2. 구성 관리: 개발, 테스트, 운영 환경에 따라 다른 구성을 쉽게 적용할 수 있습니다.
  3. 확장 가능성: 애플리케이션의 확장을 도와주며, 여러 모듈을 개별적으로 관리하고 결합할 수 있습니다.

애플리케이션 팩토리 패턴의 예시

애플리케이션 팩토리를 사용하지 않으면, 보통 아래와 같은 방식으로 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()

애플리케이션 팩토리의 주요 특징

  1. 애플리케이션 생성 지연: 앱 객체가 파일이 로드될 때 자동으로 생성되는 것이 아니라, create_app() 함수가 호출될 때 비로소 생성됩니다. 이를 통해 여러 앱 인스턴스를 독립적으로 생성할 수 있습니다.
  2. 구성(환경)에 따른 설정 가능: 애플리케이션 팩토리 함수에 매개변수를 전달함으로써 다양한 환경(개발, 테스트, 운영)에 맞게 설정을 다르게 적용할 수 있습니다.

설정 예시

애플리케이션 팩토리를 사용하면 다양한 환경에 맞게 애플리케이션 설정을 다르게 할 수 있습니다.

# 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 프로젝트가 커질수록, 애플리케이션 팩토리를 사용하는 것이 좋은 설계 패턴입니다.

주요 장점:

  1. 유연한 설정 관리: 환경에 따라 설정을 쉽게 변경 가능.
  2. 테스트 용이성: 서로 독립된 애플리케이션 인스턴스를 생성하여 테스트에 유리.
  3. 프로젝트 구조 관리: 블루프린트와 함께 사용하여 프로젝트를 모듈화하고 유지보수성을 높일 수 있음.
728x90

'Study > Flask' 카테고리의 다른 글

flask-wtf란?  (0) 2024.09.19
Flask-Migrate란?  (0) 2024.09.18
블루프린트(Blueprint)란?  (0) 2024.09.18