구현한 개인 프로젝트인 예산 관리 프로젝트에서, 변하지 않는 것이 카테고리 데이터입니다.
하지만 예산을 등록할때, 카테고리를 조회할때 등 카테고리 정보를 가져올때가 있습니다.
이를 효과적으로 개선하기 위해 Redis 캐시를 도입했습니다.
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class CategoryService {
private final CategoryRepository categoryRepository;
public RsData<List<Category>> getAll() {
List<Category> allCategories = categoryRepository.findAll();
if(allCategories.isEmpty()){
return RsData.of("F-1", "등록된 카테고리가 없습니다.");
}
return RsData.of("S-1", "카테고리 목록 조회 성공", allCategories);
}
public Category get(Long categoryId) {
return categoryRepository.findById(categoryId).get();
}
}
@Entity
@Getter
@Builder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor // 필수
@QueryEntity
public class Category implements Serializable // 필수 {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
@Column(unique = true)
private String nameE;
@Column(unique = true)
private String nameH;
}
public RsData<List<Category>> getAll() {
List<Category> allCategories = categoryRepository.findAll();
if(allCategories.isEmpty()){
return RsData.of("F-1", "등록된 카테고리가 없습니다.");
}
return RsData.of("S-1", "카테고리 목록 조회 성공", allCategories);
}
@Cacheable(value = "CategoryList")
public List<Category> getAllCategoriesByCached() {
return categoryRepository.findAll();
}
public RsData<List<Category>> getAll() {
// 캐시 활용
List<Category> allCategories = redisService.getAllCategoriesByCached();
if(allCategories.isEmpty()){
return RsData.of("F-1", "등록된 카테고리가 없습니다.");
}
return RsData.of("S-1", "카테고리 목록 조회 성공", allCategories);
}
예산 계획 설정, 지출 예산 등록 등에 예산 카테고리 각각을 조회한다.
이 경우에도 DB 조회가 빈번히 발생하나, 카테고리는 변하는 데이터가 아니기에 Redis에 각각 저장한다.
변경 전 코드
public Category get(Long categoryId) {
return categoryRepository.findById(categoryId).get();
}
public Category get(Long categoryId) {
// 캐시 활용
return redisService.getCategoryByCached(categoryId);
}
프로젝트 중 변할 일이 없는 카테고리 데이터를 캐시화 하여 성능을 향상시킬 수 있었습니다!