[Spring] Enum Singleton, 진짜로 쓸까?

sunnyboy·2025년 8월 18일

Spring

목록 보기
3/3
post-thumbnail

Enum으로 하는게 좋다면서요

자바의 대가이자 Effective Java의 저자 조슈아 블로크는 Enum을 이용한 Singleton 객체를 생성하는 것을 추천했다.

그 이유는

  1. Enum은 JVM 내 하나만 존재하는 것이 100% 보장됨
  2. Enum은 원래 직렬화가 가능해서 Serializable 인터페이스 구현안해도 됨
  3. 리플렉션으로부터 안전

근데 실제로 이 방법을 사용하는 경우가 있나?

갑자기 딴 길로 새어버림

일단 내가 주로 사용하는 스프링에서는 스프링 컨테이너에서 Bean으로 객체를 관리한다.

그래서 Singleton과는 뗄 수 없는 관계인데, 여기서도 Spring은 Enum으로 Bean을 생성하지 않는다.

자체적으로 리플렉션과 프록시를 이용하여 만든다고 한다.

일반적인 Singleton 구현 방식과 좀 다른 것 같은데… 뭐지 ??

Spring이 Singleton 객체(Bean)를 생성하는 방법

  1. @Service 가 붙은 객체를 스캔해서 찾아냄
  2. Reflection API를 사용하여 해당 클래스의 생성자를 호출
  3. 이렇게 Bean이 인스턴스화 되어 의존성 주입 등이 완료되면, 스프링 컨테이너는 이 객체를 Singleton Registry 라는 캐시 저장소에 보관
  4. 나중에 또 해당 객체를 필요로 하면 싱글톤 레지스트리에서 반환 → 재사용 보장

실제로 Bean을 생성하는 것은 내부적으로 그냥 인스턴스 생성(new)과 같은 방식임.

참고: https://docs.spring.io/spring-framework/reference/core/beans/definition.html#beans-factory-class-ctor

근데? 그것을 Singleton Registry 라는 캐시 저장소에 보관함으로써 Singleton 처럼 운영하는 것.

참고: https://docs.spring.io/spring-framework/reference/core/beans/factory-scopes.html#beans-factory-scopes-singleton

내가 알던 Singleton 구현 방법 등등과는 관련이 없다.

Spring에서는 왜 Enum으로 Singleton을 구현하지 않을까

  1. Spring은 Bean Scope를 다양하게 제공함

    Singleton 외에도 prototype이나 request, session 등 여러 인스턴스를 생성해야 하는 경우

    Enum은 못함

  2. 런타임 시점에 외부설정을 주입하기 어려움

    스프링은 XML이나 Java Config로 런타임에 Bean의 속성이나 의존성을 자유롭게 변경할 수 있음.

    Enum은 못함

  3. 생성자 주입이 안됨

    Enum은 런타임 시점에 생성자가 결정되어버려서 다른 객체를 주입받기 위한 생성자 오버로딩 불가

    Spring의 유연함에 맞지 않아!!

그래서 Enum Singleton은 어디서 씀??

뭔가 가장 안전하고 좋다.. 라는 것은 알겠는데 실제로 사용한 사례를 보지 못해서 그런가..
와닿지가 않는다.

프레임워크 같은 복잡한 경우에 쓰기는 힘들 것 같고, 좀 간단한 형태의 Singleton에서 사용할 듯??

profile
Data Analysis, ML, Backend 이것저것 합니다

0개의 댓글