Redis를 캐시로 사용할 때 가장 많이 하는 고민 중 하나는 다음과 같습니다.
"데이터를 수정해야 할 때, DTO 전체를 Redis에 다시 저장해야 할까? 아니면 변경된 필드만 수정할 수 있을까?"
Redis는 다양한 자료형을 지원합니다. DTO(Data Transfer Object)를 캐시할 때는 주로 두 가지 방식 중 하나를 사용합니다.
String 타입에 직렬화된 JSON 형태로 저장redisTemplate.opsForValue().set("post:123", dto); // JSON 직렬화된 전체 DTO
이 방식은 Redis에 전체 객체를 문자열로 저장하는 방식입니다.
즉, 필드 하나만 바뀌었더라도 Redis에는 전체 값을 덮어써야 합니다.
dto.setTitle("수정된 제목");
redisTemplate.opsForValue().set("post:123", dto); // 전체 덮어쓰기
Hash 타입으로 필드 단위 저장redisTemplate.opsForHash().put("post:123", "title", "제목");
redisTemplate.opsForHash().put("post:123", "content", "내용");
이 방식은 DTO의 각 필드를 Redis의 Hash 구조에 key-value로 저장합니다.
필드 단위로 접근하거나 수정할 수 있어 필드 하나만 바꿔도 해당 필드만 업데이트하면 됩니다.
redisTemplate.opsForHash().put("post:123", "title", "수정된 제목");
| 구분 | String(JSON 직렬화) | Hash(필드 단위 저장) |
|---|---|---|
| 장점 | 구현 간단, 통째로 직렬화 | 필드 단위로 업데이트 가능 |
| 단점 | 전체 덮어쓰기만 가능 | 구조 설계 복잡, 역직렬화 필요 |
| 적합한 상황 | 변경이 적은 데이터 | 필드 일부가 자주 변경될 때 |
String 방식으로 간단하게 처리Hash 방식 사용Redis는 빠르지만, 데이터 업데이트 전략은 매우 중요합니다.
특히 DTO 캐싱에서 전체 덮어쓰기와 필드 단위 수정은 성능과 코드 복잡도에 큰 영향을 미칩니다.
🚀 변경이 적다면
String으로,
🔁 자주 바뀌면Hash로 관리하자!