Spring StopWatch 사용 방법 – currentTimeMillis 안녕

Spring StopWatch 대표 이미지

Spring StopWatch란?

Spring Framework에서 제공하는 Spring StopWatch는 간단한 유틸리티 클래스로, 코드 블록의 실행 시간을 측정하는 데 주로 사용합니다. 아주 간단하게 시간 측정을 시작하고, 측정을 중지하여 소요된 시간등을 계산할수 있습니다. 스프링 (Spring)의 StopWatch 클래스(Class)는 org.springframework.util 패키지에 포함되어 있습니다. 이 클래스는 코드 실행 시간을 측정하고, 간단한 로그를 출력하는 등의 기능들을 제공합니다.

스프링 공식 Docs

사용 방법

종속성(Dependency) 추가

Spring Boot를 사용한다면, 추가적인 설정은 필요하지 않습니다. 다만 사용하고 있지 않다면 아래와 같이 추가가 필요합니다.

  1. Maven – Pom.xml 추가
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-core</artifactId>
	<version>5.1.3.RELEASE</version>
</dependency>

2. Gradle –  build.gradle 추가

compile group: 'org.springframework', name: 'spring-core', version: '5.1.3.RELEASE'

메소드 설명

  • currentTaskName() : 현재 실행중인 태스크의 이름(Task Name)을 반환합니다.
  • getId() : 스톱워치가 작성시에 지정된 ID를 반환합니다.
  • getLastTaskInfo() : 마지막 태스크를 StopWatch.TaskInfo 객체를 반환합니다.
  • getLastTaskName() : 마지막 태스크의 이름(Last Task Name)을 반환합니다.
  • getLastTaskTimeMillis() : 마지막 태스크에 소요된 시간 ms(밀리초)단위로 반환합니다.
  • getLastTaskTimeNanos() : 마지막 태스크에 소요된 시간을 ns(나노초) 단위로 리턴합니다.
  • getTaskCount() : 시간이 지정된 태스크(Task)의 수를 반환합니다.
  • getTaskInfo() : 실행된 태스크에 관한 데이터의 배열을 반환합니다.
  • getTotalTimeMillis() : 모든 작업의 총 시간을 ms(밀리초) 단위로 반환합니다.
  • getTotalTimeNanos() : 모든 작업의 총 시간을 ns(나노초) 단위로 반환합니다.
  • getTotalTimeSeconds() : 모든 작업의 총 시간을 s(초) 단위로 리턴합니다.
  • isRunning() : 현재 StopWatch를 실행하고 있는지를 반환합니다.
  • prettyPrint() : 수행된 모든 조작을 기술하는 테이블을 가지는 정보를 보기 좋게 문자열로 출력합니다.
  • setKeepTaskList(boolean keepTaskList) : 시간 경과에 따른 배열의 작성 여부를 세팅합니다.
  • shortSummary() : 총 실행 시간의 간단하게 표시한다.
  • start() : 태스크의 이름 없이 바로 시작한다.
  • start(String taskName) : 태스크의 이름으로 작업을 개시한다.
  • stop() : 현재의 작업을 정지한다.
  • toString() : 수행된 모든 작업을 기술하는 정보를 문자열로 생성합니다.

사용법 – 기본

  1. StopWatch 객체 생성 성능을 측정하고자 하는 메서드(method)에서 StopWatch 객체를 생성합니다.
  2. start() 를 사용하여 스탑워치를 실행한다.그러면 시간의 측정이 시작된다.
  3. stop() 을 사용하여 실제 소요시간을 측정을 한다.
  4. 결과 출력은 StopWatch의 getTotalTimeMillis() 메서드를 호출하여 측정된 실행 시간을 얻을 수 있습니다. 해당 결과를 log로 출력하거나 필요에 따라 다른 처리(system.out.println 등)를 수행할 수 있습니다.

    예시
// 스프링 프레임 워크의 스톱워치를 사용하기 위해 import를 한다.
import org.springframework.util.StopWatch;

public class DevJStopWatchExample {

    public static void main(String[] args) {
        // StopWatch 객체 생성
        StopWatch stopWatch = new StopWatch();

        // 측정 시작
        stopWatch.start();

        // 성능을 측정하고자 하는 대상이 되는 코드 부분
        for (int i = 0; i < 10000; i++) {
            // 이번 예시에서는 간단한 반복문을 사용하였습니다.
        }

        // 측정 종료
        stopWatch.stop();

        // 결과 출력
        long elapsedTime = stopWatch.getTotalTimeMillis();
        System.out.println("코드 실행 시간: " + elapsedTime + "밀리초");
    }
}

이렇게 하면 간단히 쉽게 실행 시간을 측정할 수 있습니다. StopWatch를 활용하면 메서드 실행 시간을 쉽게 파악하여 병목 현상을 찾거나, 성능 향상을 위한 포인트를 쉽게 찾을수 있습니다.

사용법 – 태스크(Task)의 활용법

Task 메서드는 스프링(Spring) StopWatch의 주요 기능 중 하나로, 코드의 여러 부분을 구분하여 측정할 때 사용합니다. 예를 들어, 하나의 메서드 안에서 여러 개의 작은 작업을 수행하고 각 작업의 실행 시간을 측정하고자 할 때 유용합니다.

prettyPrint() 라는 메소드는 StopWatch의 결과를 보기 좋은 형식으로 출력해주는 메소드입니다.

task 메소드를 사용하여 여러 가지 작업의 실행 시간을 측정한 뒤, prettyPrint를 호출하면 각 작업의 이름(task name)과 실행 시간을 정리하여 깔끔하게 보여줍니다. 이런 이유로 같이 쓰면 굉장히 유용한 메소드이다.

예시)

import org.springframework.util.StopWatch;

public void devJStopWatchMethod() {
    StopWatch stopWatch = new StopWatch();

    stopWatch.start("Task 1"); // 첫 번째 Task 1의 시작
    // Task 1 수행 코드
    stopWatch.stop();

    stopWatch.start("Task 2"); // 두 번째 Task 2의 시작
    // Task 2 수행 코드
    stopWatch.stop();

    // 더 많은 작업들을 추가로 측정할 수 있습니다.

    System.out.println(stopWatch.prettyPrint());
}
StopWatch '': running time = 1000 ms

-----------------------------------------
ms     %     Task name
-----------------------------------------
0500   050%  Task 1
0500   050%  Task 2


이렇게 prettyPrint()와 task를 같이 사용하면, 각 태스크의 이름, 실행 시간(ms), 전체 실행 시간 대비 비율이 표시됩니다. prettyPrint() 메서드는 코드의 성능 측정 결과를 쉽게 파악할 수 있도록 도와줍니다.

Spring StopWatch vs Apache StopWatch

Spring StopWatch 장점

Task단위로 측정하기엔 더 편하고, prettyPrint 가 꽤 유용하다

Spring Project에 별도의 설정없이 사용하기 좋다.

Apache StopWatch 장점 : 관련 문서 Apache StopWatch

suspend()와 같은 중지 기능을 사용하기에 유리하다.

split()와 같이 측정내 시간을 끊어 측정하기 유리하다.

결론

  • Spring 을 사용하다면 간단하게, StopWatch 를 사용하면 좋다.
  • Task 단위로 나눠서 보고 싶다면, Spring StopWatch를 추천한다.
  • Suspend 와 같이 중간에 중단 하거나, Start 이후 split 해야하는 이유가 있다면 Apache StopWatch를 사용해보는것을 추천한다.

2 thoughts on “Spring StopWatch 사용 방법 – currentTimeMillis 안녕”

Leave a Comment