본문 바로가기

FrontEnd

[번역] 자바스크립트 디버깅 완벽가이드

반응형

Chrome Devtool을 사용한 디버깅 방법을 마스터해 봅니다.

 

아래 글을 번역한 글입니다 : 

https://dev.to/atapas/the-definitive-guide-to-javascript-debugging-2021-edition-116n

 

The definitive guide to JavaScript Debugging [2021 Edition]

Introduction As developers, we’ve traditionally rooted out errors in our programs (we’ll c...

dev.to

들어가며

개발자인 우리는 전통적으로 로그 문을 사용해 프로그램의 오류를 근절했습니다.
JavaScript에는 이를 위한 유명한 console.log() 메서드가 있습니다.

console.log 문은 좋지만 단계별 디버깅을 수행할 수 있는 도구보다 효율성이 떨어집니다.
이 아티클에서는 Google 크롬 개발자 도구(DevTools라고도 함)를 사용하여
JavaScript 애플리케이션을 쉽게 디버깅하는 방법을 배웁니다.
 
DevTools 사용의 장점은
각 브라우저 공급업체(예: Firefox 및 Microsoft)에서 JavaScript 애플리케이션을 디버깅하는 자체 도구를 제공하며
각 도구가 비슷한 방식으로 동작한다는 것입니다.
따라서 한 브라우저에서 개발 도구를 사용하는 방법을 배우면
다른 브라우저의 개발 도구도 쉽게 사용할 수 있습니다.

오늘 디버깅해 볼 것

Greet Me 앱을 살펴보세요.

이 JavaScript 앱은 귀하의 이름을 묻고,

귀하를 위한 개인화된 인사말을 전달하는 데 사용되는 '소원(wish)'을 제출하도록 귀하를 초대합니다.

그림 1 : 에러가 발생한 Greeting 앱

문제가 있습니다. 인사말 메시지가 소원 부분을 올바르게 인쇄하지 않습니다. 악성 단어인 NaN을 삽입합니다.

고맙게도 Chrome DevTools를 사용하면 문제를 식별할 수 있습니다.

https://greet-me-debugging.vercel.app/ 에서 해당 앱을 직접 실행해 볼 수 있습니다.

 

전체 코드는 링크(app code from GitHub)에서 확인할 수 있습니다.

소스 패널 이해하기

DevTools는 DOM 검사, 프로파일링, 네트워크 호출 검사를 포함하여 디버깅 작업을 수행하기 위한 다양한 도구를 제공합니다.
하지만 지금 우리가 관심을 갖고 있는 것은 자바스크립트 디버깅에 도움이 되는 Sources 패널입니다.

 

  • F12 키를 누르거나 Ctrl+Shift+I(Windows, Linux) 또는 Command+Option+I(Mac) 단축키를 사용하여 DevTools를 열 수 있습니다.

소스 탭을 클릭하여 소스 패널로 이동합니다.

그림 2 : 소스 패널 열기

소스 패널에는 세 가지 기본 섹션이 있습니다.

  1. 파일 네비게이터(탐색기) 섹션: greeting 페이지에서 요청하는 모든 파일이 여기에 나열됩니다.
  2. 코드 에디터(편집기) 섹션: 네비게이터 창에서 파일을 선택하면 파일 내용이 여기에 나열됩니다. 여기에서 코드를 편집할 수도 있습니다.
  3. 디버거 섹션: 여기에서 중단점 설정, 변수 값 검사, 변경 사항 감시 등을 위해 사용할 수 있는 많은 도구를 찾을 수 있습니다.

그림3 : 소스 패널의 각 섹션

DevTools 창이 넓거나 별도의 창에 도킹되지 않은 경우
코드 편집기 창 오른쪽에 디버거 섹션이 표시됩니다.

그림 4: DevTool 창이 활짝 열려 있습니다.

중단점 설정하기

디버깅을 시작하려면 먼저 중단점을 설정해야 합니다.
중단점은 디버그할 수 있도록 코드 실행을 일시 중지하려는 논리적 지점입니다.
DevTools를 사용하면 다양한 방법으로 중단점을 설정할 수 있습니다.
애플리케이션 디버깅을 시작하면서 이를 설정하는 방법을 배웁니다.
  • 코드 라인에서
  • 조건문에서
  • DOM 노드에서
  • 이벤트 리스너에서.

코드 라인에서 중단점 설정하기

코드 라인 중단점을 설정하려면:
  1. 소스 탭을 클릭합니다.
  2. 파일 탐색기 섹션에서 소스 파일을 찾습니다.
  3. 오른쪽에 있는 코드 편집기 섹션의 코드 줄로 이동합니다.
  4. 라인 번호 열을 클릭하여 해당 라인에 중단점을 설정합니다.

그림 5: 코드 라인 중단점 설정

여기에서는 6번 줄에 중단점을 설정했습니다. 여기서 코드 실행이 일시 중지됩니다.
: 조사할 코드의 정확한 영역을 모를 때 해당 방법을 사용합니다.
여러 줄의 코드 중단점을 설정하고 조사할 수도 있습니다.
우리는 이 아티클의 뒷부분에서 그것을 볼 것입니다.
 

조건부 중단점 설정

조건부 중단점을 설정하려면:
  • 소스 탭을 클릭합니다.
  • 파일 탐색기 섹션에서 소스 파일을 찾습니다.
  • 오른쪽의 코드 편집기 섹션에서 코드 라인으로 이동합니다.
  • 라인 번호를 마우스 오른쪽 버튼으로 클릭하고 조건부 중단점 추가 옵션을 선택합니다.

코드 라인 아래에 대화 상자가 나타나면, 조건 입력을 시작합니다.

그림 6a: 줄 번호를 마우스 오른쪽 버튼으로 클릭

  • 입력 시 조건 선택을 제안하는 자동 완성 옵션이 표시됩니다.
    • Enter 키를 눌러 중단점을 활성화합니다.
    • 줄 번호 열 위에 주황색 아이콘이 표시되어야 합니다.

그림 6b: 조건 입력

  • 조건부 중단점이 활성화되었습니다.
  • 코드 실행은 print() 함수가 name===Joe인 상태로 호출될 때마다 일시 중지됩니다.

그림 6c: 조건부 중단점이 활성화되었습니다.

팁: 조사할 코드의 특정 영역을 알고 있는 경우 조건부 중단점을 사용하십시오.
코드 영역을 알고 있을 수 있으므로 추가 조건을 사용하여 문제의 근본 원인을 찾을 수 있습니다.

이벤트 리스너에 중단점 설정

이벤트 리스너에 중단점을 설정하려면 다음을 수행하십시오.
  1. 소스 탭을 클릭합니다.
  2. 디버거 섹션에서 Event Listener Breakpoints 창을 확장합니다.
  3. 카테고리 목록에서 이벤트 리스너 목록을 선택하여 중단점을 설정합니다.
  4. 애플리케이션에 버튼 클릭 이벤트가 있습니다. 마우스 옵션 아래의 click checkbox를 선택합니다.

그림 7: 클릭 이벤트 리스너에 중단점 설정

: 이벤트가 발생한 후 실행되는 이벤트 리스너 코드를 일시 중지하려는 경우에 사용하십시오.

DOM 노드에 중단점 설정

DevTools는 DOM 검사 및 디버깅에도 강력합니다.
DOM에서 항목이 추가, 제거 또는 변경될 때 코드 실행을 일시 중지하도록 중단점을 설정할 수 있습니다.
DOM 변경에 중단점을 설정하려면
  • 요소 탭을 클릭합니다.
  • 중단점을 설정할 요소로 이동합니다.
  • 요소를 마우스 오른쪽 버튼으로 클릭하여 상황에 맞는 메뉴를 가져옵니다.
  • 중단을 선택한 다음 , 다음 중 하나를 선택합니다.
    • Subtree modifications(하위 트리 수정), 
    • Attribute modifications(특성 수정)
    • Node removal(노드 제거)
그림 8: DOM 변경에 중단점 추가
위 그림에서 볼 수 있듯이 하위 트리 수정 조건으로 출력 DIV의 DOM 변경에 중단점을 설정하고 있습니다.
인사말 메시지가 출력 DIV에 추가되고 하위 트리가 수정되면, 중단점에 의해 실행이 중단됩니다.
(해당 라인이 실행되기 전에 중단됨)
document.getElementById('output').innerHTML = '<span class="message">' + message + '</span>';
위의 중단점에 의해 중단된 디버거

팁: DOM 변경으로 인해 버그가 발생한 것으로 의심될 때 사용하십시오.
돔 조작과 관련한 JavaScript 코드 실행은 DOM 변경 시 디버거가 중단될 때 자동으로 일시 중지됩니다.


소스 코드 살펴보기

이제 우리는 중단점을 설정하는 모든 중요한 방법을 알고 있습니다.
복잡한 디버깅 상황에서는 이들을 조합하여 사용해야 할 수도 있습니다.
문제를 파악하기 위해 중단점을 통과하는 방법을 살펴보겠습니다.
 
디버거 섹션은 코드를 단계별로 실행하기 위한 5개의 컨트롤을 제공합니다.

그림 9: Step through 컨트롤

Step;한 줄 씩 단계별 실행(Key shortcut – F9)

이 옵션을 사용하면 JavaScript 코드를 한 줄씩 단계별로 실행할 수 있습니다.
도중에 함수 호출이 있는 경우 단계별 실행도 함수 내부로 들어가 한 줄씩 실행한 다음 빠져나옵니다.

그림 9a: 한 줄씩 단계별 수행

Step Over;한 줄 건너뛰어 실행(Key shortcut – F10)

이 옵션을 사용하면 특정 라인의 함수 실행을 자세히 조사하지 않습니다. 
경우에 따라 일부 함수가 제대로 작동하는 것이 확실하고 이를 검사하는 데 시간을 보내고 싶지 않을 수 있습니다.

이 상황에서는 스텝 오버를 사용해야 합니다.

아래 예에서는 logger() 함수를 건너뜁니다.

그림 9b: 함수 건너뛰기

Step Into;함수 안으로 들어가기 (Key shortcut – F11)

함수를 더 깊이 조사하려면 이 옵션을 사용하세요.
한 단계씩 진행할 때 함수가 예기치 않게 작동하는 느낌이 들고 해당 함수 내부를 검사하고 싶을 수 있습니다.
step into를 사용하여 함수 내부로 들어가 디버그합니다.

아래 예에서는 logger() 함수의 내부를 조사합니다.

그림 9c: 다음 함수 호출 시작점으로 들어가기

Step out;함수 밖으로 나오기 (Key shortcut – Shift + F11)

조사 중인 함수를 더 이상 조사하고 싶지 않을 수 있습니다.
이 옵션을 사용하여 함수 실행을 종료합니다.

아래 예에서 우리는 logger() 함수 내부로 들어갔다가 즉시 빠져나옵니다.

그림 9d: 현재 함수에서 나가기

Resume/Jump; 다음 중단점으로 이동 (Key shortcut – F8)

때때로 중간에 코드를 디버깅하지 않고 하나의 중단점에서 다른 중단점으로 점프하고 싶을 수 있습니다.
다음 중단점으로 이동하려면 이 옵션을 사용하십시오.

그림 9e: 재개 또는 다음 중단점으로 점프


스코프, 콜 스택, 값 검사

디버그할 행을 단계별로 실행하면
변수의 범위와 값, 함수 호출의 호출 스택을 검사할 수 있습니다.

스코프

스코프 패널을 사용하여 전역 스코프에 무엇이 있고 해당 변수가 무엇인지 알아낼 수 있습니다.
this 키워드의 값도 확인할 수 있습니다.

그림 10a: 스코프 패널

콜 스택

콜 스택 패널은 함수 실행 스택을 식별하는 데 도움이 됩니다.

그림 10b: 콜 스택

값 검사는 코드에서 버그를 식별하는 기본 방법입니다.
단계별로 이동할 때 변수에 마우스를 올려 놓는 것만으로 값을 검사할 수 있습니다.

아래 예에서는 코드 실행 단계에서 값을 검사하기 위해 변수 명을 선택하고 있습니다.

그림 10c: 마우스 오버로 값 검사

또한 코드 섹션을 표현식으로 선택하여 값을 확인할 수 있습니다.
아래 예에서는 값을 검사하기 위해 document.getElementById('m_wish') 표현식을 선택했습니다.
그림 10d: 표현식 값 검사

Watch 섹션

watch 섹션에서는 하나 이상의 표현식을 추가하고 실행 시 해당 값을 감시할 수 있습니다.
이 기능은 코드 논리 외부에서 일부 계산을 수행하려는 경우 매우 유용합니다.

(주 : 중단점에서 해당 변수 값을 가져와 코드를 건드리지 않고 디버거에서 뭔가 해볼 수 있음)

 

코드 영역의 모든 변수를 결합하고 유효한 JavaScript 표현식을 형성할 수 있습니다.
코드 실행 단계별로 변하는 표현식의 값을 확인할 수 있습니다.

Watch를 추가하는 데 필요한 단계는 다음과 같습니다.
  • Watch 섹션 위의 + 아이콘을 클릭합니다.

그림 11a: watch 식 추가

확인하고픈 표현식을 추가합니다. 이 예에서는 해당 값을 확인하려는 변수 wish를 추가했습니다.
그림 11b: Watch에 표현식 값 등록

watch를 사용하는 또 다른 방법은 콘솔 드로어를 이용하는 것입니다. 활성화 방법은 아래 예를 참조하십시오.

그림 11c: 콘솔 드로어 활성화

중단점 비활성화 및 제거

모든 중단점을 한 번에 비활성화하려면 Deactivate Breakpoints 버튼(아래 원으로 표시됨)을 클릭하십시오.

그림 12a: 모든 중단점 비활성화

위의 방법은 중단점을 제거하지 않습니다.
필요한 기간 동안 비활성화합니다.

중단점을 활성화하려면 동일한 버튼을 다시 클릭하십시오.

 

확인란을 선택 취소하여 중단점 패널에서 하나 이상의 중단점을 제거할 수 있습니다.
마우스 오른쪽 버튼을 클릭하고 모든 중단점 제거 옵션을 선택하여 모든 중단점을 영구적으로 제거할 수 있습니다.

그림 12b: 중단점을 하나 이상 또는 모두 제거합니다.


마지막으로, 버그 고치기

지금까지 배운 내용을 바탕으로 Greet Me 앱이 예상대로 작동하도록 하기 위한 수정 사항은 무엇이라고 생각하십니까?
알아내셨나요?

 

문제는 메시지를 구성하는 wish 변수 앞에 있는 여분의 + 입니다.
// This is the line where the issue is.
// Identify the extra '+' before the wish.
const message = 'Hello ' 
                        + name 
                        + ', Your wish `' 
                        + + wish 
                        + '` may come true!';
현실적인 디버깅 시나리오에서 해당 문제를 어떻게 찾을 수 있습니까? 이 짧은 비디오 데모를 보십시오.

Visual Studio Code로 Javascript 디버깅하기

VS Code 디버깅 설정

VS Code에는 다양한 기능을 활성화하기 위한 여러 확장(예: 플러그인)이 있습니다.
JavaScript 디버깅을 활성화하려면 Debugger for Chrome이라는 확장 프로그램을 설치해야 합니다.
다음 방법 중 하나로 설치할 수 있습니다.

  • Debugger for Chrome 홈페이지로 이동하여 설치 버튼을 클릭합니다. 이렇게 하면 VS Code가 시작되고 자동으로 설치가 시작됩니다.
  • VS Code의 확장 패널에서 이 확장을 검색하여 설치할 수 있습니다.

그림 13a: VS Code 확장 설치

설치 후 왼쪽에서 실행 옵션을 클릭하고 JavaScript 애플리케이션을 실행/디버그하기 위한 구성을 생성합니다.

그림 13b: 구성으로 디버깅 활성화

일부 설정 정보가 포함된 launch.json이라는 파일이 생성됩니다. 다음과 같이 보일 수 있습니다.
  {
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: <https://go.microsoft.com/fwlink/?linkid=830387>
    "version": "0.2.0",
    "configurations": [
        {
            "type": "chrome",
            "request": "launch",
            "name": "Debug the Greet Me app",
            "url": "<http://localhost:5500>",
            "webRoot": "${workspaceFolder}"
        }
    ]
  }
다음 매개변수를 변경할 수 있습니다.
  • name: 앱에 적합한 모든 것. 변경하는 것은 선택 사항입니다.
  • url: 앱이 로컬에서 실행 중인 URL입니다.
  • webRoot: 기본적으로 값은 현재 폴더인 ${workspaceFolder}입니다.
    • index.html과 같은 파일이 있는 진입점 폴더로 변경할 수 있습니다.

마지막 단계는 왼쪽 상단 모서리에 있는 작은 재생 아이콘을 클릭하여 디버깅을 시작하는 것입니다.

그림 13c: 디버깅 시작하기

디버거 패널 이해하기

VS Code는 JavaScript 디버깅을 위해 DevTools와 유사한 도구를 제공합니다.
이 문서에서 지금까지 본 Google Chrome JavaScript 디버거와 많은 유사점을 찾을 수 있습니다.
알아야 할 기본 섹션은 다음과 같습니다.

  1. 디버깅 활성화: 재생 버튼을 눌러 디버깅 옵션을 활성화합니다.
  2. 중단점을 단계별로 실행하고 디버깅을 일시 중지하거나 중지하기 위한 컨트롤입니다. 일부 키보드 단축키가 다를 수 있다는 점을 제외하면 Chrome DevTools에서 본 것과 거의 비슷합니다.
  3. 소스 코드에 중단점을 설정합니다. 이것은 브라우저의 크롬 개발자 도구와 비슷합니다.
  4. 변수 범위와 값을 볼 수 있는 스코프 패널. 이것은 브라우저의 크롬 개발자 도구와 비슷합니다.
  5. 코드 외부에 표현식을 정의하고 보는 watch 패널.
  6. 실행 함수의 호출 스택.
  7. 활성화, 비활성화 및 제거할 중단점 목록입니다.
  8. 콘솔 로그 메시지를 읽기 위한 디버그 콘솔.
그림 13d: VS Code 디버깅 컨트롤 분석

데모

다음은 VS Code 디버깅 제어 사용법을 보여주는 간단한 데모(1분)입니다.


비동기 로직 디버깅하기

콜스택의 async 체크박스 이용

요약

  • 로거보다 도구를 사용하여 JavaScript 코드를 디버깅하는 것이 항상 더 좋습니다.
  • Google Chrome DevTools 또는 VS Code 디버거 확장과 같은 도구는 console.log()에 의존하는 것보다 훨씬 낫습니다.
  • DevTools Source Panel은 변수 값을 검사하고, 식을 관찰하고, 범위를 이해하고, 호출 스택을 읽는 등의 기능을 갖춘 매우 강력한 도구입니다.
  • 중단점을 설정하는 방법에는 여러 가지가 있으며 디버깅 상황에 따라 사용해야 합니다.
  • 중단점 관리는 DevTools을 이용하며 강력합니다.
  • VS Code 디버거 확장 프로그램은 반드시 사용해야 합니다.




 

반응형