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()orBankAccount.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 |
