Coverage for src / mysingle / core / service_types.py: 0%
45 statements
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-02 00:58 +0900
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-02 00:58 +0900
1"""
2Simplified Service Configuration for MSA
3간소화된 MSA 서비스 설정 (IAM vs Non-IAM)
4"""
6from dataclasses import dataclass, field
7from enum import Enum
8from typing import Callable, Optional
11class ServiceType(str, Enum):
12 """간소화된 마이크로서비스 유형"""
14 # IAM 서비스 - 인증/사용자 관리 기능 포함 (직접 JWT 검증)
15 IAM_SERVICE = "iam_service"
17 # Non-IAM 서비스 - Gateway 헤더 기반 인증
18 NON_IAM_SERVICE = "non_iam_service"
21@dataclass
22class ServiceConfig:
23 """통합 서비스 설정 (AppConfig + ServiceConfig 일원화)"""
25 # 기본 정보
26 service_name: str
27 service_type: ServiceType
28 service_version: str = "1.0.0"
29 description: Optional[str] = None
31 # 데이터베이스
32 enable_database: bool = True
33 database_name: Optional[str] = None
35 # 감사 로깅
36 enable_audit_logging: bool = True
38 # 인증 (ServiceType에 따라 자동 설정)
39 enable_auth: bool = field(init=False)
40 enable_oauth: bool = field(init=False)
41 enable_user_management: bool = field(init=False)
43 # Gateway 관련
44 is_gateway_downstream: bool = field(init=False)
45 public_paths: list[str] = field(default_factory=lambda: ["/health", "/metrics"])
47 # 기능
48 enable_metrics: bool = True
49 enable_health_check: bool = True
50 cors_origins: Optional[list[str]] = None
52 # 생명주기
53 lifespan: Optional[Callable] = None
55 def __post_init__(self):
56 """ServiceType에 따라 인증 설정 자동 구성"""
57 if self.service_type == ServiceType.IAM_SERVICE:
58 # IAM 서비스: 직접 JWT 검증
59 self.enable_auth = True
60 self.enable_oauth = True
61 self.enable_user_management = True
62 self.is_gateway_downstream = False
63 self.public_paths.extend(["/docs", "/openapi.json"])
65 else: # NON_IAM_SERVICE
66 # Non-IAM 서비스: Gateway 헤더 기반 인증 우선 + 미들웨어 활성화
67 # 미들웨어는 우선 Kong 헤더를 사용하고, 없으면 직접 JWT(헤더/쿠키)로 폴백합니다.
68 # 따라서 Non-IAM 서비스에서도 enable_auth 를 True 로 설정해 미들웨어를 장착합니다.
69 self.enable_auth = True
70 self.enable_oauth = False
71 self.enable_user_management = False
72 self.is_gateway_downstream = True
74 # 데이터베이스명 기본값 설정
75 if not self.database_name:
76 self.database_name = f"{self.service_name.replace('-', '_')}_db"
79def create_service_config(
80 service_name: str,
81 service_type: ServiceType,
82 service_version: str = "1.0.0",
83 description: Optional[str] = None,
84 **kwargs,
85) -> ServiceConfig:
86 """ServiceConfig 생성 헬퍼 함수"""
88 return ServiceConfig(
89 service_name=service_name,
90 service_type=service_type,
91 service_version=service_version,
92 description=description,
93 **kwargs,
94 )
97# 환경변수에서 ServiceType 파싱
98def parse_service_type(type_str: str) -> ServiceType:
99 """환경변수 문자열을 ServiceType으로 변환"""
100 try:
101 return ServiceType(type_str.lower())
102 except ValueError:
103 # 기본값: Non-IAM 서비스
104 return ServiceType.NON_IAM_SERVICE
107__all__ = [
108 "ServiceType",
109 "ServiceConfig",
110 "create_service_config",
111 "parse_service_type",
112]