Design Pattern

그저 작성했는데 싱글톤 패턴이었던 것에 대하여

KANG_G1 2024. 5. 23. 18:00

오늘도 평화로움을 바라며 코딩하던 날이었습니다.


서버로부터 전달받은 토큰을 변수에 캐싱하는 로직을 포함해 PR했는데요.

하나의 인스턴스로 관리한다는 키워드로 구글링을 할 때,

여러 블로그가 있었지만 제로초 블로그를 통해 제 코드가 싱글톤 패턴이라는 것을 깨닫고

해당 디자인 패턴에 대해 알게되었습니다.

 

사실, 제가 처음 개발 분야에 입문하고 여러 인터뷰에 참여할 당시

싱글톤 패턴에 대해서 알고있느냐는 질문을 몇 번 받았는데요.

2년차가 된 지금, 제가 싱글톤 패턴을 기반으로 한 코드를 작성했다는게 신기해서

포스팅하게 되었습니다.


싱글톤 패턴이란?

클래스의 인스턴스를 하나만 생성하고, 그 인스턴스를 어디서든 접근할 수 있도록 하는 디자인 패턴인데요.

단 하나 객체만을 만들 때 사용되며 어디서든 해당 객체에 접근할 수 있다는 의미입니다.

 


직접 구현해본 싱글톤 패턴 예시

// 변수로 인스턴스를 관리
let userInstance = null;

// 싱글톤 객체를 생성하는 함수
const createUser = () => {
  let userInfo = {};

// user의 국룰 정보인 name, age, email을 인스턴스에 저장
  const setUserInfo = (name, age, email) => {
    userInfo = { name, age, email };
  };


  const updateUserInfo = (key, value) => {
    if (userInfo[key] !== undefined) {
      userInfo[key] = value;
    }
  };

  const getUserInfo = () => {
    return userInfo;
  };

  const resetUserInfo = () => {
    userInfo = {};
  };

  return {
    setUserInfo,
    updateUserInfo,
    getUserInfo,
    resetUserInfo
  };
};

// 싱글톤 인스턴스를 리턴하는 함수
const getUserInstance = () => {
  if (!userInstance) {
    userInstance = createUser();
  }
  return userInstance;
};

// 예시
const userSingleton = getUserInstance(); // 또는 getUserInstance()로만 사용 가능
userSingleton.setUserInfo('붉은발의제프', 32, 'redjeff@gmail.com'); // { age: 32, email: "redjeff@gmail.com",name: "붉은발의제프" }
userSingleton.updateUserInfo('age', 22); { age: 22, email: "redjeff@gmail.com",name: "붉은발의제프" }
userSingleton.resetUserInfo(); // {}

 

사내 코드를 보여줄 수는 없어 간단히 작성해본 싱글톤 패턴 예시입니다.

위의 코드가 싱글톤 패턴인 이유를 2가지로 정리해보았는데요.

 

1. 단일 인스턴스로만 관리(= userInstance라는 객체 변수)

2. 전역에서 해당 인스턴스에 대해 접근이 가능하며, 다수 호출되더라도 동일한 인스턴스를 참조.

동일한 인스턴스를 여러 번 호출해도 동일한 객체가 리턴된다는 의미


다 작성하고 보니 제가 작성한 싱글톤 패턴은 완전한 싱글톤 패턴이 아니겠다는 생각이 들었는데요.

왜냐하면 현재는 전역에서 모든 속성에 접근이 가능하기 때문이죠.

 

완전한 싱글톤 패턴으로 진화시키는 과정은 2부에서 작성해보겠습니다!

 

Reference

[zeroCho - 디자인 패턴(싱글턴, 모듈, 생성자)]