Home 싱글톤 레지스트리
Post
Cancel

싱글톤 레지스트리

싱글톤 레지스트리

이전 까지 우리는 스프링 애플리케이션 컨텍스트에 대해 알아보았다. 애플리케이션 컨텍스트는 오브젝트 팩토리와 비슷한 방식으로 동작하는 IoC 컨테이너이다. 그러면서 동시에 이 애플리케이션 컨텍스트는 싱글톤을 저장하고 관리하는 싱글톤 레지스트리이기도 하다.

싱글톤 패턴(Singleton Pattern)

싱글톤 레지스트리를 알아보기 전에 싱글톤 패턴에 대해 먼저 알아보자.

싱글톤 패턴은 어떤 클래스를 애플리케이션 내에서 제한된 인수턴스 수를 가지도록 하는것이다. 보통은 이름처럼 하나만 존재하도록 강제하는 패턴이다.

서버 애플리케이션과 싱글톤

왜 스프링에서 싱글톤 개념이 나오는 것일까? 이는 스프링이 태생적으로 자바 엔터프라이즈 기술을 사용하는 서버환경을 위해 고안된 기술이기 때문이다.

여기서 말하는 서버환경은 서버 하나당 최대로 초당 수십에서 수백 번씩 브라우저나 여타 시스템으로 부터 요청을 받아 처리할 수 있는 높은 성능이 요구되는 환경이다.

만약 한번의 요청에 5개의 오브젝트가 만들어 진다고 가정해보면, 초당 500번의 요청을 처리하기 위해서는 2500개의 오브젝트가 생성된다.

아무리 자바의 오브젝트 생성과 가비지 컬렉션의 성능이 좋아졌다고 한들 이렇게 부하가 걸리면 서버가 감당하기 힘들어 진다. 이런 이유로 서버환경에서는 싱글톤의 사용이 권장된다.

안티패턴 싱글톤

서버환경에서는 싱글톤의 사용이 권장된다고 하였지만 디자인 패턴 관점에서는 피해야할 패턴인 안티패턴으로 분류된다.

우선 간단히 싱글톤 오브젝트를 만들어보겠다.

1
2
3
4
5
6
7
8
9
public class Singleton {
    private static Singleton instance = new Singleton();

    public static Singleton getInstance() {
        return instance;
    }

    private Singleton() {}
}
  1. 싱글톤 오브젝트는 생성된 오브젝트를 저장하기 위해 자신과 같은 타입의 스태틱 필드를 정의한다.
  2. 외부에서 오브젝트를 생성하지 못하도록 생성자를 private으로 만든다.
  3. 마지막으로 생성된 오브젝트를 반환해줄 getInstance 스태틱 메소드를 만든다.

자바에서 싱글톤을 구현하는 방법은 보통 위와 같다. 하지만 일반적으로 싱글톤 패턴 구현 방식에는 다음과 같은 문제가 있다.

  • private 생성자로 인해 상속할 수 없다.
  • 테스트가 힘들다.
  • 서버환경에서는 싱글톤이 하나만 만들어지는 것을 보장하지 못한다.
  • 전역 상태를 만들 수 있기 때문에 바람직하지 못하다.

스프링 - 싱글톤 레지스트리

싱글톤에는 다양한 문제점이 존재한다. 하지만 스프링은 서버환경에서 오브젝트를 싱글톤 방식으로 사용되는 것을 적극 지지한다. 그로인해 스프링은 직접 싱글톤 형태의 오브젝트를 만들고 관리하는 기능을 제공한다. 바로 싱글톤 레지스트리다. 그리고 싱글톤 레지스트리는 다음과 같은 장점을 가진다.

  • public 생성자를 가질 수 있다.
  • 테스트가 간단하다.
  • 객체지향적인 설계 방식과 원칙, 디자인 패턴등을 적용하는데 아무런 제약이 없다.
1
2
3
4
5
6
7
8
9
10
11
12
13
public class SingletonTest {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(MemberFactory.class);
        MemberRepository memberRepository1 = context.getBean("memberRepository", MemberRepository.class);
        MemberRepository memberRepository2 = context.getBean("memberRepository", MemberRepository.class);

        System.out.println("memberRepository1 = " + memberRepository1);
        System.out.println("memberRepository2 = " + memberRepository2);

        // memberRepository1 = hello.core.member.MemoryMemberRepository@6eeade6c
        // memberRepository2 = hello.core.member.MemoryMemberRepository@6eeade6c
    }
}

위의 코드를 실행해보면 스프링이 객체의 싱글톤을 보장해 주는 것을 알 수 있다.

스프링이 빈을 싱글톤으로 만드는 것은 결국 오브젝트의 생성 방법을 제어하는 IoC 컨테이너로서의 역할이다. 위의 코드를 통해 확인하였듯이 스프링 IoC를 적용하면 싱글톤 객체로 만들어진다. 그래서 getBean()을 여러 번 호출하여 요청하더라도 매번 동일한 오브젝트를 받게 된다.

참고

This post is licensed under CC BY 4.0 by the author.

스프링 빈 조회

컴포넌트 스캔과 의존관계 주입

Comments powered by Disqus.