Commit 2df7f0b
committed
perf(pipeline): UsecasePipelineBase 핸들러명 추출 결과 generic static 캐싱
GetRequestHandler/GetRequestHandlerLower/GetRequestHandlerPath은 매 요청
hot path에서 호출되지만 결과는 generic 인자 TRequest별 고정값. 매번
3회 Regex 매칭 + string indexing 재실행 중이었음.
UsecasePipelineBase<TRequest>가 이미 generic class라 .NET 런타임이
인자별 별도 static 영역을 자동 분리. ConcurrentDictionary 같은 동적
lookup 자료구조는 불필요 — static readonly field 패턴으로 lookup 0,
타입별 boundedness 자연 보장, 24/365 가동에서 메모리 누수 없음
(TRequest 종류는 컴파일 타임 결정, 100 타입 기준 약 30KB 상수 누적).
변경:
- _cachedHandlerPath, _cachedHandler, _cachedHandlerLower 3개 static
readonly field 추가
- GetRequestHandler*는 캐시 참조로 단순화 (lookup 0)
- 기존 본문은 ComputeRequestHandler private 메서드로 이전
- 보너스: ToLower() → ToLowerInvariant() (culture-aware bug 위험 제거)
검증: Functorium.slnx 빌드 0 오류, 1554/1582 테스트 통과(28 skip).
Public API 영향 0 (protected 메서드 시그니처 동일).
후속(별도 평가): GetRequestCategoryType 두 오버로드는 TRequest와 다른
타입을 받을 수 있어 generic static field 부적합. 호출 빈도 측정 후 판단.1 parent 93d9647 commit 2df7f0b
1 file changed
Lines changed: 20 additions & 14 deletions
Lines changed: 20 additions & 14 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
92 | 92 | | |
93 | 93 | | |
94 | 94 | | |
95 | | - | |
96 | | - | |
97 | | - | |
98 | | - | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
99 | 106 | | |
100 | 107 | | |
101 | 108 | | |
| |||
115 | 122 | | |
116 | 123 | | |
117 | 124 | | |
118 | | - | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
119 | 134 | | |
120 | 135 | | |
121 | 136 | | |
| |||
146 | 161 | | |
147 | 162 | | |
148 | 163 | | |
149 | | - | |
150 | | - | |
151 | | - | |
152 | | - | |
153 | | - | |
154 | | - | |
155 | | - | |
156 | | - | |
157 | | - | |
158 | 164 | | |
159 | 165 | | |
160 | 166 | | |
| |||
0 commit comments