Module Pattern ?
특정 구성요소를 다른 구성요소와 독립적으로 유지하는데 가장 널리 사용되는 디자인 패턴.
잘 구조화된 코드를 지원하기 위해 느슨한 결합을 제공한다.
Module ?
"Module"은 자바스크립트의 "클래스"이다.
그리고 클래스의 많은 장점 중 하나로 "캡슐화"가 있는데 캡슐화란 상태 및 동작을 다른 클래스에서 엑세스하지 못하도록 보호하는 것을 말한다.(접근 제어자를 통하거나 권한 설정을 통하여)
Module Pattern은 public, private 접근 권한을 가능하게 한다.
- 모듈은 변수와 메서드를 보호하는 클로저처럼 private를 허용한다.
- 객체를 반환한다.
const bookModule = (function() {
// private
let title = 'JavaScript';
let price = 15; //즉 모듈 패턴을 사용하면 접근할 수 없음 !! private Zone
// public
return { //접근할 수 있음 !! public Zone
printTitle: function () {
console.log(title);
}
}
})();
bookModule.printTitle();
모듈을 생성하여, 외부에서 직접 엑세스할 수 있는(return 객체)와 접근할 수 없는 부분을 나눈다.
return 객체의 필드만 접근할 수 있고, public zone과 private zone은 느슨한 결합으로 이루어진다.
Revealing Module Pattern ?
Module Pattern의 변형이다.
목적은 캡슐화를 유지하고 객체 리터럴에서 반환된 특정 변수와 메서드들을 잘 나타내기 위함이다.
const reveaingModule = (() => {
let privateValiable = 10;
var privateMethod = () => {
console.log('내부 정보입니다.');
privateValiable++; //내부 정보 열람 카운트 +1
};
var methodToExpose = () => {
console.log('내부 정보입니다2.');
};
var methodToExpose2 = () => {
privateMethod();
};
return {
first : methodToExpose, //내부 정보를 외부로 공개하고 호출할 순 있지만 직접 값을 전달할 수는 없음.
second : methodToExpose2
};
})();
reveaingModule.first();
reveaingModule.second();
console.log(reveaingModule.first);// out : () => { console.log('내부 정보입니다2.'); }
console.log(reveaingModule.second); // out : () => { privateMethod(); }
private한 모듈의 필드를 직접 엑세스할 수 없지만, public Zone(Return 객체)를 통하여 일부 내부 필드를 엑세스, 확인할 수 있다.