NodeJS 기초: IIFE (즉시 실행 함수 표현식)
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
JavaScript 개발자, 특히 React 및 Node.js 환경에서 전역 범위 오염 방지, 모듈 패턴 구현, 데이터 보안이 필요한 경우
핵심 요약
- IIFE는 즉시 실행되는 함수 표현식으로, 전역 범위 오염 방지 및 데이터 캡슐화에 유용 (
(function() { ... })()
형식) - 모듈 패턴 구현에 활용 가능하며,
use strict
적용을 통해 안전한 개발 환경 제공 - 비동기 초기화 및 Node.js에서의 민감 정보 보호에 효과적 (
const config = (function() { ... })()
예시)
섹션별 세부 요약
1. **Namespace Pollution Prevention (전역 범위 오염 방지)**
- IIFE를 사용하여 외부 라이브러리의 전역 변수를 캡슐화 가능
- 예시:
window.legacyLib
를 IIFE 내부에서 선언하여 외부에 노출되지 않도록 처리 console.log(typeof legacyLib);
는object
를 반환하지만, 외부 코드는legacyLib
를 직접 사용할 수 없음
2. **Module Pattern (Pre-ES Modules)**
- ES 모듈 이전 시 IIFE를 사용하여 모듈 패턴 구현 가능
- 예시:
privateVariable
과privateFunction
을 IIFE 내부에서 정의하고,publicFunction
을 외부로 노출 myModule.publicFunction()
실행 시privateVariable
값을 사용 가능하지만,myModule.privateVariable
은undefined
3. **Asynchronous Initialization (비동기 초기화)**
- IIFE로 비동기 작업을 처리하고, 완료 후 실행 순서 관리 가능
- 예시:
await new Promise(...)
를 사용하여 1초 대기 후"Initialization complete!"
출력
4. **React Custom Hook with Encapsulated State**
useState
와 결합하여 복잡한 초기화 로직 캡슐화 가능- 예시:
initialValue * 2
를 IIFE 내부에서 계산하여useState
의 초기값으로 설정
5. **Node.js Environment Isolation**
- 민감 정보(예:
apiKey
)를 IIFE 내부에 캡슐화하여 보호 가능 config.getApiKey()
로 값 접근 가능하지만, 외부에서apiKey
직접 참조 불가
6. **Performance Implications (성능 영향)**
- IIFE 자체는 미니멀 오버헤드를 제공하지만, 내부 코드의 복잡도가 성능에 영향
V8
에서 빈 IIFE는 1마이크로초 미만의 오버헤드 발생
7. **Security Considerations (보안 고려사항)**
- IIFE는 전역 범위 오염 방지에 도움되지만, XSS 또는 주입 공격에 대한 보안은 추가 조치 필요
DOMPurify
사용 권장,eval()
또는new Function()
은 피해야 함
8. **Testing and Debugging (테스트 및 디버깅)**
Jest
,Vitest
등으로 IIFE 테스트 가능,console.log
및console.table
로 디버깅 지원- 소스맵 사용 권장, IIFE 내부 코드 추적 용이
9. **Common Mistakes (일반적인 실수)**
- 불필요한 IIFE 사용, 전역 변수 의존,
use strict
생략, 복잡한 초기화 로직 포함, 반환 값 누락 - 예시:
return 42;
을 IIFE 내부에서 반환하지 않으면 외부에서 값 접근 불가
10. **Best Practices (최선의 실천 방식)**
use strict
적용, IIFE 내부 코드를 최소한으로 유지, 반환 값 제공, ES 모듈 우선 사용- 예시:
const myModule = (function() { ... })();
로 모듈 패턴 구현
결론
IIFE는 전역 범위 오염 방지, 데이터 캡슐화, 모듈 패턴 구현에 유용하지만, ES 모듈 사용이 권장됩니다. use strict
적용 및 복잡한 로직은 피하고, 테스트 및 디버깅 시 소스맵 활용이 필수적입니다.