From 74e6bd83dc91b1453b34f012a2383f54e4f85f25 Mon Sep 17 00:00:00 2001 From: SEAN Date: Wed, 11 Feb 2026 11:20:16 +0900 Subject: [PATCH] =?UTF-8?q?improvement:=20InMemoryTokenStore=EB=A5=BC=20Re?= =?UTF-8?q?dis=20=EA=B8=B0=EB=B0=98=EC=9C=BC=EB=A1=9C=20=EA=B5=90=EC=B2=B4?= =?UTF-8?q?=20(#162)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - RedisTokenStore 구현 (ITokenStore, Redis StringSet/Get/KeyDelete) - DI 등록 변경 (InMemoryTokenStore → RedisTokenStore) - AddMemoryCache() 제거 (더 이상 사용처 없음) Closes #162 --- .../Caching/RedisTokenStore.cs | 68 +++++++++++++++++++ SPMS.Infrastructure/DependencyInjection.cs | 3 +- 2 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 SPMS.Infrastructure/Caching/RedisTokenStore.cs diff --git a/SPMS.Infrastructure/Caching/RedisTokenStore.cs b/SPMS.Infrastructure/Caching/RedisTokenStore.cs new file mode 100644 index 0000000..5a65d1c --- /dev/null +++ b/SPMS.Infrastructure/Caching/RedisTokenStore.cs @@ -0,0 +1,68 @@ +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using SPMS.Application.Interfaces; +using SPMS.Application.Settings; + +namespace SPMS.Infrastructure.Caching; + +public class RedisTokenStore : ITokenStore +{ + private readonly RedisConnection _redis; + private readonly RedisSettings _settings; + private readonly ILogger _logger; + + public RedisTokenStore( + RedisConnection redis, + IOptions settings, + ILogger logger) + { + _redis = redis; + _settings = settings.Value; + _logger = logger; + } + + public async Task StoreAsync(string key, string value, TimeSpan expiry) + { + try + { + var db = await _redis.GetDatabaseAsync(); + await db.StringSetAsync(BuildKey(key), value, expiry); + } + catch (Exception ex) + { + _logger.LogError(ex, "토큰 저장 실패: key={Key}", key); + throw; + } + } + + public async Task GetAsync(string key) + { + try + { + var db = await _redis.GetDatabaseAsync(); + var value = await db.StringGetAsync(BuildKey(key)); + return value.IsNullOrEmpty ? null : value.ToString(); + } + catch (Exception ex) + { + _logger.LogError(ex, "토큰 조회 실패: key={Key}", key); + throw; + } + } + + public async Task RemoveAsync(string key) + { + try + { + var db = await _redis.GetDatabaseAsync(); + await db.KeyDeleteAsync(BuildKey(key)); + } + catch (Exception ex) + { + _logger.LogError(ex, "토큰 삭제 실패: key={Key}", key); + throw; + } + } + + private string BuildKey(string key) => $"{_settings.InstanceName}token:{key}"; +} diff --git a/SPMS.Infrastructure/DependencyInjection.cs b/SPMS.Infrastructure/DependencyInjection.cs index d05fb29..81e109c 100644 --- a/SPMS.Infrastructure/DependencyInjection.cs +++ b/SPMS.Infrastructure/DependencyInjection.cs @@ -88,8 +88,7 @@ public static class DependencyInjection services.AddHostedService(); // Token Store & Email Service - services.AddMemoryCache(); - services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); return services;