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