1.6 싱글톤 레지스트리와 오브젝트 스코프
오브젝트의 동일성과 동등성
동일성
- 두 개의 오브젝트가 완전히 같은 오브젝트라는 것을 의미한다.
- 두 개의 오브젝트가 동일하다면 사실은 하나의 오브젝트만이 존재하는 것으로 두 개의 오브젝트 레퍼런스가 존재하는 것이다.
- == 연산자를 통해 동일성을 확인할 수 있다.
동등성
- 두 개의 오브젝트가 동일한 정보를 가지고 있는 것을 의미한다.
- equals() 메소드를 통해 동등성을 확인할 수 있다.
오브젝트 팩토리와 어플리케이션 컨텍스트의 차이
- 오브젝트 팩토리를 통해 userDao() 메소드를 호출할 때 마다 new 연산자로 새로운 오브젝트가 생성된다.
- 스프링 어플리케이션 컨텍스트로 부터 getBean을 통해 가져온 오브젝트는 매번 new 연산자로 새로운 오브젝트를 생성하지 않는다.
싱글톤 패턴
개념
- 어떤 클래스를 애플리케이션 내에서 제한된 인서튼스 개수(단 하나)만 존재하도록 강제하는 패턴이다.
- 클라이언트에서의 모든 요청마다 각 로직을 담당하는 오브젝트를 새로 생성하면 서버의 부하가 걸리기 때문에 도입된 방법이다.
구현 방법
- 생성자를 private으로 만들어 클래스 밖에서는 오브젝트를 생성하지 못하도록 한다.
- 생성된 싱글톤 오브젝트를 저장할 수 있는 자신과 같은 타입의 스태틱 필드를 정의한다.(private static UserDao INSTANCE)
- 스태틱 팩토리 메소드인 getInstance()를 만들고 이 메소드가 최초로 호출되는 시점에서 한 번만 오브젝트가 만들어지게 한다. 생성된 오브젝트는스태틱 필드에 저장된다. 또는 스태틱 필드의 초기값으로 오브젝트를 미리 만들어둘 수도 있다.
- 한번 오브젝트가 만들어지고 난 후에는 getInstance() 메소드를 통해 이미 만들어져 스태틱 필드에 저장해둔 오브젝트를 넘겨준다.
한계
- private 생성자로 인해 상속할 수 없다.
- 테스트하기가 힘들다.(사용자가 사용할 특정 오브젝트를 주입하기 힘들다)
- 서버환경에서는 싱글톤이 하나만 만들어지는 것을 보장하지 못한다.
- 싱글톤의 사용은 전역 상태를 만들 수 있기 때문에 바람직하지 못하다.(static 메소드)
싱글톤 레지스트리
- 싱글톤 패턴의 한계를 해결한 방식이다.
- 스프링의 객체지향적 설계 방식과 원칙 적용하는데 적합한 방식이다.
싱글톤 오브젝트의 상태
- 멀티스레드 환경에서 싱글톤 오브젝트의 상태 관리를 주의해야한다.
- 다중 사용자가 인스턴스를 서로 읽고 변경하여 잘못된 값을 읽는 것을 방지하기 위해 무상태(stateless) 방식으로 만들어져야 한다.
- 파라미터와 로컬 변수, 리턴 값 등을 이용해 메소드 내에 생성되는 독립적인 공간을 통해 싱글톤 오브젝트의 인스턴스를 덮어쓰는 일을 방지한다.
1.7 의존관계 주입(DI)
의존관계
- A클래스가 B클래스를 사용하는 경우 B가 변하면 A에 영향을 미치게 되고, A와 B는 의존관계 라고 할수 있다.
- 위의 예시는 A는 B에 의존하지만 B는 A에 의존하고 있지 않다.
- 이와 같이 의존관계에는 방향성이 존재한다.
의존 오브젝트
- 프로그램이 시작되고 오브젝트가 만들어 지고 나서 런타임 시에 의존관계를 맺는 대상
의존관계 주입
- DI 컨테이너에 의해 런타임 시에 의존 오브젝트를 사용할수 있도록 그 레퍼런스를 전달받는 과정
- 의존관계 주입을 위해선 DI를 받을 클래스의 오브젝트도 빈 오브젝트여야 한다.
- 오브젝트 주입을 위해서는 DI를 받을 클래스 오브젝트에 대한 생성과 초기화 권한도 컨테이너가 가지고 있어야하기 때문이다.
의존관계 주입의 세가지 조건
- 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다.(인터페이스에만 의존하고 있어야 한다.)
- 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제 3의 존재가 결정한다.
- 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공해줌으로써 만들어진다.
의존관계 검색
- 자신이 필요로 하는 의존 오브젝트를 능동적으로 찾는 것을 의미한다.
- 의존관계 검색에서 자신이 사용할 오브젝트를 검색하는 오브젝트는 빈 오브젝트일 필요가 없다.
1.8 XML을 이용한 설정
- 설정 과정을 자바 클래스와 어노테이션을 이용하는 방법 외에도 XML을 사용하여 설정하는 방법이 있다.
- XML을 텍스트 파일이기 때문에 다루기 쉽고 별도의 빌드 과정이 필요하지 않다.
bean 메소드
- 빈의 이름(id=" ")
- 빈의 클래스(class=" ")
- 빈의 의존 오브젝트
property 태그
- name: 프로퍼티의 이름을 나타내고 이를 통해 수정자 메소드를 알 수 있다.
- ref: 수정자 메소드를 통해 주입해줄 오브젝트 빈 이름
- value:
용어 정리
DTD
- 문서 형식 정의(Document Type Definition, DTD)는 컴퓨터 용어로, SGML 계열의 마크업 언어에서 문서 형식을 정의하는 것이다. SGML을 비롯해 HTML, XHTML, XML 등에서 쓰인다.