본문 바로가기

프로젝트 일지

#17. JMeter 활용하여 서버 과부하 관리

해당 프로젝트에서 현재 DB의 데이터 호출에 활용되는 ORM, 프레임워크는 아래와 같다.

1. Spring Data JPA
2. JPA - JPQL
3. QueryDsl

위의 3가지 방법은 모두 데이터 호출 속도와는 무관하게 데이터 호출하는 방식을 결정짓는 요인이다.

Spring Data JPA
= 메서드 네이밍 컨벤션에 맞추어 자동 생성 메서드를 쓰느냐

List<MemberBook> findByMember_MemberIdAndReturnedAtIsNullAndBook_BookPublisher
(Long memberId, String bookPublisher);

 

JPA-JPQL
= SQL을 직접 작성하느냐

@Query("SELECT mb FROM MemberBook mb WHERE mb.member.id =:memberId 
AND mb.returnedAt IS NULL AND mb.book.bookPublisher =:bookPublisher")
List<MemberBook> findByMemberIdAndReturnedAtIsNull
(@Param("memberId") Long memberId, @Param("bookPublisher") String bookPublisher);

 

QueryDsl
= Type-Safe 쿼리 방식으로 SQL과 유사한 쿼리를 생성하는 프레임워크.

    @Override
    public List<MemberBook> Q_DSL_findMemberBooks(Long memberId, String bookPublisher) {
        return jpaQueryFactory
                .selectFrom(qMemberBook)
                .where(qMemberBook.member.memberId.eq(memberId)
                        .and(qMemberBook.returnedAt.isNull())
                        .and(qMemberBook.book.bookPublisher.eq(bookPublisher)))
                .fetch();
    }


다시 한번 말하지만 3방식 데이터를 '어떻게 호출하는지'에 관한 차이가 있다.

하지만 동시에 5000명의 유저가 동시에 데이터 호출 요청이 들어온다면 서버 측에서 부하가 걸릴테고
이 상황에서 Spring Data JPA, JPA-JPQL, QueryDsl 3가지 경우의 평균 응답 속도가 궁금해졌다.


이를 위해 사용하는 Tool로써 JMeter 를 활용해보자.

 

<JMeter 사용법 확인>

https://dvdhan.tistory.com/241

 

JMeter 설치 & 사용 법

JMeter ? Apache에서 만든 자바로 만들어진 웹 애플리케이션 성능 테스트 오픈 소스. JMeter를 활용하면 아래와 같은 테스트를 할 수 있다. -웹 : HTTP, HTTPS, (Java, NodeJS, PHP, ASP.NET .. ) - SOAP / REST 웹 서비스

dvdhan.tistory.com

 

< Test 대상 메서드 >

<목적>
회원의 이름, 이메일을 전달받아
해당 회원이 대여 후 미반납 된 도서 중
선택된 특정 출판사에 의해 출간된 도서들의 리스트를 호출하는 것.

 

< Test 조건 >

동시 요청 5,000번 5회 반복 = 총 25,000번의 요청 테스트

 

< Test 결과 >

#1. Spring Data JPA

 

#2. JPA - JPQL

 

#3. QueryDsl

< Test 결과 비교 >

  Spring Data JPA JPA - JPQL QueryDsl
샘플 수 25,000 25,000 25,000
에러율 0.00% 0.00% 0.00%
처리량 472.4/sec 500.0/sec 499.8/sec
평균 응답 시간 1059 ms 347 ms 315 ms
중위값 응답 시간 1098 ms 334 ms 220 ms
90% 라인 응답 시간 1218 ms 685 ms 759 ms
95% 라인 응답 시간 1433 ms 770 ms 832 ms
99% 라인 응답 시간 1608 ms 1127 ms 1144 ms
최대 응답 시간 2809 ms 1979 ms 2815 ms

3가지 중Spring Data JPA의 처리량이 가장 낮고, 응답 시간이 가장 높다.

< 결론 >

평균 응답 시간 기준
Spring Data JPA 에서 QueryDsl로 변경함으로써 평균 응답 시간 기준 70.2% 향상.
(1059 ms - 315 ms) / 1059 ms * 100