Spring (03). 스프링 singleton VS Java static Singleton
저번엔 Java static 싱글톤 이번엔 스프링 싱글톤에 대해 알아보자
0. 들어가기전에
저번 시간 아주 잠깐 Java의 Singleton에 대해 알아봤다. 그리고 이번시간에는 스프링 singleton에 대해 알아본다고 했었다. 하지만 그전에 이 둘의 차이를 알아보고 시작하면 좋을것 같아 두 사용법에 대한 차이를 적어보려 한다.
두 방식의 차이가 단순히 구현방식 코드의 차이만 있을까? 그랬으면, 이글을 쓰려 하지도 않았을 것이다. 물론 두패턴 모두 의도는 같을수 있지만 이둘은 생명주기의 범위가 서도 다르다. 생명주기의 범위가 다르다는건 무엇일까?
1. Spring 싱글턴 VS Java static 싱글턴
바로 위에서 말했듯 Spring의 Singleton과 Java static의 의도(여러 객채들이 하나의 인스턴스를 공유한다)는 개념은 같다. 하지만 해당 인스턴스의 생명주기(생성, 소멸, 사용)에는 조금 차이가 있다.
이 생명주기의 차이로 인해 많은 문제들이 발생한다. 이러한 문제로 인해 각 Singleton 패턴을 섞어 쓰면 안된다.
먼저 말하고 살하면,
Java static 공유 범위는 Classloader 기준이고.
Spring Singleton의 공유 범위는 ApplicationContext 기준이다.
자바 싱글턴 패턴
이전에 배웠던 자바 싱글턴 패턴을 복습해보자
- 1) 생성자를 private으로 선언 (외부에서 클래스의 오브젝트 생성할 수 없다)
- 2) 참조는 static 으로 정의 : 어느 영역에서든 접근이 가능하도록 한다.
스프링 싱글턴 패턴
스프링 싱글턴은 클래스 자체에 의해서가 아닌 스프링 컨테이너(Bean Factory/Apllication Context)에 의해 구현된다.
스프링에서는, 컨테이너 내에서 특정 클래스에 대해 @bean이 정의되면, 스프링 컨테이너는 그 클래스에 대해 딱 한개의 인스턴스를 만든다. 이 공유 인스턴스는 설정 정보에 의해 관리되고, bean이 호출될 때마다 스프링은 생성된 공유 인스턴스를 리턴 시킨다.