싱글톤 레지스트리

반응형
728x90
반응형

스프링의 빈 오브젝트

스프링의 애플리케이션 컨텍스트는 IoC 컨테이너로써, 싱글톤을 저장하고 관리하는 싱글톤 레지스트리이다. 스프링은 여러 번에 걸쳐 빈을 요청하더라도 매번 동일한 오브젝트를 돌려준다. getBean() 메소드를 실행할 때마다 같은 오브젝트를 돌려준다. 스프링은 기본적으로 별다른 설정을 하지않으면, 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만든다.

 

왜 스프링은 싱글톤으로 빈을 만들까?

스프링이 주로 적용되는 대상은 자바 엔터프라이즈 서버환경이다. 자바 엔터프라이즈 서버환경이란, 서버 하나당 최대로 초당 수십에서 수백번씩 브라우저나 다른 시스템으로부터의 요청을 받아 처리할 수 있는 높은 성능이 요구되는 환경이다. 만약 매번 클라이언트에서 요청이 올때마다 각 로직을 담당하는 오브젝트를 새로 만들어서 사용한다면, 부하가 걸리게 되면서 서버가 감당하기 힘들어진다. 그래서 서블릿 클래스당 하나의 오브젝트만 만들어두고, 사용자의 요청을 담당하는 여러 스레드에서 하나의 오브젝트를 공유하여 동시에 사용한다.

 

 

자바에서의 싱글톤 구현 방법

1) 클래스 밖에서는 오브젝트를 생성하지 못하도록 생성자를 private로 만든다.

2) 생성된 싱글톤 오브젝트를 저장할 수 있는 자신과 같은 타입의 static 필드를 정의한다.


3) static 팩토리 메소드인 getInstance()를 만들고 이 메소드가 최초로 호출되는 시점에서 한번만 오브젝트가 만들어지게한다. 생성된 오브젝트는 static 필드에 저장되고 static 필드의 초기값으로 오브젝트를 미리 만들어둘 수 있다.


4) 한번 오브젝트가 만들어지고 난 후에는 getInstance() 메소드를 통해 이미 만들어져 static 필드에 저장해둔 오브젝트를 넘겨준다.

 

public class Test {   private static Test INSATCE;      private Test() {...}    public static synchronized Test getInstance() {     if (INSTANCE == null) {       INSTANCE = new Test(???);       return INSTANCE;     }   } }

 

위 코드의 문제점을 알아보자.

 

1) private 생성자를 갖고있기 때문에 상속할 수 없다.

싱글톤 패턴은 생성자를 private로 제한한다. 문제는 private 생성자를 가진 클래스는 다른 생성자가 없다면 상속이 불가능하다. 이는 객체지향적인 설계의 장점을 적용하기가 어려운 큰 문제가 있고, 상속과 다형성 같은 객체지향의 특징이 적용되지 않는 static 필드와 메소드를 사용하는 것이 문제를 발생시킨다.

 

2) 테스트가 어렵다.

싱글톤은 만들어지는 방식이 제한적이기 때문에 테스트에서 사용될 때 목 오브젝트 등으로 대체하기 어렵다.

 

3) 서버환경에서는 싱글톤이 하나만 만들어지는 것을 보장하지 못한다.

서버에서 클래스 로더를 어떻게 구성하고 있느냐에 따라서 싱글톤 클래스임에도 하나 이상의 오브젝트가 만들어질 수 있다.

 

4) 싱글톤의 사용은 전역 상태로 만들 수 있기 때문에 바람직하지 못하다.

싱글톤의 static 메소드를 이요해 언제든지 싱글톤에 쉽게 접근할 수 있기 때문에 애플리케이션 어디서든지 사용이 가능한 전역상태가 된다. 아무 객체나 자유롭게 접근하고 수정하고 공유할 수 있는 전역 상태를 갖는다는 것은 객체지향 프로그래밍에서는 권장되지 않는다.

 

 

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

싱글톤 레지스트리란, 스프링이 직접 싱글톤 형태의 오브젝트를 관리하는 기능을 제공해주는 것이다. 스프링 컨테이너는 싱글톤을 생성하고, 관리하고, 공급하는 싱글톤 관리 컨테이너이기도 하다. 싱글톤 레지스트리는 자바 클래스를 싱글톤으로 활용하게 해준다. 평범한 자바 클래스도 IoC 방식의 컨테이너를 사용해서 생성과 관계설정, 사용 등에 대한 제어권을 컨테이너에게 넘기면 손쉽게 싱글톤 방식으로 만들어져 관리되게 할 수 있다. 오브젝트 생성에 관한 모든 권한은 IoC 기능을 제공하는 애플리케이션 컨텍스트에 있기 때문이다. 스프링의 싱글톤 레지스트리 덕분에 싱글톤 방식으로 사용될 애플리케이션 클래스라도 public 생성자를 가질 수 있다.

 

 

스프링 빈의 스코프

스프링이 관리하는 오브젝트, 즉 빈이 생성되고, 존재하고, 적용되는 범위를 빈의 스코프라고 한다. 스프링 빈의 기본 스코프는 싱글톤이다. 싱글톤 스코프는 컨테이너 내에 한 개의 오브젝트만 만들어져서, 강제로 제거하지 않는 한 스프링 컨테이너가 존재하는 동안 계속 유지된다. 스프링에서 만들어지는 대부분의 빈은 싱글톤 스코프를 갖는다.

 

 

반응형

'Coding > Spring' 카테고리의 다른 글

Reactive Spring / Reactive Programming  (1) 2020.01.11
필드주입과 생성자주입의 차이  (0) 2019.02.15
코드 리팩토링  (0) 2018.05.03
코드의 응집도와 결합도  (0) 2018.05.03
제어의역전 IOC  (0) 2018.03.17

Designed by JB FACTORY