오브젝트의 동일성과 동등성
동일성
오브젝트의 주소가 같다는 의미로 == 연산자를 통해서 비교한다.
즉, 서로 동일한 오브젝트라면 해당 오브젝트는 두 개가 아니라 하나만 존재하고 있다는 것
동등성
오브젝트의 정보가 같다는 내용으로 equals 메서드를 통해서 비교한다.
즉, 서로 동등한 오브젝트라면 오브젝트가 가지고 있는 내용은 같지만 주소는 다르므로
동등한 오브젝트는 하나가 아니라 두 개가 같은 내용으로 존재하고 있다는 것
equal 메서드를 따로 구현하지 않은 경우에는 Object 클래스에 있는 것을 사용하여 동일성을 비교함
팩토리와 애플리케이션 컨텍스트의 동일성 차이
스프링을 적용하지 않은 기존의 팩토리를 통해 오브젝트를 생성하는 경우에는
오브젝트가 생성될 때마다 항상 새로운 오브젝트가 생성 되어
주소값이 다른, 동일성이 같지 않은 오브젝트가 생성된다.
스프링의 애플리케이션 컨텍스트를 통해 생성된 오브젝트는
항상 같은 주소값을 가진 오브젝트를 반환하여 동일성이 보장된다.
이렇게 주소값이 같은 동일한 하나의 오브젝트만 생성하여 사용하는 것을
싱글톤 패턴이라고 하고 이런 싱글톤 방식으로 오브젝트를 만드는
IoC 컨테이너인 애플리케이션 컨텍스트는 싱글톤을 저장하고 관리하는
싱글톤 레지스트리라고 한다.
싱글톤 레지스트리와 싱글톤 패턴은 엄연히 다른 개념이다.
싱글톤으로 빈을 생성하는 이유
스프링은 자바 엔터프라이즈 기술을 사용하는 서버환경에서 주로 사용된다.
서버에서는 클라이언트의 요청을 받아 작업을 수행해야하는데
클라이언트의 요청이 올 때마다 오브젝트를 계속 생성이 된다면
서버에 과부하가 걸려 감당하기가 힘들다.
그렇기 때문에 사용자의 요청을 담당하는 여러 스레드에서
하나의 오브젝트를 공유하여 동시에 사용한다.
싱글톤 패턴의 단점
싱글톤으로 만드려는 생성자의 접근 제어자를 private으로 하여
외부에서 오브젝트를 더 이상 생성할 수 없게 제한하고
해당 클래스 안에서 정적 멤버로 오브젝트를 생성한 후에
getter를 통해 해당 싱글톤 오브젝트를 사용할 수 있게 한다.
싱글톤을 구현하는 코드는 아래와 같다.
public class Single{
private static Single INSTANCE;
private Single() {}
public Single getSingle() {
return INSTANCE;
}
}
오브젝트를 클래스 자신만 생성할 수 있게 생성자를 private으로 제한하기 때문에 상속할 수 없고,
static 멤버를 사용하기 때문에 객체지향의 가장 큰 특징인 상속과 다형성을 사용할 수 없다.
오브젝트가 생성되는 방식도 제한이 되어있기 때문에
테스트를 하기 위해 오브젝트를 생성하거나 초기화 혹은 값을 주입하는 작업이 힘들다.
서버환경에서 싱글톤이 하나만 생성되는 것이 보장되지 않기도 하는데.
서버의 클래스 로더가 어떻게 구성되었는지에 따라, 혹은 서버가 여러 개의 JVM에 분산되어 설치되는 등에
따라 여러개의 싱글톤 오브젝트가 생기기 때문에 완벽한 싱글톤 오브젝트라고 볼 수 없기도 하다.
또한 싱글톤은 정적 멤버로 만들기 때문에 언제 어디서든 접근할 수 있어서
무분별한 접근, 수정, 공유의 문제가 생길 수 있다.
싱글톤 레지스트리
위와 같이 자바의 기본적인 싱글톤 패턴의 구현 방식은 큰 단점들이 있어서
스프링은 싱글톤 레지스트리라는 직접 싱글톤을 만들고 관리하는 기능이 존재한다.
private 생성자와 스태틱 메서드를 사용하는 클래스가 아닌
평범한 자바 클래스를 싱글톤으로 활용할 수 있게 해준다.
스프링에서는 오브젝트의 생성, 관계설정, 사용 등에 대한 모든 제어권을
애플리케이션 컨텍스트에게 넘기기 때문에 스태틱과 private 생성자를 쓰지 않아도
애플리케이션 컨텍스트가 자동으로 관리해주기 때문에 가능한 것이다.
즉, 애플리케이션 컨텍스트 덕분에 스태틱을 사용하지 않고 public 생성자도 사용할 수 있어져서
자바의 객체지향적인 방식들을 모두 사용할 수 있는 단점이 없는 싱글톤 패턴을 사용할 수 있게 된다.
싱글톤과 오브젝트의 상태
싱글톤은 여러 스레드, 즉 여러 요청이 들어오면 동시에 접근해서 사용할 수 있기 때문에
서비스 형태의 오브젝트로 사용되는 무상태 방식으로 만들어져야 한다.
무상태 방식이란 인스턴스 필드의 값을 변경하고 유지하지 않는 방식으로
상태정보를 내부에 갖고 있지 않는 방식을 말하는데
이러한 방식을 사용하는 이유는 만약에 두 명의 사용자가 동시에
A라는 값을 변경했다면 가장 마지막으로 값을 변경한 사용자의 변경사항만
저장되는 상황들을 방지하기 위해서다.
이는 싱글톤 오브젝트, 즉 하나의 객체를 모든 사용자가 동시에 사용하기 때문이다.
상태를 저장하지 않으면 요청에 대한 결과나 데이터베이스와 서버 등으로부터 생성된 정보를
저장할 공간이 없지만 이런 경우에는 파라미터와 로컬 변수 혹은 리턴 값처럼 한 번 사용되고
버려지는 정보를 사용하여 처리하면 동시성 문제와 메모리 문제를 해결할 수 있다.
따라서 개별적으로 바뀌는 정보는 로컬 변수, 파라미터로 주고 받는 것이 좋고
싱글톤 빈을 저장하거나 읽기 전용 정보 같은 경우는 그대로 사용해도 상관 없다.
스프링 빈의 스코프
스프링에서 빈이 생성되고, 존재하고, 적용되는 범위로
기본 스코프는 싱글톤 상태이다.
싱글톤 스코프는 컨테이너가 존재하는 동안, 즉 서버가 유지되는 동안 계속 유지된다.
대부분의 경우 스코프는 싱글톤 스코프이지만, 상황에 따라 바뀌기도 하는데
빈을 요청할 때마다 새로운 오브젝트를 만드는 프로토타입 스코프와
사용자로부터 HTTP 요청이 온 경우에 생성되는 요청 스코프, 세션 스코프 등이 있다.
'Back-End > Spring' 카테고리의 다른 글
XML 설정 (0) | 2023.06.07 |
---|---|
DI(Dependency Injection) (0) | 2023.06.07 |
스프링 IoC (0) | 2023.06.05 |
IoC(Inversion of Control, 제어의 역전) (0) | 2023.06.05 |
초난감 DAO와 객체지향 (0) | 2023.06.05 |