노트

모듈 패턴과 노출 모듈 패턴

Module Pattern and Revealing Module Pattern

프런트엔드#js#pattern · 연결된 개념 5개

쉽게 말하면

모듈 패턴은 자판기처럼 안쪽 재고와 기계는 잠가 두고 앞면 버튼 몇 개만 밖에 내놓는 방식이에요. 클로저로 내부 상태를 감춰서 다른 코드가 함부로 바꾸거나 이름이 부딪히지 않게 해요.

비유가 깨지는 곳 버튼을 바꿔 달아도 내부 배선은 그대로예요. 노출 모듈에서 공개 함수를 밖에서 덮어써도 내부 호출은 원래 함수를 써요. 지금은 ES 모듈이 파일 단위로 같은 일을 해요.

모듈 패턴(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 클래스 문법). 그래도 팩토리 함수와 클로저로 상태를 감추는 방식은 훅과 커스텀 스토어에서 여전히 쓰인다

캡슐화 일반론은 변수·컬렉션 캡슐화, 인스턴스를 하나로 제한하면 싱글턴 패턴과 이어진다. 출처 책은 『자바스크립트 + 리액트 디자인 패턴』.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • NestJS

    NestJS는 TypeScript를 전제로 모듈·의존성 주입(Dependency Injection, DI)·데코레이터(decorator) 구조를 제공하는 Node.js 서버 프레임워크다. 2017년 Kamil Myśliwiec가 만들었고, 구조를 강제하는 방식 때문에 흔히 "Node.js의 Spring"이라 불린다.

  • 행동 패턴

    객체 사이의 책임 분배와 대화 방식을 정리하는 패턴들. 요청 전달, 알고리즘 교체, 상태 변화, 알림, 작업 캡슐화 같은 문제를 다룬다.

  • 생성 패턴

    객체를 만드는 과정을 감추는 패턴들. 어떤 구체 클래스를 고를지, 생성 단계를 어떻게 보장할지, 생성 비용을 어떻게 줄일지를 다룬다. 호출하는 쪽이 new 구체클래스()를 직접 쓰지 않게 해서 결합도(Coupling)를 낮추는 것이 공통점이다.

  • 내부 가변성과 메모이제이션

    내부 가변성(Interior Mutability)은 객체나 함수의 참조는 그대로인데 안에 숨은 상태가 바뀌는 성질이다. React의 메모이제이션은 "입력이 다른 참조인가"만 보기 때문에, 참조가 같으면 내용이 바뀌어도 바뀌지 않았다고 판단한다. React 공식 문서는 이를 "겉모습은 같은데 몰래 내용물을 바꾸는 상자"에 비유한다.

  • 프로토타입 오염

    프로토타입 오염(prototype pollution)은 공격자가 __proto__나 constructor.prototype 같은 특수 키를 입력에 넣어 Object.prototype을 바꾸는 JavaScript 취약점이다. 모든 객체가 프로토타입 체인(prototype chain)으로 그 속성을 물려받으므로, 애플리케이션 전체의 동작이 바뀐다.

보기 옵션