😀
fistkim TECH BLOG
  • Intro
  • 강의
    • Reactive Programming in Modern Java using Project Reactor
      • Reactor execution model 1
      • Reactor execution model 2
      • Reactor execution model 3 - parallelism
      • Reactor execution model 4 - overview
      • Transform
      • Combine
      • Side Effect Methods
      • Exception/Error handling
      • retry, retryWhen, repeat
      • BackPressure
      • Cold & Hot Streams
    • NEXTSTEP 클린코드 with java 9기
      • 정리노트
    • NEXTSTEP DDD 세레나데 2기
      • CH01 도메인 주도 설계 이해
      • CH02 크게 소리 내어 모델링 하기
      • CH03 도메인 주도 설계 기본 요소
      • CH04 도메인 주도 설계 아키텍처
      • CH05 도메인 이벤트
    • NEXTSTEP 인프라 공방 1기
      • 망 분리하기
      • 통신 확인하기
      • 도커 컨테이너 이해하기
      • [미션 1] 서비스 구성하기 실습
      • [미션 2] 서비스 배포하기 실습
      • 서버 진단하기
      • 어플리케이션 진단하기
      • [미션 3] 서비스 운영하기
      • 웹 성능 진단하기
      • 부하 테스트
      • k6
      • [미션 4] 성능 테스트
      • 리버스 프록시 개선하기
      • 캐싱 활용하기
      • [미션 5] 화면 응답 개선하기
      • Redis Annotation 및 설정
      • 인덱스 이해하기 & DB 튜닝
      • [미션 6-1] 조회 성능 개선하기
      • [미션 6-2] DB 이중화 적용
    • NEXTSTEP 만들면서 배우는 Spring 3기
      • CH01 올바른 방향 바라보기
      • CH02 HTTP 이해 - 웹 서버 구현
        • HTTP 파싱
        • HTTP 웹 서버 구현
      • CH03 MVC - @MVC 프레임워크 구현
        • Servlet 다시 짚기
        • Cookie, Session 다시 짚기
        • MVC 프레임워크 구현
      • CH04 나만의 라이브러리 구현
      • CH05 DI - DI 프레임워크 구현
      • CH06 Aspect OP
    • 스프링 시큐리티
      • 스프링 시큐리티 아키텍처
      • WebAsyncManagerIntegrationFilter
      • SecurityContextPersistenceFilter
      • HeaderWriterFilter
      • CsrfFilter
      • (+) 스프링 시큐리티 + JWT
      • (+) 마치며
    • 더 자바, 코드를 조작하는 다양한 방법
      • CH01 JVM 이해하기
      • (+) 클래스 로더 이해하기
      • CH02 바이트 코드 분석 및 조작
      • (+) jacoco
      • CH03 리플렉션
      • CH04 다이나믹 프록시
      • CH05 애노테이션 프로세서
    • 더 자바, 애플리케이션을 테스트하는 다양한 방법
      • CH01 JUnit 5
      • CH02 Mockito
      • (+) Spy vs Mock
      • CH03 도커와 테스트
      • CH04 성능 테스트
      • (+) VisualVM
      • (+) 테스트 자동화
      • CH05 운영 이슈 테스트
      • CH06 아키텍처 테스트
    • 모든 개발자를 위한 HTTP 웹 기본 지식
      • CH01 인터넷 네트워크
      • CH02 HTTP 기본
      • CH03 HTTP 메서드 속성
      • CH04 HTTP 메서드 활용
      • CH05 HTTP 상태코드
      • CH06 HTTP 헤더1 - 일반 헤더
      • CH07 HTTP 헤더2 - 캐시와 조건부 요청
      • (+) HTTPS 원리
    • 스프링 프레임워크 핵심 기술
      • CH01 IOC 컨테이너
      • CH02 AOP
      • (+) 스프링 의존성 관리
      • (+) 생성자 주입 장점
    • 코딩으로 학습하는 GoF의 디자인 패턴
      • 객체 생성
        • 싱글톤 패턴
        • 팩토리 메소드 패턴
        • 추상 팩토리 패턴
        • 빌더 패턴
        • 프로토타입 패턴
      • 구조
        • 어댑터 패턴
        • 브릿지 패턴
        • 컴포짓 패턴
      • 행동
        • (작성중)
    • 실전 Querydsl
      • CH01 프로젝트 환경구성
      • CH02 예제 도메인 모델
      • CH03 기본문법
      • CH04 중급 문법
      • CH05 실무활용 (스프링 데이터 JPA와 Querydsl)
      • CH06 스프링데이터JPA 가 제공하는 Querydsl 기능
      • (+) 별칭(alias)
      • (+) Slice 쿼리
    • 스프링 데이터 JPA
      • CH01 핵심개념이해 1
      • CH02 핵심개념이해 2
      • CH03 핵심개념이해 3
      • CH04 Spring Data Common
      • CH05 Spring Data JPA
    • 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
      • CH01 지연 로딩과 조회 성능 최적화
      • CH02 컬렉션 조회 최적화
      • CH03 전체 정리
    • 초보를 위한 쿠버네티스 안내서
      • CH01 쿠버네티스 시작하기
      • CH02 쿠버네티스 알아보기
      • CH03 쿠버네티스 실습 준비
      • CH04 쿠버네티스 기본 실습
    • Flutter Provider Essential
      • CH01 Introduction
      • CH02 Provider Overview
      • CH03 TODO App
      • CH04 Weather App
      • CH05 Firebase Authentication App
    • Flutter Bloc Essential
      • CH01 Introduction
      • CH02 Bloc Overview
      • CH03 TODO App
      • CH04 Weather App
      • CH05 Firebase Authentication App
    • Flutter Advanced Course - Clean Architecture With MVVM
      • CH01 Introduction
      • CH02 Clean Architecture 4 Layer
      • CH03 MVVM
      • CH04 Data Layer
      • (+) Data Layer - response to model
      • (+) Data Layer - Network
      • CH05 Domain Layer
      • CH06 Presentation Layer
      • CH07 Application Layer
      • (+) Application Layer - l10n
      • (+) Application Layer - DI
      • (+) Application Layer - environment
    • 자바 알고리즘 입문
      • CH01 문자열
      • CH02 Array(1, 2 차원 배열)
      • CH03 Two pointers, Sliding window[효율성: O(n^2)-->O(n)]
      • CH04 HashMap, TreeSet (해쉬, 정렬지원 Set)
      • CH05 Stack, Queue(자료구조)
      • CH06 Sorting and Searching(정렬, 이분검색과 결정알고리즘)
      • CH07 Recursive, Tree, Graph(DFS, BFS 기초)
      • CH08 DFS, BFS 활용
      • CH09 Greedy Algorithm
      • CH10 dynamic programming(동적계획법)
  • 도서
    • 만들면서 배우는 클린 아키텍처
      • 학습목표
      • CH01 계층형 아키텍처의 문제는 무엇일까?
      • CH02 의존성 역전하기
      • CH03 코드 구성하기
      • CH04 유스케이스 구현하기
      • CH05 웹 어댑터 구현하기
      • CH06 영속성 어댑터 구현하기
      • CH07 아키텍처 요소 테스트하기
      • CH08 경계 간 매핑하기
      • CH09 어플리케이션 조립하기
      • CH10 아키텍처 경계 강제하기
      • CH11 의식적으로 지름길 사용하기
      • CH12 아키텍처 스타일 결정하기
    • 클린 아키텍처
      • 들어가며
      • 1부 소개
        • 1장 설계와 아키텍처란?
        • 2장 두 가지 가치에 대한 이야기
      • 2부 벽돌부터 시작하기: 프로그래밍 패러다임
        • 3장 패러다임 개요
        • 4장 구조적 프로그래밍
        • 5장 객체 지향 프로그래밍
        • 6장 함수형 프로그래밍
      • 3부 설계 원칙
        • 7장 SRP: 단일 책임 원칙
        • 8장 OCP: 개방-폐쇄 원칙
        • 9장 LSP: 리스코프 치환 원칙
        • 10장 ISP: 인터페이스 분리 원칙
        • 11장 DIP: 의존성 역전 원칙
      • 4부 컴포넌트 원칙
        • 12장 컴포넌트
        • 13장 컴포넌트 응집도
        • 14장 컴포넌트 결합
      • 5부
        • 15장 아키텍처란?
    • 스프링 입문을 위한 자바 객체 지향의 원리와 이해
      • CH01 사람을 사랑한 기술
      • CH02 자바와 절차적/구조적 프로그래밍
      • CH03 자바와 객체 지향
      • (+) 자바 코드 실행에 따른 메모리 적재과정
      • CH04 자바가 확장한 객체 지향
      • CH05 객체 지향 설계 5 원칙 - SOLID
      • CH06 스프링이 사랑한 디자인 패턴
      • CH07 스프링 삼각형과 설정 정보
      • (부록) 람다(lambda)
    • 객체지향의 사실과 오해
      • CH01 협력하는 객체들의 공동체
      • CH02 이상한 나라의 객체
      • CH03 타입과 추상화
      • CH04 역할, 책임, 협력
      • CH05 책임과 메시지
      • CH06 객체 지도
      • CH07 함께 모으기
      • (+) 인터페이스 개념 바로잡기
    • 도메인 주도 개발 시작하기
      • CH01 도메인 모델 시작하기
      • CH02 아키텍처 개요
      • CH03 애그리거트
      • CH04 리포지터리와 모델 구현
      • CH05 스프링 데이터 JPA를 이용한 조회 기능
      • CH06 응용 서비스와 표현 영역
      • CH07 도메인 서비스
      • CH08 애그리거트 트랜잭션 관리
      • CH09 도메인 모델과 바운디드 컨텍스트
      • CH10 이벤트
      • CH11 CQRS
    • 자바 ORM 표준 JPA 프로그래밍
      • CH01 JPA 소개
      • CH02 JPA 시작
      • CH03 영속성 관리
      • CH04 엔티티 매핑
      • CH05 연관관계 매핑 기초
      • CH06 다양한 연관관계 매핑
      • CH07 고급 매핑
      • CH08 프록시와 연관관계 관리
      • CH09 값 타입
      • CH10 객체지향 쿼리 언어
      • CH11 웹 애플리케이션 제작
      • CH12 스프링 데이터 JPA
      • CH13 웹 애플리케이션과 영속성 관리
      • CH14 컬렉션과 부가 기능
      • CH15 고급 주제와 성능 최적화
      • CH16 트랜잭션과 락, 2차 캐시
    • 소프트웨어 세상을 여는 컴퓨터과학
      • CH01 컴퓨터 과학 소개
      • CH02 데이터 표현과 디지털 논리
    • 이펙티브 자바
      • 1 장 들어가기
      • 2장 객체 생성과 파괴
        • [01] 생성자 대신 정적 팩터리 메서드를 고려하라
        • [02] 생성자에 매개변수가 많다면 빌더를 고려하라
        • [03] private 생성자나 열거 타입으로 싱글턴임을 보증하라
        • [04] 인스턴스화를 막으려거든 private 생성자를 사용하라
        • [05] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
        • [06] 불필요한 객체 생성을 피하라
        • [07] 다 쓴 객체 참조를 해제하라
        • [08] finalizer 와 cleaner 사용을 피하라
        • [09] try-finally 보다는 try-with-resources 를 사용하라
      • 3장 모든 객체의 공통 메서드
        • [10] equals는 일반 규약을 지켜 재정의하라
        • [11] equals 를 재정의하려거든 hashCode도 재정의하라
        • [12] toString 을 항상 재정의하라
        • [13] clone 재정의는 주의해서 진행하라
        • [14] Comparable 을 구현할지 고려하라
      • 4장 클래스와 인터페이스
        • [15] 클래스와 멤버의 접근 권한을 최소화하라
  • 토픽
    • 서버 모니터링
      • CPU 사용량
      • 메모리 사용량
      • 스레드 풀
    • Spring Boot Monitoring
      • Spring actuator
      • Spring eureka
      • Prometheus
      • grafana
      • Spring actuator + Prometheus + grafana
    • JAVA 데일리 토픽
      • 메모리 누수(memory leak)
      • 객체 참조의 유형
      • 커스텀 스레드 풀
      • Mark And Compact
      • serialVersionUID 이해하기
      • 함수형 인터페이스
      • 메소드 참조
      • equals()와 hashCode()가 무엇이고 역할이 무엇인지
      • StringBuffer vs StringBuilder
      • String vs StringBuilder, StringBuffer
      • String interning
    • JAVA GC
    • 프로그래머스 문제 풀기
      • 해시
      • 스택/큐
      • 힙(Heap)
      • 정렬
      • 완전탐색
      • DFS/BFS
    • 데이터베이스 구성 및 작동 흐름
    • 데이터베이스 JOIN 원리
    • 객체지향생활체조 원칙
    • 상태(state), 상속(inheritance), 합성(composition) 의 상관관계
    • java enum은 메모리에 언제, 어떻게 할당되는가
    • Checked Exception vs UnChecked Exception
    • Reactive Streams 원리탐구 - 간단한 예제 직접 작성해보기
    • Flutter Basic
    • Flutter StatefulWidget 생명주기
    • Flutter 가 위젯을 그리는 원리
    • Flutter 클린 아키텍처
      • application layer
        • 패키지 구조 및 레이어 설명
        • environment
        • dependency injection
        • go_router
        • foreground & background
        • 다국어처리 (l10n, i18n)
        • Global 처리(시스템 점검, fore->back 등)
        • connection_manager
        • permission_manager
        • push_notification_manager
        • firebase 연동
      • data layer
        • 패키지 구조 및 레이어 설명
        • network
        • repository
      • domain layer
        • 패키지 구조 및 레이어 설명
      • presentation layer
        • 패키지 구조 및 레이어 설명
        • resources
    • 기술 관련 포스팅 읽기
  • 기타
    • 작업일지
      • 2023. 10
      • 2023. 09
      • 2023. 08
      • 2023. 07
      • 2023. 06
      • 2023. 05
      • 2023. 04
      • 2023. 03
      • 2023. 02
      • 2023. 01
      • 2022. 12
    • Business Model
      • 아이디어 불패의 법칙
      • 린 모바일 앱 개발
      • 린 스타트업
      • 제로투원
      • MIT 스타트업 바이블
      • 린치핀
    • 백로그 종합
Powered by GitBook
On this page
  • 부하테스트
  • Jmeter 구성요소
  • 실습
  • Thread Group
  • Sampler > HTTP Request
  • Listener > View Results in Table, View Results Tree
  • Listener > Aggregate Report
  • Listener > Response Time Graph
  • Listener > Aggregate Graph
  • Assertions
  1. 강의
  2. 더 자바, 애플리케이션을 테스트하는 다양한 방법

CH04 성능 테스트

부하테스트

부하테스트를 처음 할 때에는 k6 라는 툴을 사용 했었는데, Jmeter가 인지도(?) 가 훨씬 높은 것 같고 나는 안 써봤지만 nGrinder 도 많이 쓰는 것 같다.

Jmeter 사용하면서 부하 테스트 진행했다. Jmeter 를 최초로 접했을 때, 실무에서 많이 쓸 줄 알았는데 나의 경험상 실무에서는 거의 안썼었다.

회사에서 인스턴스 스펙을 넉넉하게 사용했었어서 그랬던거 같기도 하고, 팀장님을 비롯하여 기존에 프로젝트를 구축하신 분들께서 모니터링 툴이나 구조 같은걸 잘 잡아두셔서 그랬던거 같기도 하다.

어찌 되었든 내가 개발하는 건에 대해서 만이라도 많은 양의 부하가 들어온다고 가정하고(그렇든 그렇지 않든) 가용성에 민감하게 생각하면서 개발해야겠다는 생각이 든다.

Jmeter 구성요소

Jmeter 는 부하테스트 툴이다. 아래는 Jmeter 구성요소이다.

  1. Thread Group: "Thread Group"은 테스트 시나리오의 사용자 그룹을 정의하는 데 사용됩니다. 이 그룹은 동시에 실행되는 가상 사용자의 수, 램프업 및 램프다운 시간, 반복 횟수 등을 설정할 수 있습니다.

  2. Sampler: "Sampler"는 테스트 시나리오에서 수행할 작업을 정의하는 데 사용됩니다. HTTP 요청을 보내거나 데이터베이스 쿼리를 실행하는 등의 작업을 수행할 수 있습니다. JMeter는 다양한 유형의 샘플러를 제공하며, 웹 애플리케이션, SOAP/XML-RPC 웹 서비스, FTP 서버, 데이터베이스 등 다양한 프로토콜을 지원합니다.

  3. Listener: "Listener"는 테스트 실행 중에 결과를 수집하고 표시하는 데 사용됩니다. 예를 들어, "View Results Tree" 리스너는 각 샘플의 요청 및 응답 세부 정보를 표시하고, "Summary Report" 리스너는 테스트 결과 요약 정보를 보여줍니다. JMeter에는 다양한 유형의 리스너가 제공되며, 결과를 CSV 파일로 저장하거나 그래프로 표시하는 등의 다양한 형식으로 결과를 분석할 수 있습니다.

  4. Assertion: "Assertion"은 테스트 결과를 검증하는 데 사용됩니다. 샘플 응답의 내용, 응답 시간, 상태 코드 등을 확인하여 테스트 결과의 유효성을 검사할 수 있습니다. 예를 들어, "Response Assertion"은 응답 데이터의 특정 패턴을 확인하고, "Duration Assertion"은 응답 시간이 특정 범위 내에 있는지 확인할 수 있습니다.

  5. Timer: "Timer"는 각 샘플 간의 지연 시간을 설정하는 데 사용됩니다. 특정 동작 간의 딜레이를 추가하여 테스트 시나리오를 조정하거나 부하를 시뮬레이션할 수 있습니다. 예를 들어, "Constant Timer"는 각 샘플 사이에 고정된 시간 간격을 추가합니다.

실습

간단한 핸들러를 만들어서 Jmeter 를 통해서 부하테스트를 진행했다. 자주 쓰는 구성 요소들만 살펴본다.

@RestController
public class SampleController {

    Random random = new Random();

    @GetMapping("/index")
    public String stressTest() throws InterruptedException {
        int waitSecond = random.nextInt(5);
        System.out.println(">>> " + waitSecond);
        Thread.sleep(waitSecond * 1000);
        return "index";
    }

}

Thread Group

  • Number of Threads : 총 요청을 얼마나 할 것인가(총 호출 횟수)

  • Ramp-up period(seconds) : Number of Threads 를 몇 초에 걸쳐서 요청 할 것인가

  • Loop Count : 설정한 Number of Threads 와 Ramp-up period(seconds) 의 조합으로 몇 번 반복시킬지 반복 횟수(infinite 설정할 경우 무한히 반복시킨다)

Sampler > HTTP Request

설정한 Thread Group 으로 수행할 테스트 작업. 위 설정 정보로 테스트를 진행한다. 실습은 간단한 예제이지만 인터페이스에서 볼 수 있듯이 파라미터나 바디 등에 정보를 설정할 수 있다. Configuration 을 이용하면 헤더 값 등을 설정할 수 있다.

Listener > View Results in Table, View Results Tree

각 요청에 대한 결과들을 알 수 있다. 사실 부하테스트에서 이런 건당 결과는 크게 의미가 없는 것 같긴 하다.

Listener > Aggregate Report

  1. Label: 요청에 대한 레이블 또는 이름입니다. 해당 요청을 식별할 수 있도록 설정한 값입니다.

  2. Samples: 요청이 실행된 샘플의 총 수입니다. 각 요청은 하나의 샘플로 계산됩니다.

  3. Average: 모든 샘플의 응답 시간의 평균입니다. 샘플의 응답 시간을 모두 합산한 후, 요청 수로 나눈 값입니다.

  4. Median: 모든 샘플의 응답 시간 중 중간값입니다. 응답 시간을 오름차순으로 정렬한 후, 중간에 위치한 값입니다.

  5. 90% Line: 모든 샘플의 응답 시간 중 90%에 해당하는 값입니다. 응답 시간을 오름차순으로 정렬한 후, 상위 90%에 해당하는 값입니다.

  6. Min: 모든 샘플의 최소 응답 시간입니다.

  7. Max: 모든 샘플의 최대 응답 시간입니다.

  8. Error%: 발생한 오류 응답의 백분율입니다. 오류 응답은 HTTP 응답 코드가 400 이상인 경우를 의미합니다.

  9. Throughput: 초당 요청 수입니다. 샘플의 수를 테스트 실행 시간(초)으로 나눈 값입니다.

  10. KB/sec: 초당 전송된 데이터 양(KB)입니다. 요청 및 응답 데이터의 크기를 테스트 실행 시간(초)으로 나눈 값입니다.

  11. Received KB/sec: 초당 수신된 데이터 양(KB)입니다. 응답으로 수신된 데이터의 크기를 테스트 실행 시간(초)으로 나눈 값입니다.

% Line 이 높게 나올 수 밖에 없는 이유는 N %이내의 요청들에 대해서 처리된 응답시간이기 때문이다. 100개의 요청중 응답시간을 기준으로 오름차순 정렬하고 90번째 요청의 응답시간이 곧 90% Line 이라고 이해하면 된다.

내가 실습 코드에서 0, 1, 2, 3, 4 초가 랜덤하게 sleep 되도록 처리해둬서 Average 가 약2초가 나온 것을 볼 수 있다.

Listener > Response Time Graph

Graph settings 의 interval 을 설정해서 응답 시간에 대한 그래프를 확인한다.

Listener > Aggregate Graph

Column settings 에서 보고 싶은 종류들을 체크하고 막대 그래프를 볼 수 있다.

Assertions

위에 이미 Assertions 에 가 무엇인지는 적어두었고, 종류들은 위와 같다.

PreviousCH03 도커와 테스트Next(+) VisualVM

Last updated 1 year ago