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

1""" 

2Simplified Service Configuration for MSA 

3간소화된 MSA 서비스 설정 (IAM vs Non-IAM) 

4""" 

5 

6from dataclasses import dataclass, field 

7from enum import Enum 

8from typing import Callable, Optional 

9 

10 

11class ServiceType(str, Enum): 

12 """간소화된 마이크로서비스 유형""" 

13 

14 # IAM 서비스 - 인증/사용자 관리 기능 포함 (직접 JWT 검증) 

15 IAM_SERVICE = "iam_service" 

16 

17 # Non-IAM 서비스 - Gateway 헤더 기반 인증 

18 NON_IAM_SERVICE = "non_iam_service" 

19 

20 

21@dataclass 

22class ServiceConfig: 

23 """통합 서비스 설정 (AppConfig + ServiceConfig 일원화)""" 

24 

25 # 기본 정보 

26 service_name: str 

27 service_type: ServiceType 

28 service_version: str = "1.0.0" 

29 description: Optional[str] = None 

30 

31 # 데이터베이스 

32 enable_database: bool = True 

33 database_name: Optional[str] = None 

34 

35 # 감사 로깅 

36 enable_audit_logging: bool = True 

37 

38 # 인증 (ServiceType에 따라 자동 설정) 

39 enable_auth: bool = field(init=False) 

40 enable_oauth: bool = field(init=False) 

41 enable_user_management: bool = field(init=False) 

42 

43 # Gateway 관련 

44 is_gateway_downstream: bool = field(init=False) 

45 public_paths: list[str] = field(default_factory=lambda: ["/health", "/metrics"]) 

46 

47 # 기능 

48 enable_metrics: bool = True 

49 enable_health_check: bool = True 

50 cors_origins: Optional[list[str]] = None 

51 

52 # 생명주기 

53 lifespan: Optional[Callable] = None 

54 

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"]) 

64 

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 

73 

74 # 데이터베이스명 기본값 설정 

75 if not self.database_name: 

76 self.database_name = f"{self.service_name.replace('-', '_')}_db" 

77 

78 

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 생성 헬퍼 함수""" 

87 

88 return ServiceConfig( 

89 service_name=service_name, 

90 service_type=service_type, 

91 service_version=service_version, 

92 description=description, 

93 **kwargs, 

94 ) 

95 

96 

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 

105 

106 

107__all__ = [ 

108 "ServiceType", 

109 "ServiceConfig", 

110 "create_service_config", 

111 "parse_service_type", 

112]