• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

싱글턴 관련해서 이해가 잘 가지 않습니다

23.05.12 00:15 작성 조회수 416

3

const server1 = new Server();
const server2 = new Server();

이렇게 했을 때 server1 과 server2 가 동일한 인스턴스가 될 수 있나요?

제가 알고 있는 싱글턴은 인스턴스 요청시 이미 생성된 인스턴스가 있으면 그거 리턴해주고, 없으면 새로 만들어서 리턴함과 동시에 저장해두었다가 계속 사용하는 방식 혹은 스프링처럼 프레임워크가 한 클래스에 대해 하나의 인스턴스만 존재하도록 관리하는 방식인데 혹시 강의에서 말씀 주신 건 다른 의미인걸까요?

아니면 하나의 Server 인스턴스 내에서는 모두 동일한 express.Express 타입의 app 을 공유한다는 의미에서 싱글턴이라고 표현하신걸까요?

 

감사합니다!

답변 4

·

답변을 작성해보세요.

1

좋은 질문 감사합니다. 앞서 답변에 대해, 명확하게 전달을 못드린 것 같아서 제대로 정리해드리겠습니다.

싱글톤의 정의 : 특정 클래스의 인스턴스를 단 하나만 생성함.

  • 디자인적 관점 : 싱글톤은 전역 접근 가능하면서도 인스턴스화가 통제된 객체를 제공해서 코드의 일관성을 유지하고 자원 공유를 쉽게 함.

  • 메모리 관점 : 싱글톤은 단일 인스턴스만 유지함으로써 메모리 사용량을 최적화하고, 공유 리소스에 대한 중복 생성을 방지함.

사실 메모리 관점으로 봤을때, NodeJS에서는 싱글톤패턴 구현이 의미가 없습니다.
이유 : node.js 에서 싱글톤이 필요한 이유가 무엇인가요? - 인프런 | 질문 & 답변 (inflearn.com)

하지만, 코드 디자인적 의미로도 중요한 의미를 같기 때문에 이를 설명하고자, app을 하나로 정의하여 설명하였습니다.
실제 싱글톤을 구현하는 예시를 들어서 설명을 드리겠습니다.

NodeJS에서 싱글톤 패턴을 사용하려면, (NodeJS의 모듈은 싱글톤과 유사하게 동작하기 때문에), 모듈 시스템을 사용하는 것이 일반적입니다.

require() 함수로 모듈을 불러올 때, NodeJS는 모듈의 인스턴스를 생성하고 이를 캐시에 저장합니다. 그 다음부터는 캐시에 있는 동일한 인스턴스를 반환합니다.

// mySingleton.js
class MySingleton {
  constructor() {
    if (!MySingleton.instance) {
      this.data = [];
      MySingleton.instance = this;
    }

    return MySingleton.instance;
  }

  addData(item) {
    this.data.push(item);
  }

  getData() {
    return this.data;
  }
}

module.exports = MySingleton;
// app.js
const MySingleton = require('./mySingleton');

const singleton1 = new MySingleton();
singleton1.addData('Item 1');

const singleton2 = new MySingleton();
singleton2.addData('Item 2');

console.log(singleton1.getData()); // ['Item 1', 'Item 2']
console.log(singleton2.getData()); // ['Item 1', 'Item 2']

위 코드에서 singleton1과 singleton2는 동일한 인스턴스를 참조하며, singleton1에 추가한 데이터를 singleton2에서도 확인하실 수 있습니다.

// app.js
const MySingleton = require("./mySingleton");

const singleton1 = new MySingleton();
const singleton2 = new MySingleton();

singleton1.user = { hello: "world" };

console.log(singleton1.user); // { hello: 'world' }
console.log(singleton2.user); // { hello: 'world' }

위의 코드도 확인해보세요.

이제 express 인스턴스도 실험해보면 아래와 같습니다.

// app.js
const express = require("express");

const app1 = express();
const app2 = express();

app1.user = { hello: "world" };

console.log(app1.user); // { hello: 'world' }
console.log(app2.user); // undefined

따라서, const app = express() 이렇게 하나로 정의해서 app 객체만을 사용하면, 의미적으로 싱글톤 패턴과 유사하게 동작하게 동작하는 것을 기대할 수 있습니다.

추가적으로 궁금하신 사항 있으시면 답글 달아주세요!

1

조성언님의 프로필

조성언

질문자

2023.05.12

 

답변 감사합니다!

 

여전히 궁금한점이 있어서 이어서 질문드립니다

패턴이 언어별로 구현이 다를수는 있어도 의미가 달라지지는 않는다고 생각합니다

제가 알고있는 싱글턴 패턴은 클래스가 단 하나의 인스턴스만 가지도록 하는 패턴인데 자바스크립트에서는 다른 의미를 가진다는게 잘 이해되지 않습니다

요거 굳이 클래스 멤버변수로 app 을 사용하지 않더라도 기존 코드에서도 동일한 express.Express 인스턴스를 사용하는건 마찬가지 아닌가요?

이번 강의 이전의 코드와 이번 강의에서 개선된 코드간의 차이가 있는걸까요?

0

조성언님의 프로필

조성언

질문자

2023.05.15

자세한 답변 감사드립니다~

그렇다면 Server 클래스를 싱글턴 패턴으로 구현한게 아니라 싱글턴 패턴과 유사하게 동작하는(스프링에서의 빈과 비슷) express.Application 를 적용하여 싱글턴 패턴에 대해 실습해보는 강의였다고 이해하면 될까요?

네 정확합니다. 좀 혼란의 소지가 있을 수 있겠네요 강의 노트에 정리해두겠습니다. 좋은 질문 감사드립니다. ㅎㅎ

0

자바에서의 싱글턴과는 다릅니다! server1과 server2는 다른 인스턴스입니다.

하나의 Server 인스턴스 내에서 모두 동일한 express.Express 타입의 app을 공유한다는 의미입니다