apple/DesignPattern, Architecture

Swift 디자인패턴 Singleton Pattern (싱글톤 패턴)

lgvv 2022. 4. 12. 03:11

Swift 디자인패턴 Singleton Pattern (싱글톤 패턴)

 

Singleton 패턴은 애플리케이션 전체에서 하나의 인스턴스만 생성되도록 보장하며, 전역적으로 접근할 수 있는 접근점을 제공.

Swift 6부터는 동시성 문제가 발생할 수 있어서 주의해서 사용

 

히스토리

    • 2022-04-12: 디자인 패턴 스터디 정리
    • 2024-11-29: 포스팅 글 재정리 및 조금 더 실용적인 예제 코드로 변경

 

싱글톤 패턴

 

 


Singleton Pattern

Singleton Pattern은 아래의 특성을 가짐

  • 전역 접근성: 인스턴스를 전역적으로 접근 가능.
  • 하나의 인스턴스: 클래스의 인스턴스는 프로그램 내에서 단 하나만 존재.
  • 필요할 때 객체를 생성하며, 힙에 올라가고 앱이 종료될 때 해제됨.

장점

  • 전역적으로 상태 관리에 용이
  • 인스턴스가 하나만 생성되어서 객체가 여러개 생성됨으로써 발생하는 메모리 낭비 막을 수 있음
  • 공통 자원의 일관성 유지

단점

  • 글로벌 상태 문제로 인하여 코드의 의존성이 증가
  • 의존성 주입 등으로 인해 테스트 환경을 구축하기가 어려울 수 있음
  • 멀티스레드 환경에서 초기화 안전성 문제 존재
  • 해당 객체를 더이상 사용하지 않는 상태에도 힙에 올라가서 오히려 메모리 낭비로 이어질 수 있음

정리

  • 싱글톤 패턴은 장단점이 분명하여, 특징을 이해하고 적절하게 사용하는 것이 좋음
  • 대규모 리팩토링 과정에서 싱글톤으로 객체를 처리한 후 개발이 끝난 다음에 의존성을 주입하는 형태로 가는 과정에서 사용될 수 있음

 

코드 예제

싱글톤 패턴의 구현에 actor를 사용함. swift 6에서 동시성 문제가 발생할 수 있어서 더 안전하게 사용하고자 함.

import SwiftUI

final actor Database {
    static var shared: Database = {
        return .init()
    }()
    
    private var instance: [String: String] = [:]
    
    private init() {}
    
    func write() {}
    
    func read() { }
}