스프링의 의존성 관리 방법
IoC: Inversion of Control 제어의 역행 => 스프링의 핵심원리
스프링이 IoC를 지원하는 두 가지 형태
Dependency Lookup |
-컨테이너가 애플리케이션 운용에 필요한 객체를 생성하고 클라이언트는컨테이너가 생성한 객체를 검색(Lookup)하는 방식 -실제 애플리케이션 개발 과정에서는 사용하지 않음 |
Dependency Injection |
-객체사이의 의존관계를 스프링 설정 파일에 등록된 정보를 바탕으로 컨테이너가 자동으로 처리 -의존성 설정을 바꾸고 싶을 때 프로그램 코드를 수정하지 않고 스프링 설정 파일 수정만으로 변경사항을 적용할 수 있음 -> 유지보수 향상 -개발과정에서 실제 자주 사용하는 방식 세터 인젝션(Setter Injection) : Setter 메소드를 기반 생성자 인젝션(Constructor Injection) : 생성자 기반 |
생성자 인젝션(Constructor Injection) 이용하기
스프링 컨테이너는 XML 설정파일에 등록된 클래스를 찾아서 객체를 생성할 경우 기본적으로 매개변수가 없는 기본 생성자를 호출
컨테이너가 기본 생성자 말고 매개변수를 가지는 다른 생성자를 호출할 수 있도록 설정 가능-> 생성자 인젝션 사용
: 생성자의 매개변수로 의존관계에 있는 객체의 주소 정보를 전달할 수 있음
객체를 만들기 원하는 클래스에 매개변수를 가지는 생성자를 만듦
예시) public SamsungTV(SonySpeaker speaker) {
System.out.println("===> SamsungTV 객체 생성");
this.speaker = speaker;
}
그 다음 applicationContext.xml 파일에서 <bean>설정을 해준다
<bean id="tv" class="polymorphism.SamsungTV">
<constructor-arg ref="sony"></constructor-arg>
</bean>
<bean id="sony" class="polymorphism.SonySpeaker"></bean>
예시문이지만, SamsungTV객체를 만들 때 그냥 매개 없는 객체를 만들지 않고 SonySpeaker를 매개로 가진 객체를 생성하는 것이다.
그럼 안에서 따로 sonyspeaker 객체를 생성하는 코드를 작성하지 않고도 스피커를 통한 메소드를 실행할 수 있다. (스프링퀵스타트 참고, 최규태 저)
생성자를 통한 인젝션 설정에서 잊지 말아야 할 것은 바로
<constructor-arg></constrcutor-arg>
엘리먼트를 넣어서 추가하면 된다는 것이다. 물론 매개변수로 들어갈 객체 또한 밑에서 <bean>으로 생성해주어야 먼저 생성된 뒤 그 객체가 매개변수로 들어간다. 실제로 순서를 보면
소니 스피커 객체를 먼저 생성한 후에 SamsungTV 객체를 생성한다. 아니 요리 신기할수가!? (....)
그렇다면 매개변수가 1개가 아닌 2개 이상의 경우는 어찌하나?
마찬가지의 방법으로 매개변수가 여러개 들어가는 생성자를 만들어 주고, <constructor-arg>를 갯수만큼 집어 넣으면 된다.
다만 생성자가 여러 개 오버로딩 되어 있는 경우, 어떤 생성자를 호출해야 할지 분명하지 않을 수 있다. 이럴 경우 index속성을 사용, 어떤 값이 몇번 째 매개변수로 매핑되는지 지정할 수 있다.
<constructor-arg>엘리먼트 속성
ref |
인자로 전달될 데이터가 <bean>으로 등록된 다른 객체인 경우 ref를 사용하여 해당 객체의 아이디나 이름 참조 | <constructor-arg ref="참고할 id or name" /> |
value |
고정된 문자열이나 정수같은 기본형 데이터 value속성 사용 | <constructor-arg value="숫자, 문자 등의 기본형" /> |
index | 어떤 값이 몇 번째 매개변수로 매핑 되는지 지정, index는 0부터 시작 | <constructor-arg index="0" /> |
'건승하고있어요 > Spring framework' 카테고리의 다른 글
[Spring] 스프링1일차 - 컬렉션(Collection) 객체 설정 (0) | 2018.02.08 |
---|---|
[Spring] 스프링1일차 - 의존성관리/Setter인젝션(Setter Injection) (0) | 2018.02.08 |
[Spring] 스프링1일차 - 스프링 XML 설정 (0) | 2018.02.08 |
[Spring] 스프링1일차 - 스프링 컨테이너 및 설정파일 (2) | 2018.02.08 |
[Spring] 스프링1일차 - 프레임워크 개요 (4) | 2018.02.08 |