티스토리 뷰
자바스크립트로 대규모 프로젝트를 관리하다 보면, 분명히 코드를 제대로 작성한 것 같은데 런타임에서 예상치 못한 undefined 객체 참조 오류를 마주하거나, 전역 변수가 오염되어 디버깅에 수 시간을 허비하는 경험을 하게 됩니다. 이는 자바스크립트가 탄생 초기부터 가졌던 '유연함'이라는 특성 때문입니다. 하지만 2026년 현재, 복잡해진 웹 애플리케이션 환경에서 이러한 유연함은 오히려 치명적인 독이 됩니다.
ECMAScript 5(ES5)에서 도입된 Strict Mode는 단순히 문법을 까다롭게 만드는 장치가 아닙니다. 엔진 레벨에서 최적화를 방해하는 요소를 제거하고, 잠재적인 버그를 사전에 차단하여 코드의 실행 속도를 높이는 '안전장치'입니다. 현대적인 프레임워크(React, Vue, Next.js 등)와 빌드 도구는 기본적으로 이 모드를 활성화하지만, 직접 라이브러리를 배포하거나 레거시 코드를 리팩토링해야 하는 시니어 개발자에게 Strict Mode의 10가지 세부 규칙 이해는 필수적인 소양입니다.
Strict Mode 적용 시 변화하는 10가지 핵심 문법 규칙
코드 상단에 'use strict';를 선언하는 순간, 자바스크립트 엔진은 관용적인 해석을 멈추고 다음과 같은 엄격한 잣대를 적용합니다.
1. 선언하지 않은 변수에 대한 할당 금지
일반 모드에서는 변수 선언 키워드(var, let, const) 없이 변수를 할당하면 엔진이 이를 전역 객체(window 또는 global)의 프로퍼티로 자동 생성합니다. Strict Mode에서는 이를 즉시 ReferenceError로 처리하여 의도치 않은 전역 오염을 방지합니다.
2. 읽기 전용(Read-only) 프로퍼티 수정 제한
객체의 writable: false 설정이 된 프로퍼티에 값을 쓰려고 시도할 때, 일반 모드에서는 에러 없이 무시되지만 엄격 모드에서는 TypeError를 발생시켜 데이터 불변성을 보장합니다.
3. 확장 불가 객체(Non-extensible)에 프로퍼티 추가 금지
Object.preventExtensions()가 적용된 객체에 새로운 프로퍼티를 추가하려 할 경우 예외를 발생시킵니다. 이는 객체의 구조적 무결성을 유지하는 데 도움을 줍니다.
4. 함수 파라미터 이름의 중복 선언 금지
일반 모드에서는 function sum(a, a, b) {}와 같이 동일한 이름의 인자를 허용(마지막 인자가 우선됨)하지만, 엄격 모드에서는 문법 에러(SyntaxError)가 발생합니다.
5. 8진수 숫자 리터럴 표기법 제한
접두사 0으로 시작하는 8진수 표기법(예: 010)은 혼동을 야기할 수 있어 금지됩니다. 대신 ES6 표준인 0o10 형태를 사용해야 합니다.
6. with 문의 사용 전면 금지
코드의 가독성을 해치고 최적화를 어렵게 만드는 with 키워드를 사용하면 구문 분석 단계에서 에러를 던집니다.
7. eval의 독립적 스코프 생성
eval() 내부에서 선언된 변수가 외부 스코프에 영향을 주지 않도록 격리됩니다. 이는 보안 사고와 예기치 못한 변수 덮어쓰기를 방지하는 핵심 기제입니다.
8. delete 연산자의 제한
변수, 함수, 삭제 불가능한 프로퍼티(Configurable: false)를 delete 명령어로 삭제하려 할 경우 에러가 발생합니다.
9. 함수 내부 this 바인딩의 변화
가장 중요한 변화 중 하나입니다. 일반 함수 내에서 this를 참조할 때, 일반 모드에서는 전역 객체(window)를 가리키지만 엄격 모드에서는 undefined로 고정됩니다. 이는 생성자 함수 호출 시 new 키워드를 누락했을 때 전역 객체를 수정하는 대형 사고를 막아줍니다.
10. 예약어(Reserved Words) 사용 제한
미래의 자바스크립트 버전을 위해 예약된 단어들(implements, interface, let, package, private 등)을 변수명이나 함수명으로 사용할 수 없습니다.
일반 모드 vs 엄격 모드: 실행 환경 비교 분석
실제 프로젝트 환경에서 Strict Mode가 주는 성능 및 안정성 지표를 테이블로 정리하였습니다.
| 구분 | Normal Mode (Sloppy) | Strict Mode | 기대 효과 |
|---|---|---|---|
| 에러 감지 | 조용히 실패 (Silent Fail) | 즉각적인 예외 발생 (Throw) | 디버깅 시간 40% 이상 단축 |
| 엔진 최적화 | 스코프 체인 추적이 복잡함 | 변수 위치가 명확하여 최적화 용이 | V8 엔진 기준 실행 속도 향상 |
| 전역 오염 | 암묵적 전역 변수 허용 | 엄격히 차단 | 메모리 누수 및 충돌 방지 |
| this 바인딩 | 전역 객체(window) 강제 연결 | undefined (안전한 참조) | 보안 및 런타임 오류 방지 |
안전한 Strict Mode 적용을 위한 체크리스트
기존 프로젝트에 엄격 모드를 도입하거나 신규 프로젝트를 설계할 때, 다음의 4단계 실행 프로세스를 따를 것을 권장합니다.
- 모듈 단위 적용: 전체 스크립트 파일에 한꺼번에 적용하기보다는 개별 함수나 파일 단위로
'use strict';를 선언하여 점진적으로 테스트를 수행합니다. (현대적인 ES Modules는 기본적으로 strict mode가 내장되어 있습니다.) - 정적 분석 도구 활용: ESLint와 같은 도구에서
"strict": "error"규칙을 활성화하여 런타임 이전에 문법 위반 사항을 90% 이상 필터링합니다. - 서드파티 라이브러리 검증: 직접 작성한 코드 외에 가져다 쓰는 외부 라이브러리가 Strict Mode 환경에서 올바르게 동작하는지 단위 테스트를 거쳐야 합니다.
- this 참조 코드 전수 조사: 특히 이벤트 핸들러나 콜백 함수 내에서
this를 전역 객체 용도로 활용했던 레거시 코드가 있는지 반드시 확인하여.bind()나 화살표 함수로 대체합니다.
전문가 Tip: 왜 'use strict'는 문자열인가요?
- 이는 하위 호환성(Backward Compatibility) 때문입니다. Strict Mode를 지원하지 않는 아주 오래된 엔진(Legacy Browsers)은 이 구문을 단순한 문자열 리터럴로 인식하고 무시하므로, 전체 스크립트가 멈추는 불상사를 막을 수 있습니다.
- 2026년 현재 대다수의 환경은 ES6+를 지원하므로
type="module"을 사용한다면 명시적인 선언 없이도 이미 가장 안전한 모드에서 코드를 작성하고 있는 셈입니다.
자바스크립트의 엄격 모드는 개발자를 구속하는 제약이 아니라, 코드의 예측 가능성을 높여주는 가장 비용 효율적인 솔루션입니다. 지금 바로 여러분의 함수 최상단에 'use strict';를 적어넣는 습관을 들이시기 바랍니다.
기술의 변화가 빠르지만, 오늘 다룬 본질적인 원리를 이해하신다면 어떤 응용 도구도 금방 익히실 수 있을 겁니다.

