파이썬 서비스 팩토리 패턴

팩토리 패턴을 사용하는 경우, 여러 서비스(API)를 효율적으로 관리하고 확장할 수 있습니다. 팩토리 패턴을 사용하면, 서비스 타입에 따라 동적으로 다른 객체를 생성하여 반환하는 중앙 집중화된 객체 생성 메커니즘을 제공할 수 있습니다. 이는 코드의 중복을 최소화하고, 확장성과 유지보수성을 향상시킵니다.
파이썬 서비스 팩토리 패턴
Photo by Hitesh Choudhary / Unsplash

On this page

팩토리 패턴을 사용하는 경우, 여러 서비스(API)를 효율적으로 관리하고 확장할 수 있습니다. 팩토리 패턴을 사용하면, 서비스 타입에 따라 동적으로 다른 객체를 생성하여 반환하는 중앙 집중화된 객체 생성 메커니즘을 제공할 수 있습니다. 이는 코드의 중복을 최소화하고, 확장성과 유지보수성을 향상시킵니다.

파일/폴더 구조

팩토리 패턴을 적용할 때, 각 서비스(API)에 대한 클래스를 별도의 파일로 분리하고, 공통 인터페이스 또는 추상 클래스를 사용하는 구조가 일반적입니다. 예를 들어, OCR, STT, Notification 등 각기 다른 서비스를 제공하는 클래스들을 별도의 파일로 관리하고, 이들을 생성하는 팩토리 클래스를 별도의 파일로 구성할 수 있습니다.

다음은 권장되는 기본적인 디렉토리 구조입니다:

/toast_services/
|-- __init__.py
|-- service_factory.py    # 서비스 객체를 생성하는 팩토리 클래스
|-- base_service.py       # 모든 서비스가 상속받을 수 있는 기본 클래스 또는 인터페이스
|-- services/
    |-- __init__.py
    |-- ocr_service.py    # OCR 서비스 구현
    |-- stt_service.py    # STT 서비스 구현
    |-- notification_service.py # 알림 서비스 구현

서비스 클래스 예시

각 서비스 클래스는 공통 인터페이스를 구현하거나 추상 클래스를 상속받아 특정 서비스의 로직을 구현합니다. 예를 들어, ocr_service.py 파일 내용은 다음과 같을 수 있습니다.

# ocr_service.py

from .base_service import BaseService

class OcrService(BaseService):
    def perform_action(self, data):
        # OCR 처리 로직
        return "OCR 결과 반환"

팩토리 클래스 예시

팩토리 클래스는 요청에 따라 적절한 서비스 인스턴스를 생성합니다.

# service_factory.py

from .services.ocr_service import OcrService
from .services.stt_service import SttService
from .services.notification_service import NotificationService

class ServiceFactory:
    @staticmethod
    def get_service(service_type):
        if service_type == 'OCR':
            return OcrService()
        elif service_type == 'STT':
            return SttService()
        elif service_type == 'Notification':
            return NotificationService()
        else:
            raise ValueError("Unknown service type")

사용 예시

이 팩토리를 사용하여 Flask 라우트에서 서비스를 요청할 때 다음과 같이 할 수 있습니다.

# app.py
from flask import Flask, request
from toast_services.service_factory import ServiceFactory

app = Flask(__name__)

@app.route('/service', methods=['GET'])
def handle_service():
    service_type = request.args.get('type')
    data = request.args  # or request.form or request.json depending on your needs
    service = ServiceFactory.get_service(service_type)
    result = service.perform_action(data)
    return result

if __name__ == '__main__':
    app.run(debug=True)

이 구조는 각 서비스의 구현을 독립적으로 유지하면서도, 중앙에서 서비스 생성을 관리할 수 있게 해주어 코드의 유연성과 확장성을 향상시킵니다.

Subscribe to Keun's Story newsletter and stay updated.

Don't miss anything. Get all the latest posts delivered straight to your inbox. It's free!
Great! Check your inbox and click the link to confirm your subscription.
Error! Please enter a valid email address!