오늘도 평화로움을 바라며 코딩하던 날이었습니다.
서버로부터 전달받은 토큰을 변수에 캐싱하는 로직을 포함해 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
'Design Pattern' 카테고리의 다른 글
한 층 더 파본 singleton pattern (1) | 2024.11.27 |
---|---|
Compound pattern을 적용해 공통 모달을 만들어보자 (0) | 2024.11.15 |
HOC(=고차함수)를 사용해 전역 타이머를 구현해보자 (0) | 2024.08.10 |
완전한 싱글톤 패턴으로 리팩토링을 진행해보자 (0) | 2024.05.25 |