728x90
반응형

의존성 관리

 

스프링의 의존성 관리 방법

  • 스프링 프레임워크의 가장 중요한 특징은 객체의 생성과 의존관계를 컨테이너가 자동으로 관리한다는 점이다.
  • 이것이 스프링 Ioc(제어의 역행)의 핵심 원리
  • Ioc 두 가지 형태 
  • 1. Dependency Lookup
  • 2. Dependency Injection

스프링의 Ioc

[그림1] 스프링 Ioc 출처 : http://dlwbsula.blogspot.com/2016/10/ioc.html

 

Dependency Lookup

  • 애플리케이션 운용에 필요한 객체를 생성하고 클라이언트는 컨테이너가 생성한 객체를 검색(Lookup)해 사용하는 방식
  • 보통 사용했던 방식이지만 실제 애플리케이션 개발과정에서는 사용하지 않는다. Dependecy Injection을 사용하는 경우가 많다.(대부분)

 

Denpendency Injection

  • 객체 사이의 의존관계를 스프링 설정 파일에 등록된 정보를 바탕으로 컨테이너가 자동으로 처리
  • 의존성 설정을 바꾸고 싶을 경우 프로그램 코드를 수정하고 않고 스프링 설정 파일 수정만으로 변경사항을 적용할 수 있어서 유지보수가 향상된다.
  • 컨테이너가 직접 객체들 사이에 의존관계를 처리하는 것을 의미
  • Setter 메소드를 기반으로 하는 세터 인젝션과 생성자를 기반으로 하는 생성자 인젝션으로 나뉜다.

 

의존성 관계

  • 의존성(Dependency)관계란 객체와 객체의 결합 관계다. 
  • 하나의 객체에서 다른 객체의 변수나 메소드를 이용해야 한다면 이용하려는 객체에 대한 객체 생성과 생성된 객체의 레퍼런스 정보가 필요하다.

의존관계 테스트를 위해 다음과 같은 SonySpeaker 클래스를 추가로 작성한다.

 

SonySpeaker.java 

[그림2] SonySpeaker

 

그리고 SamsungTV클래스의 볼륨 조절 기능을 SonySpeaker가 이용하도록 수정

 

[그림3] SamsungTV.java

 

이제 결과를 알기 위해 TVUser클라이언트 프로그램 실행

 

TVUser.java

[그림4] TVUser.java 코드

 

[그림5] TVUser 실행 결과

 

실행 결과를 보면 SonySpeaker 객체가 두개나 생성된다는 것을 확인할 수 있다.

이러한 문제가 발생하는 이유는 의존관계에 있는 Speaker 객체에 대한 객체 생성 코드를 직접 SamsungTV 소스에 명시했기 때문이다. 스프링은 이 문제를 의존성 주입(Dependency Injection)을 이용해 해결한다.

 

 

 

생성자 인젝션 이용하기

  • 스프링 컨테이너는 XML, 설정 파일에 등록된 클래스를 찾아 객체 생성시 기본적으로 매개변수가 없는 기본(Default) 생성자를 호출한다.
  • 다만 인위적으로 매개변수를 가지는 다른 생성자를 호출하도록 설정할 수 있는데, 이러한 기능을 이용해 생성자 인젝션을 처리한다.
  • 생성자 인젝션을 사용하면 생성자의 매개변수로 의존관계에 있는 객체의 주소 정보를 전달할 수 있다.

 

SamsungTV 클래스에 생성자 추가

[그림6] SamsungTV클래스

 

applicationContext.xml 수정

 

[그림7] applicationContext.xml 수정

 

TVUser 클래스 실행 결과

[그림8] TVUser 클래스 실행 결과

 

 

다중 변수 매핑

  • 생성자 인젝션에서 초기화해야 할 멤버변수가 여러 개라면, 여러 개의 값을 한꺼번에 전달해야 한다.

 

SamsungTV 클래스 수정

[그림9] SamsungTV 클래스 수정

 

<constructor-arg> 엘리먼트를 매개변수의 개수만큼 추가해야 한다.

[그림10] applicationContext 수정

 

<constructor-arg> 엘리먼트에서는 ref와 value 속성을 사용해 생성자 매개변수로 전달할 값을 지정할 수 있다.

ref

  • 인자로 전달될 데이터가 <bean>으로 등록된 다른 객체일 경우 ref 속성 이용해 해당 객체의 아이디나 이름을 참조

value

  • 고정된 문자열이나 정수 같은 기본형 데이터일 경우 value 속성 사용

 

applicationContext.xml 수정 후 TVUser 클래스 실행

[그림11] TVUser 실행 결과

 

의존관계 변경

모든 스피커 최상위 부모로 사용할 Speak 인터페이스 추가

[그림12] Speaker 인터페이스 추가

 

또 다른 스피커 AppleSpeaker클래스  추가 

[그림13] AppleSpeaker 추가

 

다음 SonySpeaker 또한 Speaker를 implements하도록 수정하고 SamsungTV 클래스의 멤버변수와 매개변수 타입을 모두 Speaker로 수정한다.

[그림14] SonySpeaker클래스 수정

 

마지막으로 AppleSpeaker도 스프링 설정 파일에 <bean> 등록 및 ref설정도 변경해준다.

[그림15] applicationContext.xml 수정

 

결과 출력

[그림16] TVUser 결과

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기