[리팩토링] Query 횟수 줄이기 (Redis @Cacheable)

이정환·2023년 8월 19일
0

[개인 프로젝트]

목록 보기
7/8

@Cacheable 사용 전 후 비교(Postman)

@Cacheable를 roomController의 Getroom메소드에 적용하니 아래처럼 호출 API 호출 시간이 대략 5배 정도 빨라졌다. 콘솔 확인해보면 처음 요청땐 SQL 요청하고, 그 이후에는 SQL 요청하지 않는다. DB 부하를 분산시킬 수 있게 됐다. postman 실행 결과는 다음과 같다.

@Cacheable 사용 전 Room 정보 호출 결과

@Cacheable 사용 후 Room 정보 호출 결과

구현 방법

컨트롤러의 일부코드, DTO, gradle 수정해서 구현했다.
컨트롤러에서는 ResponseEntity 이 코드를 직렬화 할 수 없기 때문에 제거 했고,
DTO 에서는 redis 저장 및 읽기 때를 위한 직렬화 인터페이스 상속 받고,
gradle에서는 클래스로더에서의 DTO 호환성 문제 발생으로 해당 패키지는 주석처리했다.

//수정 전 

//RoomController

   @Cacheable(value = "room", key = "#id")
   @GetMapping("/id/{id}")
   public ResponseEntity<RoomDto> getRoom(@PathVariable Long id){
       Optional<RoomDto> roomDtoOpt = roomService.getRoomAndIncrementViewCount(id);
       return ResponseEntity.ok(roomDtoOpt.get());
   }

//RoomDto
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class RoomDto{}


//gralde
developmentOnly 'org.springframework.boot:spring-boot-devtools'
//수정 후 

//RoomController

   @Cacheable(value = "room", key = "#id")
   @GetMapping("/id/{id}")
   public RoomDto getRoom(@PathVariable Long id){
       Optional<RoomDto> roomDtoOpt = roomService.getRoomAndIncrementViewCount(id);
       return (roomDtoOpt.get());
   }

//RoomDto
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class RoomDto implements Serializable {}



//gralde
//developmentOnly 'org.springframework.boot:spring-boot-devtools'

쿼리 최적화를 위해
Room 에서의 RUD 는 @Cacheable, @CachePut, @CacheEvict를 활용해서 캐싱 구현했다.

향후

쿼리 최적화를 위해서
Room 에 대한 장바구니 기능 구현 계획이다. redistemplate 혹은 Redis jpa 사용 계획이다.

0개의 댓글