@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 사용 계획이다.