개요

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 } 같은 사람이 읽기 쉬운 형태로 표시

정리

  • console.log는 기본적으로 util.inspect를 사용하며 기본 depth는 2
  • 이 때문에 깊게 중첩된 값이 [Object], [Array]로 축약됨
  • 전체 구조가 필요하면 util.inspect(obj, { depth: null })로 출력 제어
  • JSON.stringify는 직렬화, util.inspect는 디버깅 가독성에 초점
  • 운영 로그에서는 출력 크기와 민감정보 노출 관리 필요

참고자료