본문 바로가기

토비의 스프링

[토비의 스프링] 싱글톤 레지스트리로서의 애플리케이션 컨텍스트

 

1) 싱글톤 레지스트리란?

 

- 애플리케이션 컨텍스트는 우리가 만들었던 오브젝트 팩토리와 비슷한 방식으로 동작하는 IoC 컨테이너다.

  그러면서 동시에 이 애플리케이션 컨텍스트는 싱글톤을 저장하고 관리하는 싱글톤 레지스트리(singleton registry)이기도 하다.

 

- 스프링은 기본적으로 별다른 설정을 하지 않으면 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만든다.

  여기서 싱글톤이라는 것은 디자인 패턴에서 나오는 싱글톤 패턴과 비슷한 개념이지만 그 구현 방법은 확연히 다르다. 

 

 

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

- 왜 스프링은 싱글톤으로 빈을 만드는 것일까? 

  이는 스프링이 주로 적용되는 대상이 자바 엔터프라이즈 기술을 사용하는 서버환경이기 때문이다.

  물론 스프링으로 PC 등에서 동작하는 독립형 윈도우 프로그램 같은 걸 개발할 수도 있긴 하지만

  실제로는 그히 드물다.

 

- 태생적으로 스프링은 엔터프라이즈 시스템을 위해 고안된 기술이기 때문에 

  서버 환경에서 사용될 때 그 가치가 있다.

  실제로 스프링은 대부분 서버환경에서 사용된다. 

 

- 스프링이 처음 설계됐던 대규모의 엔터프라이즈 서버환경은 서버 하나당

  최대로 초당 수십에서 수백 번씩 브라우저나 여타 시스템으로부터의 요청을 받아

  처리할 수 있는 높은 성능이 요구되는 환경이었다. 

 

- 또 하나의 요청을 처리하기 위해 데이터 액세스 로직, 서비스 로직, 비즈니스 로직,

  프레젠테이션 로직 등의 다양한 기능을 담당하는 오브젝트들이 참여하는 

  계층형 구조로 이뤄진 경우가 대부분이다.

  비즈니스 로직도 복잡한 경우가 많다. 

 

- 그런데 매번 클라이언트에서 요청이 올 때마다 각 로직을 담당하는 오브젝트를 새로 만들어서

  사용한다고 생각해보자.

  요청 한 번에 5개의 오브젝트가 새로 만들어지고, 초당 500개의 요청이 들어오면,

  초당 2500개의 새로운 오브젝트가 생성된다. 

 

- 1분이면 15만개, 1시간이면 9백만개의 새로운 오브젝트가 만들어진다.

  아무리 자바의 오브젝트 생성과 가비지 컬렉션(GC)의 성능이 좋아졌다고 한들

  이렇게 부하가 걸리면 서버가 감당하기 힘들다. 

 

- 그래서 엔터프라이즈 분야에서는 서비스 오브젝트라는 개념을 일찍부터 사용해왔다.

  서블릿은 자바 엔터프라이즈 기술의 가장 기본이 되는 서비스 오브젝트라고 할 수 있다.

  스펙에서 강제하진 않지만, 서블릿은 대부분 멀티스레드 환경에서 싱글톤으로 동작한다.

  서블릿 클래스당 하나의 오브젝트만 만들어두고,  

  사용자의 요청을 담당하는 여러 스레드에서 하나의 오브젝트를 공유해 동시에 사용한다. 

 

- 이렇게 애플리케이션 안에 제한된 수, 대개 한 개의 오브젝트만 만들어서 

  사용하는 것이 싱글톤 패턴의 원리다.

  따라서 서버환경에서는 서비스 싱글톤의 사용이 권장된다.

  하지만 디자인 패턴에 소개된 싱글톤 패턴은 사용하기가 까다롭고  여러 가지 문제점이 있다.

  그래서 심지어 이런 싱글톤 패턴을 피해야 할 패턴이라는 의미로 안티패턴(anti-pattern)이라고 

  부르는 사람도 있다.