싱글톤은 GoF에도 소개된 패턴이라 많은 사람들이 알고 계시고, 패턴중에 가장 쉽기때문에 많이들 사용하시는 거로 압니다. 그리고 그만큼 호불호 가 분명히 존재하는 패턴이기도 합니다.
저 또한 싱글톤을 그다지 좋아하지 않는데요. 제가 싱글톤을 사용하는 경우는 제가 싱글톤 클래스를 직접 정의하지 않고 IoC 컨테이너를 통해 클래스를 싱글톤 인스턴스로 등록 하는 경우입니다.
싱글톤에 대해 제대로 알기 위해서는 먼저 static 객체와 싱글톤의 차이부터 알아야 하는데요.
static 객체는 CLR이 유일한 인스턴스를 보장 해주는 인스턴스 형태입니다. 싱글톤 역시 인스턴스는 static형태로 가지고 있습니다. 프로세스 내에서 아무데서나 막 접근해도 유일한 인스턴스이기 때문에 개발 시 간편하게 사용할 수 있으나, static 객체에 여러 맴버를 추가해놓고 쉽게 프로그래밍을 한다면, 스파게티 코드 및 static 객체에 대한 의존성이 엄청나게 생겨서 프로그램 유지보수에 좋지 않은 영향 을 끼칩니다. 싱글톤은 나아가, 하나의 클래스기 때문에 static 객체에 대하여 자신만의 추가 기능을 구현하거나, 클래스기 때문에 상속 을 할 수 있다는 장점이 있습니다. 하지만 이렇게 추가 기능을 여러가지를 구현하면 역시 의존도가 높아지기 때문에 프로그래밍 구조를 깨뜨릴 수 있게 될 겁니다.
최초에 싱글톤을 적절한 의존성을 지니고 개발에 대해 편의성을 제공하려고 만들었다가도, 퇴사를 하고 이 프로그램을 잘 모르는 다음 타자가 손 대면서 싱글톤을 자주 이용하면 결과적으로 좋지 못한 프로그램이 되어 갈 것 같다는 제 생각입니다.
하지만 싱글톤에 대해서 좀 자세히 알고 싶다면 아래 포스팅을 참고하시면 좋을 듯합니다. 여러 C#의 싱글톤 코딩 형태에 대하여 VS가 자동으로 해주기 때문에 크게 의미가 없다고 주장하는 글입니다.
https://blog.naver.com/vactorman/220481200251
싱글톤 얘기가 나오면 스레드에 대해 안전하지 않다 는 말이 자주 나옵니다.
일반적으로 스레드에 대해 안전하지 않다. 라는 말은 특정 객체에 대하여 여러 스레드가 데이터를 추가, 수정, 삭제할 때 여러 스레드가 그 객체의 데이터를 조회한 시점에서 스레드들의 객체 조회값이 서로 일치하지 않을 경우 입니다. 예를 들어 List 클래스는 멀티스레드에 대해 안전하지 않은 객체이며, 10개의 스레드가 동시에 접근하여 데이터를 추가하고 삭제하고 조회했을 때 스레드들이 조회한 list의 Item count는 모두 제각각 일 것입니다.
이런 경우 .NET의 동기화 컬렉션을 사용하곤 합니다.
물론 싱글톤 객체에 대하여 여러 스레드가 동시에 접근하는 일이 없다면, 굳이 멀티스레드에 대한 대비를 하지 않으셔도 될 것 같습니다.