의존성 주입 - 기본

DEV NAHYUN·2021년 10월 5일
0

Spring

목록 보기
5/8
  • 스프링은 IoC(제어의 역행)을 두 가지 방식으로 지원
  • Dependency Lookup : 컨테이너가 앱 운용에 필요한 객체를 생성하고 클라이언트는 컨테이너가 생성한 객체를 검색하여 사용
    Dependency Injection : 객체 사이 의존관계를 스프링 설정 파일에 등록된 정보를 바탕으로 컨테이너가 자동으로 처리.

@ 의존성 관계? 객체와 객체의 결합 관계. 하나의 객체에서 다른 객체의 변수나 메소드를 쓰려면 이들 사이 객체의 레퍼런스가 필요하다.

의존성 주입 전

  • SonySpeaker.java
package polymorphism;

public class SonySpeaker {

	// 10/5 의존성
	public SonySpeaker() {
		System.out.println("===> SonySpeaker 객체 생성");
	}
	
	public void volumeUp() {
		System.out.println("SonySpeaker --- 소리 올린다.");
	}
	
	public void volumeDown() {
		System.out.println("SonySpeaker --- 소리 내린다.");
	}
}
  • TVUser.java
package polymorphism;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class TVUser {

	public static void main(String[] args) {

		// 1. Spring 컨테이너를 구동한다.
		AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");


		// 2. Spring 컨테이너로부터 필요한 객체를 요청(Lookup)한다.
		TV tv = (TV) factory.getBean("tv");
		tv.powerOn();
		tv.volumeUp();
		tv.volumeDown();
		tv.powerOff();


		// 3. Spring 컨테이너를 종료한다.
		factory.close();

	}

}
  • 결과
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@41975e01: startup date [Tue Oct 05 17:32:47 KST 2021]; root of context hierarchy
===> SamsungTV 객체 생성
SamsungTV---전원 켠다.
===> SonySpeaker 객체 생성
SonySpeaker --- 소리 올린다.
===> SonySpeaker 객체 생성
SonySpeaker --- 소리 내린다.
SamsungTV---전원 끈다.
INFO : org.springframework.context.support.GenericXmlApplicationContext - Closing org.springframework.context.support.GenericXmlApplicationContext@41975e01: startup date [Tue Oct 05 17:32:47 KST 2021]; root of context hierarchy

--> 쓸 데 없이 SonySpeaker 객체 두 번 생성
--> SonySpeaker 를 변경할 때 메소드를 전부 수정해야 함.

의존성 주입 후

  • 스프링 컨테이너는 XML 설정 파일에 등록된 클래스를 찾아서 객체 생성할 때 기본적으로 매개변수가 없는 기본 생성자 호출.
  • 하지만 매개변수를 가지는 다른 생성자를 호출하도록 생성한다면 --> 이 기능을 이용해 생성자 인젝션 처리 가능. 이를 사용하면 의존관계에 있는 객체 주소 정보를 매개변수로 전달 가능.
  • applicationContext.xml
	<bean id="tv" class="polymorphism.SamsungTV">
		<constructor-arg ref="sony"></constructor-arg> <!-- 생성자 인젝션 태그 -->
	</bean>

	<bean id="sony" class="polymorphism.SonySpeaker"></bean>
</beans>
  • SamsungTV.java
package polymorphism;

public class SamsungTV implements TV {

	
	// 10/5(화) 의존성 실습
	private SonySpeaker speaker;
	
    // 구동된 컨테이너로부터 SamsungTV 객체를 얻어내 보자.
    // SamsungTV 객체가 언제 생성되는지 확인하기 위해서 기본 생성자를 추가
	public SamsungTV() {
		System.out.println("===> SamsungTV 객체 생성(1)");
	}

	
	public SamsungTV(SonySpeaker speaker) {
		System.out.println("===> SamsungTV 객체 생성(2)");
		this.speaker = speaker;
		// SonySpeaker 객체를 매개변수로 받아서 멤버변수로 선언된 speaker 를 초기화
	}

	// 다형성을 활용한 코드(인터페이스 메소드 재정의 필요)

	public void powerOn() {
		System.out.println("SamsungTV---전원 켠다.");
	}

	public void powerOff() {
		System.out.println("SamsungTV---전원 끈다.");
	}
	

	public void volumeUp() {
		speaker.volumeUp();
	}

	public void volumeDown() {
		speaker.volumeDown();
	}
}
  • 결과
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@41975e01: startup date [Tue Oct 05 17:42:45 KST 2021]; root of context hierarchy
===> SonySpeaker 객체 생성
===> SamsungTV 객체 생성(2)
SamsungTV---전원 켠다.
SonySpeaker --- 소리 올린다.
SonySpeaker --- 소리 내린다.
SamsungTV---전원 끈다.
INFO : org.springframework.context.support.GenericXmlApplicationContext - Closing org.springframework.context.support.GenericXmlApplicationContext@41975e01: startup date [Tue Oct 05 17:42:45 KST 2021]; root of context hierarchy

살펴볼 점

  1. SamsungTV 클래스의 객체가 생성될 때, 기본 생성자가 아닌 두 번째 생성자가 사용됐다. 스프링 설정 파일에 SonySpeaker가 SamsungTV 클래스 밑에 등록됐음에도...
  2. 스프링 컨테이너는 기본적으로 < bean > 등록된 순서대로 객체를 생성하고, 기본 생성자 호출을 원칙으로 한다. 그런데 생성자 인젝션으로 의존성 주입을 할 경우 SonySpeaker 객체가 먼저 생성되었으며, SonySpeaker 객체를 매개변수로 받아들이는 생성자를 호출하여 객체를 생성했다.
profile
나만 알아보면 된다는 마음으로 작더라도 조금씩

0개의 댓글

관련 채용 정보