나 홀로 객체 패턴
Singleton Pattern은 특정 class를 하나의 instance로만 제한하는 디자인 패턴입니다.
즉, 모든 참조는 단 하나의 객체로만 하게 됩니다. 애플의 framework에도 빈번히 발견할 수 있는 패턴이기도 합니다.
그렇다면 Singleton pattern은 어떤 경우 사용할까요? iOS에는 UIApplication이라는 객체가 존재합니다.
앱이 실행될 때 시스템은 UIApplicationMain함수를 부르게 되는데 이 과정에서 UIApplication 객체를 Singleton pattern으로 생성합니다.
UIApplication의 주요 역할은 들어오는 사용자 이벤트의 초기 라우팅을 처리하는 것입니다. 이런 처리를 앱이 실행될 때가 아닌 다른 상황에서 여러 객체를 생성해서 한다면 UIApplication이 적절하게 초기화되고 적절한 역할을 수행할 수 없을 수도 있습니다.
이처럼 Singleton pattern은 객체가 하나 이상의 인스턴스를 가질 때 문제가 발생할 수 있는 부분을 방지할 때 사용하곤 합니다.
단, Singleton pattern을 잘못 사용한다면 Singleton Pattern이 적용된 객체에 다른 객체들이 의존성을 너무 많이 갖게 되어 쉽게 수정이 어렵기 때문에 적절한 상황에서 사용해야 합니다.
그럼 백그라운드에 진입할 때 로그를 보내는 코드를 Singleton pattern이 어떤 것인지 보겠습니다.
(이렇게 구현하지 않아도 되지만 예시로 한번 보겠습니다.)
우선 Log라는 Value Object가 있습니다. 이 구조체를 사용해서 로그 정보를 다룰 것입니다.
다음은 로그를 보내는 객체로 Singleton pattern이 적용된 class입니다. 로그를 배열로 갖고 있고 send()가 호출되면 서버에 저장된 로그들을 전송합니다.
아래는 BackgroundLogger가 어떻게 사용되는지 나타냅니다. 특정 상황에서 BackgroundLogger에 로그를 add 하고 (이 곳에선 viewDidLoad가 특정 상황이라고 가정합니다.) Background에 진입 시 AppDelegate class에서 send() 메서드가 호출됩니다.
이렇게 구현하게 되면 화면이 전환돼도 한 곳(BackgroundLogger.shared)에 로그가 쌓이고 백그라운드 진입 시 한 번에 로그를 전송할 수 있습니다.
만약, BackgroundLogger가 각각 객체가 Singleton Pattern이 아니라면 어떻게 될까요?
각 ViewController마다 Background Notification을 등록하고 로그를 보내야 할 것입니다. 여러 번의 네트워크 요청이 발생할 수 있죠. 이런 상황에서 Singleton pattern을 사용하면 한 번의 네트워크 요청으로 로그를 남길 수 있습니다.
물론 완벽한 예시는 아닙니다. 그래도 Singleton Pattern을 어떻게 사용할 수 있는지 참고하면 좋겠습니다.
읽어주셔서 고맙습니다.
Raywenderlich의 Design Patterns by Tutorials를 참고했습니다.
https://www.raywenderlich.com/books/design-patterns-by-tutorials/v3.0