노출모듈 패턴(Revealing Module Pattern)

2025. 3. 24. 14:44·Computer Science/Design Pattern

1. 노출모듈 패턴(Revealing Module Pattern)

- 내부 구현은 숨기고, 외부에 공개할 함수만 명확하게 드러내는 패턴

- 주로 JavaScript에서 사용된다.

- JavaScript는 파일마다 스코프가 분리되지 않기 때문에, 변수/함수 은닉과 공개를 명확히 구분하기 때문


2. JavaScript에서의 노출모듈 패턴 예제

const BankAccount = (function() {
  // private 변수
  let balance = 0;

  // private 함수
  function logBalance() {
    console.log("현재 잔액:", balance);
  }

  // public 함수 정의
  function deposit(amount) {
    balance += amount;
    logBalance();
  }

  function withdraw(amount) {
    if (balance >= amount) {
      balance -= amount;
      logBalance();
    } else {
      console.log("잔액이 부족합니다.");
    }
  }

  // return에서 공개할 것만 명확히 '드러냄'
  return {
    deposit: deposit,
    withdraw: withdraw
  };
})();

코드 분석

const BankAccount = (function() {

* 즉시 실행 함수(Immediately Invoked Function Expression): 정의하자마자 즉시 실행되는 함수

  • *즉시 실행 함수(IIFE) 정의 시작
  • 실행 후 결과 > BankAccount 변수에 저장
  • 내부의 변수와 함수는 외부에서 직접 접근 불가 > private

let balance = 0;

  • 은행 게좌의 잔액을 저장하는 변수 > private 변수
  • 외부에서 직접 접근할 수 없음 > BankAccount.balance(X)

function logBalance() { console.log("현재 잔액:", balance); }

  • 잔액을 출력하는 역할 > private 함수
  • 외부에서 직접 호출 불가 > BankAccount.logBalance(X)
  • only 내부 함수에서만 호출 가능

function deposit(amount) { balance += amount; logBalance(); }

  • 입금 함수(전달된 금액을 balance에 더함) > public 함수(나중에 return으로 노출됨)
  • 입급 후 현재 잔액을 출력하는 역할

function withdraw(amount) { if (balance >= amount) { balance -= amount; logBalance(); } else { console.log("잔액이 부족합니다."); } }

  • 출금 함수(잔액이 충분할 때만 출금함) > public 함수(나중에 return으로 노출됨)
  • 출금 후 잔액을 출력하는 역할

return { deposit: deposit, withdraw: withdraw }; })();

  • 모듈의 public 인터페이스를 정의함
  • deposit, withdraw 함수만 외부에 노출
  • BankAccount.deposit() or BankAccount.withdraw() > 사용가능(O)
  • but, balance / logBalance는 외부에서 접근 불가 > 캡슐화

3. 노출모듈 패턴의 장단점

장점

  • 내부 구현을 숨기고 필요한 기능만 공개 > 캡슐화
  • 외부에서 접근 가능한 코드가 명확해서 협업 시 혼동 줄임 > 유지보수 용이
  • return 구문만 보면 외부 API가 한눈에 들어옴 > 코드 구조 명확
  • 전역 네임스페이스 오염 방지(IIFE 사용) > 전역 변수 최소화

단점

  • 내부에서 객체 참조에 제한이 생김 > this 키워드 사용 어려움
  • 내부 구조가 고정됨 > 동적으로 공개 멤버 수정 어려움
  • 여러 모듈끼리 통신할 경우 어려울수도.. > 모듈 간 의존성 복잡
  • import/export 모듈 시스템 등장 이후 사용 빈도 감소 > ES6 이후 덜 씀

4. 노출모듈 패턴을 써야 할 경우

1. 간단한 라이브러리

2. jQuery 플러그인 개발

3. Canvas 기반 UI 툴

4. Node.js 이전의 프론트엔드 모듈화 구현

  • 간단한 유틸 모듈 > 복잡한 상태 관리 없이 기능만 노출해줌
  • 라이브러리 / 플러그인 작성 시 > 공개 API를 명확히 보여주고 내부는 숨김
  • JavaScript로 캡슐화를 흉내내야 할 때 > ES6 모듈 시스템을 쓰지 않는 환경일 경우
  • 브라우저 기반 코드에서 전역 오염을 피하고 싶을 때 > 글로벌 네임스페이스 최소화 해줌

5. 주의사항

1. 즉시 실행 함수(IIFE)를 기반으로 해야 한다.

2. return 구문에서만 public 멤버를 노출해야 한다.

3. 내부 함수와 변수는 외부에서 접근할 수 없다.

4. 동일한 이름으로 내부 함수와 공개 이름을 일치시키는 것이 일반적.

5. ES6 에서는 export를 써서 더 자연스럽게 모듈을 구성한다.

6. 단일 책임 원칙(SRP)에 맞게 구성해야 효과적이다.


6. 결론

노출모듈 패턴은 내부는 숨기고, 외부에 보여줄 것만 return으로 명확하게 노출하는 패턴이다

JavaScript에서 모듈처럼 행동할 수 있도록 도와주는 방식

'Computer Science > Design Pattern' 카테고리의 다른 글

MVC 패턴 (Model-View-Controller Pattern)  (0) 2025.03.24
이터레이터 패턴(Iterator Pattern)  (0) 2025.03.21
프록시 패턴(Proxy Pattern)  (0) 2025.03.19
옵저버 패턴(Observer Pattern)  (1) 2025.03.19
전략 패턴(Strategy Pattern)  (1) 2025.03.18
'Computer Science/Design Pattern' 카테고리의 다른 글
  • MVC 패턴 (Model-View-Controller Pattern)
  • 이터레이터 패턴(Iterator Pattern)
  • 프록시 패턴(Proxy Pattern)
  • 옵저버 패턴(Observer Pattern)
zajinmori
zajinmori
hello world !
  • zajinmori
    zajinmori's DevLog
    zajinmori
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 전체 (14)
      • Computer Science (14)
        • Design Pattern (8)
        • Programming Paradigm (3)
        • Network (3)
        • Operating System (0)
        • Database (0)
        • Data Structure (0)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • hELLO· Designed By정상우.v4.10.3
    zajinmori
    노출모듈 패턴(Revealing Module Pattern)
    상단으로

    티스토리툴바