공공부하자개발 · 영어 학습 노트
자바
실무 확장Excel · 파일 업로드 · DB 연동0/22 완료
  • 01Excel(XLSX) 구조와 순수 JDK로 읽기/쓰기
  • 02Apache POI로 Excel 업로드/다운로드
  • 03파일 업로드/다운로드 서버 (HttpServer)
  • 04JDBC 기초와 트랜잭션 (H2)
  • 05MyBatis 어노테이션 매퍼로 쿼리 연동
  • 06MyBatis XML 매퍼 · Oracle 방언 · PageHelper · Spring Boot
  • 07REST API 서버와 JSON
  • 08Vue 3 SPA 와 Java 서버 연동
  • 09@Scheduled 운영
  • 10로깅 실무: 레벨·계층, MDC 추적, 예외·성능, 마스킹, 롤링, JSON 로그
  • 11외부 API 연동
  • 12테스트 실무
  • 13암호화·개인정보 보호
  • 14인코딩·한글 실무
  • 15@Transactional 심화
  • 16긴 작업 비동기 처리와 진행률
  • 17SFTP·FTP 파일 연계
  • 18로컬 캐시와 @Cacheable
  • 19메일·알림 발송
  • 20웹 보안 체크리스트
  • 21빌드 도구와 폐쇄망 의존성 반입
  • 22성능 측정: p50·p95·p99, 측정 계층, JFR, JMH 함정, 자체 부하 테스트, 병목 순위
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 실무 확장 › 22 / 22

성능 측정: p50·p95·p99, 측정 계층, JFR, JMH 함정, 자체 부하 테스트, 병목 순위

섹션 7진행 0 / 22
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

4. 응용 변형 예제

4.1 구간 타이머로 요청 안의 병목 좁히기

메서드 앞뒤를 감싸 로그를 남기면, JFR 없이도 어느 구간이 느린지 대략 알 수 있습니다.

java
long t0 = System.nanoTime();
List<Order> orders = orderMapper.selectByUser(userId);
log.debug("select: {}ms", (System.nanoTime() - t0) / 1_000_000);

t0 = System.nanoTime();
List<OrderDto> dtos = orders.stream().map(this::toDto).toList();
log.debug("convert: {}ms", (System.nanoTime() - t0) / 1_000_000);

이 방식은 임시 진단용입니다. 운영에 계속 남기면 로그가 과다해져 2.8절의 "로그 과다" 병목 그 자체가 됩니다. 원인을 찾으면 코드를 제거하거나 조건부 로깅으로 낮춥니다.

4.2 MDC 로 요청 단위 소요 시간 남기기

여러 요청이 섞여 실행되는 서버 로그에서는 MDC(Mapped Diagnostic Context)로 요청 ID 를 붙여야 한 요청의 흐름을 따라갈 수 있습니다.

java
MDC.put("reqId", UUID.randomUUID().toString().substring(0, 8));
long t0 = System.nanoTime();
try {
    return service.process(req);
} finally {
    log.info("elapsed={}ms", (System.nanoTime() - t0) / 1_000_000);
    MDC.clear();
}

reqId 로 로그를 필터링하면 같은 요청이 어느 구간에서 시간을 썼는지 시간순으로 재구성할 수 있습니다. 동시 사용자가 많은 운영 환경에서 필수적인 습관입니다.

4.3 커넥션 풀 크기와 목표 TPS 역산

HikariCP 풀 크기를 정할 때 "일단 크게" 잡는 대신, 목표 TPS 와 평균 쿼리 시간으로 역산합니다.

text
필요 풀 크기 ≈ 목표 TPS × 평균 응답 시간(초)

예: 목표 TPS 50, 평균 쿼리 80ms(0.08초)
필요 풀 크기 ≈ 50 × 0.08 = 4

여유를 감안해도 이 예시라면 풀 크기 10 이상은 과잉일 가능성이 큽니다. 풀을 과도하게 키우면 Oracle 세션 수만 늘고 실제 처리량은 늘지 않습니다. 커넥션 풀 고갈이 의심되면 풀 크기보다 먼저 쿼리 시간을 줄이는 것이 순서상 맞습니다.

응용 변형 예제
  • 4.1 구간 타이머로 요청 안의 병목 좁히기
  • 4.2 MDC 로 요청 단위 소요 시간 남기기
  • 4.3 커넥션 풀 크기와 목표 TPS 역산
이전 섹션3 코드 예제4 / 7다음 섹션5 자주 하는 실수 (Tip)