환경 구성 및 의존성 설치
Redis 서버가 로컬 또는 원격 환경에서 실행 중임을 가정하고, Java 기반 프로젝트에서 외부 스토어 접근을 위한 라이브러리 설치를 먼저 수행합니다. Maven 관리를 통해 필요한 종속성을 정의하며, 본 가이드에서는 Jedis와 Redisson 두 가지 주요 클라이언트를 활용하여 비교 분석합니다.
pom.xml 파일 내부의 <dependencies> 영역에 다음 내용을 추가하여 빌드 시점에 패키지를 로드합니다. 최신 안정적인 버전을 선정하여 호환성과 안정성을 확보하였습니다.
<!-- Redisson Client -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.23.4</version>
</dependency>
<!-- Jedis Client -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.4.3</version>
</dependency>
<!-- Spring Data Redis Abstraction -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.7.17</version>
</dependency>
연결 테스트 및 기본 명령어 구현
설정된 라이브러리를 사용하여 실제 네트워크 연결이 성공하는지 검증하고, 문자열, 맵, 집합, 큐 등 다양한 데이터 구조를 다루는 샘플 코드를 작성합니다. 클래스 구조를 명확히 구분하여 각 클라이언트의 특징을 파악할 수 있도록 재구성하였습니다.
다음 예시는 main 메서드 내에서 두 가지 방식을 병행하거나 선택적으로 실행하며, 리소스 누수가 방지되도록 주의 깊게 처리합니다.
package com.example.redis.integration;
import org.redisson.Redisson;
import org.redisson.config.Config;
import redis.clients.jedis.Jedis;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
import java.util.Queue;
public class RedisOperationDemo {
public static void main(String[] args) {
// --- Jedis 를 통한 단순 KV 저장소 테스트 ---
testJedisStringOperation();
// --- Redisson 을 통한 분산 컬렉션 테스트 ---
testRedissonCollections();
}
private static void testJedisStringOperation() {
String host = "localhost";
int port = 6379;
// Jedis 인스턴스 생성 및 자동 리소스 정리 권장
try (Jedis client = new Jedis(host, port)) {
System.out.println("[Jedis] 커넥션 풀 연결 확인됨.");
// 특정 키에 대한 문자열 값 기록
String sessionKey = "user_session_info";
String sessionValue = "Active_User_ID_1001";
client.set(sessionKey, sessionValue);
// 기록된 값 조회 및 출력
String retrievedData = client.get(sessionKey);
System.out.println("[Jedis] 조회 결과 (" + sessionKey + "): " + retrievedData);
String cacheKey = "temp_config_value";
String cacheVal = client.get(cacheKey);
System.out.println("[Jedis] 캐시 상태 (" + cacheKey + "): " + (cacheVal != null ? cacheVal : "없음"));
} catch (Exception e) {
e.printStackTrace();
}
}
private static void testRedissonCollections() {
Config config = new Config();
config.useSingleServer()
.setConnectionPoolSize(32)
.setAddress("redis://127.0.0.1:6379");
RedissonClientManager manager = new RedissonClientManager(config);
try {
// 1. Concurrent Map 을 이용한 동적 데이터 매핑
manager.processConcurrentMap("employee_registry",
Map.of("emp_001", "Kim Minho", "emp_002", "Lee Jieun"));
// 2. Set 을 이용한 중복 제거 데이터 관리
Set<String> accessLogSet = manager.createUniqueLogSet("web_access_logs");
accessLogSet.add("login_success");
accessLogSet.add("logout_fail");
accessLogSet.add("login_success"); // 중복 입력 시 무시됨
System.out.println("[Redisson] 로그 세트 크기: " + accessLogSet.size());
// 3. Queue 를 이용한 순차 작업 처리
Queue<String> taskQueue = manager.initializeTaskQueue("daily_jobs");
taskQueue.offer("send_email");
taskQueue.offer("sync_db");
taskQueue.offer("generate_report");
// 대기 중인 작업 확인
System.out.println("[Redisson] 대기 작업 현황: " + taskQueue);
System.out.println("[Redisson] 다음 작업 대상: " + taskQueue.peek());
} finally {
// 자원 반환 및 종료 처리
manager.closeConnections();
}
}
// Redisson 연동을 감싸는 헬퍼 객체 (리팩토링 적용)
static class RedissonClientManager {
private final Redisson redisson;
public RedissonClientManager(Config conf) {
this.redisson = Redisson.create(conf);
}
@SuppressWarnings("unchecked")
public void processConcurrentMap(String keyName, Map data) {
org.redisson.api.RMap remoteMap = redisson.getMap(keyName);
remoteMap.putAll(data);
System.out.println("[Redisson] 맵 동기화 완료: " + remoteMap.keySet());
}
public Set<String> createUniqueLogSet(String setName) {
return redisson.getSet(setName);
}
public Queue<String> initializeTaskQueue(String queueName) {
return redisson.getQueue(queueName);
}
public void closeConnections() {
redisson.shutdown();
}
}
}