이 글에서는 시스템 실행 중 성능을 향상시키기 위해 데이터를 캐싱하는 몇 가지 기술을 살펴보겠습니다. 일반적으로 계산하는 데 시간이 오래 걸리는 값을 캐싱하면 나중에 액세스할 때 시간을 절약할 수 있습니다. 캐싱되는 값은 자주 변경되지 않거나, 최신 버전이 필요하지 않은 경우가 많습니다.
Spring Boot에서 캐싱
Spring Boot REST API에서 캐싱을 활성화하는 가장 간단한 방법은 애플리케이션에 설정하고, 엔드포인트에 @Cacheable 어노테이션을 사용하는 것입니다.
애플리케이션에서 다음과 같이 @EnableCaching 어노테이션을 추가하기만 하면 됩니다.
@GetMapping("/v1/status") public ResponseEntity<String> statusV1(){ log.info("status V1 called"); // 약간의 무거운 처리 return ResponseEntity.ok("DONE"); }
@GetMapping("/v2/status") @Cacheable("status") public ResponseEntity<String> statusV2(){ log.info("status V2 called"); // 약간의 무거운 처리 return ResponseEntity.ok("DONE"); }
@GetMapping("/v3/status/{param}") @Cacheable("status") public ResponseEntity<String> statusV3(@PathVariable finalint param){ log.info("status V3 called"); // 약간의 무거운 처리 return ResponseEntity.ok(param == 1 ? "DONE" : "IN PROCESS"); } }
JPA 캐싱
때로는 API의 결과를 캐싱할 수 없지만, 쿼리의 결과를 캐싱함으로써 동일한 쿼리를 여러 번 실행하는 것을 피할 수 있습니다. JPA와 Spring Boot는 이를 스마트하게 처리할 수 있습니다.
엔티티를 정의해보겠습니다.
1 2 3 4 5 6 7 8 9 10 11
@Entity @Getter @Setter publicclassCustomer{
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
private String name; }
그런 다음, 리포지토리에서 @Cacheable 어노테이션을 추가하여 결과를 캐시에 저장할 메서드를 지정합니다. findById와 같은 “standard” 메서드를 캐싱해야 하는 경우, 이를 오버라이드하고 어노테이션을 추가할 수 있습니다.