‘비전공자를 위한 Redis 입문/실전 (조회 성능 최적화편)’ 강의에서는 데이터 조회(Read) 작업을 빠르게 만드는 가장 기초적이면서도 강력한 전략인 Cache Aside 전략을 배웠다. 하지만 데이터 쓰기(Write) 작업이 미친 듯이 발생하는 상황이라면 어떻게 해야할까?
예를 들어, 유명 인플루언서가 SNS에 새로운 게시글을 올린 상황을 상상해보자. 알림을 받은 수십만 명의 팔로워가 동시에 앱을 켜고 ‘좋아요’ 버튼을 누를 것이다. 1초에 수천 번의 클릭이 발생할 것이고 그로 인해 1초에 수천 번의 INSERT 쿼리를 날림으로써 DB는 짧은 시간에 엄청난 부하를 받게 된다. 그로 인해 서버는 느려지고, 유저들은 좋아요 버튼을 눌렀는데 뒤늦게 반응을 하거나 작동을 하지 않는 경험을 하게 될 것이다.
INSERT INTO likes (user_id, post_id)
VALUES (?, ?)
이 상황을 재현해보면서 문제를 해결해나가보자.
✅ 테스트 환경 구성하기
Docker로 MySQL 띄우기
DB에 직접 수많은 쓰기 작업(좋아요 데이터 삽입)의 쿼리를 날리면 얼마나 느린지 눈으로 확인하려고 한다. 하지만 여러분이 쓰고 있는 노트북은 대부분 성능이 너무 좋다. 그래서 Docker를 활용해 DB가 쓸 수 있는 성능을 제한했다.
@Entity(name = "likes")
@Getter
@NoArgsConstructor
public class Like {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long userId;
private Long postId;
public Like(Long userId, Long postId) {
this.userId = userId;
this.postId = postId;
}
}
LikeRepository
public interface LikeRepository extends JpaRepository<Like, Long> {
}
LikeController
@RestController
@RequiredArgsConstructor
@RequestMapping("/likes")
public class LikeController {
...
@PostMapping()
public void likePost(
@RequestBody LikePostRequestDto likePostRequestDto
) {
likeService.likePost(likePostRequestDto);
}
...
}
LikeService
@Service
@RequiredArgsConstructor
public class LikeService {
...
public void likePost(LikePostRequestDto likePostRequestDto) {
Long userId = likePostRequestDto.getUserId();
Long postId = likePostRequestDto.getPostId();
Like like = new Like(userId, postId);
likeRepository.save(like);
}
...
}
Spring Boot 서버 실행시키기
Postman으로 좋아요 API가 잘 작동하는 지 확인하기
k6 부하테스트 스크립트 실행시키기
k6가 설치되어 있다는 가정하에 진행한다.
클론받은 Spring Boot 프로젝트의 루트 디렉토리에 보면 scripts/script_1-1.js 파일을 이미 만들어뒀다.
scripts/script_1-1.js
import http from 'k6/http';
import { check, sleep } from 'k6';
import { randomIntBetween } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
export const options = {
// 가상 유저(VUs) 1000명으로 설정
vus: 1000,
// 테스트를 10초 동안 진행
duration: '10s',
};
export default function () {
// 랜덤 데이터 생성
// 유저는 1~10,000명, 게시글은 1~100개라고 가정
const userId = randomIntBetween(1, 10000);
const postId = randomIntBetween(1, 100);
// 좋아요 API
const url = 'http://localhost:8080/likes';
const payload = JSON.stringify({
userId: userId,
postId: postId,
});
const params = {
headers: {
'Content-Type': 'application/json',
},
};
// POST 요청 전송
const res = http.post(url, payload, params);
// 응답 상태 코드 확인 (200 OK가 왔는 지 체크)
check(res, {
'status is 200': (r) => r.status === 200,
});
}
Spring Boot의 프로젝트 경로에서 아래 명령어를 실행시키자.
$ k6 run scripts/script_1-1.js
가상 유저를 1000명으로 설정해서 동시에 1000명이 좋아요 API를 요청하도록 설정했음에도 불구하고, DB가 들어오는 요청을 다 처리하지 못해 TPS는 274 밖에 안 나오는 걸 확인할 수 있다. 즉, 1초당 274개를 넘는 좋아요 요청이 들어오면, 처리하지 못하는 요청이 계속 쌓이면서 문제가 생길 수 있다.
이 문제를 해결하기 위해 DB 사양을 높이는 것도 방법이 될 수 있지만, 비싼 데이터베이스의 사양을 높이는 건 부담스럽기도 하고 데이터베이스 사양을 높이는 데에도 한계가 있다. 따라서 Redis를 활용해 이 문제를 해결해보자.
author
category
Redis
createdAt
Jan 12, 2026
series
비전공자도 이해할 수 있는 Redis 중급/실전
slug
type
series-footer
updatedAt
Jan 12, 2026 12:26 AM
📎
이 글은 비전공자도 이해할 수 있는 Redis 중급/실전 강의의 수업 자료 중 일부입니다.