Singleton 패턴

Eddy📱·2022년 8월 9일
1

Design-Pattern

목록 보기
1/4
post-thumbnail

Singleton이란?

static 타입 프로퍼티로 전역으로 하나의 Class를 생성하여, 공용으로 사용하는 디자인 패턴이다.
인스턴스가 하나만 존재하는 것을 보증하고 싶을 경우에 주로 사용된다.

iOS에서는 앱 설정이나 사용자의 기본 설정을 저장하는 UserDefaults를 사용할 때 인스턴스를 한번만 생성하여 여러 곳에서 공유해서 사용한다

장단점

장점

  • 하나의 인스턴스 생성으로 메모리 낭비 방지
  • 전역 instance로 공유가 쉬움
  • 두 번째 사용시에는 기존에 생성된 것을 사용하기 때문에 로딩시간 감소

단점

  • 싱글톤 객체와 싱글톤 객체 사용하는 클래스들 간의 결합도가 높아짐
  • 유지보수, 테스트 어려움
  • 변경에 대한 추적이 어려움

Multi Threading 환경에서 안전한가?

swift에서는 static을 사용해 타입 프로퍼티로 인스턴스를 생성하기 때문에 사용 시점에 초기화되고 Dispatch_once도 자동 적용 되기 때문에 Thread-Safe하다.

Dispatch_one란?

응용 프로그램의 수명 동안 한 번만 블록 개체를 실행하게 해준다.

여러 스레드에서 동시에 호출되는 경우 이 함수는 블록이 완료될 때까지 동기식(serial)으로 기다린다.

Object-C에서 싱글톤을 만들때 사용한다.

Singleton은 왜 안티패턴일까?

싱글톤을 사용하는 곳과 싱글톤 클래스 사이에 의존성이 생기게 된다.

클래스 사이에 강한 의존성, 즉 결합도가 높아지면 단위테스트의 어려움 등 다양한 문제가 발생한다.

아무 객체나 자유롭게 접근하고 수정하고 공유할 수 있는 전역 상태를 갖는 것은 객체지향 프로그래밍에서는 지양되어야 할 패턴이다.

SOLID 원칙의 대부분은 인터페이스 설계와 관련이 있다.

의존성을 구현부(콘크리트 클래스)가 아닌 Interface에 두면 실제 구현부가 변경되어도 이를 사용한 코드는 큰 영향을 받지 않는다.

그렇기 때문에 SOLID원칙(OCP, LSP, ISP, DIP등)을 지키기 위해서는 인터페이스로 설계를 하는 것이 좋다.

하지만 싱글톤을 이용하는 경우 대부분 인터페이스가 아닌 구현부의 객체를 미리 생성해놓고 정적 메소드를 이용하여 사용하게 된다.

아무 객체나 자유롭게 접근하고 수정하고 공유할 수 있는 전역 상태를 갖는 것은 객체지향 프로그래밍에서는 지양되어야 할 모델이다.

싱글톤을 대체하는 방법?

싱글톤을 사용하지 않고 의존성 주입을 통해 활용하는 방식으로 대체할 수 있다.

코드를 보면 이해가 될 것이다.

//DataManagerInjector.swift
protocol DataManagerInjector {
    var dataManager: DataManager { get }
}
fileprivate let sharedAppDataManager: DataManager = DataManager()

extension DataManagerInjector {
    var dataManager: DataManager {
        return sharedAppDataManager
    }
}
--------------------------
//MainViewController.swift
class MainViewController: UIViewController, DataManagerInjector {
     func tappedSave(withObject object: ModelType) {
         self.dataManager.save(object)
     } 
}

이렇게 사용하게되면 공유 instance를 protocol 내부의 extension에서만 사용하고 있다.

이 말은 즉, 이 프로토콜을 채택한 곳에서만 sharedAppDataManager를 사용할 수 있다.

그래서 모든 곳에서 접근이 가능하지 않게 된다! 이로써 싱글톤에서 생기는 전역적으로 접근할 수 있기에 은닉화가 되어있지 않고 여러 곳에서 결합도가 늘어나는 문제를 해결할 수 있다.

참고 사이트

https://medium.com/@hartwellalex/protocol-extensions-and-shared-dependency-injection-in-swift-an-alternative-to-singletons-68934dee6998

profile
Make a better world

0개의 댓글