어플리케이션이 시작될 때 클래스가 최초 한번만 메모리를 할당하고(static)
그 메모리가 인스턴스를 만들어 사용하는 디자인 패턴
예를 들어 레지스트리 같은 설정 파일의 경우 객체가 여러개 생성되면 설정 값이 변경될 위험이 생길 수 있다.
인스턴스를 1개만 생성되게 되는 싱글톤 패턴 적용 시, 하나의 인스턴스에 메모리를 등록해서 여러 개 쓰레드가 동시에 해당 인스턴스를 공유하여 사용할 수 있기 때문에 많은 요청이 일어나는 곳에서 효율을 높일 수 있다.
이러한 장점을 가진 싱글톤 패턴은 DBCP (DatabaseCommection Pool)처럼 공통된 객체를 여러 개 생성해서 사용하는 경우 많이 이용된다.
즉 메모리 낭비를 방지
, 클래스 간 데이터 공유가 쉽다
는 장점이 있기 때문에 싱글톤 패턴을 활용한다.
이는 객체 지향 설계 원칙에 어긋나기 때문에 수정이 어려워지고 유지보수 비용이 높아질 수 있다.
또한 멀티쓰레드 환경에서 동기화 처리를 안하면 인스턴스가 2개가 생성될 가능성이 생긴다.
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 학습 중 알게 된 싱글톤 패턴... 내용을 정리하고 관련 내용을 코드로 작성해보며 이해는 할 수 있었다.
아직 처음 접해서 낯설긴 한데 계속 공부해 봐야겠다.