Node.js는 애플리케이션의 성능을 측정하고 최적화하기 위한 강력한 도구를 제공합니다. 그 중 하나는 Performance API로, 개발자가 고해상도 타임스탬프와 다양한 성능 메트릭을 캡처할 수 있게 해줍니다. 이 가이드는 Node.js Performance API의 주요 구성 요소와 이를 효과적으로 사용하는 방법을 소개합니다.
Node.js에서 성능이 중요한 이유
Node.js는 이벤트 기반의 비동기 아키텍처로서 I/O 작업에 적합합니다. 그러나 비차단 환경에서도 성능은 여전히 중요합니다. 느린 애플리케이션은 사용자에게 실망을 주고 확장성을 저해합니다. 병목 현상을 식별하고 코드를 최적화하는 것은 원활한 사용자 경험을 위해 필수적입니다.
API 응답 시간을 개선하고 싶으신가요? 아래의 기사는 API 응답 시간을 증가시키는 방법에 대한 단계별 가이드를 제공합니다.

왜 Node.js Performance API를 사용해야 할까요?
- 성능 병목 현상 식별: 성능 병목 현상은 사용자 경험을 상당히 저하시킬 수 있습니다. Performance API를 사용하면 개발자는 함수 실행, 리소스 로딩 또는 HTTP 요청 처리와 같은 지연이 발생하는 정확한 순간을 파악할 수 있습니다. 이러한 정확성은 목표 최적화를 가능하게 합니다.
- 리소스 사용 최적화: 성능 모니터링은 CPU와 메모리와 같은 리소스가 어떻게 사용되고 있는지를 이해하는 데 도움이 됩니다. 비효율적인 리소스 사용을 식별함으로써 개발자는 코드를 더 효율적으로 최적화하여 비용을 줄이고 확장성을 향상시킬 수 있습니다.
- 사용자 경험 향상: 빠르게 응답하는 애플리케이션은 더 나은 사용자 경험을 제공합니다. Performance API는 첫 번째 바이트까지 걸리는 시간(TTFB) 및 첫 번째 콘텐츠 페인트(FCP)와 같은 주요 메트릭을 측정하는 데 도움을 주어 개발자가 더 빠른 로딩 시간과 원활한 상호작용을 위한 개선을 할 수 있도록 합니다.
- 애플리케이션 안정성 개선: 지속적인 성능 모니터링은 문제가 심각해지기 전에 이상 현상과 잠재적인 문제를 감지하는 데 도움이 됩니다. 이러한 사전 예방적 접근 방식은 애플리케이션의 가동 시간과 신뢰성을 높입니다.
Node.js Performance API 소개
Performance API는 perf_hooks
모듈을 통해 접근할 수 있으며, Node.js 개발자에게 애플리케이션 성능을 측정하고 분석하기 위한 종합적인 도구 키트를 제공합니다. 이는 Date.now()
와 같은 전통적인 방법에 비해 상당한 이점을 제공하며, 고해상도 타이밍과 더 구조화된 성능 평가 접근 방식을 제공합니다. Date.now()
메서드에서는 다음과 같은 내용을 볼 수 있습니다;
const startTime = Date.now();
// call a function to perform a task()
console.log(`작업 기간: ${Date.now() - startTime} 밀리초`);
Date.now() 함수는 잘 작동하지만, 겉보기에는 간단해 보이지만 시스템 시계의 변화로 인해 측정이 불확실할 수 있습니다.
여기서 Node.js Performance API가 등장합니다. 우리는 애플리케이션의 시간 사용을 완전히 측정하고 시스템 시계와 같은 문제로부터 괴롭힘을 받지 않기를 원합니다.
Node.js Performance API는 perf_hooks
모듈에서 제공하는 여러 핵심 메서드와 클래스를 기반으로 구축되어 있습니다. 여기에는 다음이 포함됩니다:
이 도구 각각은 성능 메트릭을 캡처하고 분석하는 데 뚜렷한 목적을 가지고 있습니다.
performance.now() 사용하기
performance.now()
메서드는 밀리초 단위의 고해상도 타임스탬프를 반환합니다. 이는 Date.now()
보다 더 높은 정밀도로 애플리케이션 내의 간격을 측정하는 데 유용합니다.
작업의 지속 시간을 가져오려면, 측정하려는 작업의 시작과 종료에 performance.now()
메서드를 추가하면 됩니다;
const { performance } = require('node:perf_hooks');
const start = performance.now();
// 몇 가지 작업 수행
const end = performance.now();
console.log(`소요 시간: ${end - start} ms`);
우선, 우리는 노드 모듈에서 performance를 가져오고, 그런 다음 시작 및 종료 상수를 만들고 그에 성능.now 메서드를 할당하여 작업의 정확한 시간을 얻습니다.
위 코드의 출력은 다음과 같이 나타나야 합니다;
소요 시간: 1253.**** ms.
performance.mark() 사용하기
Node.js의 performance.mark()
메서드는 코드의 특정 지점에서 이름이 지정된 타임스탬프(또는 마크)를 생성할 수 있게 해줍니다. 이러한 마크는 애플리케이션의 서로 다른 부분 간에 소요된 시간을 측정하는 데 도움이 되어 성능 병목 현상에 대한 통찰을 제공합니다.
const { performance } = require('node:perf_hooks');
performance.mark('A');
// 일부 작업 수행
performance.mark('B');
이 예제에서는 performance.mark('A')와 performance.mark('B')가 각각 'A'와 'B'라는 두 개의 마크를 생성합니다.
마크에는 추가 세부정보도 포함될 수 있으며, 이는 디버깅이나 추가 분석에 유용할 수 있습니다.performance.mark('A', { detail: '작업 시작' }); performance.mark('B', { detail: '작업 종료' });
여기서 detail
속성은 각 마크가 무엇을 나타내는지에 대한 추가 정보를 제공합니다.
마크를 생성한 후, performance.measure()
를 사용하여 이들 간의 지속 시간을 측정할 수 있습니다.
performance.measure() 사용하기
performance.measure()
는 Node.js의 Performance API 내에서 두 개의 마크된 지점 간의 지속 시간을 계산하는 함수입니다. 본질적으로 측정 항목을 생성하고 나중에 검색 및 분석할 수 있도록 경과 시간을 저장합니다.
기억하세요, performance.mark()
섹션에서 우리는 두 개의 마크인 A
와 B
를 만들었습니다. 이 섹션에서는 이들을 테스트하고 performance.mark()
가 performance.measure()
와 어떻게 작동하는지 살펴보겠습니다.
performance.measure('A to B', 'A', 'B');
const measures = performance.getEntriesByType('measure');
measures.forEach(measure => {
console.log(`${measure.name}: ${measure.duration}ms`);
});
이것은 'A'와 'B'라는 마크 사이의 경과 시간을 계산하는 'A to B'라는 측정값을 생성합니다.
위 코드를 실행하면 출력은 두 마크 'A'와 'B' 사이의 지속 시간을 표시합니다. 콘솔에 출력될 수 있는 예시는 다음과 같습니다:
A to B: 12.345ms
이 출력은 'A'와 'B' 마크 사이의 작업이 약 12.345 밀리초 소요되었음을 나타냅니다.
PerformanceObserver 사용하기
Node.js의 PerformanceObserver
인터페이스는 개발자가 비동기적으로 마크, 측정 및 리소스 타이밍 항목과 같은 성능 항목을 관찰하고 처리할 수 있게 해줍니다. 이는 수집되는 성능 데이터를 모니터링하고 반응하는 데 특히 유용하여 실시간 성능 분석 및 최적화에 필수적인 도구입니다.
PerformanceObserver
를 사용하려면 인스턴스를 생성하고 성능 항목을 처리할 콜백 함수를 정의해야 합니다. 기본 설정은 다음과 같습니다:
const { PerformanceObserver, performance } = require('node:perf_hooks');
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
console.log(entry);
});
});
observer.observe({ entryTypes: ['mark', 'measure'] });
이 예제에서:
PerformanceObserver
및performance
가져오기:PerformanceObserver
및performance
객체는perf_hooks
모듈에서 가져옵니다.- 관찰자 생성: 새
PerformanceObserver
인스턴스가 콜백 함수를 사용하여 생성됩니다. 이 함수는 새로운 성능 항목이 기록될 때마다 호출됩니다. - 항목 유형 관찰:
observer.observe
메서드는 관찰할 항목 유형을 지정하는 객체와 함께 호출됩니다(이 경우mark
와measure
).
PerformanceObserver의 실용적인 사용 사례
1. 실시간 성능 모니터링:
PerformanceObserver
는 애플리케이션 성능을 지속적으로 모니터링하여 성능 문제에 대한 즉각적인 피드백을 제공합니다. 이는 실시간 성능 데이터가 중요한 프로덕션 환경에서 특히 유용합니다.
2. 리소스 로딩 분석:
- 리소스 타이밍 항목을 관찰함으로써 개발자는 스크립트, 스타일시트 및 이미지와 같은 다양한 리소스가 어떻게 로드되는지를 분석하여 로드 시간을 최적화하는 데 도움을 줄 수 있습니다.
3. 디버깅 및 프로파일링:
- 개발 중
PerformanceObserver
는 코드의 특정 부분을 프로파일링하는 데 사용할 수 있으며, 느린 함수 및 잠재적 병목 현상을 식별하는 데 도움이 됩니다.
4. 사용자 정의 성능 메트릭:
- 개발자는 애플리케이션 내에서 중요한 포인트를 마크하고 측정하여 사용자 정의 성능 메트릭을 생성할 수 있으며, 이를 통해 애플리케이션의 특정 요구에 맞춘 세분화된 성능 분석을 할 수 있습니다.
Node.js에서 애플리케이션 테스트
지금까지 우리는 Node.js Performance API에 대해 배우고, 그 중요성, 작동 방식 및 기본 Date.now()
함수와의 차이점에 대해 알아보았습니다.
애플리케이션을 구축하고 있다면, 애플리케이션 구축에 집중하고 테스트는 다른 서비스에 맡기고 싶을 것입니다. Apidog 덕분에 API와 애플리케이션을 테스트할 수 있습니다.

Apidog는 성능 테스트를 포함하여 API 테스트를 위해 특별히 설계된 강력한 도구입니다. API를 생성, 관리 및 테스트하기 위한 종합적인 솔루션을 제공합니다. Apidog는 API 동작을 시뮬레이션하고, 테스트 케이스를 정의하며, 상세한 보고서를 생성할 수 있게 해줍니다. 직관적인 인터페이스를 통해 성능 테스트를 쉽게 구성하고 응답 시간을 분석하며 성능 병목 현상을 식별할 수 있습니다.

결론
Node.js Performance API는 performance.mark()
, performance.measure()
및 PerformanceObserver
와 같은 도구를 포함하여 개발자에게 애플리케이션 성능을 모니터링하고 최적화하기 위한 강력한 기능을 제공합니다. 이러한 도구를 활용함으로써 Node.js 애플리케이션의 성능 특성에 대한 정확한 통찰을 얻고, 병목 현상을 식별하며, 효율성과 사용자 경험을 향상시키기 위해 목표 최적화를 구현할 수 있습니다.
Performance API 외에도 최상의 API/애플리케이션 관행을 적용하고 강력한 부하 테스트 및 모니터링을 수행하면 애플리케이션의 전반적인 성능을 크게 향상시킬 수 있습니다. 이러한 노력을 결합하면 Node.js 애플리케이션이 원활하게 실행되고, 효과적으로 확장되며, 우수한 사용자 경험을 제공하여 시장에서 경쟁 우위를 유지할 수 있도록 합니다.