[TIL CS]싱글톤 패턴에 대하여

조민수·2022년 9월 15일
0

cs

목록 보기
1/5
post-thumbnail

2022-09-01
그 동안 학부 때 배웠던 디자인 패턴이지만 상당히 많이 시간이 지나 까먹은 것도 사실이니 간단히 다시 한번 정리를 해놓자

그럼 그 전에 디자인 패턴에 대한 정의를 내려보자

디자인패턴

디자인 패턴은 프로그램을 설계할 때 발생했던 문제점들을 객체간의 상호관계 등을 이용하여 해결할 수 있도록 규약 형태로 만들어 놓은 것이다

하지만 사실 말이 이렇게만 들으면 대체 정확히 '규약'이라는 말은 사실 정확히 몸에 와닿는 표현은 아닌 것 같다...😅

따라서 좀 직접적으로 사용하는 개발론적으로 생각해보면

디자인패턴은 기존환경에서 반복적으로 일어나는 문제점들을 어떻게 해결해나갈지에 대한 일종의 솔루션이라고 생각하면 된다

그럼 디자인패턴을 쓰면 무엇이 좋은가 생각해보면

장점

1.재사용이 가능한 설계는 선택하고,재사용을 방해하는 설계는 배제하도록 도와줌
2.이미 만든 시스템의 유지보수나 문서화도 개선할 수 있다
3.클래스의 명세를 정확히 알 수가 있다


🚩싱글톤패턴

우선 싱글톤 패턴은

생성패턴! 중 하나이다

그럼 생성패턴은 뭔가..??
우리가 공부하는 패턴에는 대략적으로 카테고리가

  1. 생성패턴
  2. 구조패턴
  3. 행동패턴
이런식으로 나뉜다 그 중 생성패턴은

인스턴스를 만드는 절차를 추상화하는 패턴이다

그 말은 즉슨
1.생성패턴은 시스템이 어떤 Concete Class를 사용하는지에 대한 정보를 캡슐화한다
2.이들 클래스의 인스턴스들이 어떻게 만들어지고 어떻게 결합하는지에 대한 부분을 완전 가려줘 우리는 그 구현과정은 몰라도 된다

다시 돌아와서

🤷‍♂️싱글톤패턴 얘기로 돌아오면

어떤 클래스의 인스턴스가 오직 하나임을 보장하며, 이 인스턴스에 접근할 수 있는 전역적인 접촉점을 제공하는 패턴!
즉 어떤 클래스의 인스턴스가 메모리 상에 단 하나만 존재할수있게하는 원리이다!

🙋‍♂️그럼 전역변수처럼하면 되지않아??

물론 좋은 생각이 될 수 있겠지만 싱글톤패턴을 사용함으로써 애초에 또 같은 인스턴스가 할당되는 것을 내부적으로 막아줘서 하나만 사용되게 하는 것 이다.

그럼 대체 언제쓸려고 해당 패턴을 쓰는걸까??

1.데이터베이스 모듈,로그를 찍는 객체,쓰레드 풀 ,윈도우관리자 등
여러 객체를 관리하는 역할의 객체는 프로그램내에서 단 하나의 인스턴스만 있는게 좋기 때문이다!

정리하자면 I/O bound 작업에는 네트워크작업,데이터베이스,파일시스템 등이 있는데 이러한 작업은 상대적으로 시간이 많이 걸리는 작업으로 필요!

예를 들어보면 데이터베이스 모듈에서 connection을 위한 객체 생성시 굳이 여러 인스턴스를 만들면 매번 용도는 같지만 계속 db연결위한 객체 생성은 몹시 큰 비용이 들기 때문이다


👨‍💻싱글톤패턴 js로 구현하기

	class Singleton{
     	constuctor(){
         	if(!Singleton.instance){
              Singleton.instance=this;
            }
          return Singleton.instance;
        }
      getInstance(){
       	return Singleton.instance;
      }
      
    }
//즉 하나의 인스턴스가 만들어놓은게 없으면 새롭게 하나 만들어주고
//있으면 기존의 만든 것을 반환한다

그럼 매번 싱글톤패턴은 쓰는건 좋기만 한걸까??
아니다 물론 단점도 존재한다

대표적으로 TDD에는 큰 영향을 주는게 싱글톤패턴이다
왜냐하면 TDD 특징상 각 테스트 단위별로 순서가 바뀌어도 똑같은 결과를 내야하지만

하나의 인스턴스로부터 공유하는 특징에 의해 문제가 발생,,

그만큼 싱글톤패턴은 의존성이 상당히 높아진다고 말할수있다

예를 들어오면 js의 테스트 라이브러리인 Mocha를 예시를 들자면

실제로 해당 코드는 Mocha.js에서 Array의 있는 index.js라는 함수를 검사해주는 Tdd이다.위 아래 함수는 똑같은 기능을 하면서 a라는 변수에 4의 값이 없으면 -1이면 테스트를 합격하는 코드이다.

하지만 첫번째 테스트코드에서 만약 변수에 접근하여 값을 바꾸게 되면 밑에 테스트에서는 틀릴 수 밖에 없게된다

따라서 싱글톤패턴에서는 기본적으로 인스턴스를 미리 생성해둬야하는 순서가 즉 의존성이 있기때문에 각 독립적으로는 못한다,,,왜냐하면 하나의 변수로 공유하는 원리니,,,


😲결론
싱글톤패턴의 장점:
1.IO바운드같은 비용이 많이 드는 작업에서 인스턴스를 하나로 공유하므로써 인스턴스비용절감
단점:
1.의존성이 높아져 TDD에 좋지않음-각 테스트마다 독립적인 인스턴스를 생성 못하니,,,

profile
컬러감이 있는 프론트엔드개발자

0개의 댓글