의존성 관리
스프링의 의존성 관리 방법
- 스프링 프레임워크의 가장 중요한 특징은 객체의 생성과 의존관계를 컨테이너가 자동으로 관리한다는 점이다.
- 이것이 스프링 Ioc(제어의 역행)의 핵심 원리
- Ioc 두 가지 형태
- 1. Dependency Lookup
- 2. Dependency Injection
스프링의 Ioc
Dependency Lookup
- 애플리케이션 운용에 필요한 객체를 생성하고 클라이언트는 컨테이너가 생성한 객체를 검색(Lookup)해 사용하는 방식
- 보통 사용했던 방식이지만 실제 애플리케이션 개발과정에서는 사용하지 않는다. Dependecy Injection을 사용하는 경우가 많다.(대부분)
Denpendency Injection
- 객체 사이의 의존관계를 스프링 설정 파일에 등록된 정보를 바탕으로 컨테이너가 자동으로 처리
- 의존성 설정을 바꾸고 싶을 경우 프로그램 코드를 수정하고 않고 스프링 설정 파일 수정만으로 변경사항을 적용할 수 있어서 유지보수가 향상된다.
- 컨테이너가 직접 객체들 사이에 의존관계를 처리하는 것을 의미
- Setter 메소드를 기반으로 하는 세터 인젝션과 생성자를 기반으로 하는 생성자 인젝션으로 나뉜다.
의존성 관계
- 의존성(Dependency)관계란 객체와 객체의 결합 관계다.
- 하나의 객체에서 다른 객체의 변수나 메소드를 이용해야 한다면 이용하려는 객체에 대한 객체 생성과 생성된 객체의 레퍼런스 정보가 필요하다.
의존관계 테스트를 위해 다음과 같은 SonySpeaker 클래스를 추가로 작성한다.
SonySpeaker.java
그리고 SamsungTV클래스의 볼륨 조절 기능을 SonySpeaker가 이용하도록 수정
이제 결과를 알기 위해 TVUser클라이언트 프로그램 실행
TVUser.java
실행 결과를 보면 SonySpeaker 객체가 두개나 생성된다는 것을 확인할 수 있다.
이러한 문제가 발생하는 이유는 의존관계에 있는 Speaker 객체에 대한 객체 생성 코드를 직접 SamsungTV 소스에 명시했기 때문이다. 스프링은 이 문제를 의존성 주입(Dependency Injection)을 이용해 해결한다.
생성자 인젝션 이용하기
- 스프링 컨테이너는 XML, 설정 파일에 등록된 클래스를 찾아 객체 생성시 기본적으로 매개변수가 없는 기본(Default) 생성자를 호출한다.
- 다만 인위적으로 매개변수를 가지는 다른 생성자를 호출하도록 설정할 수 있는데, 이러한 기능을 이용해 생성자 인젝션을 처리한다.
- 생성자 인젝션을 사용하면 생성자의 매개변수로 의존관계에 있는 객체의 주소 정보를 전달할 수 있다.
SamsungTV 클래스에 생성자 추가
applicationContext.xml 수정
TVUser 클래스 실행 결과
다중 변수 매핑
- 생성자 인젝션에서 초기화해야 할 멤버변수가 여러 개라면, 여러 개의 값을 한꺼번에 전달해야 한다.
SamsungTV 클래스 수정
<constructor-arg> 엘리먼트를 매개변수의 개수만큼 추가해야 한다.
<constructor-arg> 엘리먼트에서는 ref와 value 속성을 사용해 생성자 매개변수로 전달할 값을 지정할 수 있다.
ref
- 인자로 전달될 데이터가 <bean>으로 등록된 다른 객체일 경우 ref 속성 이용해 해당 객체의 아이디나 이름을 참조
value
- 고정된 문자열이나 정수 같은 기본형 데이터일 경우 value 속성 사용
applicationContext.xml 수정 후 TVUser 클래스 실행
의존관계 변경
모든 스피커 최상위 부모로 사용할 Speak 인터페이스 추가
또 다른 스피커 AppleSpeaker클래스 추가
다음 SonySpeaker 또한 Speaker를 implements하도록 수정하고 SamsungTV 클래스의 멤버변수와 매개변수 타입을 모두 Speaker로 수정한다.
마지막으로 AppleSpeaker도 스프링 설정 파일에 <bean> 등록 및 ref설정도 변경해준다.
결과 출력
최근댓글