싱글톤 레지스트리와 오브젝트 스코프
싱글톤 레지스트리와 오브젝트 스코프
💎 오브젝트의 동일성과 동등성
-
자바에서 두 개의 오브젝트가 같은가라는 말은 주의해서 써야 한다.
-
자바에서는 두 개의 오브젝트가 완전히 같은 동일한(identical) 오브젝트라고 말하는 것과, 동일한 정보를 담고 있는 (equivalent) 오브젝트라고 말하는것은 분명한 차이가 있다.
-
전자는 동일성(identity) 비교라고 하고, 후자는 동등성(equality) 비교라고 한다.
-
동일성은 == 연산자로, 동등성은 equals 메소드를 이용해 비교한다.
-
💎 일반 자바코드를 이용해서 Factory 클래스를 직접 생성 후 오브젝트를 여러 번 호출 했을때는 동일한 오브젝트 일까?
DaoFactory factory = new DaoFactory();
UserDao dao1 = factory.userDao();
UserDao dao2 = factory.userDao();
System.out.println(dao1);
System.out.println(dao2);
#결과값
springbook.dao.UserDao@118f375
springbook.dao.UserDao@117a8bd
- 출력 결과에서 알 수 있듯이, 두 개는 각기 다른 값을 동일하지 않은 오브젝트이다.
💎 스프링 컨텍스트로부터 여러 번 호출 한 오브젝트는 동일한 오브젝트 일까?
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao dao1 = context.getBean("userDao", UserDao);
UserDao dao2 = context.getBean("userDao", UserDao);
System.out.println(dao1);
System.out.println(dao2);
#결과값
springbook.dao.UserDao@ee22f7
springbook.dao.UserDao@ee22f7
-
두 오브젝트의 출력은 같으므로 두 개의 오브젝트는 동일하다!
-
그렇다면 어떤 원리로 스프링에서는 여러 번에 걸쳐 빈을 요청하더라도 매번 동일한 오브젝트를 돌려줄까?
- 싱글톤 레지스트
💎 싱글톤 레지스트리로서의 애플리케이션 컨텍스트
-
애플리케이션 컨텍스트는 싱글톤을 저장하고 관리하는 싱글톤 레지스트리이기도 하다.
-
스프링은 기본적으로 별다른 설정을 하지 않으면 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만든다.
- 스프링에서의 싱글톤과 디자인 패턴에서의 싱글톤은 비슷한 개념이지만 구현 방법은 확연히 다르다.
💎 스프링에서 싱글톤으로 빈을 만드는 이유
-
스프링이 처음 설계됐던 대규모의 엔터프라이즈 서버 환경은 서버 하나당 최대로 초당 수십에서 수백 번씩 브라우저나 시스템으로부터의 요청을 받아 처리할 수 있는 높은 성능이 요구되는 환경이었다.
-
매번 클라이언트에서 요청이 올 때마다 각 로직을 담당하는 오브젝트를 새로 만든다면 부하를 감당할 수 없어서 서비스 오브젝트라는 개념을 사용해왔다.
-
서블릿은 자바 엔터프라이즈 기술의 가장 기본이 되는 서비스 오브젝트로서 클래스당 하나의 오브젝트만 만들어두고, 사용자의 요청을 담당하는 여러 스레드에서 하나의 오브젝트를 공유해 동시에 사용한다.
-
💎 디자인패턴에서의 싱글톤 패턴의 한계
-
private 생성자를 갖고 있기 때문에 상속 할 수 없다.
-
싱글톤은 테스트하기 힘들다.
-
서버환경에서는 싱글톤이 하나만 만들어지는 것을 보장하지 못한다.
-
싱글톤의 사용은 전역 상태를 만들 수 있기 때문에 바람직하지 못하다.
💎 싱글톤 레지스트리
-
스프링은 서버환경에서 싱글톤이 만들어져서 서비스 오브젝트 방식으로 사용되는 것을 적극 지지한다.
-
하지만 자바의 기본적인 싱글톤 패턴의 구현 방식은 여러 가지 단점이 있기 때문에, 스프링은 직접 싱글톤 형태의 오브젝트를 만들고 관리하는 기능을 제공한다.
-
그것이 바로 싱글톤 레지스트리다.
-
스프링 컨테이너는 싱글톤을 생성하고, 관리하고, 공급하는 싱글톤 관리 컨테이너이기도 하다.
-
-
싱글톤 레지스트리의 장점
-
스태틱 메소드와 private 생성자를 사용해야 하는 비정상적인 클래스가 아니라 평범한 방식의 컨테이너를 사용해서 생성과 관계설정, 사용등에 대한 제어권을 컨테이너에게 넘기면 손쉽게 싱글톤 방식으로 관리되게 할 수 있다.
- 오브젝트 생성에 관한 모든 권한은 IoC 기능을 제공하는 애플리케이션 컨텍스트에 있기 때문이다.
-
목 오브젝트를 통한 테스트 가능
-
💎 싱글톤과 오브젝트의 상태
-
싱글톤은 멀티스레드 환경이라면 여러 스레드가 동시에 접근해서 사용할 수 있다.
-
따라서 상태관리에 주의를 기울여야 한다.
-
기본적으로 싱글톤이 멀티스레드 환경에서 서비스 형태의 오브젝트로 사용되는 경우에는 상태정보를 내부에 갖고 있지 않은 무상태(stateless) 방식으로 만들어져야 한다.
-
상태가 없는 방식으로 클래스를 만드는 경우에 각 요청에 대한 정보나 DB나 서버의 리소스로부터 생성한 정보는 파라미터와 로컬 변수, 리턴 값을 이용해야 한다.
-
💎 스프링 빈의 스코프
-
스프링이 관리하는 오브젝트, 즉 빈이 생성되고, 존재하고, 적용되는 범위를 빈의 스코프(scope)라고 한다.
-
스프링 빈의 기본 스코프는 싱글톤이다.
-
싱글톤 스코프는 컨테이너 내에 한 개의 오브젝트만 만들어져서, 강제로 제거하지 않는 한 스프링 컨테이너가 존재하는 동안 계속 유지된다.
- 스프링에서 만들어지는 대부분의 빈은 싱글톤 스코프를 갖는다.
-
Comments