이 튜토리얼에서는 Jedis 라이브러리를 사용하여 Redis의 해시(Hash) 값에 대해 CRUD(Create, Read, Update, Delete) 작업을 수행하는 방법을 알아봅니다.
Jedis 라이브러란?
Jedis는 Redis 데이터 저장소를 위한 Java 클라이언트 라이브러리입니다. 가볍고 사용법이 매우 간단하며, Redis 2.8.x, 3.x.x 및 그 이상 버전과 완벽하게 호환됩니다.
해시(Hash) 값이란?
해시는 필드-값(field-value) 쌍으로 구성된 맵(Map) 구조로, 자바 객체처럼 객체 타입 데이터를 표현하는 데 적합합니다. Redis에서 해시는 하나의 값으로 저장되며, Redis는 이러한 해시 값을 저장·관리·조회할 수 있는 다양한 명령어를 제공합니다.
프로젝트 설정
선호하는 IDE에서 간단한 Maven 프로젝트를 생성한 후, pom.xml 파일에 아래 의존성을 추가합니다.
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.0.1</version> </dependency>
최신 버전의 Jedis 라이브러리는 Maven Central 저장소에서 확인할 수 있습니다.
Redis 설치
실습을 진행하려면 최신 버전의 Redis가 로컬 환경에 설치되어 있어야 합니다. Redis 공식 문서에서 운영체제별 설치 방법을 확인할 수 있습니다.
Jedis 연결
자바 코드를 Redis 서버에 연결하려면 Jedis(redis.clients.jedis.Jedis) 클래스의 객체를 생성합니다.
Jedis jedis = new Jedis();
로컬 머신에서 기본 포트(6379)로 Redis 서비스를 실행 중이라면 기본 생성자만으로도 정상적으로 동작합니다. 다른 호스트나 포트를 사용하는 경우에는 생성자에 올바른 호스트 URL과 포트 번호를 인자로 전달해야 합니다.
필드 값 생성 및 설정(Create)
해시 값 내부의 필드에 값을 설정하는 메서드는 세 가지가 있습니다.
- hset : 지정한 값을 해당 필드에 설정합니다. 필드가 이미 존재하면 기존 값이 덮어쓰여지며, 키가 존재하지 않으면 설정 작업 수행 전에 해시 값을 담는 새로운 키가 생성됩니다.
/* <hash-1>에 name 필드 추가 */ jedis.hset("hash-1", "name", "john"); /* <hash-2>에 name 필드 추가 (바이트 배열 형태) */ jedis.hset("hash-2".getBytes(), "name".getBytes(), "john".getBytes()); - hsetnx : 필드가 존재하지 않는 경우에만 값을 설정합니다. 필드가 이미 존재하면 이 작업은 아무런 영향을 미치지 않습니다.
/* <hash-1>에 name 필드 추가 */ jedis.hsetnx("hash-1", "name", "john"); /* <hash-2>에 age 필드 추가 */ jedis.hsetnx("hash-2".getBytes(), "age".getBytes(), "23".getBytes()); - hmset : 여러 개의 필드/값 쌍을 한 번에 설정합니다. 지정한 필드 중 이미 존재하는 것이 있다면 해당 값은 덮어쓰여집니다.
/* <hash-1>에 name과 age 필드 동시에 추가 */ Map<String,String> map = new HashMap<String, String>(); map.put("name","john"); map.put("age","23"); jedis.hmset("hash-1", map);
필드 값 조회(Read)
해시 값 내부 필드에 저장된 값을 조회하는 메서드는 두 가지가 있습니다.
- hget : 해시 내 단일 필드에 저장된 값을 반환합니다.
/* <hash-1>에서 name 필드 값 조회 */ jedis.hget("hash-1", "name"); - hmget : 하나 이상의 필드에 저장된 값을 한 번에 반환합니다.
/* <hash-1>에서 name과 age 필드 값 조회 */ jedis.hmget("hash-1", "name", "age");
필드 개수 확인(Size)
hlen 메서드는 특정 키에 저장된 해시 값에 포함된 필드의 개수를 반환합니다.
/* <hash-1>의 필드 개수 반환 */
jedis.hlen("hash-1");
필드 삭제(Delete)
hdel 메서드는 키에 저장된 해시 값에서 하나 이상의 필드를 삭제합니다.
/* <hash-1>에서 name과 age 필드 삭제 */
jedis.hdel("hash-1", "name", "age");
/* <hash-2>에서 name과 age 필드 삭제 */
jedis.hdel("hash-2".getBytes(),"name".getBytes(),"age".getBytes());
필드 존재 여부 확인
hexists 메서드는 지정한 필드가 해당 해시에 속해 있는지 여부를 확인합니다.
/* <hash-1>에 name 필드가 존재하는지 확인 */
jedis.hexists("hash-1", "name");
/* <hash-2>에 name 필드가 존재하는지 확인 */
jedis.hexists("hash-2".getBytes(),"name".getBytes());
전체 데이터 조회(Get All)
hgetall 메서드는 키에 저장된 해시 값의 모든 필드와 해당 값들을 한 번에 반환합니다.
/* <hash-1>의 모든 필드와 값 반환 */
jedis.hgetAll("hash-1");
/* <hash-2>의 모든 필드와 값 반환 */
jedis.hgetAll("hash-2".getBytes());
모든 필드 이름 조회(Get All Keys)
hkeys 메서드는 키에 저장된 해시 값에 포함된 모든 필드의 이름을 반환합니다.
/* <hash-1>의 모든 필드 이름 반환 */
jedis.hkeys("hash-1");
/* <hash-2>의 모든 필드 이름 반환 */
jedis.hkeys("hash-2".getBytes());
모든 값 조회(Get All Values)
hvals 메서드는 키에 저장된 해시 값에 포함된 모든 필드의 값들을 반환합니다.
/* <hash-1>의 모든 값 반환 */
jedis.hvals("hash-1");
/* <hash-2>의 모든 값 반환 */
jedis.hvals("hash-2".getBytes());
참고 자료
- Redis 공식 문서 - Hash Command Docs
지금까지 Jedis 라이브러리를 사용하여 Redis 해시 값에 CRUD 작업을 수행하는 방법을 살펴보았습니다. 이 글이 도움이 되었다면 댓글로 의견을 남겨주시고, 주변에도 널리 공유해 주세요!