루비와 싱글턴 패턴: 잘 어울리지 않는 조합

Ruby and the singleton pattern don't get along

작성자
발행일
2011년 10월 11일

핵심 요약

  • 1 루비에서 싱글턴 패턴을 구현하는 다양한 방법(표준 라이브러리, 클래스/모듈 메서드, `module_function`, `extend self`, bare `Object` 등)은 각각 복잡성, 철학적 문제, 예상치 못한 동작 등의 심각한 단점을 내포하고 있습니다.
  • 2 `Singleton` 모듈은 강력하지만 과도한 복잡성을 가지며, 다른 저수준 구현들은 루비 객체 시스템의 미묘한 특징과 단점을 드러내지만, 완전한 해결책을 제시하지 못합니다.
  • 3 싱글턴 패턴은 본질적으로 전역 상태 관리에 해당하며, 재사용성과 테스트 용이성을 저해하므로, 가능한 경우 패턴 자체를 피하거나 그 한계를 명확히 인지하고 신중하게 접근해야 합니다.

도입

객체 지향 언어에서 유래한 많은 디자인 패턴들이 루비에서 우아하게 번역되는 반면, 싱글턴 패턴은 루비에서 적절한 구현 방법을 찾기 어려운 예외적인 구조로 지적됩니다. 이 글은 싱글턴 패턴의 작동 방식에 대한 명확한 정의를 제시하고, 루비 표준 라이브러리 `Singleton` 모듈을 포함하여 다양한 구현 옵션들을 탐색하며, 각 접근 방식이 가지는 문제점과 한계를 심층적으로 분석합니다. 이를 통해 루비 객체 시스템의 미묘한 특성과 단점을 이해하고, 싱글턴 패턴에 대한 비판적 시각을 제시합니다.

루비에서 싱글턴 패턴을 구현하려는 시도는 여러 가지가 있으나, 모두 고유한 문제점을 안고 있습니다.

1. 표준 라이브러리 Singleton 모듈

  • include Singleton으로 단일 인스턴스를 보장하지만, 상속/복제/마샬링 등 광범위한 내부 오버라이드로 인해 과도하게 복잡합니다.

2. 클래스 메서드만 사용하는 클래스

  • undef_method :new로 인스턴스 생성을 막지만, 인스턴스화될 수 없는 클래스라는 철학적 모순과 상속 계층에서의 역할 문제가 있습니다.

3. 모듈 메서드만 사용하는 모듈

  • 인스턴스화 불가를 이용하지만, 모듈이 믹스인될 수 있어 “쓸모없는 인스턴스”와 유사한 상황을 초래하며, 순수성 관점에서 이점이 적습니다.

4. module_function을 사용하는 모듈

  • 메서드를 모듈 레벨에서 호출 가능하게 하고 믹스인 시 비공개로 만들지만, private 키워드와의 복잡한 상호작용과 비공개 메서드 호출 불가 등 혼란스러운 동작을 보입니다.

5. extend self를 사용하는 모듈

  • module_function의 대안으로, 모듈 자체에 인스턴스 메서드를 확장합니다. 접근 제어가 일관되지만, 믹스인 시 모든 메서드가 대상 객체의 공개 API에 추가될 수 있습니다.

6. Object의 베어 인스턴스 활용

  • Object.new 객체에 직접 메서드를 추가하여 구현하지만, inspect 시 불투명하고 RDoc과 같은 도구를 통한 문서화가 어렵습니다.

7. 직접 구현한 구조체

  • Scala의 object와 유사한 명명된 단일 객체 구문을 제안하지만, 루비 언어의 1차 지원 부족으로 문서화 및 기존 Class/Module과의 일관성 문제가 있습니다.

결론

루비에서 싱글턴 패턴을 구현하려는 시도는 대부분 과도하게 복잡하며, 객체 지향적 순수성을 추구하는 과정에서 실용성을 잃는 경우가 많습니다. 싱글턴 패턴은 본질적으로 전역 상태를 관리하는 화려한 방식에 불과하며, 이는 `$logger = SimpleLogger.new`와 같은 단순한 전역 변수 할당과 실질적인 차이가 미미할 수 있습니다. 시스템에 추가되는 모든 싱글턴 객체는 단일하고 전역적인 특성으로 인해 재사용성과 테스트 용이성이 저하됩니다. 따라서 싱글턴 패턴의 구현 여부는 맥락에 따라 신중하게 결정해야 하며, 기본적으로는 피하는 것이 좋습니다. 루비 언어에 우아하게 개별 객체를 정의할 수 있는 1차 구조체가 추가된다면 이 문제가 해결될 수 있겠지만, 이는 루비 코드 작성 방식에 큰 변화를 가져올 것입니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!