토비 스프링; 오브젝트와 의존관계 (2)

🗓️

지난 글에서 DAO 오브젝트 팩토리를 스프링의 Application Context로 변환하는 과정까지 했다. 이 과정에서 @Configuration이라는 어노테이션으로 Application Context가 빈을 만들 수 있게 했다.

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

그런데 오브젝트 팩토리로 만든 DAO는 여러개 생성이 가능하고 그렇게 되면 동일하지 않게된다.
Application Context로 만든 DAO는 동일하다.

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

IoC컨테이너인 Application Context는 Singleton Registry다.
스프링은 빈을 생성할때 기본적으로 Singleton으로 만든다.

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

스프링이 빈을 싱글톤으로 만드는 이유

  • 스프링은 주로 서버환경에서 실행됨.
  • 서버는 초당 수십에서 수백번씩 요청을 받음
  • 요청마다 오브젝트를 생성하면 부하가 걸림
  • 그래서 싱글톤으로 만듬

싱글톤 패턴의 한계

  • private 생성자를 갖기 때문에 상속을 할 수 없다.
  • 인스턴스화 하는 방식이 제한적이라 테스트하기 힘들다.
  • 서버환경에서 싱글톤이 하나만 만들어지는것을 무조건 보장하지 못한다.
  • static 메소드를 통해 전역상태를 만들 수 있기 때문에 바람직하지 못하다.

싱글톤 레지스트리

  • 싱글톤을 직접 만든는 것은 앞서 단점이 있기 때문에 스프링은 직접 싱글톤 레지스트리로 빈을 관리한다.
  • 평범한 자바 클래스라도 싱글톤으로 사용할 수 있게 해준다.
  • 이때문에 객체지향 설계를 하는데 제약이 없다.

1.6.2 싱글톤과 오브젝트의 상태

1.7 의존관계 주입 (Dependency Injection)

1.7.1 제어의 역전 (IoC)과 의존관계 주입

  • 스프링 IoC의 대표적인 동작 원리는 의존 주입이다 .(Dependency Injection)

1.7.2 런타임 의존관계 설정

의존관계

  • 의존에는 방향성이 있다.

A가 B에 의존한다.

  • B가 변하면 A에 영향을 미친다.
  • 클래스 모델이나 코드에는 런타임 시점의 의존관계가 잘 드러나지 않는다. 그러기 위해서는 인터페이스에만 의존하고 있어야 한다.
  • 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제 3의 존재가 결정한다.
  • 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입) 해줌으로써 만들어진다.

의존관계 주입

  • 자바에서 의존관계 주입이란 생성자의 파라미터로 인스턴스의 레퍼런스를 전달해주는 방법 뿐이다.
  • DI 컨테이너는 자신이 결정한 의존관계를 맺어줄 클래스의 오브젝트를 만들고, 이 생성자의 파라미터로 오브젝트의 레퍼런스를 전달해준다.

1.7.3 의존관계 검색과 주입

  • IoC 컨테이너는 의존관계를 검색한다.
  • 런타임시 의존관계를 맺을 오브젝트를 결정하는것과 오브젝트의 생성 작음은 외부 컨테이너에게 IoC로 맡긴다.
  • 그러나 이것을 가져올 때는 스스로 컨테이너에게 요청하는 방법을 사용한다.
  • IoC 컨테이너에 의존관계 검색을 요청하는것은 다음과 같다.
  • 그런데 이러면 아무도 안쓰지.

1.7.4 의존관계 주입의 응용

DI(의존주입)의 장점

  • 코드에는 런타임 클래스에 대한 의존관계가 나타나지 않는다.
  • 인터페이스를 통해 결합도가 낮은 코드를 만든다.
  • 그러므로 다른 책임을 가진 사용 의존관계에 있는 대상이 바뀌거나 변경되더라도 자신은 영향을 받지 않는다.
  • 영항을 받지 않으니 변경을 통한 다양한 확장 방법에 자유롭다.

기능 구현의 교환

  • 구현체의 교체가 가능하다 (앞에서 다 설명함)

부가기능 추가

DaoFactory에서 조합한다.

1.7.5 메소드를 이용한 의존관계 주입

  • 수정자 메소드 (setter)를 이용한 주입
  • 일만 메소드를 이용한 주입

1.8 XML을 이용한 설정

  • 자바로 하던걸 XML로 한다.

1.8.1 XML 설정

1.8.2 XML을 이용하는 애플리케이션 컨텍스트

1.8.3 DataSource 인터페이스로 변환

Servlet; DataSource 연동 (platanus.me)

  • 자바에서 제공하는 DataSource 인터페이스를 사용하면 DB 커넥션을 쉽게 가져올 수 있다
  • 다양한 DataSource 구현체들이 있다. 가장 유명한건 HikariCP..

자바 코드 설정 방식

XML 설정 방식

1.8.4 프로퍼티 값의 주입

값 주입

  • DB주소, 아이디, 패스워드 같은 정보를 수정자 메소드를 통해 설정 가능

value 값의 자동 변환

1.9 정리

  • 전략패턴
  • OCP
  • 낮은 결합도와 높은 응집도
  • IoC
  • 싱글톤 레지스트리
  • DI
  • 생성자 주입, 수정자 주입
  • XML DI 설정