비동기 방식을 이용하여 성능 개선
Artillery로 간단한 백엔드 API 성능 측정하기 에서 측정했던 생성 API (POST 방식) 성능을
DB 커넥션 풀 설정에 따른 백엔드 API 성능 측정하기 방식으로 성능 개선하는 방법도 있지만 프로그래밍 방식으로도 성능을 개선할 수도 있다.
바로 비동기를 이용하여 클라이언트 응답과 생성 비즈니스 로직을 분리하는 것이다. 이러한 방식이 바로 백엔드 개발자들이 가장 관심을 가지고 주목해야 할 부분일 것 같다.
DB에 저장할 데이터가 중복되면 안되고 auto_increment PK 컬럼이 아닌 경우, 보통 생성 API는 다음의 로직을 거칠 것이다.
[ 랜덤값을 이용하여 유니크한 문자열이나 auto_increment 방식의 숫자 생성 → DB에 해당 키가 있는지 조최(최대 n번까지 시도) → DB에 유니크한 데이터 저장 → 응답 ]
이 과정을 2가지로 분리한다.
- DB에 insert하는 작업을 비동기로 분리하여 클라이언트에게 바로 응답
- 유니크한 데이터 생성 시, 스노우 플레이크 방식 이용하여 아예 중복되는 문자열(혹은 난수)가 생성되지 않도록 로직 변경(DB에 해당 데이터가 존재하는지 확인하는 작업 제거됨)
스노우 플레이크 방식이란
분산 시스템에서 고유한 id를 생성하기 위한 방법으로, 일반적으로 타임스탬프와 서버 id를 조합하여 고유성을 보장한다. 이와 관련한 내용은 추후에 따로 정리하겠다.
DB insert 작업을 비동기로 처리
@Transactional(readOnly = false)
public ShortenUrlCreateResponseDto generateShortenUrl(ShortenUrlCreateRequestDto shortenUrlCreateRequestDto) {
String originalUrl = shortenUrlCreateRequestDto.getOriginalUrl();
// 스노우 플레이크 방식으로 키 생성
String shortenUrlKey = getUniqueShortenUrlKey();
ShortenUrl shortenUrl = new ShortenUrl(originalUrl, shortenUrlKey);
// 비동기로 db 저장
shortenUrlRepository.asyncSaveShortenUrl(shortenUrl);
ShortenUrlCreateResponseDto shortenUrlCreateResponseDto = new ShortenUrlCreateResponseDto(shortenUrl);
// 클라이언트에 곧바로 응답
return shortenUrlCreateResponseDto;
}
..
@Async
@Override
// DB에 INSERT
public void asyncSaveShortenUrl(ShortenUrl shortenUrl) {
jpaShortenUrlRepository.save(shortenUrl);
}
..
@EnableAsync
@SpringBootApplication
public class TestserviceApplication {
public static void main(String[] args) {
SpringApplication.run(TestserviceApplication.class, args);
}
}
Artillery로 성능을 측정한 결과는 다음과 같다.
3개의 결과만 비교해봐도 성능이 개선된 것을 확실히 알 수 있다.
심지어 커넥션 풀 사이즈를 2배 늘렸을 때보다도 성능이 더 개선되었다. 개발자들은 이처럼 코드로 성능을 개선할 수 있는 방법을 많이 고민해봐야 한다. 소프트웨어 차원에서 최대한 시도하고 그럼에도 성능이 개선이 안된다면 최후의 보루로 하드웨어 차원에서 성능 개선을 시도해봐야 한다.
'Backend 개발 > Backend 성능 개선' 카테고리의 다른 글
[애플리케이션 내 캐시 구현하여 백엔드 조회 API 성능 개선하기 ②] (0) | 2025.04.07 |
---|---|
[인덱스 이용하여 백엔드 조회 API 성능 개선하기 ①] (0) | 2025.04.04 |
[DB 커넥션 풀 설정에 따른 백엔드 API 성능 측정하기] (0) | 2025.04.02 |
[Artillery로 간단한 백엔드 API 성능 측정하기] (0) | 2025.04.01 |
[백엔드 성능 테스트 도구 Artillery 다운로드 및 설치 방법] (0) | 2025.03.31 |