🏛️Infra/Redis

부하 테스트를 통해 Redis 적용 전후 성능 비교

말동말동현 2025. 3. 16. 12:49

부하 테스트에서 서비스가 1초당 처리할 수 있는 작업량을 보고 Throughput이라고 부른다. 단위는 TPS(Transaction Per Seconds, 1초당 처리한 트랜잭션의 수)를 많이 활용한다.

만약 내가 만든 서비스가 1초에 최대 100개의 API 요청을 처리할 수 있다면, 이 서비스의 Throughput100 TPS라고 얘기한다.

 

환경 세팅 (k6)

https://velog.io/@ryuneng2/%EB%B6%80%ED%95%98-%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9D%98-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-Windows-K6-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95

 

부하 테스트의 기본 개념, Windows K6 설치 방법

❓ 부하 테스트란? > 부하 테스트란, 임계값 한계에 도달할 때까지 시스템의 부하를 지속적으로 꾸준히 증가시켜 시스템의 성능을 테스트하는 것이다. ✅ 부하 테스트에서 자주 사용하는 용어

velog.io

 

 API에 부하를 주기 위해 k6 스크립트 작성

import http from 'k6/http';
import { sleep } from 'k6';

export default function () {
  http.get('http://{EC2 IP 주소}:8080/boards');
}

 

 

 

 캐싱을 적용시키기 전의 Throughput 측정

1. 캐싱 코드 주석처리하기

@Service
public class BoardService {
  ...
  //  @Cacheable(cacheNames = "getBoards", key = "'boards:page:' + #page + ':size:' + #size", cacheManager = "boardCacheManager")
  public List<Board> getBoards(int page, int size) {
    Pageable pageable = PageRequest.of(page - 1, size);
    Page<Board> pageOfBoards = boardRepository.findAllByOrderByCreatedAtDesc(pageable);
    return pageOfBoards.getContent();
  }
}

 

2. Spring Boot 서버 빌드 및 백그라운드 실행

# 스프링 프로젝트 경로로 들어가서 아래 명령어 실행
$ ./gradlew clean build -x test 

# 정확한 테스트를 위해 Spring Boot 서버를 백그라운드에서 실행시키자. 
$ cd build/libs
$ nohup java -jar -Dspring.profiles.active=prod {빌드된 jar 파일명} &

# 8080번 포트에 Spring Boot 서버가 잘 실행되고 있는 지 확인
$ lsof -i:8080

 

3. 로컬 환경에서 K6로 성능 테스트 해보기

# K6의 스크립트 파일이 위치한 경로에서 아래 명령어 실행시키기
$ k6 run --vus 30 --duration 10s script.js

 

  • --vus 30 : 가상 유저(Virtual Users)를 30명으로 셋팅 (API 요청을 보내는 사용자가 30명인 것처럼 부하 생성)
  • --duration 30s : 30초 동안 테스트를 유지

 

 

 

 

 

평균적으로 1초에 1개의 요청을 처리했다는 뜻이다. 즉, 이 서비스는 1초에 최대 처리할 수 있는 요청의 처리 개수가 385개라는 뜻이다. ‘현재 구축한 서비스에서 게시글 조회 API의 Throughput이 1이다’라고 얘기할 수 있다.

Redis를 적용한 결과 확연히 달라진 결과를 확인할 수 있다.