From ea46f5401db65665067d7531ce82fc49926e09c6 Mon Sep 17 00:00:00 2001 From: mattknatt Date: Thu, 23 Apr 2026 14:52:56 +0200 Subject: [PATCH] Introduce caching with Caffeine and annotate EmployeeService with cache operations --- pom.xml | 8 +++++++ .../application/service/EmployeeService.java | 7 ++++++ .../infrastructure/config/CacheConfig.java | 23 +++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 src/main/java/org/example/projektarendehantering/infrastructure/config/CacheConfig.java diff --git a/pom.xml b/pom.xml index 28842f2..b5def9a 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,14 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-cache + + + com.github.ben-manes.caffeine + caffeine + org.apache.tika tika-core diff --git a/src/main/java/org/example/projektarendehantering/application/service/EmployeeService.java b/src/main/java/org/example/projektarendehantering/application/service/EmployeeService.java index 8a1cdb0..af693ff 100644 --- a/src/main/java/org/example/projektarendehantering/application/service/EmployeeService.java +++ b/src/main/java/org/example/projektarendehantering/application/service/EmployeeService.java @@ -10,6 +10,8 @@ import org.example.projektarendehantering.presentation.dto.EmployeeCreateDTO; import org.example.projektarendehantering.presentation.dto.EmployeeDTO; import org.example.projektarendehantering.presentation.dto.EmployeeUpdateDTO; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import lombok.RequiredArgsConstructor; @@ -28,6 +30,7 @@ public class EmployeeService { private final EmployeeRepository employeeRepository; private final EmployeeMapper employeeMapper; + @CacheEvict(value = {"employees-by-role", "all-employees"}, allEntries = true) @Transactional public EmployeeDTO createEmployee(Actor actor, EmployeeCreateDTO dto) { requireCanManageEmployees(actor); @@ -50,6 +53,7 @@ public EmployeeDTO createEmployee(Actor actor, EmployeeCreateDTO dto) { return employeeMapper.toDTO(employeeRepository.save(entity)); } + @CacheEvict(value = {"employees-by-role", "all-employees"}, allEntries = true) @Transactional public EmployeeDTO updateEmployee(Actor actor, UUID id, EmployeeUpdateDTO dto) { requireCanManageEmployees(actor); @@ -66,6 +70,7 @@ public EmployeeDTO updateEmployee(Actor actor, UUID id, EmployeeUpdateDTO dto) { return employeeMapper.toDTO(employeeRepository.save(entity)); } + @CacheEvict(value = {"employees-by-role", "all-employees"}, allEntries = true) @Transactional public void deleteEmployee(Actor actor, UUID id) { requireCanManageEmployees(actor); @@ -80,6 +85,7 @@ public Optional getEmployee(Actor actor, UUID id) { return employeeRepository.findById(id).map(employeeMapper::toDTO); } + @Cacheable("all-employees") @Transactional(readOnly = true) public List getAllEmployees(Actor actor) { requireCanManageEmployees(actor); @@ -88,6 +94,7 @@ public List getAllEmployees(Actor actor) { .collect(Collectors.toList()); } + @Cacheable(value = "employees-by-role", key = "#role") @Transactional(readOnly = true) public List findByRole(Role role) { return employeeRepository.findAllByRole(role).stream() diff --git a/src/main/java/org/example/projektarendehantering/infrastructure/config/CacheConfig.java b/src/main/java/org/example/projektarendehantering/infrastructure/config/CacheConfig.java new file mode 100644 index 0000000..c56b402 --- /dev/null +++ b/src/main/java/org/example/projektarendehantering/infrastructure/config/CacheConfig.java @@ -0,0 +1,23 @@ +package org.example.projektarendehantering.infrastructure.config; + +import com.github.benmanes.caffeine.cache.Caffeine; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.caffeine.CaffeineCacheManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.TimeUnit; + +@Configuration +@EnableCaching +public class CacheConfig { + + @Bean + public CaffeineCacheManager cacheManager() { + CaffeineCacheManager manager = new CaffeineCacheManager("employees-by-role", "all-employees"); + manager.setCaffeine(Caffeine.newBuilder() + .maximumSize(500) + .expireAfterWrite(10, TimeUnit.MINUTES)); + return manager; + } +}