콜스택 추적 개요
자동 수집
Naite.t() 호출 시 콜스택 자동 추적
호출 경로
함수 호출 순서 파일 위치 정보
디버깅 지원
문제 위치 파악 원인 추적
Viewer 통합
VSCode에서 시각화 클릭으로 이동
콜스택이란?
콜스택(Call Stack)은 프로그램 실행 중 함수 호출 순서를 추적하는 데이터 구조입니다. Naite는Naite.t() 호출 시점의 콜스택을 자동으로 수집하여, 로그가 어디서 기록되었는지 정확히 파악할 수 있게 합니다.
왜 콜스택이 중요한가?
복잡한 애플리케이션에서는 하나의 작업이 여러 함수를 거쳐 실행됩니다. 문제가 발생했을 때, 어떤 경로로 함수가 호출되었는지 알면 디버깅이 훨씬 쉬워집니다.- console.log의 한계
- Naite의 해결책
기본 구조
Naite가 수집하는 콜스택 정보는 다음과 같습니다:콜스택 예시
콜스택 예시
createUser(15번 줄): 실제로Naite.t()를 호출한 위치test(42번 줄): 테스트 코드에서createUser를 호출runWithMockContext: Sonamu의 Context 래퍼 (여기서 종료)
콜스택 수집 원리
extractCallStack() 동작
Naite는 JavaScript의Error 객체를 이용하여 콜스택을 수집합니다.
1
Error 객체 생성
new Error().stack으로 현재 콜스택을 문자열로 얻습니다.2
불필요한 프레임 제거
Error, extractCallStack, Naite.t 프레임을 제외합니다 (slice(3)).3
파싱
각 라인을
StackFrame 객체로 파싱합니다.4
Context 경계에서 종료
runWithContext를 만나면 거기서 자릅니다. 그 이상은 Vitest 내부 코드로 의미가 없습니다.parseStackFrame() 로직
두 가지 콜스택 형식을 파싱합니다:- 형식 1: 함수명 있음
- 형식 2: 익명 함수
- 특수 케이스: node:internal
runWithContext 종료 이유: Naite는 의미 있는 콜스택만 유지합니다.
runWithContext는 Sonamu의
Context 경계이며, 그 위는 Vitest의 내부 코드로 디버깅에 도움이 되지 않습니다.실전 디버깅 시나리오
1. 호출 경로 추적
복잡한 함수 호출 체인에서 특정 경로만 추적합니다.2. 에러 발생 지점 파악
에러가 발생했을 때 정확한 위치를 찾습니다.에러 추적의 가치
에러 추적의 가치
일반적인 이를 통해 78번 줄의
console.log나 console.error는 에러 메시지만 보여줍니다. 하지만 Naite의 콜스택을 사용하면:- 정확한 파일과 라인: 에러가 발생한 정확한 코드 위치
- 호출 경로: 어떤 함수들을 거쳐 에러가 발생했는지
- VSCode 통합: 클릭 한 번으로 코드 위치로 이동
- 컨텍스트: 에러 발생 시점의 데이터와 함께 저장
validateUser에서 에러가 발생했다면:validateUser에서 에러가 발생했고, 이것이 45번 줄의 createUser에서 호출되었고, 12번 줄의 테스트에서 시작되었음을 알 수 있습니다.3. 복잡한 호출 체인 분석
A → B → C → D 순서로 호출되는 복잡한 체인을 분석합니다.4. fromFunction() 활용
특정 함수에서 호출된 로그만 필터링합니다.- direct (직접 호출)
- indirect (간접 호출)
- both (모두, 기본값)
콜스택의 첫 번째 프레임(
stack[0])만 체크합니다.VSCode Viewer 통합
Naite Viewer는 콜스택 정보를 시각적으로 표시하고, 클릭 한 번으로 코드 위치로 이동할 수 있게 합니다.콜스택 시각화
Naite Viewer에서 각 로그를 클릭하면 다음과 같이 표시됩니다:Viewer 화면 예시
Viewer 화면 예시
- 각 프레임을 클릭하면 VSCode 에디터가 해당 파일의 정확한 라인으로 이동
- 코드 컨텍스트를 즉시 확인 가능
- 디버깅 시간 단축
실전 활용 예시
1
Viewer에서 로그 확인
테스트 실행 후 Naite Viewer에서 의심스러운 로그를 찾습니다.
2
콜스택 확인
로그를 클릭하여 콜스택을 확인합니다. 어떤 함수들을 거쳐 왔는지 파악합니다.
3
코드 위치로 이동
콜스택의 각 프레임을 클릭하여 실제 코드를 확인합니다.
4
문제 파악 및 수정
콜스택을 따라가며 문제의 원인을 찾고 수정합니다.
고급 패턴
1. 성능 병목 파악
콜스택과 시간 정보를 결합하여 성능 병목을 찾습니다.2. Syncer 디버깅
Syncer의 복잡한 템플릿 생성 과정을 추적합니다.3. 무한 루프 감지
재귀 함수의 깊이를 모니터링합니다.4. 조건부 로깅
특정 조건에서만 상세 로깅을 활성화합니다.콜스택 제한 사항
runWithContext에서 종료
Naite는runWithContext 또는 runWithMockContext를 만나면 콜스택 수집을 종료합니다.
runWithContext는 Sonamu의 Context 경계- 그 위는 Vitest 내부 코드 (의미 없음)
- 의미 있는 콜스택만 유지하여 가독성 향상
node:internal 경로
Node.js 내부 경로는 lineNumber를 0으로 설정합니다:익명 함수
화살표 함수나 익명 함수는functionName이 null입니다:
베스트 프랙티스
1
의미 있는 위치에 로깅
2
에러 상황에 로깅
3
명시적 함수명 사용
4
VSCode Viewer 활용
로컬 개발 시 Naite Viewer를 켜두고, 로그를 클릭하여 콜스택을 확인하세요. 코드 위치로 바로 이동할 수 있어 디버깅 속도가 크게 향상됩니다.
주의사항
다음 단계
Naite Viewer
VSCode Extension으로 콜스택을 시각적으로 확인하세요.
로그 조회하기
fromFunction()으로 특정 함수의 로그만 필터링하세요.
로그 기록하기
효과적인 로깅 전략을 배우세요.
Naite란?
Naite 전체 개요로 돌아가세요.