프로그래밍

[Spring] day59 : 의존 관계와 의존 주입(DI) 본문

자바/Spring

[Spring] day59 : 의존 관계와 의존 주입(DI)

시케 2023. 8. 9. 22:33
728x90
반응형

2023.08.01.화

의존 관계

어떤 메서드를 수행하는 주체가 되면 의존관계가 발생한다

 

예를들면 main Action을 하는 진짜 주체는 BoardDAO이다

selectAll / selectOne과 같은 메서드를 실행하는 주체는 BoardDAO이기 때문이다

실제로 TV를 켜는 주체는 리모콘인 것과 같은 맥락이다

 

의존 관계가 발생한다면 의존 주입을 해야한다 

 

의존 주입(DI)

: Dependency Injection

의존 주입은 곧 멤버변수 초기화라고 이해하면 편하다

의존 주입에는 2가지 방식이 있다

  1. 생성자 주입
  2. setter 주입

해당 객체의 멤버변수를 초기화하는 기존의 방식과 비슷하다

 

설정(.xml)

우리는 POJO인 객체 의존 주입을 할 것이므로

스프링 컨테이너 설정파일인 applicationContext.xml 파일에서 설정을 할 것이다

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">

	<context:component-scan base-package="test"></context:component-scan>
	<bean class="test.GalaxyWatch" id="gw"></bean>
	
	<context:component-scan base-package="day59"></context:component-scan>
	<bean class="day59.RemoteA" id="a"></bean>
	<!-- <bean class="day59.RemoteB" id="b"></bean> -->

	<bean class="day59.LgTV" id="lTv">
		<constructor-arg ref="a"></constructor-arg>
	</bean>


	<!--
	<bean class="test.Ahri" id="ahri">
		<constructor-arg ref="tti"/>
	</bean>
	<bean class="test.Teemo" id="teemo" lazy-init="true">
		<constructor-arg ref="jsw"/>		
	</bean>

	<bean class="test.JohnyasSandWatch" id="jsw" lazy-init="true"/>
	<bean class="test.tenThousandIce" id="tti" lazy-init="true"/>

	<bean class="day59.SamsungTV" id="sTv">
		<constructor-arg ref="a"></constructor-arg>
	</bean>
	
	<bean class="day59.LgTV" id="lTv">
		<property name="remote" ref="b"></property>
	</bean>
	

	<bean class="day59.RemoteA" id="a"></bean>
	<bean class="day59.RemoteB" id="b"></bean>

	<bean class="day59.TestBean" id="tb">
		<property name="testList">
			<list>
				<value>작은티모</value>
				<value>중간티모</value>
				<value>큰티모</value>
			</list>
		</property>
	</bean>

	<bean class="day59.TestBean2" id="tb2">
		<property name="testMap">
			<map>
				<entry>
					<key><value>1001</value></key>
					<value>작은티모</value>
				</entry>
				<entry>
					<key><value>1002</value></key>
					<value>중간티모</value>
				</entry>
				<entry>
					<key><value>1003</value></key>
					<value>큰티모</value>
				</entry>
			</map>
		</property>
	</bean>
	-->
</beans>

 

[ 실행 흐름 ]

Client
1. 스프링 컨테이너 구동
: 팩토리 패턴을 사용하고 있어서, 객체명을 LookUp하여 객체반환

xml에서 lgTV랑 samsungTV 둘 다 같은 id로 지정후
필요할때마다 둘중하나를 가리는 방식으로 하기도 한다
→ xml의 변경만으로도 아웃풋이 달라진다

하지만 보통 객체의 이름은 같게 짓지는 않는다
 액션류는 바뀌는 일이 적고 조금씩 구동방식이 다를 수 있기 때문
 보통은 모듈마다 같게 한다(업그레이드 등등 주로 광고/멤버변수 변경 등등)
※ 예전것을 가려놓기도 한다

 

setter 방식은 생성자 주입 방식과 형태는 비슷하지만
이름으로 찾아가기 때문에 "이름"을 반드시 일치시켜야 한다

<bean class="test.IPhone" id="apple">
해당코드만 작성시에는 consturutor가 아니기 때문에 기본생성자이다

[순서]
지연로딩은 호출 시점에 생성
따라서 현재 호출되지 않았음
IPhone 기본 생성자 호출
setter 호출 시도
setter를 하려면 watch가 필요 ---> 갤럭시워치
갤럭시 워치 기본 생성자 호출
setter 호출 마무리

 

728x90
반응형
Comments