GGURUPiOS

[Swift] Singleton? 싱글톤에 대해 알아보기 본문

Swift/문법 파헤치기

[Swift] Singleton? 싱글톤에 대해 알아보기

꾸럽 2023. 11. 7. 21:17

안녕하세요

이번시간엔 싱글톤에 대해 알아보도록 하겠습니다.


Singleton 싱글톤?

싱글톤은 개발에 있어서 매우 인기 있는 디자인 패턴입니다.

이것은 매우 간단하고 일반적이며 프로젝트에서 사용하기 쉽습니다.

타입 프로퍼티로 클래스 인스턴스를 한 번만 초기화하며 클래스 인스턴스를 전역적으로 공유합니다.

 

무슨 말일까요. 아래의 예제로 살펴봅시다

기본적인 싱글톤 패턴 구현

class LocationManager {
    
    static let shared = LocationManager()
    
    var locationGranted: Bool?    
    private init(){} // init 함수의 접근제어를 private 으로 설정해서 외부에서는 생성을 못하게 함
    
    func requestForLocation() {
        //Code Process  
        locationGranted = true     
        print("Location granted")
    }
    
}
LocationManager.shared.requestForLocation()

 

위의 예제에서 LocationManager 라는 클래스를 정의 했습니다.

타입 프로퍼티로 

static let shared = LocationManager() 이런식으로 생성해줍니다.

(프로퍼티 명 shared는 관습적인것 같습니다.

싱글톤임을 알리는 네이밍 같은느낌.

물론 애플 문서에서도 shared로 프로퍼티명을 짓습니다.

https://developer.apple.com/documentation/swift/managing-a-shared-resource-using-a-singleton 여기서 확인가능해요)

 

private init의 의미

클래스 내부에서 선언한 싱글톤 인스턴스 이외의 다른 인스턴스를 생성하지 못하도록 하기 위함입니다.

private은 구현범위 내에서만 접근이 가능한 접근제어자이기 때문에, class 내부에서만 사용이 가능합니다.

 


싱글톤의 특징

위의 글에서 나와있듯 정리를 해보자면 싱글톤은 아래와 같은 두가지 특징이 있습니다.

  • 글로블 액세스 가능
  • 인스턴스가 단 하나

이 두가지 특징은 싱글톤의 강점이기도 하지만, 단점을 야기합니다.

 

장점

싱글톤은 엄밀히 말해서 전역객체는 아니지만 전역객체 처럼 사용할 수 있습니다.

전역으로 프로그램 어느 곳에서나 접근할 수 있다는 것이 장점입니다.(편리함)

 

단점

1. 싱글톤은 전역적으로 변경 가능한 상태를 제공

 

장점이였던 글로벌 액세스는, 프로그램 어디서든 공유 리소스에 접근할 수 있음을 나타냅니다.

그러나 어디서든 공유 리소스에 접근하면, 접근권한이 없어야 하는 코드에서도 접근, 수정이 가능하다면

발견하고 수정하기 어려운 버그를 야기할 수 있습니다.

 

싱글톤은 사용하기 쉽고 편리하기 때문에 막 사용할 수 있습니다.

그러나 이러한 편리함이 미래의 버그를 야기할 수 있으므로 주의 해야합니다.

 

2. 추적이 어렵다

 

위의 얘기와 비슷한 느낌으로, 모든 시스템이 싱글톤 액세스할 수 있고 

우리가 모르는 사이에도 인스턴스를 변경할 수 있습니다.

이는 추적하기가 까다롭고 심각한 오류를 발생 시킬 수 있습니다.

 

3. 하나의 인스턴스만 필요하다는 가정이 틀렸을 수 있다

싱글톤은 기본적으로 하나의 인스턴스만 가집니다.

그런데 앱이 성장한 후에 해당 클래스의 다른 인스턴스가 필요한 경우가 생길 수 있습니다.

그렇다면 우리는 코드의 상당 부분을 다시 작성하고, 모든 코드에 대한 상당한 리팩토링이 필요합니다.

그러므로 사용에 주의를 요합니다.

4. Massive 싱글톤

싱글톤 클래스는 종종 부피가 커질 수 있습니다.

어디서나 쉽게 접근할 수 있기 때문에 공유 코드가 싱글톤 내부에서 끝날 가능성이 높습니다.

5. 불분명한 분리

싱글톤은 분리가 불분명한 코드를 장려합니다.

관심사 분리, 단일책임이 불분명한 클래스가 되버립니다.

싱글톤은 공유 리소스에 대한 접근이 많은 객체가 가능해야 하기 때문에 광범위(모호?)하게 만듭니다.

 


Swift의 싱글톤?

  • UIApplication.shared
  • UserDefaults.standard
  • FileManager.default
  • URLSession.shared

Swift로 개발을 하다보면, 위와같은 싱글톤들을 만날 수 있습니다.

위 처럼, 애플이 구현해둔 싱글톤을 자세히 살펴보면 의문점이 하나생깁니다.

 

바로 또 다른 인스턴스를 생성할 수 있다는 것입니다. (= 하나의 인스턴스만 존재해야 해야 한다는 특징을 깹니다)

아래와 같이 생성이 가능합니다

 

즉, 싱글톤의 정의 측면에서 엄격한 의미의 싱글톤 보다는 공유 인스턴스에 가까운 것입니다.

(틀렸다면 댓글남겨주세요!)

(하지만 애플 문서에서 보면, 몇몇 객체는 싱글톤으로 설명을하고 있긴하다..)

 

 

 

 

 


주의해야 할점 

만약 싱글톤 내에 변수 프로퍼티가 있다고 생각해봅시다.

전역적으로 접근 가능하므로 앱의 여러곳에서 변수를 수정하거나 업데이트 하려고 시도할 수 있습니다.

이런 경우에는 스레드 측면에서 문제가 될 수 있습니다. (ex. 서로 다른 스레드에서 동시에 프로퍼티의 수정을 시도할 때)

주의를 해서 코드를 작성해야 합니다.


의존성 주입?

사실 싱글톤은 전역적으로 쓰이기 때문에, 사용에 주의를 요합니다.

일반적인 클래스 들은 의존성 주입을 통해 사용하게 됩니다.

의존성 주입은 추후에 다시 다뤄보도록 하겠습니다.

 

싱글톤은 그럼 언제 쓰는 것이 좋을까요?(사용사례 정도)

(아래 출처에서 따왔습니다)

  1. 유저 매니저: 일부 사용자 데이터를 저장(서버동기화 X) 유저와 디바이스 정보, 앱 내의 여러 위치에서 접근해야 할 수 있는 정보 등
  2. 키 매니저: 앱을 실행하는데 필요한 모든 키를 영구적으로 저장.
    일반적인 키값은 유저디폴트에, 암호화 키는 키체인에 저장됩니다
  3. 데이터 매니저: 스플래시 화면에서 호출되어 데이터를 한 번 로드. 앱 정보(색상, 글꼴, 배너)를 유지관리
  4. 미리보기(더미데이터) 관리: 서버와 통신하기 전에 더미 데이터를 채우기위해 싱글톤으로 만든다음 싱글톤 안에서 더미데이터를 생성한다. 
    쉽게 더미데이터로 사용 가능
  5. 파일 매니저: 파일 관리자를 사용하여 다운로드한 데이터를 저장하고 싶을 때, 싱글톤 클래스로 만들어 다른 폴더에
    데이터를 저장할 수 있도록 함.

출처 

https://medium.com/@Ariobarxan/singleton-and-swift-7f1ef456047a

 

The claim of divinity:‌ Singleton and Swift

In this article, you are going to take a deep dive into the Singleton pattern. I wrote this article after reading two books(Design…

medium.com

https://developer.apple.com/documentation/swift/managing-a-shared-resource-using-a-singleton

 

Managing a Shared Resource Using a Singleton | Apple Developer Documentation

Provide access to a shared resource using a single, shared class instance.

developer.apple.com

https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Singleton.html

 

Singleton

Retired Document Important: This document may not represent best practices for current development. Links to downloads and other resources may no longer be valid. Singleton A singleton class returns the same instance no matter how many times an application

developer.apple.com