1장 오브젝트와 의존관계(2)

Soonwoo Kwon·2022년 2월 25일
0

토비의 스프링

목록 보기
2/11

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 등에서 쓰인다.

0개의 댓글