improvement: InMemoryTokenStore를 Redis 기반으로 교체 (#162) #163

Merged
seonkyu.kim merged 1 commits from improvement/#162-redis-token-store into develop 2026-02-11 02:23:11 +00:00
2 changed files with 69 additions and 2 deletions
Showing only changes of commit 74e6bd83dc - Show all commits

View File

@ -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<RedisTokenStore> _logger;
public RedisTokenStore(
RedisConnection redis,
IOptions<RedisSettings> settings,
ILogger<RedisTokenStore> 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<string?> 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}";
}

View File

@ -88,8 +88,7 @@ public static class DependencyInjection
services.AddHostedService<DataRetentionWorker>();
// Token Store & Email Service
services.AddMemoryCache();
services.AddSingleton<ITokenStore, InMemoryTokenStore>();
services.AddSingleton<ITokenStore, RedisTokenStore>();
services.AddSingleton<IEmailService, ConsoleEmailService>();
return services;