Performance Improvement

게시글 목록 미리보기 성능 개선하기 - 1편

jjunhub 2025. 1. 10. 20:52

부제 : VARCHAR vs. TEXT 성능 비교하기

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

문제 상황

게시글을 빠르게 불러오지 못한다는 피드백을 받았다.

 

현재 상황 정리

현 서비스에서 게시글은 현재 Paging 기법 중 Slicing을 활용하여, 무한 스크롤을 통해서 게시글을 불러오고 있었다.

게시글 미리보기의 구성은 [ 제목, 작성자 이름, 작성시간, 본문 내용 중 앞 20글자 ]이다.

게시글의 각 속성에 대한 타입은 다음과 같다. ( 불필요한 부분은 생략 )

column 이름 column 타입
제목 VARCHAR
작성자 VARCHAR
본문 TEXT
작성시간 DATETIME

 

원인 분석 - TEXT

여러 가지 원인이 있을 것 같은데, 우선 가장 먼저 의심되는 것은 TEXT 타입으로 이루어진 본문을 불러오는 것이었다. MySQL에서 TEXT 타입은 데이터가 일정량이 넘어가면, 포인터로 변경되어 MySQL의 디스크쪽을 가르키는 것으로 알고 있다. 이는 TEXT 타입을 불러오는 것 자체가 DISK I/O를 유발하므로, varchar 데이터를 사용하는 것보다 느릴 수밖에 없다고 생각하였다.

 

하지만 게시글의 본문을 TEXT 타입으로 구성해야하는 것은 변경할 수가 없기에 다른 방법을 고안해야했다. 게시글 미리보기 구성에서는 게시글 본문이 전체가 필요하지 않다. 따라서 게시글 미리보기를 위한 column을 1개 더 추가하여, 다음과 같이 구성해볼 생각을 하였다.

column 이름 column 타입
제목 VARCHAR
작성자 VARCHAR
본문 TEXT
본문 미리보기 VARCHAR
작성시간 DATETIME

 

본문 미리보기는 게시글이 작성될 때, 본문에서 앞 20글자만을 가져와서 저장하는 일종의 반정규화 형태라고 볼 수 있다. 물론 저장하는 column이 1개 더 늘어나는 것은 어쩔 수 없지만, 조회 성능과 비교하여 어느정도 Trade off라고 생각한다. 이제 이 상태로 게시글 미리보기 로직에 대한 성능 테스트를 수행해보자.

성능 테스트 환경

서버 코드

Mysql 8.0

게시글 데이터 6300개

JMeter 5.6.3

Spring Boot 3.4.1

JPA

 

성능 분석 결과

실제로 약 17프로 정도 빠르게 응답을 받아올 수 있었다.

평균 응답 시간 4.78ms -> 3.97ms

 

다만 이 측정에서는 여러 가지 요인이 작용하여, 정확하게 성능이 측정되지 않았을 것이라고 예상한다. 예를 들면, 반복적으로 DB의 같은 테이블을 쿼리 날리면서 발생하는 캐시들과 같은 것들이 그 요인 중 하나가 있을 것이다. 따라서 더 좋은 방법이 있을 지 고민해봐야한다.

결론

TEXT 부분으로 이루어진 중 일부를 자주 조회해야한다면, 이를 반정규화하여 VARCHAR로 따로 저장하는 것도 어느 정도의 성능 개선을 이룰 수 있다는 것을 배웠다.

마치며.

개발자는 항상 의심해야 한다고 생각한다. 이러한 의심의 기반은 자신이 고민하며, 공부하여 배우는 지식들이다. 만약 내가 MySQL에서 각 데이터 타입이 어떻게 저장되는 지를 알고 있지 않았다면, 이러한 방식으로 성능 개선을 고려할 수 없었을 것이다.