개요
Node.js에서 console.log로 객체를 찍다 보면 [Object], [Array]로 축약돼 상세 구조가 보이지 않는 경우가 많음 원인은 console.log가 내부적으로 util.inspect를 사용하고, 기본 depth가 2이기 때문임 아래에서 동작 방식과 옵션, 실무에서 흔히 하는 설정을 정리함
console.log가 [Object]로 축약되는 이유
console.log는 객체를 문자열로 만들 때 util.inspect를 사용함 기본 동작은 depth 2까지 펼치고 그 이후는 축약 표시
- 0단계 예시
{ args: [Object] } - 1단계 예시
{ args: { take: 5, orderBy: [Array], where: [Object] } } - 2단계 예시
{ args: { take: 5, orderBy: [ [Object] ], where: { userId: 123 } } } - 3단계 예시
{ args: { take: 5, orderBy: [ { createdAt: 'desc' } ], where: { ... } } }기본 depth가 2이므로 3단계 이상 중첩된 객체는 [Object], 배열은 [Array]로 축약 표시됨
util.inspect 간단 소개
util.inspect는 node:util 모듈에 있는 함수로, JS 값을 사람이 읽기 좋은 문자열로 직렬화하는 유틸리티
console.log(obj)는 실질적으로 util.inspect(obj, { depth: 2, colors: false })와 유사하게 동작함
주요 옵션
- depth (기본값 2) 객체 중첩을 몇 단계까지 펼칠지 결정 null로 설정하면 무제한으로 출력
- colors (기본값 false) ANSI 색상 코드 사용 여부
- breakLength (기본값 80) 한 줄로 출력할 최대 길이, 초과 시 줄바꿈 시도 Node.js 버전에 따라 기본값이 소폭 상이할 수 있음
- compact (기본값 3) 줄바꿈 없이 압축 출력할 최소 크기 기준
- showHidden (기본값 false) non-enumerable 속성 포함 여부
변경 전후 비교
변경 전
- 코드 예시
console.log('🐾️ [${headers}]', body) - 내부적으로
util.inspect(body, { depth: 2 })와 유사하게 동작 - 깊은 객체가 [Object]로 축약되어 구조 파악 어려움
변경 후
- 코드 예시
console.log('🐾️ [${headers}]', inspect(body, { depth: null })) - depth null 지정 시 중첩 깊이 제한 없이 전개
- 깊이 있는 구조도 축약 없이 전체 확인 가능
주의 사항
- 매우 큰 객체를 depth null로 출력하면 로그가 과도하게 길어질 수 있음
- 운영 환경에서는 필드 마스킹, 샘플링, 크기 제한 등 추가 제어 필요
JSON.stringify와의 차이
목적이 다름
- JSON.stringify: 데이터 직렬화 목적, 전송·저장에 적합
- util.inspect: 디버깅 가독성 목적, 콘솔 출력에 적합
세부 동작 차이
- 순환 참조
- JSON.stringify: 에러 발생
- util.inspect:
[Circular *]로 표시
- undefined
- JSON.stringify: 컨텍스트에 따라 제외 또는 null 치환
- util.inspect: 값 그대로 표시
- BigInt
- JSON.stringify: 에러 발생
- util.inspect: 값 표시
- 함수
- JSON.stringify: 제외
- util.inspect:
[Function: name]형태로 표시
- Map, Set
- JSON.stringify:
{}로 출력 - util.inspect:
Map(2) { 'a' => 1 }같은 사람이 읽기 쉬운 형태로 표시
- JSON.stringify:
정리
- console.log는 기본적으로 util.inspect를 사용하며 기본 depth는 2
- 이 때문에 깊게 중첩된 값이 [Object], [Array]로 축약됨
- 전체 구조가 필요하면
util.inspect(obj, { depth: null })로 출력 제어 - JSON.stringify는 직렬화, util.inspect는 디버깅 가독성에 초점
- 운영 로그에서는 출력 크기와 민감정보 노출 관리 필요