디자인패턴

노출 모듈 패턴 (Revealing Module Pattern)

traveler_JH 2024. 12. 17. 22:30

노출 모듈 패턴 (Revealing Module Pattern)

    • 자바스크립트의 모듈 패턴의 변형으로, 객체 내부의 비공개(private) 변수와 메서드는 숨기고, 외부에 노출할 멤버를 명시적으로 선언하여 관리하는 디자인 패턴

노출모듈 패턴의 핵심

  • 명시적 노출
    • 어떤 메서드와 변수를 외부에 공개할지 명확하게 제어할 수 있다.
  • 캡슐화
    • 비공개 변수나 메서드는 클로저를 통해 외부에서 접근할 수 없도록 숨길 수 있다.
  • 가독성 향상
    • 공개된(public) 메서드와 비공개(private) 메서드를 분리하여 코드를 더 명확하게 만든다.

구성요소

    • Context
      • 전략을 사용하는 주체
      • 알고리즘(전략)을 실행하기위해 Strategy객체를 참조
    • Strategy
      • 동작(알고리즘)의 인터페이스 또는 추상 클래스
      • 동작의 공통된 인터페이스를 정의
    • ConcreteStrategy
      • Strategy 인터페이스를 구현하는 구체적인 알고리즘 클래스
      • 다양한 방식으로 동작을 제공하며, 실행시에 Context에서 이를 선택

예제

const CounterModule = (function () {
    // 비공개 변수
    let count = 0;

    // 비공개 메서드
    function logCount() {
        console.log("Current count:", count);
    }

    // 공개 메서드
    return {
        increment: function () {
            count++;
            logCount();
        },
        decrement: function () {
            count--;
            logCount();
        },
        reset: function () {
            count = 0;
            logCount();
        },
        getCount: function () {
            return count;
        }
    };
})();

// 사용
CounterModule.increment(); // Current count: 1
CounterModule.increment(); // Current count: 2
CounterModule.decrement(); // Current count: 1
console.log(CounterModule.getCount()); // 1
CounterModule.reset(); // Current count: 0

작동 방식

    1. 즉시 실행 함수 (IIFE)
      • 코드의 핵심은 즉시 실행 함수(IIFE)로, 모듈을 정의하는 즉시 실행
      • 내부에 정의된 변수와 함수(count, logCount)는 클로저로 감싸져 외부에서 직접 접근할 수 없다
    2. 비공개 변수 및 메서드
      • count 변수와 logCount 메서드는 함수 내부에서만 접근 가능.
      • 클로저를 통해 값을 유지하고 관리합니다.
    3. 공개 메서드 반환
      • return문을 사용하여 외부에서 접근 가능한 메서드를 명시적으로 정의
      • 공개된 메서드(increment, decrement, reset, getCount)는 내부에서 비공개 변수와 메서드에 접근할 수 있다.
    4. 공개 메서드 사용
      • 공개된 메서드는 외부에서 사용할 수 있으며, 이를 통해 count 값을 안전하게 수정하고 조회할 수 있다

코드 실행 흐름

  1. 모듈 초기화
    • 즉시 실행 함수가 실행되며 CounterModule 객체를 생성.
    • 비공개 변수 count가 0으로 초기화되고, 비공개 메서드 logCount와 공개 메서드들이 설정됨.
  2. 공개 메서드 호출
    • increment를 호출하면 count가 증가하고 logCount가 실행되어 현재 값을 출력.
    • decrement, reset도 동일한 방식으로 작동.
  3. 비공개 변수 유지
    • 외부에서 count를 직접 수정할 수 없고, 오직 공개 메서드를 통해서만 접근 가능.
  4. 안전한 데이터 관리
    • getCount를 통해 count 값을 읽을 수 있으나, 외부에서 직접 변경할 수는 없음.

노출모듈 패턴의 장점

  • 캡슐화
    • 내부 데이터를 숨기고, 외부에는 필요한 기능만 노출.
  • 명확한 인터페이스
    • 어떤 기능이 외부에서 접근 가능한지 명확히 정의.
  • 충돌 방지
    • 전역 네임스페이스 오염을 줄이고 모듈화된 코드를 작성 가능.

노출모듈 패턴의 단점

  1. 테스트 어려움
    • 비공개 메서드와 변수는 외부에서 접근 불가능하므로 테스트가 어려울 수 있음.
  2. 유지보수 복잡성
    • 지나치게 많은 비공개 메서드가 있으면 코드 유지보수가 어려워질 수 있음.
  3. 클로저 오버헤드
    • 클로저를 사용하기 때문에 메모리 사용량이 증가할 가능성 있음.

노출모듈 패턴이 적합한 상황

  • 모듈화가 필요한 경우:
    • 큰 프로젝트에서 코드를 조직화하고 전역 변수 충돌을 방지하려는 경우.
  • 비공개 데이터 보호:
    • 중요한 데이터나 메서드를 외부에서 직접 수정하지 못하도록 보호하려는 경우.