fun with console log

원문: Fun with console.log()πŸ’Ώ

μ—¬λŸ¬λΆ„μ΄ μ›Ή 앱을 κ°œλ°œν•œ 적이 μžˆλ‹€λ©΄, console.log(...)κ°€ μ΅μˆ™ ν•˜μ‹€κ²λ‹ˆλ‹€. 이 λ©”μ„œλ“œλŠ” 개발자 μ½˜μ†”μ— 데이터λ₯Ό 좜λ ₯ν•˜λ©°, 디버깅과 λ‘œκΉ…, 그리고 ν…ŒμŠ€νŠΈμ— μœ μš©ν•©λ‹ˆλ‹€.

console.log(console)을 μ‹€ν–‰ν•˜λ©΄, μ—¬λŸ¬λΆ„μ€ console 객체에 훨씬 더 λ§Žμ€ 것이 μžˆμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

이 ν¬μŠ€νŠΈμ—μ„œλŠ” μ—¬λŸ¬λΆ„μ˜ λ‘œκΉ… κ²½ν—˜μ„ ν–₯상할 수 μžˆλŠ” 10κ°€μ§€ μœ μš©ν•œ μš”λ Ήμ„ κ°„λž΅ν•˜κ²Œ μ„€λͺ…ν•©λ‹ˆλ‹€.

λͺ©μ°¨

Tables#

console.table() λ©”μ„œλ“œλŠ” 객체/배열을 κΉ”λ”ν•œ ν˜•μ‹μ˜ ν…Œμ΄λΈ”λ‘œ 좜λ ₯ν•©λ‹ˆλ‹€.

js
console.table({
  'Time Stamp': new Date().getTime(),
  OS: navigator['platform'],
  Browser: navigator['appCodeName'],
  Language: navigator['language'],
});

tables

Groups#

console.group() μ‚¬μš©ν•˜μ—¬ κ΄€λ ¨λœ μ½˜μ†” 문을 접을 수 μžˆλŠ” μ„Ήμ…˜κ³Ό ν•¨κ»˜ κ·Έλ£Ήν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ¬Έμžμ—΄μ„ 맀개 λ³€μˆ˜λ‘œ μ „λ‹¬ν•˜μ—¬ μ„ νƒμ μœΌλ‘œ μ„Ήμ…˜μ— 제λͺ©μ„ μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ½˜μ†”μ—μ„œ μ„Ήμ…˜μ„ μ ‘κ³  펼칠 수 μžˆμ§€λ§Œ, group λŒ€μ‹  groupCollapsedλ₯Ό μ‚¬μš©ν•˜μ—¬ 기본적으둜 μ ‘νžŒ μ±„λ‘œ ν‘œμ‹œν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ„Ήμ…˜ 내에 ν•˜μœ„ μ„Ήμ…˜μ„ μ€‘μ²©ν•˜λŠ” 것도 κ°€λŠ₯ν•˜μ§€λ§Œ groupEndλ₯Ό μ‚¬μš©ν•˜μ—¬ 각 그룹을 λ‹«μ•„μ•Ό ν•˜λŠ” 것을 κΈ°μ–΅ν•˜μ„Έμš”.

λ‹€μŒ μ˜ˆμ—μ„œλŠ” 일뢀 정보가 ν¬ν•¨λœ μ—΄λ¦° μ„Ήμ…˜μ„ 좜λ ₯ν•©λ‹ˆλ‹€.

js
console.group('URL Info');
console.log('Protocol', window.location.protocol);
console.log('Host', window.origin);
console.log('Path', window.location.pathname);
console.groupCollapsed('Meta Info');
console.log('Date Fetched', new Date().getTime());
console.log('OS', navigator['platform']);
console.log('Browser', navigator['appCodeName']);
console.log('Language', navigator['language']);
console.groupEnd();
console.groupEnd();

groups

Styled Logs#

색상, κΈ€κΌ΄, ν…μŠ€νŠΈ μŠ€νƒ€μΌ 및 크기와 같은 κΈ°λ³Έ CSS둜 둜그 좜λ ₯을 μŠ€νƒ€μΌλ§ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이에 λŒ€ν•œ λΈŒλΌμš°μ € 지원은 κ½€ λ‹€μ–‘ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ λ‹€μŒ μ½”λ“œλ₯Ό μ‹€ν–‰ν•΄λ³΄μ„Έμš”.

js
console.log(
  '%cHello World!',
  'color: #f709bb; font-family: sans-serif; text-decoration: underline;'
);

μ•„λž˜μ™€ 같은 κ²°κ³Όκ°€ 좜λ ₯된 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

styled logs

κ½€ λ©‹μ§€μ§€ μ•Šλ‚˜μš”? μ—¬λŸ¬λΆ„μ΄ ν•  수 μžˆλŠ” 것이 훨씬 λ§ŽμŠ΅λ‹ˆλ‹€!

κΈ€κΌ΄, μŠ€νƒ€μΌ, 배경색을 λ³€κ²½ν•˜κ±°λ‚˜ κ·Έλ¦Όμžλ‚˜ 곑선을 μΆ”κ°€ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

styled logs example

μ—¬κΈ° μ œκ°€ 개발자 λŒ€μ‹œλ³΄λ“œμ—μ„œ μ‚¬μš©ν•˜λŠ” 것과 μœ μ‚¬ν•œ 것이 μžˆμŠ΅λ‹ˆλ‹€. μ½”λ“œλŠ” μ—¬κΈ° μžˆμŠ΅λ‹ˆλ‹€.

styled logs example2

Time#

또 λ‹€λ₯Έ 일반적인 디버깅 기법은 μ‹€ν–‰ μ‹œκ°„μ„ μΈ‘μ •ν•˜μ—¬ μž‘μ—…μ— κ±Έλ¦¬λŠ” μ‹œκ°„μ„ μΆ”μ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” console.time()을 μ‚¬μš©ν•˜μ—¬ 타이머λ₯Ό μ‹œμž‘ν•˜κ³  λ§€κ°œλ³€μˆ˜λ‘œ λ ˆμ΄λΈ”μ„ μ „λ‹¬ν•œ λ‹€μŒ, λ™μΌν•œ λ ˆμ΄λΈ”μ„ λ§€κ°œλ³€μˆ˜λ‘œ console.timeEnd()λ₯Ό μ‚¬μš©ν•˜μ—¬ 타이머λ₯Ό μ’…λ£Œν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ console.timeLog()λ₯Ό μ‚¬μš©ν•˜μ—¬ μž₯κΈ° μ‹€ν–‰ μž‘μ—… 내에 마컀λ₯Ό μΆ”κ°€ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

js
console.time('concatenation');
let output = '';
for (var i = 1; i <= 1e6; i++) {
  output += i;
}
console.timeEnd('concatenation');
bash
concatenation: 1206ms - timer ended

time

μ„±λŠ₯ νƒ­ 내에 마컀λ₯Ό μΆ”κ°€ν•˜λŠ” λΉ„ν‘œμ€€ λ©”μ„œλ“œμΈ console.timeStamp()도 μžˆμŠ΅λ‹ˆλ‹€. 이 λ©”μ„œλ“œλŠ” 페인트 및 λ ˆμ΄μ•„μ›ƒ μ΄λ²€νŠΈμ™€ 같이 νƒ€μž„λΌμΈμ— 기둝된 λ‹€λ₯Έ μ΄λ²€νŠΈλ“€κ³Ό μ½”λ“œμ˜ νŠΉμ • 지점을 ν•¨κ»˜ μ—°κ΄€μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

Assert#

였λ₯˜κ°€ λ°œμƒν•˜κ±°λ‚˜ νŠΉμ • 쑰건이 μ°Έ λ˜λŠ” 거짓인 κ²½μš°μ—λ§Œ μ½˜μ†”μ— 기둝할 수 μžˆμŠ΅λ‹ˆλ‹€. 이 μž‘μ—…μ€ console.assert()λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ˜ν–‰ν•  수 있으며, 첫 번째 맀개 λ³€μˆ˜κ°€ falseκ°€ μ•„λ‹ˆλ©΄ μ½˜μ†”μ— 아무것도 κΈ°λ‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

첫 번째 맀개 λ³€μˆ˜λŠ” 체크할 λΆ€μšΈ 쑰건이며, κ·Έλ‹€μŒ 맀개 λ³€μˆ˜λŠ” 좜λ ₯ν•˜κ³ μž ν•˜λŠ” 0개 ν˜Ήμ€ λ§Žμ€ 데이터 μ§€μ λ“€μž…λ‹ˆλ‹€. 그리고 λ§ˆμ§€λ§‰ 맀개 λ³€μˆ˜λŠ” 좜λ ₯ν•  λ©”μ‹œμ§€μž…λ‹ˆλ‹€. λ”°λΌμ„œ console.assert(false, 'Value was false') 첫 번째 맀개 λ³€μˆ˜κ°€ false이기 λ•Œλ¬Έμ— λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

js
const errorMsg = 'the # is not even';
for (let num = 2; num <= 5; num++) {
  console.log(`the # is ${num}`);
  console.assert(num % 2 === 0, { num }, errorMsg);
}

assert

Count#

λ‘œκΉ…μ„ μœ„ν•΄ μˆ˜λ™μœΌλ‘œ 숫자λ₯Ό μ¦κ°€μ‹œν‚¨ 적이 μžˆμœΌμ‹ κ°€μš”? console.count()λŠ” μ–΄λ–€ 것이 μ‹€ν–‰λœ 횟수 λ˜λŠ” μ½”λ“œ 블둝이 μž…λ ₯된 λΉˆλ„λ₯Ό μΆ”μ ν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€.

μ„ νƒμ μœΌλ‘œ μΉ΄μš΄ν„°μ— λ ˆμ΄λΈ”μ„ μ§€μ •ν•˜μ—¬ μ—¬λŸ¬ μΉ΄μš΄ν„°λ₯Ό κ΄€λ¦¬ν•˜κ³  좜λ ₯을 더 λͺ…ν™•ν•˜κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

μΉ΄μš΄ν„°λŠ” 항상 1λΆ€ν„° μ‹œμž‘ν•©λ‹ˆλ‹€. console.countReset()을 μ‚¬μš©ν•˜μ—¬ μ–Έμ œλ“ μ§€ μΉ΄μš΄ν„°λ₯Ό 리셋할 수 μžˆμŠ΅λ‹ˆλ‹€. 이 κ²½μš°λ„ λ ˆμ΄λΈ” 맀개 λ³€μˆ˜λ₯Ό μ„ νƒμ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ μ½”λ“œλŠ” 각 ν•­λͺ©μ— λŒ€ν•œ μΉ΄μš΄ν„°λ₯Ό μ¦κ°€μ‹œν‚€λ©°, μ΅œμ’…κ°’μ€ 8이 λ©λ‹ˆλ‹€.

js
const numbers = [1, 2, 3, 30, 69, 120, 240, 420];
numbers.forEach(name => {
  console.count();
});

λ‹€μŒμ€ λ ˆμ΄λΈ”μ΄ μ§€μ •λœ μΉ΄μš΄ν„°μ˜ 좜λ ₯ μ˜ˆμž…λ‹ˆλ‹€.

count

λ ˆμ΄λΈ”μ„ μ „λ‹¬ν•˜λŠ” λŒ€μ‹  값을 μ‚¬μš©ν•˜λ©΄ 각 쑰건 값에 λŒ€ν•΄ λ³„λ„μ˜ μΉ΄μš΄ν„°λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.

js
console.count(NaN); // NaN: 1
console.count(NaN + 3); // NaN: 2
console.count(1 / 0); // Infinity: 1
console.count(String(1 / 0)); // Infinity: 2

Trace#

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μš°λ¦¬λŠ” μ’…μ’… 깊게 μ€‘μ²©λœ λ©”μ„œλ“œμ™€ 객체λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. console.trace()λ₯Ό μ‚¬μš©ν•˜μ—¬ μŠ€νƒ 좔적을 ν•  수 있고, νŠΉμ • 지점에 λ„λ‹¬ν•˜κΈ° μœ„ν•΄ 호좜된 λ©”μ„œλ“œλ₯Ό 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

trace

μ„ νƒμ μœΌλ‘œ μŠ€νƒ 좔적과 ν•¨κ»˜ 좜λ ₯될 데이터λ₯Ό 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

Dir#

μ½˜μ†”μ— 큰 객체λ₯Ό λ‘œκΉ…ν•˜λŠ” 경우, 그것은 읽기 μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€. console.dir() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν™•μž₯ κ°€λŠ₯ν•œ 트리 ꡬ쑰둜 ν˜•μ‹μ„ μ§€μ •ν•©λ‹ˆλ‹€.

λ‹€μŒμ€ 디렉터리 μŠ€νƒ€μΌ μ½˜μ†” 좜λ ₯의 μ—μ‹œμž…λ‹ˆλ‹€.

dir

console.dirxml()을 μ‚¬μš©ν•˜μ—¬ μœ μ‚¬ν•œ λ°©λ²•μœΌλ‘œ XML λ˜λŠ” HTML 기반 트리λ₯Ό 인쇄할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

Debug#

μ—‘ 내에 μ—¬λŸ¬λΆ„μ΄ 개발 쀑에 μ‚¬μš©ν•˜λŠ” λͺ‡λͺ‡ λ‘œκ·Έκ°€ μ„€μ •λ˜μ–΄ μžˆμ„ 수 μžˆμ§€λ§Œ, 그것듀이 μ‚¬μš©μžμ—κ²Œ 보이기λ₯Ό μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 둜그 ꡬ문을 console.debug()둜 λŒ€μ²΄ν•˜λ©΄ console.log와 μ •ν™•νžˆ 같은 λ°©μ‹μœΌλ‘œ μž‘λ™ν•˜μ§€λ§Œ, λΉŒλ“œ μ‹œμŠ€ν…œμ—μ„œ μ œκ±°λ˜κ±°λ‚˜ ν”„λ‘œλ•μ…˜ λͺ¨λ“œμ—μ„œ 싀행될 λ•ŒλŠ” λΉ„ν™œμ„±ν™”λ©λ‹ˆλ‹€.

둜그 μˆ˜μ€€#

λΈŒλΌμš°μ € μ½˜μ†”μ—λŠ” μ—¬λŸ¬ ν•„ν„°(정보, κ²½κ³ , μ—λŸ¬)κ°€ 있으며, 이λ₯Ό 톡해 둜그된 λ°μ΄ν„°μ˜ 상세 정도λ₯Ό λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν•„ν„°λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ‹€μŒ 쀑 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 둜그 ꡬ문을 μ „ν™˜ν•˜μ‹­μ‹œμ˜€.

  • console.info() - λ‘œκΉ… λͺ©μ μ˜ 정보성 λ©”μ‹œμ§€λ‘œ, 일반적으둜 μž‘μ€ β€œi”와/λ˜λŠ” νŒŒλž€μƒ‰ 배경을 ν¬ν•¨ν•©λ‹ˆλ‹€.
  • console.warn() - κ²½κ³  / 치λͺ…적이지 μ•Šμ€ 였λ₯˜λ₯Ό λ‚˜νƒ€λ‚΄λ©°, 일반적으둜 μ‚Όκ°ν˜• λŠλ‚Œν‘œ 마크 와/λ˜λŠ” λ…Έλž€μƒ‰ 배경을 ν¬ν•¨ν•©λ‹ˆλ‹€.
  • console.error() - κΈ°λŠ₯에 영ν–₯을 λ―ΈμΉ  수 μžˆλŠ” 였λ₯˜λ₯Ό λ‚˜νƒ€λ‚΄λ©°, 일반적으둜 μ›ν˜• λŠλ‚Œν‘œμ™€/λ˜λŠ” λΉ¨κ°„ 배경을 ν¬ν•¨ν•©λ‹ˆλ‹€.

Node.jsμ—μ„œ μ„œλ‘œ λ‹€λ₯Έ 둜그 λ ˆλ²¨μ€ 운영 ν™˜κ²½μ—μ„œ 싀행될 λ•Œ μ„œλ‘œ λ‹€λ₯Έ μŠ€νŠΈλ¦Όμ— κΈ°λ‘λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 운영 ν™˜κ²½μ—μ„œ error()λŠ” stderr에 기둝되고 logλŠ” stdout에 좜λ ₯λ˜μ§€λ§Œ, 개발 ν™˜κ²½μ—μ„œλŠ” λͺ¨λ‘ μ •μƒμ μœΌλ‘œ μ½˜μ†”μ— ν‘œμ‹œλ©λ‹ˆλ‹€.

닀쀑 κ°’ 둜그#

console κ°μ²΄λŠ” λŒ€λΆ€λΆ„ μ—¬λŸ¬ 맀개 λ³€μˆ˜λ₯Ό ν—ˆμš©ν•˜λ―€λ‘œ 좜λ ₯에 λ ˆμ΄λΈ”μ„ μΆ”κ°€ν•˜κ±°λ‚˜ ν•œ λ²ˆμ— μ—¬λŸ¬ 데이터 지점을 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. console.log('User: ', user.name);

κ·ΈλŸ¬λ‚˜ λ ˆμ΄λΈ”μ΄ μ§€μ •λœ μ—¬λŸ¬ 값을 μΈμ‡„ν•˜λŠ” 더 μ‰¬μš΄ 접근법은 ꡬ쑰 λΆ„ν•΄ ν• λ‹Ή(object deconstructing)을 μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, x,y,z와 같은 μ„Έ 개의 λ³€μˆ˜κ°€ μžˆλŠ” 경우, 각 λ³€μˆ˜ 이름과 값이 좜λ ₯λ˜λ„λ‘ console.log({x, y, z});와 같이 μ€‘κ΄„ν˜Έλ‘œ λ‘˜λŸ¬μ‹Έμ„œ 객체둜 λ‘œκΉ… ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Multi-Value Logs

둜그 λ¬Έμžμ—΄ ν˜•μ‹#

좜λ ₯ν•  ν˜•μ‹ λ¬Έμžμ—΄μ„ λΉŒλ“œν•΄μ•Ό ν•˜λŠ” 경우, ν˜•μ‹ μ§€μ •μžλ₯Ό μ‚¬μš©ν•˜μ—¬ Cμ–Έμ–΄ μŠ€νƒ€μΌ printfλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같은 μ§€μ •μžλ“€μ΄ μ§€μ›λ©λ‹ˆλ‹€.

  • %s - λ¬Έμžμ—΄ λ˜λŠ” λ¬Έμžμ—΄λ‘œ λ³€ν™˜λ˜λŠ” λ‹€λ₯Έ λͺ¨λ“  νƒ€μž…
  • %d / %i - μ •μˆ˜
  • %f - μ‹€μˆ˜
  • %o - 졜적의 ν˜•μ‹ μ‚¬μš©
  • %O - κΈ°λ³Έ ν˜•μ‹ μ‚¬μš©
  • %c - μ‚¬μš©μž μ •μ˜ ν˜•μ‹ μ‚¬μš© (더 λ§Žμ€ 정보)

μ˜ˆμ‹œ

js
console.log(
  'Hello %s, welcome to the year %d!',
  'Alicia',
  new Date().getFullYear()
);
// Hello Alicia, welcome to the year 2022!

λ¬Όλ‘  ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄μ„ μ‚¬μš©ν•˜μ—¬ λ™μΌν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 짧은 λ¬Έμžμ—΄μ˜ 경우 ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄ 방식이 더 읽기 μ‰½μŠ΅λ‹ˆλ‹€.

Clear#

λ§ˆμ§€λ§‰μœΌλ‘œ μ΄λ²€νŠΈμ—μ„œ 좜λ ₯을 찾을 λ•Œ, μ—¬λŸ¬λΆ„μ€ νŽ˜μ΄μ§€κ°€ 처음 λ‘œλ”©λ˜λ©΄μ„œ μ½˜μ†”μ— 둜그 된 λͺ¨λ“  것을 μ œκ±°ν•˜κ³  싢을 수 μžˆμŠ΅λ‹ˆλ‹€. 이 μž‘μ—…μ€ console.clear()λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ˜ν–‰ν•  수 있으며, λͺ¨λ“  λ‚΄μš©μ„ μ§€μš°μ§€λ§Œ, μ–΄λ–€ 데이터도 μ΄ˆκΈ°ν™”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

일반적으둜 νœ΄μ§€ν†΅ μ•„μ΄μ½˜μ„ ν΄λ¦­ν•˜μ—¬ μ½˜μ†”μ„ μ§€μšΈ 수 있고, ν•„ν„° ν…μŠ€νŠΈ μž…λ ₯을 톡해 μ½˜μ†”μ„ 검색할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

νŠΉλ³„ν•œ λΈŒλΌμš°μ € λ©”μ„œλ“œ#

λΈŒλΌμš°μ € μ½˜μ†”μ—μ„œ 직접 μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ, 디버깅, μžλ™ν™” 및 ν…ŒμŠ€νŠΈμ— 맀우 μœ μš©ν•œ λͺ‡ κ°€μ§€ κ°„λ‹¨ν•œ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

그쀑 κ°€μž₯ μœ μš©ν•œ 것듀은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • $() - Document.querySelector()의 μ•½μ–΄μž…λ‹ˆλ‹€. (DOM μš”μ†Œλ₯Ό μ„ νƒν•˜κΈ° μœ„ν•œ jQuery μŠ€νƒ€μΌ)
  • $$() - μœ„μ™€ λ™μΌν•˜μ§€λ§Œ, λ°°μ—΄μ—μ„œ μ—¬λŸ¬ μš”μ†Œλ₯Ό λ°˜ν™˜ν•  λ•Œ λͺ¨λ‘λ₯Ό 선택(selectAll) ν•©λ‹ˆλ‹€.
  • $_ - λ§ˆμ§€λ§‰μœΌλ‘œ ν‰κ°€λœ μ‹μ˜ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • $0 - 검사 μ°½μ—μ„œ κ°€μž₯ μ΅œκ·Όμ— μ„ νƒν•œ DOM μš”μ†Œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • $1…$4λ₯Ό μ‚¬μš©ν•˜μ—¬ 이전에 μ„ νƒν•œ UI μš”μ†Œλ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • $x() - Xpath 쿼리λ₯Ό μ‚¬μš©ν•˜μ—¬ DOM μš”μ†Œλ₯Ό 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • keys() 와 values() - Object.getKeys()의 μ•½μ–΄λ‘œ 객체의 ν‚€ λ˜λŠ” κ°’μ˜ 배열을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • copy() - ν΄λ¦½λ³΄λ“œμ— λ‚΄μš©μ„ λ³΅μ‚¬ν•©λ‹ˆλ‹€.
  • monitorEvents() - μ§€μ •λœ μ΄λ²€νŠΈκ°€ λ°œμƒν•  λ•Œλ§ˆλ‹€ λͺ…령을 μ‹€ν–‰ν•©λ‹ˆλ‹€.
  • console.table()κ³Ό 같은 νŠΉμ • 곡톡 μ½˜μ†” λͺ…λ Ήμ˜ 경우, μ•žμ— console.을 μž…λ ₯ν•  ν•„μš” 없이, table()만 μž…λ ₯해도 λ©λ‹ˆλ‹€.

여기에 더 λ§Žμ€ μ½˜μ†” 단좕 μ»€λ§¨λ“œκ°€ μ‘΄μž¬ν•˜λ©° 전체 λ¦¬μŠ€νŠΈλŠ” μ΄κ²ƒμž…λ‹ˆλ‹€.

κ²½κ³  이것은 개발자 도ꡬ μ½˜μ†”μ—μ„œλ§Œ μž‘λ™ν•˜λ©°, μ—¬λŸ¬λΆ„μ˜ μ½”λ“œμ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€!

그리고 μ’€ 더…#

μ½˜μ†”μ— λ‘œκΉ…ν•  수 μžˆλŠ” μž‘μ—…μ€ 훨씬 더 λ§ŽμŠ΅λ‹ˆλ‹€! μžμ„Έν•œ λ‚΄μš©μ€ MDN console λ¬Έμ„œ λ˜λŠ” 크둬 개발자 μ½˜μ†” λ¬Έμ„œμ—μ„œ ν™•μΈν•˜μ„Έμš”.

μ•„λž˜λŠ” λͺ¨λ²” 사둀에 λŒ€ν•œ κ°„λž΅ν•œ μ°Έκ³  μ‚¬ν•­μž…λ‹ˆλ‹€.

  • console.log ꡬ문이 메인 λΈŒλžœμΉ˜μ— λ³‘ν•©λ˜μ§€ μ•Šλ„λ‘ lint 룰을 μ •μ˜ν•˜μ„Έμš”.
  • ν™˜κ²½μ— 따라 디버그 둜그λ₯Ό ν™œμ„±ν™”/λΉ„ν™œμ„±ν™”ν•˜κ³  μ μ ˆν•œ 둜그 μˆ˜μ€€μ„ μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  ν˜•μ‹μ„ μ μš©ν•  수 μžˆλŠ” 래퍼(wrapper) ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜μ„Έμš”. 이것은 λ˜ν•œ μ½”λ“œ μ—…λ°μ΄νŠΈκ°€ ν•œ κ³³μ—μ„œλ§Œ ν•„μš”ν•œ μ„œλ“œνŒŒν‹°(third-party) λ‘œκΉ… μ„œλΉ„μŠ€μ™€ ν†΅ν•©ν•˜λŠ” 데도 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ―Όκ°ν•œ 정보λ₯Ό 둜그둜 남기지 λ§ˆμ„Έμš”. λΈŒλΌμš°μ € λ‘œκ·ΈλŠ” μ„€μΉ˜λœ ν™•μž₯ ν”„λ‘œκ·Έλž¨μ— μ˜ν•΄ 캑처될 수 있기 λ•Œλ¬Έμ— μ•ˆμ „ν•œ κ²ƒμœΌλ‘œ κ°„μ£Όν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€.
  • 필터링 및 λΉ„ν™œμ„±ν™”λ₯Ό 더 μ‰½κ²Œ λ§Œλ“€κΈ° μœ„ν•΄ 항상 μ˜¬λ°”λ₯Έ 둜그 μˆ˜μ€€(info,warn,error와 같은)을 μ‚¬μš©ν•˜μ„Έμš”.
  • ν•„μš”ν•œ 경우, μ‹œμŠ€ν…œμ—μ„œ 둜그λ₯Ό ꡬ문 뢄석할 수 μžˆλ„λ‘, μΌκ΄€λœ ν˜•μ‹μ„ λ”°λ₯΄μ„Έμš”.
  • 항상 μ§§κ³  의미 μžˆλŠ” 영문 둜그 λ©”μ‹œμ§€λ₯Ό μž‘μ„±ν•˜μ„Έμš”.
  • 둜그 μ•ˆμ— λ§₯락 λ˜λŠ” λ²”μ£Όλ₯Ό ν¬ν•¨ν•˜μ„Έμš”.
  • λ„ˆλ¬΄ λ‚¨μš©ν•˜μ§€ 말고, μœ μš©ν•œ μ •λ³΄λ§Œ 둜그둜 λ‚¨κΈ°μ„Έμš”.

πŸš€ ν•œκ΅­μ–΄λ‘œ 된 ν”„λŸ°νŠΈμ—”λ“œ 아티클을 λΉ λ₯΄κ²Œ 받아보고 μ‹Άλ‹€λ©΄ Korean FE Article(https://kofearticle.substack.com/)을 κ΅¬λ…ν•΄μ£Όμ„Έμš”!