싱글톤 패턴(Singleton Pattern)

parkjh9370·2022년 8월 10일
0

🔍 싱글톤 패턴이란?

어플리케이션이 시작될 때 클래스가 최초 한번만 메모리를 할당하고(static) 그 메모리가 인스턴스를 만들어 사용하는 디자인 패턴

예를 들어 레지스트리 같은 설정 파일의 경우 객체가 여러개 생성되면 설정 값이 변경될 위험이 생길 수 있다.
인스턴스를 1개만 생성되게 되는 싱글톤 패턴 적용 시, 하나의 인스턴스에 메모리를 등록해서 여러 개 쓰레드가 동시에 해당 인스턴스를 공유하여 사용할 수 있기 때문에 많은 요청이 일어나는 곳에서 효율을 높일 수 있다.


🔍 장점

  • 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다.
  • 싱글톤으로 만들어진 클래스의 인스턴스는 전역이기 때문에 다른 클래스 인스턴스들이 데이터를 공유하기 쉽다.
  • 인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 경우 사용한다.
  • 두 번째 이용시부터 객체 로딩 시간이 줄어 성능이 좋아진다.

이러한 장점을 가진 싱글톤 패턴은 DBCP (DatabaseCommection Pool)처럼 공통된 객체를 여러 개 생성해서 사용하는 경우 많이 이용된다.

메모리 낭비를 방지, 클래스 간 데이터 공유가 쉽다는 장점이 있기 때문에 싱글톤 패턴을 활용한다.

단점

  • 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스 인스턴스들 간의 결합도가 높아지게 되고, 개방/폐쇄 원칙을 위배하게 된다.

이는 객체 지향 설계 원칙에 어긋나기 때문에 수정이 어려워지고 유지보수 비용이 높아질 수 있다.
또한 멀티쓰레드 환경에서 동기화 처리를 안하면 인스턴스가 2개가 생성될 가능성이 생긴다.


싱글톤 패턴 express 적용 예제

import * as express from "express";
import catsRouter from "./cats/cats.route";

class Server {
  public app: express.Application;

  constructor() {
    const app: express.Application = express();
    this.app = app;
  }

  private setRoute() {
    this.app.use(catsRouter);
  }

  private setMiddleware() {
    this.app.use((req, res, next) => {
      console.log(req.rawHeaders[1]);
      next();
    });

    this.app.use(express.json());

    this.setRoute();

    this.app.use(
      (
        req: express.Request,
        res: express.Response,
        next: express.NextFunction
      ) => {
        res.send({ error: "404 not found error" });
      }
    );
  }

  public listen() {
    this.setMiddleware();
    this.app.listen(8000, () => {
      console.log(`8000 번 포트에서 실행 중`);
    });
  }
}

function init() {
  const server = new Server();
  server.listen();
}

init();

💡 정리

오직 한 개의 인스턴스 생성을 보증하여 효율을 찾을 수 있지만 그에 못지많게 수반되는 문제점도 많다. 싱글톤 패턴은 안티패턴으로 불릴 만큼 단독으로 사용한다면 객체 지향에 위반되는 사례가 많다. 스프링 컨테이너 같은 프레임워크의 도움을 받으면 싱글톤 패턴의 문제점들을 보완하면서 장점의 혜택을 누릴 수 있다.


참고

https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
https://devmoony.tistory.com/43

🤔 Nest.js 학습 중 알게 된 싱글톤 패턴... 내용을 정리하고 관련 내용을 코드로 작성해보며 이해는 할 수 있었다.
아직 처음 접해서 낯설긴 한데 계속 공부해 봐야겠다.

0개의 댓글