설계 패턴 : 싱글톤 패턴이란 무엇인가? 1부

박철민·2023년 4월 4일
0

CS 지식

목록 보기
4/8

싱글톤 패턴

싱글톤 패턴이란?

싱글톤 패턴은 '하나'의 클래스에 오직 '하나'의 인스턴스만 가지는 패턴입니다.

하나의 클래스, 하나의 인스턴스 이말을 쉽게 풀이하자면 하나의 클래스를 기반으로 여러 번 호출 하여 새롭게 사용하는 것이 아니라 하나의 인스턴스만을 생성하고 이를 사용하는 것입니다.

예를 들어서 Class 공용버스 가 있다고 해봅시다. 이 공용버스는 모든 회사원들이 사용하는 버스이며 하나밖에 존재하지 않습니다.

Class 회사원은 공용버스를 사용해야 합니다. 우리는 이 경우 호출을 하게 됩니다. 근데 만약 new 연산자를 사용해 공용버스를 사용할 경우 어떻게 될까요? 잘못하면 모든 회사원들이 자신만의 공용버스를 소유하게 될 겁니다. 이렇게 될경우 원하지 않는 결과가 이뤄지겠죠?
-> 예를 들어 사장님이 이용요금을 올렸는데 그게 다른 사람들의 공용버스에는 안되고 어우 복잡해라

이렇게 하나만 존재하고 그거 하나로만 처리해야 하는 경우 사용하는 패턴이 바로 '싱글톤 패턴'입니다.

하나의 클래스를 기반으로 단 하나의 인스턴스를 만들어 이를 기반으로 로직을 만드는데 쓰이며 보통 데이터베이스 연결모듈에 많이 사용합니다.

실제 우리가 사용하는데에는 데이터베이스 연결 모듈에 쓰입니다!
왜냐하면 모든 클래스들이 하나의 데이터베이스에 연결하는데 많은 데이터베이스 연결 모듈이 필요하지 않기 때문이죠!

장점

하나의 인스턴스를 기반으로 해당 인스턴스를 다른 모듈들이 공유하여 사용하기 때문에 인스턴스를 생성할 때 드는 비용이 줄어듭니다. 그렇기 때문에 "인스턴스생성에 많은 비용'이 드는 I/O 바운드 작업에 많이 사용합니다.

위의 예제를 생각하면 모든 사람이 공용버스를 소유하는 것보다 하나의 공용버스를 사용하는 것이 당연히 자원(메모리) 소모가 적을 것입니다.

I/O바운드
네트워크 연결이나 DB, 파일 시스템에 접속하는 것을 I/O 바운드라고 한다. 대체적으로 시간이 매우 많이 드는 작업들이다.

단점

의존성이 높아지며 싱글톤 패턴은 TDD를 할 때 걸림돌이 됩니다. TDD를 할 떄 단위 테스틀 주로 하는데, 단위 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행할 수 있어야 합니다.
하지만 싱글톤 패턴은 미리 생성된 하나의 인스턴스를 기반으로 구현하는 패턴이므로 각 테스트마다 '독립적인' 인스턴스를 만들기가 어렵습니다.

의존성이란?
코드에서 두 모듈 간의 연결로 객체지향언어에서는 두 클래스 간의 관계라고도 말합니다.
일반적으로 둘 중 하나가 다른 하나를 어떤 용도를 위해 사용합니다.

좀 더 쉽게 이야기하자면
위의 사람들 마다 공용버스를 공유하고 있는데 공용버스의 색깔이 바뀌면 모든 사람들의 공유버스의 색이 변하는 것을 알 수 있습니다. 이렇게 A가 바뀌었을 때 B또한 바뀌게 되는 것을 의존성이라고 합니다.

?? 근데 이게 왜 문제가 되죠 ??
만약 제가 공용버스를 삭제하는 테스트를 돌려본다고 해봅시다. TDD는 테스트를 한 결과가 테스트 밖으로 나가면 안됩니다. 근데 제가 테스트로 버스를 없애자 모두의 버스가 사라져버렸네요?! 이거는 제가 의도한 것이 아닙니다. 이런 식으로 테스트 바깥에 영향을 끼치게 독립적이지 못한 환경을 싱글톤 패턴은 야기하게 되는 겁니다.

엥 그럼 어쩔 수 없나요?
다행히 이 문제를 해결하는 방법이 있습니다. 그것이 바로 의존성 주입입니다.

의존성 주입

이러한 모듈간의 결합을 느슨하게 만드는 방법을 바로 의존성 주입이라고 합니다.
쉽게 이야기하면 중간에 의존성 주입자가 의존성 주입 부분을 가로채 메인 모듈이 '간접'적으로 의존성을 주입하는 방식입니다. 자세한 설명은 추후 의존성 주입에 대해서 상세히 설명하겠습니다!

여기서 1부를 마치겠습니다!

참고자료 : 면접을 위한 CS전공지식 노트,
https://tony-programming.tistory.com/entry/Dependency-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%9D%B4%EB%9E%80,

profile
멘땅에 헤딩하는 사람

0개의 댓글