토비의 스프링3/1장_오브젝트와 의존관계

1장 오브젝트와 의존관계(3) - 싱글톤 & 스코프

Maddie.Pyo 2016. 4. 8. 15:50

1. 싱글톤 레지스트리와 오브젝트 스코프

 

※ 오브젝트의 동일성과 동등성

자바에서 두 개의 오브젝트가 완전히 같은 동일한(identical) 오브젝트라고 말하는 것과, 동일한 정보를 담고 있는(equivalent) 오브젝트라고 말하는 것은 분명한 차이가 있다. 전자는 동일성(identity) 비교라고 하고, 후자를 동등성(equality) 비교라고 한다. 동일성은 == 연산자로, 동등성은 equals()메소드를 이용해 비교한다.

 

두 개의 오브젝트가 동일하다면 사실은 하나의 오브젝트만 존재하는 것이고 두 개의 오브젝트 레퍼런스 변수를 갖고 있을 뿐이다. 두 개의 오브젝트가 동일하지는 않지만 동등한 경우에는 두 개의 각기 다른 오브젝트가 메모리상에 존재하는 것인데 오브젝트의 동동성 기준에 따라 두 오브젝트의 정보가 동등하다고 판단하는 것일 뿐이다.

물론 동일한 오브젝트는 동등하기도 할 것이다. 하지만 그 반대는 항상 참은 아니다.

 

자바 클래스를 만들 때 equals() 메소드를 따로 구현하지 않았다면. 최상위 클래스인 Object 클래스에 구현되어 있는 equals() 메소드가 사용된다.

Object의 equals() 메소드는 두 오브젝트의 동일성을 비교해서 그 결과를 돌려준다.

따라서 이때는 동일한 오브젝트여야지만 동등한 오브젝트라고 여겨질 것이다.

 

-. 오브젝트 팩토리와 스프링의 애플리케이션 컨텍스트의 동작방식에는 무엇인가 차이점이 있다.

스프링은 여러 번에 걸쳐 빈을 요청하더라도 매번 동일한 오브젝트를 돌려준다는 것이다.

 

1.1. 싱글톤 레지스트리로서의 애플리케이션 컨텍스트

-. 애플리케이션 컨텍스트는 오브젝트 팩토리와 비슷한 방식으로 동작하는 IoC 컨테이너이다. 그러면서 동시에 이 애플리케이션 컨텍스트는 싱글톤을 저장하고 관리하는 싱글톤 레지스트리(singleton registry)이기도 하다.

 

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

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

-. 엔터프라이즈 분야에서는 서비스 오브젝트라는 개념을 일찍부터 사용해왔다. 서블릿은 자바 엔터프라이즈 기술의 가장 기본이 되는 서비스 오브젝트라고 할 수 있다. 스펙 에서 강제하진 않지만, 서블릿은 대부분 멀티스레드 환경에서 싱글톤으로 동작한다. 서블릿 클래스당 하나의 오브젝트만 만들어두고 사용자의 요청을 담당하는 여러 스레드에서 하나의 오브젝트를 공유해 동시 에 사용한다.

 

※ 싱글톤 패턴(Singleton Pattern)
싱글톤 패턴은 GoF가 소개한 디자인 패턴 중의 하나다. 디자인 패턴 중에서 가장 자주 활용되는 패턴이기도 하지만 가장 많은 비판을 받는 패턴이기도 하다. 심지어 디자인 책을 쓴 GOF 멤버조차도 싱글톤 때턴은 매우 조심해서 사용해야 하거나 피해야 활 때턴이라고 말하기도 한다.
 
싱글톤 패턴은 어떤 클래스를 애플리케이션 내에서 제한된 인스턴스 개수. 이름처럼 주로 하나만 존재하도록 강제하는 패턴이다. 이렇게 하나만 만들어지는 클래스의 오브젝트는 애플리케이션 내에서 전역적으로 접근이 가능하다. 단일 오브젝트만 존재해야 하고 이를 애플리케이션의 여러 곳에서 공유하는 경우에 주로 사용한다.

 

b. 싱글톤 패턴의 한계

ㄱ. 싱글톤을 구현하는 방법

• 클래스 밖에서는 오브젝트를 생성하지 못하도록 생성자를 private으로 만든다.
• 생성된 싱글톤 오브젝트를 저장할 수 있는 자신과 같은 타입의 스태틱 필드를 정의한다.
• 스태틱 팩토리 메소드인 getlnstance()를 만들고 이 메소드가 최초로 호출되는 시점에서 한번만 오브젝트가 만들어지게 한다. 생성된 오브젝트는 스태틱 필드에 저장된다. 또는 스태틱 필드의 초기값으로 오브젝트를 미리 만들어둘 수도 있다.
• 한번 오브젝트(싱글톤)가 만들어지고 난 후에는 getlnstance( ) 메소드를 통해 이미 만들어져 스태틱 필드에 저장해둔 오브젝트를 넘겨준다.

 

ㄴ. 한계

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

• 싱글톤은 테스트하기가 힘들다.

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

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

 

c. 싱글톤 레지스트리

-. 스프링은 서버환경에서 싱글톤이 만들어져서 서비스 오브젝트 방식으로 사용되는 것을 적극 지지한다.

하지만 자바의 기본적인 싱글톤 패턴의 구현 방식은 여러 가지 단점이 있기 때문에, 스프링은 직접 싱글톤 형태의 오브젝트를 만들고 관리하는 기능을 제공한다.

-. 스프링 컨테이너는 싱글톤을 생성하고, 관리하고, 공급하는 싱글톤 관리 컨테이너이기도 하다.

 

ㄱ. 싱글톤 레지스트리의 장점

-. 스태틱 메소드와 private 생성자를 사용해야 하는 비정상적인 클래스가 아니라 평범한 자바 클래스를 싱글톤으로 활용하게 해준다는 점이다.

-. 가장 중요한 것은 싱글톤 패턴과 달리 스프링이 지지하는 객체지향적인 설계 방식과 원칙, 디자인 패턴(싱글톤 패턴은 제외) 등을 적용하는 데 아무런 제약이 없다는 점이다.

 

2. 스프링 빈의 스코프

-. 스프링이 관리하는 오브젝트, 즉 빈이 생성되고, 존재하고, 적용되는 범위를 빈의 스코프(scope) 라고 한다.

-. 기본 스코프는 싱글톤

-. 싱글톤 스코프는 컨테이너 내에 한 개의 오브젝트만 만들어져서, 강제로 제거하지 않는 한 스프링 컨테이너가 존재하는 동안 계속 유지한다. - 대부분의 빈은 싱글톤 스코프를 갖는다.

-. 종류

ㄱ. 프로토타입 스코프 -> 빈을 요청할 때마다 매번 새로운 오브젝트를 만들어 준다.

ㄴ. 요청스코프

ㄷ. 웹의 세션과 스코프가 유사한 세션 스코프