크롬 및 계열 브라우저(엣지, 웨일)의 "개발자 도구(F12)"에서 Source Maps를 활용한 효율적인 디버깅 방법 완벽 분석

DevTools Source Maps

개발 과정에서 우리는 종종 Minification(최소화)이나 Transpilation(트랜스파일)과 같은 빌드 프로세스를 거친 코드를 마주하게 됩니다. 이러한 과정은 최종 사용자에게 제공되는 코드의 크기를 줄여 웹사이트의 로딩 속도를 향상시키는 데 도움을 주지만, 개발자가 디버깅(Debugging)을 수행할 때는 어려움을 야기합니다. 이러한 문제점을 해결하기 위해 등장한 것이 바로 Source Map입니다.

Minification(최소화)이나 Transpilation(트랜스파일)

본문에서는 Chrome 개발자 도구(DevTools, 단축키 F12)에서 Source Maps를 어떻게 활용하여 개발자가 원래 작성한 소스 코드 수준에서 효율적으로 디버깅할 수 있는지에 대한 모든 것을 상세하게 알아봅니다. 강의 내용을 기반으로 더욱 깊이 있는 해설과 풍부한 예시를 제공하여, 독자 여러분의 웹 개발 생산성을 향상시키는 것을 목표로 합니다.


Source Map이란 무엇일까요?

Source Map 정의

Source Map은 Minification이나 Transpilation과 같은 빌드 프로세스를 거치면서 변환된 코드와 원래 소스 코드 사이의 매핑 정보를 담고 있는 파일입니다. 이 파일을 통해 개발자 도구는 축소되거나 변환된 코드가 원래 어떤 코드에 해당되는지를 파악하고, 개발자에게 익숙한 원래의 소스 코드 형태로 디버깅 환경을 제공할 수 있습니다.

Minification(최소화): 소스 코드에서 불필요한 공백, 주석, 긴 변수명 등을 제거하여 파일 크기를 줄이는 기술입니다.

Transpilation(트랜스파일): 한 프로그래밍 언어로 작성된 코드를 다른 프로그래밍 언어의 코드로 변환하는 과정을 말합니다. 예를 들어, TypeScript 코드를 JavaScript 코드로 변환하는 것이 Transpilation의 한 예입니다.

디버깅(Debugging): 프로그램 코드에서 발생하는 오류(Bug)를 찾아 수정하는 과정을 의미합니다.


이 포스팅은 유튜브 채널 '캐투럽'의 콘텐츠를 기반으로 작성되었습니다. 캐투럽 채널은 IT정보, AI, 소프트웨어 개발 관련 컨텐츠를 다룹니다."


Chrome DevTools에서 Source Map은 언제, 어떻게 로드될까요?

DevTools Source Map 로드

Source Map은 특별하게도 Chrome 개발자 도구(DevTools)가 열려 있을 때만 로드됩니다. 이는 웹사이트의 성능을 유지하는 데 중요한 역할을 합니다. 일반 사용자는 Source Map이 필요하지 않으므로 개발자 도구가 활성화된 상태에서만 이를 로드함으로써 네트워크 요청을 줄이고 페이지 로딩 속도를 유지할 수 있습니다. 이는 웹사이트의 성능 최적화에 중요한 부분인데, 일반 사용자는 Source Map 파일을 필요로 하지 않기 때문입니다. DevTools가 열려 있을 때만 Source Map을 로드함으로써 불필요한 네트워크 요청을 줄이고 페이지 로딩 속도를 향상시킬 수 있습니다.

로드된 Source Map 확인 방법

로드된-source-map-확인-방법

어떤 Source Map 파일들이 로드되었는지 확인하고 싶다면 다음 단계를 따르세요.

  1. Command-Shift-P (macOS) 또는 Ctrl-Shift-P (Windows/Linux) 단축키를 눌러 Command Menu를 엽니다.
  2. Developer Resources 또는 유사한 명령어를 입력하여 해당 탭을 엽니다.
  3. 페이지를 새로 고침( Cmd + R 또는 Ctrl + R) 합니다.

Developer Resources 탭에서 현재 페이지에 로드된 모든 Source Map 파일 목록을 확인할 수 있습니다. 목록이 너무 길다면 필터 기능을 활용하여 원하는 Source Map 파일을 쉽게 찾을 수 있습니다.


Source Map을 활용한 효율적인 디버깅 실전

Source Map 디버깅 실전

이제 Source Map이 실제로 디버깅 경험을 어떻게 향상시키는지 예시를 통해 자세히 살펴보겠습니다.

1. 원래 소스 코드로 바로 이동하기

원래-소스-코드로-바로-이동하기

웹 페이지에서 특정 기능이 어떻게 작동하는지 확인하고 싶을 때, 개발자 도구의 Elements 패널을 활용할 수 있습니다. 예를 들어, 버튼을 클릭했을 때 실행되는 코드를 확인하려면, Elements 패널에서 해당 버튼을 선택하고, 오른쪽 클릭 메뉴에서 "Inspect"를 선택합니다. 여기에서 버튼에 연결된 이벤트 리스너나 속성 등을 확인할 수 있으며, 연관된 JavaScript 코드를 바로 확인할 수도 있습니다. 이렇게 하면 원래 코드와 연동하여 빠르게 디버깅할 수 있습니다. 이때 Source Map이 있다면, Minification된 파일이 아닌 원래의 TypeScript나 SCSS 파일로 바로 이동하여 코드를 분석할 수 있습니다.

예를 들어, "인사" 버튼을 클릭했을 때 실행되는 JavaScript 코드를 확인하고 싶다고 가정해 봅시다.

  1. Elements 패널에서 해당 버튼을 선택합니다.
  2. Event Listeners 탭에서 클릭 이벤트에 연결된 JavaScript 함수를 찾습니다.
  3. 함수 이름 옆의 링크를 클릭하면, Source Map 덕분에 Minification된 파일이 아닌 원래의 TypeScript 파일이 Sources 패널에서 열립니다.

2. 정확한 위치 표시 및 코드 미리보기

정확한-위치-표시-및-코드-미리보기

Console 패널에서 발생하는 오류 메시지나 로그 메시지를 통해 코드의 특정 위치를 찾아갈 때도 Source Map은 매우 유용합니다. 오류 메시지나 console.log 메시지를 클릭하면, Source Map이 Minification된 코드가 아닌 원래 소스 코드의 해당 위치를 정확하게 보여줍니다.

또한, Sources 패널에서 특정 코드 줄 아래에 마우스를 올려놓으면, DevTools는 해당 코드가 매핑된 원래 파일의 위치를 툴팁으로 보여줍니다. 이를 통해 변환된 코드가 원래 어떤 파일에서 왔는지 쉽게 파악할 수 있습니다.

3. 축소된 코드 자동 포맷팅

축소된-코드-자동-포맷

Minification된 JavaScript 또는 CSS 파일을 Sources 패널에서 열면, DevTools는 자동으로 코드를 포맷팅하여 가독성을 높여줍니다. 이는 Source Map이 제공하는 정보 덕분에 가능하며, 개발자는 축소된 난독화된 코드를 해독하는 데 시간을 낭비할 필요 없이, 깔끔하게 정돈된 코드를 보면서 디버깅할 수 있습니다.

만약 포맷팅을 취소하고 싶다면, Sources 패널 하단의 "Pretty print" 아이콘 ({})을 클릭하면 됩니다.

4. Breakpoint 설정 및 디버깅

breakpoint-설정-및-디버깅

Source Map의 가장 강력한 기능 중 하나는 원래 소스 코드에 Breakpoint(중단점)를 설정하여 디버깅할 수 있다는 것입니다. Minification된 코드 대신, 익숙한 TypeScript나 SCSS 코드에 Breakpoint를 설정하고 코드를 실행하면, DevTools는 해당 Breakpoint에서 코드 실행을 멈추고 변수의 값이나 호출 스택 등을 검사할 수 있도록 해줍니다.

예를 들어, TypeScript 파일의 특정 줄에 Breakpoint를 설정하고 웹 페이지에서 해당 코드가 실행되는 동작을 수행하면, DevTools는 자동으로 해당 TypeScript 파일을 열고 설정한 Breakpoint에서 멈춥니다.

5. Private Source Map 수동 연결

private-source-map-수동-연결

때로는 Source Map 파일을 서버에 배포하지 않고 비공개로 유지하고 싶을 수 있습니다. 특히 프로덕션 환경에서는 소스 코드 노출을 꺼리는 경우가 많습니다. 이 경우, DevTools를 사용하여 비공개 Source Map 파일을 수동으로 연결할 수 있습니다.

  1. 웹 페이지에서 마우스 오른쪽 버튼을 클릭하고 "Add Source Map..."을 선택합니다.
  2. 개인 Source Map 파일의 URL을 입력합니다.

만약 URL이 유효하지 않다면, Console 패널과 Developer Resources 탭에 경고 메시지가 표시됩니다. 유효한 URL을 입력하면 Source Map이 성공적으로 로드되어 디버깅에 활용할 수 있습니다.


Source Map 사용 시 주의사항 및 한계

Source Map 주의사항 및 한계 이미지

Source Map은 강력한 도구이지만, 몇 가지 주의해야 할 점과 기술적인 한계가 존재합니다. 예를 들어, 빌드 과정에서 최적화된 코드는 변수나 함수가 제거될 수 있어, Source Map이 정확히 매핑하지 못하는 상황이 발생할 수 있습니다. 이는 디버깅 시 변수 값을 확인하거나 변경하려는 경우 문제가 될 수 있습니다.

1. 최적화된 코드와의 불일치

최적화된-코드와의-불일치

빌드 도구는 코드 최적화를 위해 때때로 변수를 제거하거나 코드를 재구성합니다. 예를 들어, 코드 실행 중 사용되지 않는 변수나 함수는 최적화 단계에서 삭제될 수 있으며, 이는 Source Maps가 이러한 삭제된 변수나 함수에 대한 정확한 매핑 정보를 제공하지 못하게 만듭니다. 또한, 코드의 재구성으로 인해 특정 로직의 흐름이 원래 소스 코드와 다르게 보일 수 있어 디버깅 과정에서 혼란을 초래할 수 있습니다. 이러한 최적화 과정으로 인해 Source Map이 항상 완벽하게 원래 코드를 매핑하지 못할 수 있습니다.

예를 들어, 다음 TypeScript 코드를 생각해 봅시다.

function calculateArea(width: number, height: number) {
  const area = width * height;
  console.log("Area:", area);
  return area;
}

calculateArea(5, 10);

빌드 과정에서 area 변수가 최적화되어 제거될 수 있습니다. 이 경우, Source Map을 통해 디버깅을 하더라도 area 변수의 값을 미리 보거나 Scope 창에서 확인할 수 없을 수 있습니다.

2. 빌드 도구별 Source Map 처리 방식의 차이

빌드-도구별-source-map-처리-방식의-차이

Source Map 사양은 유연성을 제공하여 다양한 빌드 도구가 각기 다른 방식으로 Source Map을 생성할 수 있습니다. 이로 인해 때로는 개발자가 예상치 못한 방식으로 Source Map이 작동할 수 있으며, 혼란을 야기할 수도 있습니다.

예를 들어, CSS 파일을 처리할 때, 어떤 빌드 도구는 Minification된 CSS 파일과 SCSS 파일을 직접 매핑하는 반면, 다른 도구는 중간 단계의 포맷팅되지 않은 CSS 파일을 포함할 수 있습니다. 이 때문에 DevTools의 Sources 패널에 동일한 CSS 파일이 두 번 나타날 수 있습니다. 하나는 원본 SCSS에 매핑된 파일(기울임꼴로 표시), 다른 하나는 실제 Minification된 CSS 파일입니다.

이러한 차이는 Source Map 사양 자체가 매핑 방식을 명확하게 규정하고 있지 않기 때문에 발생합니다. 따라서 개발자는 사용하는 빌드 도구의 Source Map 처리 방식을 이해하고 있어야 혼란을 줄일 수 있습니다.

3. Inline Preview 및 Scope 창에서의 값 편집 제한

inline-preview-및-scope-창에서의-값-편집-제한

앞서 언급했듯이, 고도로 최적화된 프로덕션 코드의 경우 Source Map이 변수를 완벽하게 매핑하지 못할 수 있습니다. 이 경우, DevTools의 Inline Preview 기능이나 Scope 창에서 변수 값을 확인하거나 편집하는 데 제한이 있을 수 있습니다.


Source Map 활용 팁

Source Map 활용 팁

다음은 Chrome DevTools에서 Source Map을 더욱 효과적으로 활용하기 위한 몇 가지 팁입니다.

1. "Authored/Deployed"로 파일 그룹화

authoreddeployed로-파일-그룹화

DevTools 설정에서 "Group by Authored/Deployed" 옵션을 활성화하면, Sources 패널에서 Source Map을 통해 매핑된 원래 소스 파일과 빌드 결과물을 분리하여 볼 수 있습니다. 이를 통해 프로젝트의 구조를 더 쉽게 파악하고 원하는 파일을 빠르게 찾을 수 있습니다.

  1. DevTools를 열고 Settings (톱니바퀴 아이콘)으로 이동합니다.
  2. Experiments 탭에서 "Group sources by Authored/Deployed"를 찾아 활성화합니다.
  3. DevTools를 다시 시작합니다.

2. xGoogleIgnoreList를 활용한 스택 트레이스 개선

xgoogleignorelist를-활용한-스택-트레이스-개선

DevTools는 xGoogleIgnoreList라는 Source Map 확장 프로그램을 사용하여 스택 트레이스를 개선합니다. 이를 통해 개발자는 더욱 정확하고 의미 있는 오류 추적 정보를 얻을 수 있습니다. 자세한 내용은 관련 문서나 영상을 참고하시기 바랍니다.

스택 트레이스 (Stack Trace): 프로그램 실행 중 오류가 발생했을 때, 어떤 함수들이 호출되었는지 그 순서를 역추적하여 보여주는 정보입니다. 오류의 원인을 파악하는 데 중요한 역할을 합니다.


Source Map 사용의 장단점

Source Map 장단점
장점 단점
Minification 및 Transpilation된 코드의 효과적인 디버깅 지원 빌드 프로세스 설정 및 Source Map 생성에 추가적인 구성 필요
원래 소스 코드 수준에서 Breakpoint 설정 및 코드 실행 추적 때로는 최적화로 인해 원래 코드와 100% 일치하지 않을 수 있음
오류 발생 시 원래 소스 코드 위치를 정확하게 표시 빌드 도구별 Source Map 생성 방식의 차이로 인해 혼란이 발생할 수 있음
축소된 코드 자동 포맷팅으로 가독성 향상 Private Source Map을 사용하는 경우 수동으로 연결해야 하는 번거로움 존재


결론

결론 이미지

Source Map은 현대 웹 개발에서 디버깅 효율성을 극대화하는 데 필수적인 도구입니다. Chrome DevTools의 다양한 기능들과 Source Map의 결합은 개발자로 하여금 Minification되거나 Transpilation된 코드의 복잡성 속에서도 원래의 소스 코드 레벨에서 쉽고 빠르게 문제를 해결할 수 있도록 지원합니다. 더 나아가, Source Map 기술은 점점 더 발전하여 브라우저와 개발 도구의 자동화된 디버깅 지원을 강화하고, 더욱 복잡한 빌드 환경에서도 효율적인 문제 해결을 가능하게 할 것으로 기대됩니다. 특히 WebAssembly와 같은 최신 기술과의 통합 가능성은 Source Map의 활용 범위를 크게 확장시킬 수 있는 잠재력을 가지고 있습니다. 본문에서 다룬 내용들을 숙지하고 실제 개발 환경에 적용함으로써, 여러분의 디버깅 능력을 한 단계 더 끌어올릴 수 있기를 바랍니다.


AI와 함께 성장하는 블로거들의 커뮤니티에 초대합니다!
최신 AI 트렌드부터 실전 활용법까지, 함께 배우고 나누며 성장해요.
지금 참여하시고 새로운 가능성을 발견하세요!

AI를 활용하는 블로거들의 공간

댓글 쓰기

다음 이전