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부에서 작성해보겠습니다!