코드 블록의 실행 시간을 측정하는 데 주로 사용
간단하게 시간 측정 가능
측정을 중지하여 소요된 시간 등... 을 계산 할 수도 있다
public void test() {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// 로직이 들어갈 자리
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
}
StopWatch 객체를 생성하여, start 와 stop 구간을 설정하고 출력해준다.
473.9337 ms
가 소요되었다.
WebSocket & Stomp 를 이용한 Service 단의 조회 로직에서 DB 에서 조회를 하도록 구성했다.
public List<Message> loadMessage(String roomId) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
List<Message> messageList = new ArrayList<>();
// Redis 에서 해당 채팅방의 메시지 100개 가져오기
List<Message> redisMessageList = redisTemplateMessage.opsForList().range(roomId, 0, 99);
// Redis 에서 가져온 메시지가 없다면, DB 에서 메시지 100개 가져오기
if (redisMessageList == null || redisMessageList.isEmpty()) {
List<Message> dbMessageList = messageRepository.findTop100ByRoomIdOrderByCreatedAtAsc(roomId);
for (Message message : dbMessageList) {
MessageDto messageDto = new MessageDto(message.getSenderId(), message.getSender(), message.getRoomId(), message.getMessage(), message.getSentTime());
messageList.add(messageDto);
redisTemplateMessage.setValueSerializer(new Jackson2JsonRedisSerializer<>(Message.class)); // 직렬화
redisTemplateMessage.opsForList().rightPush(roomId, messageDto); // redis 저장
}
} else {
messageList.addAll(redisMessageList);
}
stopWatch.stop();
System.out.println(stopWatch.prettyPrint());
return messageList;
}
캐싱 전략 중 하나인 look aside cache
전략을 이용했다.
10.8054 ms
가 소요되었다.
473.9337 ms → 10.8054 ms
약 44배 정도 속도가 개선되었다!
실제 눈으로 확인했을 때도 DB 에서 조회해오는 경우 약간의 버벅거림이 있었으나
Redis 에서 조회하는 것으로 수정했을 때 채팅 서비스를 이용하는 데 불편함이 없었다.
참고: [Spring] 메소드 실행 시간 측정하기
참고: Spring StopWatch 사용 방법 – currentTimeMillis 안녕