모듈 패턴(Module Pattern)은 클로저(Closure)로 비공개 상태를 감추고, 공개할 함수만 담은 객체를 돌려주는 JavaScript 캡슐화(Encapsulation) 패턴이다. 언어에 모듈 시스템과 private 필드가 없던 시절의 표준 해법이었다. 노출 모듈 패턴(Revealing Module Pattern)은 모든 것을 비공개로 정의한 뒤 공개할 것만 반환 객체에 이름으로 연결하는 변형이다.
const counter = (function () { // IIFE: 즉시 실행해 스코프를 만든다
let count = 0 // 바깥에서 접근 불가
function increment() { count++ }
function get() { return count }
return { increment, value: get } // 노출 모듈: 공개할 것만 이름 붙여 반환
})()
counter.increment()
counter.value() // 1
counter.count // undefined- 얻는 것: 전역 이름 충돌을 막고, 내부 상태를 외부가 함부로 바꾸지 못하게 한다. 공개 API(Application Programming Interface)가 반환 객체 하나에 모여 한눈에 보인다
- 단점: 비공개 함수는 테스트하거나 확장하기 어렵다. 노출 모듈에서 내부 함수끼리는 서로를 직접 부르므로, 공개된 함수를 바깥에서 덮어써도 내부 호출은 원래 함수를 계속 쓴다(패치가 먹지 않는다)
- 지금은: ES 모듈이 파일 단위로 같은 역할을 한다. export하지 않은 것은 자동으로 비공개다. 클래스에는
#private필드가 있다(TypeScript 클래스 문법). 그래도 팩토리 함수와 클로저로 상태를 감추는 방식은 훅과 커스텀 스토어에서 여전히 쓰인다
캡슐화 일반론은 변수·컬렉션 캡슐화, 인스턴스를 하나로 제한하면 싱글턴 패턴과 이어진다. 출처 책은 『자바스크립트 + 리액트 디자인 패턴』.