1. angular.json 소스맵 옵션 이해
- scripts: true: 개발자가 작성한 TypeScript 코드 디버깅을 위해 필수.
- styles: true: CSS 문제 추적에 유용.
- vendor: false: 외부 라이브러리 소스맵을 제외하여 빌드 성능 향상 및 번들 크기 감소 (일반적으로 권장).
- hidden: true: 소스맵 파일은 생성하되, 빌드된 JS/CSS 파일에 소스맵 연결 주석을 포함하지 않아 보안을 강화합니다. 일반 사용자는 소스맵의 존재를 알 수 없으며, 관리자는 수동으로 연결해야 합니다.
angular.json 파일 내의 production 빌드 설정 부분 예시
// angular.json
"architect": {
"build": {
"configurations": {
"production": {
// ...
"sourceMap": {
"scripts": true,
"styles": true,
"vendor": false,
"hidden": true
},
// ...
}
}
}
}
2. hidden: true 환경에서의 디버깅 방법
hidden: true 설정 시 관리자가 소스맵을 사용하여 디버깅하는 주요 방법은 다음과 같습니다.
-
Node.js 서버를 통한 접근 제어:
- Node.js (Express) 서버에 미들웨어를 추가하여 .map 파일 요청을 가로챕니다.
- 특정 쿼리 파라미터(예: debug_token)나 헤더가 일치하는 경우에만 소스맵 파일을 제공합니다.
- 관리자는 브라우저 개발자 도구에서 소스맵 URL에 해당 토큰을 포함하여 수동으로 연결합니다.
-
인증된 사용자에게 동적으로 스크립트 태그 삽입 (대안):
- 관리자가 로그인했을 때, 서버가 index.html에 소스맵 정보를 활성화하는 스크립트를 동적으로 삽입하여 제공합니다.
- 이 방법은 서버가 HTML을 동적으로 처리해야 하며, 캐싱 전략을 신중히 고려해야 합니다.
-
로컬 프록시 서버 + 브라우저 확장 프로그램 (가장 권장되는 자동화 방법):
- 로컬에 소스맵 파일 보관: 프로덕션 빌드와 일치하는 .map 파일들을 개발자 로컬 PC에 저장합니다.
- 로컬 프록시 서버 실행: 로컬 PC에서 간단한 HTTP 서버를 띄워 로컬 소스맵 파일을 제공합니다.
- 브라우저 확장 프로그램 설정 (예: Requestly): 운영 서버의 .map 파일 요청을 로컬 프록시 서버로 리디렉션하도록 규칙을 설정합니다.
- 장점: 운영 서버 코드 수정 불필요, 최고의 보안성, Lazy Loading 모듈 포함 모든 소스맵 자동 연결 효과.
3. 청크(Chunk) 분리 및 Lazy Loading 모듈 디버깅
- 개별 청크 소스맵의 독립성: Angular는 --aot 빌드 시 코드를 여러 청크 파일(예: main.js, vendor.js, Lazy Loading 모듈 청크)로 분리하며, 각 청크는 자체적인 .js.map 파일을 가집니다.
- 부분 디버깅 가능: 디버깅하려는 특정 코드나 모듈이 포함된 청크의 소스맵만 연결하면 해당 부분은 디버깅이 가능합니다. 모든 청크의 소스맵을 연결해야만 디버깅이 가능한 것은 아닙니다.
- 효율적인 디버깅: 하지만 복잡한 호출 스택을 추적하거나 애플리케이션 전반의 오류를 분석할 때는 관련된 여러 청크의 소스맵을 연결하는 것이 훨씬 효율적입니다.
- Lazy Loading 문제 해결: Lazy Loading된 모듈의 소스맵이 보이지 않는 문제는 주로 소스맵 불일치, 개발자 도구의 한계, 여러 청크의 복합성, 소스맵 경로 문제 등으로 발생할 수 있습니다. 위에서 언급한 로컬 프록시 서버 + 브라우저 확장 프로그램 방식이 Lazy Loading 모듈의 소스맵을 자동으로 연결하는 가장 효과적인 방법입니다.
4. 로컬 파일 와일드카드 연결 (간접적 방법)
- 브라우저 개발자 도구의 Add source map... 기능은 로컬 파일 경로에 대한 와일드카드를 직접 지원하지 않습니다.
- 하지만 로컬 프록시 서버 + 브라우저 확장 프로그램 방식을 사용하면, Requestly와 같은 확장 프로그램의 리디렉션 규칙에서 와일드카드를 사용하여 운영 서버의 모든 .js.map 요청을 로컬 파일 시스템의 소스맵으로 자동으로 리디렉션할 수 있습니다. 이는 개발자에게 마치 로컬 파일 시스템의 모든 소스맵이 자동으로 연결되는 것과 같은 효과를 제공합니다.
5. 로컬 파일 직접 사용 시점
- 매우 높은 보안 요구사항: 소스맵 파일이 서버에 전혀 배포되지 않아야 할 때.
- 일회성/비정기적 디버깅: 복잡한 설정 없이 특정 버그를 한두 번만 확인할 때.
- 오프라인 환경: 인터넷 연결 없이 로컬 소스맵으로 디버깅해야 할 때.
- 단점: 번거로움, 버전 관리의 어려움, 팀 환경에서의 비효율성.
6. Requestly 무료/유료 버전 차이
- 무료 버전: 기본적인 요청/응답 수정, 리디렉션, 블록 기능 제공. 규칙 수 제한, 클라우드 동기화 및 팀 협업 기능 부재.
- 유료 버전: 무제한 규칙, 클라우드 동기화, 팀 협업, 환경별 규칙, 고급 매칭 조건, API 모의 등 고급 기능 제공.
- 소스맵 리디렉션 용도: 무료 버전으로도 충분히 가능합니다.
7. Requestly의 작동 방식
- Requestly는 웹 브라우저 확장 프로그램이며, 별도의 PC 버전 애플리케이션이 아닙니다.
- 웹 브라우저 내에서 웹 요청을 실시간으로 감시하고 제어하는 데 특화되어 있습니다.
- 규칙 설정은 웹 기반 UI를 통해 이루어집니다.
8. Requestly에서 로컬 파일 경로 직접 사용 및 주의사항
- Requestly의 Redirect Request 규칙에서 Another URL 필드에 file://C:/inetpub/wwwroot/$1.js.map과 같은 로컬 파일 경로를 직접 사용하는 것이 가능합니다.
- 이 방법은 로컬 프록시 서버를 띄울 필요 없이 Requestly가 직접 로컬 파일 시스템의 소스맵을 제공하도록 하여 설정을 더욱 간편하게 합니다.
- 중요한 점은 file:// 프로토콜 사용 시 슬래시를 2개만 사용해야 한다는 점입니다. (예: file://C:/path/to/file.js.map)
- file:/// (슬래시 3개)는 일부 환경에서 작동하지 않을 수 있습니다.
- Requestly에 로컬 파일 접근 권한을 부여해야 합니다.
반응형
'IT관련 > Angular' 카테고리의 다른 글
| Angular Standalone: 모듈 없는 Angular 개발의 시작 (1) | 2025.09.26 |
|---|---|
| Angular에서 스프레드 연산자(Spread Operator) 활용 정리 (0) | 2025.09.23 |
| Angular 청크 파일과 Node.js 제어 방식 (0) | 2025.09.10 |
| Angular에서 소스 맵 파일 다운로드: 서버에 따라 어떻게 다를까? (0) | 2025.09.10 |
| AngularJS vs Angular: 소스 맵 연결 방식 비교 (0) | 2025.09.10 |