티스토리 뷰

do/term

Singleton pattern, Scaffolding

dooo.park 2019. 3. 31. 13:38

Singleton pattern

전체 시스템에서 하나의 인스턴스만 존재하도록 보장하는 객체 생성 패턴

클래스 함수의 인스턴스를 한 개만 유지한다.

여러 객체를 생성하더라도 최초 생성된 객체를 사용한다.

 

객체에 대한 접근자(비공개 멤버:클로저)를 사용하여 해당 객체를 공유한다.

규모가 큰 라이브러리에서는 흔히 외부에서 접근할 수 없는 비공개 멤버를 가지고 있다. 

자바스크립트에서 비공개 멤버가 필요하다면 먼저 클로저(closure)를 염두에 두어야 한다.
즉, 비공개 멤버를 가진 싱글톤 객체를 생성하려면 클로저를 이용해야 한다.

Javascript Singleton 예제

코드에서 비공개 함수 init()의 return 값으로 반환하는 객체가 싱글톤 객체이다.

내부 변수에 접근하여 객체를 반환하는 클로저(Closure) 패턴을 사용했다.

객체를 여러 번 생성(getInstance)을 하더라도 한 개의 객체를 참조한다.


var Singleton = (function () {
	
    // 비공개 변수, 메서드 정의 
    var instantiaed;
    
    function init() {
    	
        // 싱글톤 객체 정의 
        return { 
            // 공개 메서드 정의 
            publicMethod : function () { 
            	return 'hello Singleton Pattern!!!';
            },
            // 공개 프로퍼티 정의 
            publicProp : 'single value'
        }
        
    } 
    // 공개 메서드인 getInstance() 를 정의한 객체. 
    // 렉시컬 특성으로 인해 비공개 변수, 메서드에 접근 가능(클로저) 
    return { 
    	getInstance : function () {
        	if (!instantiaed) {
            	instantiaed = init();
            }
            return instantiaed;
        }
    }
})(); 

// 싱글톤 객체 생성하여 publicMethod 호출 가능해짐 
var first = Singleton.getInstance();
first.publicMethod();
console.log(first.publicMethod()); // hello Singleton Pattern!!!
var second = Singleton.getInstance();

second.publicMethod();
console.log(second.publicMethod()); // hello Singleton Pattern!!!
console.log(first === second); // true

위의 예제 코드에서 먼저 비공개 함수인 init()의 return 문에서 객체 리터럴로 정의되는 객체가 싱글톤 객체입니다.

이 객체는 프로그램 전체에서 하나만 존재하게 됩니다.

외부에 공개되는 익명 함수의 return 문에서는 싱글톤 객체를 구하는 공개 메서드인 getInstance 가 포함된 객체를 반환합니다.

getInstance 메서드에서는 내부 변수로 정의된 instantiaed 변수의 값을 확인해서 아직 싱글톤 객체가 생성되지 않았다고 판단하면 내부 함수인 init를 호출하여 싱글톤 객체를 생성해서 반환하게 됩니다.

그런 다음 instantiaed 변수에 싱글톤 객체를 할당하게 됩니다.

 

이렇게 일반적으로 싱글톤 패턴에서는 이미 객체가 생성됐는지 여부를 알려주는 instantiaed와 같은 내부 변수가 필요합니다.

그리고 싱글톤 패턴에서는 내부 변수에 접근할 수 있는 객체를 반환하는 클로저를 이용해야 합니다.

 

위 코드에서는 변수의 렉시컬 한 특성으로 인해 내부의 getInstance 함수에서 비공개 변수인 instantiaed에 접근할 수 있다는 것과 getInstane() 호출이 끝나더라도 instantiaed 값은 계속 유지되는 특성(클로저)을 이용해 publicMethod(), publicProp 이 포함된 객체를 유일하게 생성하게 됩니다.

 

그래서 singleton.getInstance를 몇 번 호출하더라도 결과로 얻는 객체는 모두 동일한 싱글톤 객체를 가리키게 됩니다.


출처: https://webclub.tistory.com/150 [Web Club]

 


var singleton = (function() {
  var instance;
  var a = 'hello';
  function initiate() {
    return {
      a: a,
      b: function() {
        alert(a);
      }
    };
  }
  return {
    getInstance: function() {
      if (!instance) {
        instance = initiate();
      }
      return instance;
    }
  }
})();
var first = singleton.getInstance();
var second = singleton.getInstance();
console.log(first === second); // true;

IIFE로 비공개 변수를 가질 수 있게 만들어줍니다. 그리고 그 안에 instance변수와 initiate 함수를 만들어줍니다. initiate 함수 안의 내용이 실제 객체의 내용입니다. 위의 obj 객체와 비교하면 a가 비공개 변수가 되었네요.

IIFE로 즉시 반환되는 부분(return)을 보시죠. getInstance라는 메서드를 가진 객체를 반환하는데, getInstance 함수를 호출하는 순간 내부적으로 initiate 함수가 호출되고, instance에 아까 그 객체의 내용이 저장되고 동시에 반환됩니다. getInstance가 여러 번 호출됐을 경우에는 코드를 보시면 이미 instance 객체가 있는 경우에는 initiate를 거치지 않고 바로 반환하는 것을 알 수 있습니다.

first와 second 변수를 보면 두 번 다 getInstance 함수를 호출했는데요. 결과적으로 두 변수는 같습니다. first 때 initiate 된 객체를 second 때도 똑같이 반환받았기 때문이죠. 즉, 아무리 호출해도 기존에 있던 객체는 복사되는 것도 아니고 그냥 그대로 반환됩니다. 싱글턴 패턴은 모듈 패턴을 변형한 디자인 패턴입니다.

 

출처: https://www.zerocho.com/category/JavaScript/post/57541bef7dfff917002c4e86

 


IIFE

즉시 실행 함수 표현(IIFE, Immediately Invoked Function Expression)은 정의되자마자 즉시 실행되는 Javascript Function를 말한다.

이는 Self-Executing Anonymous Function으로 알려진 디자인 패턴이고 크게 두 부분으로 구성된다. 첫 번째는 괄호((), Grouping Operator)로 둘러싸인 익명 함수(Anonymous Function)이다. 이는 전역 스코프에 불필요한 변수를 추가해서 오염시키는 것을 방지할 수 있을 뿐 아니라 IIFE 내부의 변수에 접근하지 못하도록 막을 수 있는 방법이다.

두 번째 부분은 즉시 실행 함수를 생성하는 괄호()이다. 이를 통해 자바스크립트 엔진은 함수를 즉시 해석해서 실행한다.

예제 섹션
아래 함수는 즉시 실행되는 함수 표현이다. 표현 내부의 변수는 외부로부터의 접근이 불가능하다.


(function () {  
    var aName = "Barry"; 
})(); 
// IIFE 내부에서 정의된 변수는 외부 범위에서 접근이 불가능하다. 
aName // throws "Uncaught ReferenceError: aName is not defined" 


IIFE를 변수에 할당하면 IIFE 자체는 저장되지 않고, 함수가 실행된 결과만 저장된다.


var result = (function () {  
    var name = "Barry";  
    return name;  
})();  
// 즉시 결과를 생성한다. 
result; // "Barry"

출처 : https://developer.mozilla.org/ko/docs/Glossary/IIFE


Scaffolding

데이터 베이스를 이용한 프로그램에서 이를 기반으로 하는 MVC구조의 CRUD(Create Read Update Delete)의 관련된 코드를 자동으로 생성해주는 기능

자동 생성된 웹 페이지를 통해 각 테이블에 대해 만들기, 읽기, 업데이트 및 삭제(CRUD) 작업을 수행할 수 있다


Node.js 스캐폴딩

express-generator로 project를 생성하면 자동으로 다음과 같은 구조를 만들어준다.

npm install express-generator -g
express myapp --view=pug

├── app.js
├── bin
│   └── www
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   └── users.js
└── views
    ├── error.pug
    ├── index.pug
    └── layout.pug

routes

MVC의 컨트롤러 역할을 하는 라우터 코드가 담기는 디렉터리

웹 요청이 오면 URL에 따라 어떤 함수가 요청을 처리할지 결정하고 뷰를 표현하기 전에 데이터를 조회하거나 처리할 수 있다.


views
웹 요청에 응답할 HTML 화면을 제공하기 위한 파일들이 담기는 디렉터리

 
public
javascript, css, image 파일들이 담기는 디렉터리

 

node_modules

npm install 실행 시 package.json에 명시된 모듈이 설치되는 디렉터리

용량이 크기 때문에 git으로 push 할 때. gitignore에 포함한다.

 

app.js
웹 요청을 어떤 라우터에 맡길지, view engine을 어떤 것으로 할지, 로그는 어떻게 남길 것인지 등 기본 설정을 처리하는 파일 
view engine = jade, pug, ejs


 

'do > term' 카테고리의 다른 글

type assertion  (0) 2019.04.14
REST API  (0) 2019.04.04
서버 기반 인증, 토큰 기반 인증 (Session, Cookie / JSON Web Token)  (3) 2019.04.02
Boilerplate  (0) 2019.04.01
SSR, CSR / Cookie, Session  (0) 2019.03.30
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함