조회 속도 개선 테스트 - StopWatch

박영준·2023년 9월 12일
0

Spring

목록 보기
58/58

1. StopWatch

1) 정의

  • 코드 블록의 실행 시간을 측정하는 데 주로 사용

  • 간단하게 시간 측정 가능

  • 측정을 중지하여 소요된 시간 등... 을 계산 할 수도 있다

2) 사용법

public void test() {   
    StopWatch stopWatch = new StopWatch();
	stopWatch.start();
	
	// 로직이 들어갈 자리
	
	stopWatch.stop();
	System.out.println(stopWatch.prettyPrint());
}

StopWatch 객체를 생성하여, start 와 stop 구간을 설정하고 출력해준다.

2. 테스트

1) DB 에서 조회

473.9337 ms 가 소요되었다.

2) Redis 에서 조회

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 가 소요되었다.

3. 결론

473.9337 ms → 10.8054 ms

약 44배 정도 속도가 개선되었다!

실제 눈으로 확인했을 때도 DB 에서 조회해오는 경우 약간의 버벅거림이 있었으나
Redis 에서 조회하는 것으로 수정했을 때 채팅 서비스를 이용하는 데 불편함이 없었다.


참고: [Spring] 메소드 실행 시간 측정하기
참고: Spring StopWatch 사용 방법 – currentTimeMillis 안녕

profile
개발자로 거듭나기!

0개의 댓글