![Spring StopWatch 대표 이미지](https://hlksvpkz.hostingkr.com/wp-content/uploads/2023/07/Spring.png)
Spring StopWatch란?
Spring Framework에서 제공하는 Spring StopWatch는 간단한 유틸리티 클래스로, 코드 블록의 실행 시간을 측정하는 데 주로 사용합니다. 아주 간단하게 시간 측정을 시작하고, 측정을 중지하여 소요된 시간등을 계산할수 있습니다. 스프링 (Spring)의 StopWatch 클래스(Class)는 org.springframework.util 패키지에 포함되어 있습니다. 이 클래스는 코드 실행 시간을 측정하고, 간단한 로그를 출력하는 등의 기능들을 제공합니다.
사용 방법
종속성(Dependency) 추가
Spring Boot를 사용한다면, 추가적인 설정은 필요하지 않습니다. 다만 사용하고 있지 않다면 아래와 같이 추가가 필요합니다.
- 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() : 수행된 모든 작업을 기술하는 정보를 문자열로 생성합니다.
사용법 – 기본
- StopWatch 객체 생성 성능을 측정하고자 하는 메서드(method)에서 StopWatch 객체를 생성합니다.
- start() 를 사용하여 스탑워치를 실행한다.그러면 시간의 측정이 시작된다.
- stop() 을 사용하여 실제 소요시간을 측정을 한다.
- 결과 출력은 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 안녕”