서론
오늘날처럼 빠르게 변화하는 디지털 환경에서 애플리케이션은 높은 성능과 즉각적인 응답 속도를 요구받습니다. 이를 실현하는 대표적인 방법 중 하나가 바로 캐싱입니다. 자주 조회되는 데이터를 미리 저장해 두면 데이터베이스에 반복적으로 요청하는 비용을 크게 줄일 수 있습니다. Redis는 가장 널리 사용되는 인메모리 데이터 스토어 중 하나로, .NET Core 애플리케이션에 안정적이고 강력한 캐싱 솔루션을 제공합니다. 이 글에서는 실습 예제를 통해 .NET Core 6 애플리케이션에 Redis 캐시를 통합하는 전 과정을 단계별로 살펴보겠습니다.
사전 준비 사항
시작하기 전에 시스템에 다음 항목들이 준비되어 있는지 확인하세요.
- .NET Core 6 SDK: .NET Core 6 SDK 이상이 설치되어 있어야 합니다. 공식 .NET 웹사이트에서 내려받을 수 있습니다.
- Redis 서버: 로컬 환경에 Redis 서버를 설치해 실행하거나, Redis 클라우드 서비스를 이용하면 됩니다.
Windows에 Redis 서버 설치하기
Redis 다운로드 및 설치
GitHub 페이지(https://github.com/MicrosoftArchive/redis/releases/download/win-3.0.504/Redis-x64-3.0.504.msi)에서 64비트 Windows용으로 사전 컴파일된 Redis 버전을 내려받을 수 있습니다.
링크를 클릭하면 .msi 형식의 Windows 인스톨러 파일이 다운로드됩니다. 다운로드 폴더에서 해당 파일을 찾아 더블클릭한 뒤, 안내에 따라 설치를 진행하세요.
설치가 완료되면 Redis 서버는 기본적으로 C:\Program Files\Redis 경로에 설치되며, 이 폴더에서 redis-server 실행 파일을 확인할 수 있습니다.

이제 명령 프롬프트를 열고 다음 명령어를 입력합니다.
redis-server

이것으로 Redis 서버가 정상적으로 실행됩니다.
다음 명령어를 사용하면 Redis 서버에서 발생하는 업데이트와 변경 사항을 실시간으로 모니터링할 수 있습니다.
redis-cli monitor

.NET Core 6 콘솔 애플리케이션 만들기
먼저 다음 명령어로 새 콘솔 프로젝트를 생성합니다.
dotnet new console -n RedisCacheDemo
프로젝트 폴더로 이동
cd RedisCacheDemo
필수 NuGet 패키지 설치
Redis와 통신하기 위해 StackExchange.Redis 패키지를 추가합니다.
dotnet add package StackExchange.Redis
Redis 연결 구성하기
Program.cs 파일에 필요한 using 문을 추가한 뒤, Main 메서드에서 Redis 연결을 다음과 같이 구성합니다.
static void Main(string[] args)
{
var configuration = ConfigurationOptions.Parse("localhost:6379");
var redisConnection = ConnectionMultiplexer.Connect(configuration);
var redisCache = redisConnection.GetDatabase();
Console.WriteLine("Fetching data with caching:");
var cachedData = GetDataWithCaching(redisCache);
Console.WriteLine($"Result: {cachedData}");
Console.WriteLine("Fetching data without caching:");
var uncachedData = GetDataFromDatabase();
Console.WriteLine($"Result: {uncachedData}");
redisConnection.Close(); //It is important to close the connection
}
static string GetDataFromDatabase()
{
// Simulate fetching data from the database
// Replace this with your actual database fetching logic
Thread.Sleep(2000); // Simulating latency
return "Start";
}
static string GetDataWithCaching(IDatabase redisCache)
{
// redisCache.KeyDelete("cachedData"); // For Delete the Cache
// redisCache.StringSet("cachedData", "Test", TimeSpan.FromMinutes(1)); // For Update the Cache
string cachedData = redisCache.StringGet("cachedData");
if (string.IsNullOrEmpty(cachedData))
{
cachedData = GetDataFromDatabase();
redisCache.StringSet("cachedData", cachedData, TimeSpan.FromMinutes(1));
}
return cachedData;
}
이제 프로그램을 실행해 보겠습니다.
실행 결과를 보면 캐시를 사용했을 때와 사용하지 않았을 때의 출력이 서로 같습니다. 이는 처음 생성된 결과가 이미 캐시에 저장되어 있기 때문입니다. 하지만 코드의 값을 변경한 후 다시 실행하면 결과가 달라지는 것을 확인할 수 있습니다.
다음과 같이 데이터베이스 조회 메서드의 반환 값을 변경해 보겠습니다.
static string GetDataFromDatabase()
{
// Simulate fetching data from the database
// Replace this with your actual database fetching logic
Thread.Sleep(2000); // Simulating latency
return "Last";
}
반환 값을 수정한 뒤 프로그램을 다시 실행했습니다.
이번 출력에서 첫 번째 값은 캐시에 저장되어 있던 기존 값이며, 두 번째 값은 캐시를 거치지 않고 데이터베이스에서 직접 가져온 최신 값입니다. 이처럼 캐시가 적용된 경우 만료 시간이 지나기 전까지는 이전 데이터가 반환된다는 점을 확인할 수 있습니다.
마무리
축하합니다! 지금까지 .NET Core 6 애플리케이션에 Redis 캐시를 성공적으로 통합했습니다. 캐싱을 도입함으로써 애플리케이션의 성능과 응답 속도가 개선되었고, 자주 접근하는 데이터를 훨씬 더 효율적으로 처리할 수 있게 되었습니다. 실제 서비스에서는 캐시 만료 시간(TTL)과 무효화 전략을 데이터 특성에 맞게 조정하면 더욱 견고하고 확장성 있는 캐싱 아키텍처를 구축할 수 있습니다.