1. What is console? πŸ‘©β€πŸ’»

Console은 Node API λ˜λŠ” Browser API μ—μ„œ 기본으둜 μ œκ³΅ν•˜λŠ” API 쀑 ν•˜λ‚˜λ‘œ μ½”λ“œκ°€ κ°–κ³  μžˆλŠ” 데이터 λ˜λŠ” λ©”μ‹œμ§€μ™€ 같은 것듀을 터미널에 μ‹œκ°ν™” ν•΄μ£ΌλŠ” 도ꡬ닀. λŒ€λΆ€λΆ„ λ‹€λ₯Έ μ–Έμ–΄μ—μ„œ log λ˜λŠ” logger와 같은 μ΄λ¦„μœΌλ‘œ μ œκ³΅ν•˜κ³  있으며, JavaScript μ—μ„œλŠ” consoleμ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ μ œκ³΅ν•˜κ³ μžˆλ‹€.


2. Web API Console πŸ‘©β€πŸ’»

Frontend μ—μ„œ μ‚¬μš©ν•  것은 λΈŒλΌμš°μ €κ°€ Web API 둜 μ œκ³΅ν•˜λŠ” Console API λ₯Ό μ‚¬μš©ν•˜κ²Œ λœλ‹€. 링크λ₯Ό 따라 MDN μ‚¬μ΄νŠΈλ₯Ό 방문해보면 console 에 정말 λ‹€μ–‘ν•œ λ©”μ„œλ“œκ°€ μžˆλŠ” 것을 확인할 수 μžˆλ‹€. 이 쀑 μΌλΆ€λŠ” Web Workerμ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλŠ” 것듀이며, 많이 μ‚¬μš©λ˜λŠ” 것 μœ„μ£Όλ‘œ 정리해본닀.

1. console.log

둜그λ₯Ό 좜λ ₯ν•˜λŠ” κΈ°λ³Έ λ©”μ„œλ“œλ‘œ Variadic Parameters λ₯Ό λ°›μœΌλ―€λ‘œ λ‹€μŒκ³Ό 같이 μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

const person = { name: 'λ‚˜λ¬΄', age: 20, like: 'μ˜ν™”' }
const beers = ['ν…ŒλΌ', '켈리', '크둬바컀', '1664 λΈ”λž‘']
console.log(person)
// {name: 'λ‚˜λ¬΄', age: 20, like: 'μ˜ν™”'}

console.log('λˆ„κ΅¬?', person)
// λˆ„κ΅¬? β–ΆοΈŽ {name: 'λ‚˜λ¬΄', age: 20, like: 'μ˜ν™”'}

console.log('μ’‹μ•„ν•˜λŠ” λ§₯μ£Ό?', beers)
// μ’‹μ•„ν•˜λŠ” λ§₯μ£Ό? β–ΆοΈŽ (4) ['ν…ŒλΌ', '켈리', '크둬바컀', '1664 λΈ”λž‘']

console.log('λˆ„κ΅¬?', person, 'μ’‹μ•„ν•˜λŠ” λ§₯μ£Ό?', beers)
// λˆ„κ΅¬? β–ΆοΈŽ {name: 'λ‚˜λ¬΄', age: 20, like: 'μ˜ν™”'}  μ’‹μ•„ν•˜λŠ” λ§₯μ£Ό? β–ΆοΈŽ (4) ['ν…ŒλΌ', '켈리', '크둬바컀', '1664 λΈ”λž‘']

개발 λ‹¨κ³„μ—μ„œλ§Œ μ‚¬μš©ν•œλ‹€. λ…ΈμΆœμ΄ λ˜μ„œλŠ” μ•ˆ λ˜λŠ” 데이터가 λ…ΈμΆœλ˜λŠ” λ¬Έμ œκ°€ μžˆμ„ 수 있으며, λ…ΈμΆœλ˜μ–΄λ„ 상관 μ—†λŠ” 데이터라 ν•˜λ”λΌλ„ μ„±λŠ₯ 이슈의 원인이 될 수 μžˆμœΌλ―€λ‘œ λ°°ν¬μ‹œμ—λŠ” μ œκ±°ν•΄μ•Όν•œλ‹€.

2. console.info

log κ°€ console 을 좜λ ₯ν•˜λŠ”λ° μžˆμ–΄ κΈ°λ³Έν˜•μ΄λΌλ©΄, μ •λ³΄λΌλŠ” 것에 의미λ₯Ό 두어 μ’€ 더 λˆˆμ— λ„κ²Œ 좜λ ₯μ‹œν‚€λŠ” μ˜΅μ…˜μœΌλ‘œ λΈŒλΌμš°μ € 개발자 λ„κ΅¬μ˜ Console νƒ­μ—μ„œ info만 필터링 ν•  수 μžˆλŠ” μ˜΅μ…˜μ„ μ œκ³΅ν•œλ‹€. λ”°λΌμ„œ μˆ˜λ§Žμ€ log μ‚¬μ΄μ—μ„œ νŠΉμ • log λ₯Ό 주의 깊게 보기 μœ„ν•΄ console.infoλ₯Ό μ‚¬μš©ν•˜λ©΄ λ”°λ‘œ λΆ„λ¦¬μ‹œμΌœ 확인할 수 μžˆλ‹€.

const res = JSON.parse(/* {  } */)
console.info('응닡 κ²°κ³Ό', res)

λ§ˆμ°¬κ°€μ§€λ‘œ 개발 λ‹¨κ³„μ—μ„œλ§Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹μœΌλ©°, 정말 ν•„μš”ν•œ 정보일 κ²½μš°λŠ” λ°°ν¬μ‹œμ—λ„ λ‚¨κ²¨λ‘˜ 수 μžˆλ‹€.

3. console.debug

λΈŒλΌμš°μ € 개발자 λ„κ΅¬μ—μ„œ νŒŒλž€μƒ‰μœΌλ‘œ 둜그λ₯Ό 좜λ ₯ν•΄μ€€λ‹€. console 을 ν™œμš©ν•œ 디버깅 μ‹œ λΆ„λ¦¬λœ 색상을 μ μš©ν•΄ 디버깅을 λΉ λ₯΄κ²Œ ν•  수 μžˆλ„λ‘ λ•λŠ”λ‹€.

const res = foo()
console.debug('ν•¨μˆ˜ μ‹€ν–‰ κ²°κ³Ό', res)

4. console.warn

치λͺ…적인 μ—λŸ¬λŠ” μ•„λ‹ˆμ§€λ§Œ μ£Όμ˜ν•΄μ•Όν•  것에 λŒ€ν•΄ μ‹œμŠ€ν…œμ΄ κ²½κ³ λ₯Ό ν•˜λŠ” κ²½μš°κ°€ μžˆλŠ”λ°, μ΄λ•Œ μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œλ‘œ μ—­μ‹œ μ‚¬μš©μžκ°€ 직접 좜λ ₯을 κ΅¬ν˜„ν•˜κΈ°λ„ ν•œλ‹€.

const foo = arr => {
  if (arr.length === 0) {
    console.warn('빈 λ°°μ—΄μž…λ‹ˆλ‹€!')
    return
  }
  console.log('μ „λ‹¬λœ 배열은', arr)
}

foo([])       // 빈 λ°°μ—΄μž…λ‹ˆλ‹€!

5. console.error

μ •λ§λ‘œ μ—λŸ¬λ₯Ό 좜λ ₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€. μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™μœΌλ‘œ 좜λ ₯λ˜λŠ” μ—λŸ¬ λ©”μ‹œμ§€κ°€ 이 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©°, μ‚¬μš©μžκ°€ μ˜ˆμ™Έ 처리λ₯Ό ν•  λ•Œ catch 에 직접 κ΅¬ν˜„ν•˜κΈ°λ„ ν•œλ‹€. 개발자 λ„κ΅¬μ˜ Console 탭에 error만 필터링 ν•  수 μžˆλŠ” μ˜΅μ…˜μ„ μ œκ³΅ν•  뿐 μ•„λ‹ˆλΌ λΉ¨κ°„μƒ‰μœΌλ‘œ 둜그λ₯Ό 좜λ ₯ν•΄μ€€λ‹€.

const foo = arr => {
  if (!(arr instanceof Array)) {
    console.error('배열이 μ•„λ‹™λ‹ˆλ‹€!')
    return
  }
  if (arr.length === 0) {
    console.warn('빈 λ°°μ—΄μž…λ‹ˆλ‹€!')
    return
  }
  console.log('μ „λ‹¬λœ 배열은', arr)
}

foo(person)   // 배열이 μ•„λ‹™λ‹ˆλ‹€!

6. console.assert

assertλ©”μ„œλ“œλŠ” ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³Έ μ‚¬λžŒμ΄λΌλ©΄ λˆ„κ΅¬λ‚˜ μ•Œκ³  μžˆλŠ” λ©”μ„œλ“œμΌ 것이닀. Web API Console μ—μ„œ assert λ©”μ„œλ“œλŠ” success λŠ” λ¬΄μ‹œν•œ 채 fail인 κ²½μš°μ—λ§Œ 정해놓은 λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•  수 μžˆλ„λ‘ ν•œλ‹€.

console.assert(person.name === 'λ‚˜λ¬΄', 'λ•‘! 이름을 ν‹€λ Έλ„€μš”.')
console.assert(person.age === 25, 'λ•‘! λ‚˜μ΄λ₯Ό ν‹€λ Έλ„€μš”.')      // λ•‘! λ‚˜μ΄λ₯Ό ν‹€λ Έλ„€μš”.

7. console.table

객체 데이터λ₯Ό ν…Œμ΄λΈ” ν˜•νƒœλ‘œ 좜λ ₯ν•΄μ€€λ‹€.

  • Array
const beers = ['ν…ŒλΌ', '켈리', '크둬바컀', '1664 λΈ”λž‘']
console.table(beers)

Console Table 1

  • Object
const person = { name: 'λ‚˜λ¬΄', age: 20, like: 'μ˜ν™”' }
console.table(person)

Console Table 2


그리고 console.table λ©”μ„œλ“œλŠ” 두 번째 Arguments 둜 Object μ—μ„œ 좜λ ₯ν•  μ»¬λŸΌμ„ 지정할 수 μžˆλ‹€.

const students = [
  { name: 'λ°•μ•„λ¬΄κ°œ', age: 20, like: 'μŒμ•…' },
  { name: 'μ΄μ•„λ¬΄κ°œ', age: 20, like: 'μ‡Όν•‘' },
  { name: 'κΉ€μ•„λ¬΄κ°œ', age: 20, like: 'μš΄λ™' },
  { name: 'μœ μ•„λ¬΄κ°œ', age: 20, like: 'μ˜ν™”' }
]

console.table(students, ['name', 'like'])

Console Table 3

8. console.dir

Object λ₯Ό 좜λ ₯ν•  λ•Œ μžμ„Έν•œ 속성을 쀄 수 μžˆλŠ” λ©”μ„œλ“œλ‘œ 크둬 λΈŒλΌμš°μ € Web API 의 Console μ—μ„œλŠ” 별닀λ₯Έ 차이λ₯Ό 보이지 μ•ŠλŠ”λ‹€. ν•˜μ§€λ§Œ Node API 의 Console μ—μ„œλŠ” depth λ₯Ό μ„€μ •ν•΄ μ μš©ν•˜λŠ” λ“± λ‹€μ–‘ν•œ 좜λ ₯ μ˜΅μ…˜μ„ μ„€μ •ν•  수 μžˆλ‹€.

console.dir(foo, {colors: false, depth: 1})

9. console.time & console.timeEnd

ν•¨μˆ˜μ˜ μ‹€ν–‰ μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆλ‹€. console.timeκ³Ό console.timeEndλŠ” λ™μΌν•œ 이름을 μ‚¬μš©ν•΄μ•Όν•œλ‹€.

function factorial(to, acc = 1) {
  if (to === 0) return acc
  return factorial(to - 1, to * acc)
}


console.time('loop test')
const factorial50 = factorial(50)
console.log(factorial50)
console.timeEnd('loop test')
3.0414093201713376e+64
loop test: 0.06201171875 ms


μΆ”κ°€λ‘œ console.timeLogλ₯Ό μ‚¬μš©ν•˜λ©΄ λ‚΄λΆ€μ—μ„œ lap 좜λ ₯이 κ°€λŠ₯ν•˜λ‹€.

console.time('loop test')
const factorial50 = factorial(50)
console.timeLog('loop test')
console.log(factorial50)
console.timeEnd('loop test')
loop test: 0.011962890625 ms
3.0414093201713376e+64
loop test: 0.06396484375 ms

νŒ©ν† λ¦¬μ–Ό 계산과 μ½˜μ†” 좜λ ₯ 쀑간에 console.timeLog λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ lap을 좜λ ₯ν•΄ νŒ©ν† λ¦¬μ–Ό 50 μžμ²΄λŠ” 금방 μ’…λ£Œλ˜μ§€λ§Œ μ½˜μ†” 좜λ ₯이 더 λ§Žμ€ μ‹œκ°„μ„ μ†Œλͺ¨ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

10. console.count

λ³„λ„μ˜ κ΅¬ν˜„ 없이도 ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€ μ§€μ •ν•œ String κ³Ό ν•¨κ»˜ 횟수λ₯Ό 좜λ ₯ν•΄μ€€λ‹€. λ”°λΌμ„œ νŠΉμ • ν•¨μˆ˜μ˜ 호좜 횟수λ₯Ό μ•Œκ³ μž ν•  λ•Œ μœ μš©ν•˜λ‹€.

function factorial(to, acc = 1) {
  console.count('factorial is called')
  if (to === 0) return acc
  return factorial(to - 1, to * acc)
}

factorial(5)
factorial is called: 1
factorial is called: 2
factorial is called: 3
factorial is called: 4
factorial is called: 5
factorial is called: 6

11. console.trace

ν•¨μˆ˜μ˜ 호좜 μŠ€νƒμ„ μΆ”μ ν•˜λŠ” 일반적인 방법은 디버깅 νˆ΄μ„ μ‚¬μš©ν•˜λŠ” 것이닀.

function f1() { f2() }

function f2() { f3() }

function f3() {
  debugger
  console.log('hi!')
}
f1()

Function Call Stack


그런데 console.trace λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λ””λ²„κ±°μ˜ 도움 없이도 터미널에 λ°”λ‘œ ν•¨μˆ˜μ˜ Call Stack 을 좜λ ₯ν•  수 μžˆμ–΄ Asynchronous Functionκ°€ ν¬ν•¨λœ 경우 ν•¨μˆ˜κ°€ μ–΄λ–»κ²Œ 호좜 λ˜μ—ˆλŠ”μ§€ μ‰½κ²Œ νŒŒμ•…ν•  수 μžˆλ„λ‘ 도와쀀닀.

function f1() { f2() }

function f2() { f3() }

function f3() {
  console.trace()
  console.log('hi!')
}
f1()
β–Ό console.trace
f3 @ main.ts:12
f2 @ main.ts:8
f1 @ main.ts:4
(anonymous) @ main.ts:15




Reference

  1. β€œconsole.” MDN. Mar. 13, 2023, Console API.
  2. β€œμ½˜μ†” 둜그 μ œλŒ€λ‘œ μ“°κ³  μžˆμ„κΉŒ?.” Youtube. Jun. 17, 2021, μ½˜μ†” 둜그 μ œλŒ€λ‘œ μ“°κ³  μžˆμ„κΉŒ?.